@spacemade/ui 0.0.1

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 (594) hide show
  1. package/README.md +705 -0
  2. package/app.sh +806 -0
  3. package/cmd.sh +152 -0
  4. package/docs/cms-quickstart.md +206 -0
  5. package/docs/gallery-quickstart.md +24 -0
  6. package/docs/gpu-marketplace-quickstart.md +27 -0
  7. package/docs/metaverse-quickstart.md +25 -0
  8. package/docs/migration-plan.md +41 -0
  9. package/docs/modules.md +34 -0
  10. package/docs/nft-quickstart.md +26 -0
  11. package/docs/simple-cms-quickstart.md +22 -0
  12. package/middleware.ts +77 -0
  13. package/next-env.d.ts +6 -0
  14. package/next.config.ts +39 -0
  15. package/package.json +92 -0
  16. package/public/android-chrome-192x192.png +0 -0
  17. package/public/android-chrome-512x512.png +0 -0
  18. package/public/apple-touch-icon.png +0 -0
  19. package/public/favicon-16x16.png +0 -0
  20. package/public/favicon-32x32.png +0 -0
  21. package/public/favicon.ico +0 -0
  22. package/public/images/default-profile/1.png +0 -0
  23. package/public/images/default-profile/2.png +0 -0
  24. package/public/images/default-profile/3.png +0 -0
  25. package/public/images/default-profile/4.png +0 -0
  26. package/public/images/default-profile/5.png +0 -0
  27. package/public/images/default-profile/6.png +0 -0
  28. package/public/images/default-profile/7.png +0 -0
  29. package/public/images/defaults/Login-Person-Icon-dark.svg +13 -0
  30. package/public/images/defaults/Login-Person-Icon.svg +16 -0
  31. package/public/images/defaults/default-avatar.png +0 -0
  32. package/public/images/defaults/image-not-available.jpg +0 -0
  33. package/public/images/icons/amazon-icon.jpg +0 -0
  34. package/public/images/icons/azure-icon.png +0 -0
  35. package/public/images/icons/google-icon.jpg +0 -0
  36. package/public/site.webmanifest +1 -0
  37. package/scripts/crud-scaffold/bin/crud-scaffold.mjs +23 -0
  38. package/scripts/crud-scaffold/src/api/index.mjs +666 -0
  39. package/scripts/crud-scaffold/src/app/patches.mjs +355 -0
  40. package/scripts/crud-scaffold/src/core/fields.mjs +165 -0
  41. package/scripts/crud-scaffold/src/core/utils.mjs +161 -0
  42. package/scripts/crud-scaffold/src/frontend/index.mjs +1078 -0
  43. package/scripts/crud-scaffold/src/generator.mjs +103 -0
  44. package/scripts/crud-scaffold/src/templates/.gitkeep +1 -0
  45. package/scripts/crud-scaffold/src/utils/generator-utils.mjs +35 -0
  46. package/scripts/defs/cms-definition.mjs +1393 -0
  47. package/scripts/defs/gallery-definition.mjs +171 -0
  48. package/scripts/defs/gpu-definition.mjs +174 -0
  49. package/scripts/defs/metaverse-definition.mjs +170 -0
  50. package/scripts/defs/nft-definition.mjs +191 -0
  51. package/scripts/defs/simple-cms-definition.mjs +141 -0
  52. package/scripts/generate-cms-install-system.mjs +4 -0
  53. package/scripts/generate-gallery-system.mjs +4 -0
  54. package/scripts/generate-gpu-marketplace-system.mjs +4 -0
  55. package/scripts/generate-metaverse-system.mjs +4 -0
  56. package/scripts/generate-nft-system.mjs +4 -0
  57. package/scripts/generate-simple-cms-system.mjs +4 -0
  58. package/scripts/link-core.mjs +72 -0
  59. package/scripts/spacemade.mjs +446 -0
  60. package/scripts/test-generate-app.mjs +60 -0
  61. package/src/components/Dashboard/DashboardList.tsx +70 -0
  62. package/src/components/Dashboard/dashboardLayout.tsx +57 -0
  63. package/src/components/admin/nav/AdminLeftNav.tsx +168 -0
  64. package/src/components/auth/AuthBootstrap.tsx +47 -0
  65. package/src/components/auth/auth-card-shell.tsx +23 -0
  66. package/src/components/auth/forgot-password-form-template.tsx +37 -0
  67. package/src/components/auth/form/ForgotForm.tsx +146 -0
  68. package/src/components/auth/form/ResetPasswordForm.tsx +122 -0
  69. package/src/components/auth/form/SignInForm.tsx +139 -0
  70. package/src/components/auth/form/SignUpForm.tsx +166 -0
  71. package/src/components/auth/form/UpdateForm.tsx +165 -0
  72. package/src/components/auth/login-form-template.tsx +45 -0
  73. package/src/components/billing/CardBrandIcon.tsx +126 -0
  74. package/src/components/billing/block/BillingDetailsCard.tsx +120 -0
  75. package/src/components/billing/block/BillingHistory.tsx +143 -0
  76. package/src/components/billing/block/PlanDetails.tsx +138 -0
  77. package/src/components/billing/modal/UpdateCardDetailsModal.tsx +451 -0
  78. package/src/components/billing/modal/UpdatePlanModal.tsx +194 -0
  79. package/src/components/category/modal/UpdateCategoryModal.tsx +170 -0
  80. package/src/components/category/table/CategoryTable.tsx +137 -0
  81. package/src/components/common/Icons/BrainCircuitIcon.tsx +14 -0
  82. package/src/components/common/Icons/MagnifyingGlassChartIcon.tsx +14 -0
  83. package/src/components/common/Icons/PeopleGroupIcon.tsx +14 -0
  84. package/src/components/common/Icons/ScrewdriverWrenchIcon.tsx +14 -0
  85. package/src/components/common/Icons/SendMessageIcon.tsx +15 -0
  86. package/src/components/common/Icons/ShareIcon.tsx +22 -0
  87. package/src/components/common/Icons/XTwitterIcon.tsx +14 -0
  88. package/src/components/common/Image/OptimizedImage.tsx +17 -0
  89. package/src/components/common/SettingsPanel.tsx +119 -0
  90. package/src/components/common/badge/Badge.tsx +69 -0
  91. package/src/components/common/blocks/BackgroundImageBlock.tsx +43 -0
  92. package/src/components/common/blocks/Carousel.tsx +59 -0
  93. package/src/components/common/blocks/CodeSnippet.tsx +46 -0
  94. package/src/components/common/blocks/InfinityScrollWrapper.tsx +43 -0
  95. package/src/components/common/blocks/SplitBlock.tsx +47 -0
  96. package/src/components/common/blocks/TopImageBlock.tsx +39 -0
  97. package/src/components/common/button/Button.tsx +49 -0
  98. package/src/components/common/button/ButtonWithActions.tsx +71 -0
  99. package/src/components/common/button/DropdownButton.tsx +61 -0
  100. package/src/components/common/button/ScrollDownArrow.tsx +23 -0
  101. package/src/components/common/button/SharerActionBox.tsx +248 -0
  102. package/src/components/common/button/UserButton.tsx +209 -0
  103. package/src/components/common/contact/ContactForm.tsx +214 -0
  104. package/src/components/common/cta/Cta.tsx +18 -0
  105. package/src/components/common/dialog/ConversationFullscreenModal.tsx +95 -0
  106. package/src/components/common/dialog/DeleteDialog.tsx +90 -0
  107. package/src/components/common/dialog/MobileFiltersDrawer.tsx +60 -0
  108. package/src/components/common/dialog/RenameDialog.tsx +128 -0
  109. package/src/components/common/faq/FAQSection.tsx +119 -0
  110. package/src/components/common/filters/NameSearch.tsx +87 -0
  111. package/src/components/common/footer/SmallFooter.tsx +62 -0
  112. package/src/components/common/forms/AdvanceAccordion.tsx +154 -0
  113. package/src/components/common/forms/CheckBox.tsx +29 -0
  114. package/src/components/common/forms/DateTimePicker.tsx +101 -0
  115. package/src/components/common/forms/Dropzone.tsx +278 -0
  116. package/src/components/common/forms/EmailTagInput.tsx +67 -0
  117. package/src/components/common/forms/FieldAssistantBar.tsx +32 -0
  118. package/src/components/common/forms/HTMLEditor.tsx +48 -0
  119. package/src/components/common/forms/IconPicker.tsx +129 -0
  120. package/src/components/common/forms/Input.tsx +362 -0
  121. package/src/components/common/forms/InputColor.tsx +36 -0
  122. package/src/components/common/forms/RadioInputs.tsx +62 -0
  123. package/src/components/common/forms/Select.tsx +214 -0
  124. package/src/components/common/forms/SimpleTagsInput.tsx +89 -0
  125. package/src/components/common/forms/TagInput.tsx +111 -0
  126. package/src/components/common/forms/Textarea.tsx +99 -0
  127. package/src/components/common/forms/ToggleButton.tsx +67 -0
  128. package/src/components/common/forms/UserInvitePicker.tsx +600 -0
  129. package/src/components/common/header/AppPageTitle.tsx +34 -0
  130. package/src/components/common/header/SubtitleAccordion.tsx +63 -0
  131. package/src/components/common/home/block/GetStarted.tsx +17 -0
  132. package/src/components/common/home/block/Hero.tsx +33 -0
  133. package/src/components/common/home/block/InstallShortcut.tsx +41 -0
  134. package/src/components/common/home/block/MarketplaceBlock.tsx +34 -0
  135. package/src/components/common/home/block/OriginStoryBanner.tsx +17 -0
  136. package/src/components/common/home/block/OsirusCTABlock.tsx +21 -0
  137. package/src/components/common/home/block/PromoFeatureSlider.tsx +260 -0
  138. package/src/components/common/layout/DetailHero.tsx +87 -0
  139. package/src/components/common/layout/SideNavLayout.tsx +1016 -0
  140. package/src/components/common/layout/account/AccountLayout.tsx +99 -0
  141. package/src/components/common/layout/admin/AdminLayout.tsx +17 -0
  142. package/src/components/common/layout/explore/ExploreLayout.tsx +23 -0
  143. package/src/components/common/layout/explore/ExploreLayoutContent.tsx +20 -0
  144. package/src/components/common/layout/explore/ExploreLayoutFilters.tsx +28 -0
  145. package/src/components/common/loading/LoadingScreen.tsx +86 -0
  146. package/src/components/common/loading/Spinner.tsx +12 -0
  147. package/src/components/common/state/InvalidInviteCard.tsx +32 -0
  148. package/src/components/common/table/TableFilter.tsx +205 -0
  149. package/src/components/common/table/TableHeader.tsx +33 -0
  150. package/src/components/common/table/TablePaging.tsx +190 -0
  151. package/src/components/common/table/TablePagingButton.tsx +64 -0
  152. package/src/components/common/table/TablePagingInput.tsx +79 -0
  153. package/src/components/common/useUrlSelectedModel.ts +7 -0
  154. package/src/components/docs/DocsSitePreviewPage.tsx +122 -0
  155. package/src/components/docs/block/DocsPageDetailBlock.tsx +333 -0
  156. package/src/components/docs/block/DocsSidebarTopContent.tsx +8 -0
  157. package/src/components/docs/block/DocsSitePagesBlock.tsx +81 -0
  158. package/src/components/docs/block/DocsSitesBlock.tsx +35 -0
  159. package/src/components/docs/modal/CreateDocsSiteModal.tsx +132 -0
  160. package/src/components/docs/table/DocsPagesTable.tsx +163 -0
  161. package/src/components/docs/table/DocsSitesTable.tsx +109 -0
  162. package/src/components/groups/block/GroupInitialAvatar.tsx +53 -0
  163. package/src/components/groups/grid/OrgGroupMembersGrid.tsx +253 -0
  164. package/src/components/groups/modal/AddGroupModal.tsx +138 -0
  165. package/src/components/groups/modal/OrgGroupMembersModal.tsx +171 -0
  166. package/src/components/groups/modal/OrgGroupPermissionsModal.tsx +184 -0
  167. package/src/components/groups/table/OrgGroupsTable.tsx +470 -0
  168. package/src/components/head/DefaultMetadata.tsx +135 -0
  169. package/src/components/head/PageSeo.tsx +198 -0
  170. package/src/components/hoc/WithAuth.tsx +82 -0
  171. package/src/components/hoc/WithCustomerIO.tsx +48 -0
  172. package/src/components/hoc/WithGTM.tsx +31 -0
  173. package/src/components/hoc/WithGlobalContext.tsx +30 -0
  174. package/src/components/hoc/WithReCaptcha.tsx +31 -0
  175. package/src/components/hoc/WithStripe.tsx +68 -0
  176. package/src/components/layout/SidebarSizer.tsx +63 -0
  177. package/src/components/layout/app-left-nav.tsx +31 -0
  178. package/src/components/layout/app-main-layout.tsx +39 -0
  179. package/src/components/layout/site-footer.tsx +11 -0
  180. package/src/components/layout/site-header.tsx +19 -0
  181. package/src/components/marketplace/card/ProductCard.tsx +178 -0
  182. package/src/components/media/blocks/MediaAttachmentsList.tsx +79 -0
  183. package/src/components/media/blocks/MediaDetails.tsx +139 -0
  184. package/src/components/media/blocks/MediaGrid.tsx +245 -0
  185. package/src/components/media/form/MediaMiniForm.tsx +105 -0
  186. package/src/components/media/form/UpdateMediaForm.tsx +209 -0
  187. package/src/components/media/items/CircleMediaPicker.tsx +76 -0
  188. package/src/components/media/items/MediaAttachmentLinks.tsx +98 -0
  189. package/src/components/media/items/MediaDocumentPreview.tsx +43 -0
  190. package/src/components/media/items/MediaFileIcon.tsx +30 -0
  191. package/src/components/media/items/MediaPickerBox.tsx +94 -0
  192. package/src/components/media/items/MediaPickerButton.tsx +37 -0
  193. package/src/components/media/items/MediaSourcePreview.tsx +35 -0
  194. package/src/components/media/modal/AddMediaModal.tsx +237 -0
  195. package/src/components/media/modal/MediaAttachmentsModal.tsx +113 -0
  196. package/src/components/media/modal/MediaBulkDeleteWarningModal.tsx +142 -0
  197. package/src/components/media/modal/MediaDeleteWarningModal.tsx +98 -0
  198. package/src/components/media/modal/MediaPickerModal.tsx +201 -0
  199. package/src/components/media/table/MediaTable.tsx +340 -0
  200. package/src/components/media/table/MediaTableActions.tsx +130 -0
  201. package/src/components/media/table/MediaTableFilter.tsx +163 -0
  202. package/src/components/modules/module-card-grid.tsx +19 -0
  203. package/src/components/modules/module-page.tsx +27 -0
  204. package/src/components/modules/resource-page.tsx +15 -0
  205. package/src/components/nav/AdminMobileMenu.tsx +228 -0
  206. package/src/components/nav/AppTopNav.tsx +53 -0
  207. package/src/components/nav/MobileMenu.tsx +132 -0
  208. package/src/components/nav/TopNav.tsx +137 -0
  209. package/src/components/openapi/DeleteTokenModal.tsx +72 -0
  210. package/src/components/openapi/actions/ApiTokenActionsMenu.tsx +141 -0
  211. package/src/components/openapi/actions/ApiTokenCreateModal.tsx +107 -0
  212. package/src/components/openapi/actions/ApiTokenEditModal.tsx +168 -0
  213. package/src/components/orgs/OrgCreateModal.tsx +126 -0
  214. package/src/components/orgs/OrgJumpRedirect.tsx +150 -0
  215. package/src/components/page/SiteContentPage.tsx +129 -0
  216. package/src/components/post/accordion/FilterPostCategoriesAccordion.tsx +126 -0
  217. package/src/components/post/block/FeaturedProductCard.tsx +31 -0
  218. package/src/components/post/block/FeaturedProviderCard.tsx +51 -0
  219. package/src/components/post/block/InTheNews.tsx +77 -0
  220. package/src/components/post/block/PostCardsGrid.tsx +56 -0
  221. package/src/components/post/block/PostContent.tsx +128 -0
  222. package/src/components/post/block/PostDetailPage.tsx +95 -0
  223. package/src/components/post/block/PostList.tsx +111 -0
  224. package/src/components/post/block/PostNextAndPrevButtons.tsx +78 -0
  225. package/src/components/post/block/PostPeopleAlsoReadBlock.tsx +69 -0
  226. package/src/components/post/block/PostRelatedCards.tsx +43 -0
  227. package/src/components/post/card/FeaturedPostCard.tsx +107 -0
  228. package/src/components/post/card/InTheNewsCard.tsx +162 -0
  229. package/src/components/post/card/PostCard.tsx +125 -0
  230. package/src/components/post/card/RelatedPostCard.tsx +115 -0
  231. package/src/components/post/form/UpdatePostForm.tsx +639 -0
  232. package/src/components/post/modal/CreatePostModal.tsx +115 -0
  233. package/src/components/post/modal/PreviewPostModal.tsx +82 -0
  234. package/src/components/post/nav/BlogCategoriesSideNav.tsx +55 -0
  235. package/src/components/post/table/PostsTable.tsx +284 -0
  236. package/src/components/pricing/block/AddOnRow.tsx +78 -0
  237. package/src/components/pricing/block/CompletePurchase.tsx +546 -0
  238. package/src/components/pricing/block/PlanPicker.tsx +76 -0
  239. package/src/components/pricing/card/PricingCard.tsx +291 -0
  240. package/src/components/pricing/form/AddBillingInformationForm.tsx +212 -0
  241. package/src/components/pricing/form/AddPaymentMethodForm.tsx +252 -0
  242. package/src/components/pricing/form/CouponCodeForm.tsx +118 -0
  243. package/src/components/pricing/form/StripePaymentForm.tsx +106 -0
  244. package/src/components/product/block/ProductScreenshot.tsx +22 -0
  245. package/src/components/product/block/ProductScreenshotPreview.tsx +46 -0
  246. package/src/components/product/button/MediaScreenshotPicker.tsx +72 -0
  247. package/src/components/product/form/UpdateProductForm.tsx +718 -0
  248. package/src/components/product/modal/CreateProductModal.tsx +128 -0
  249. package/src/components/product/modal/UpdateProductCouponModal.tsx +227 -0
  250. package/src/components/product/modal/UpdateProductPlanModal.tsx +291 -0
  251. package/src/components/product/modal/UpdateProductVersionModal.tsx +236 -0
  252. package/src/components/product/table/ProductCouponsTable.tsx +100 -0
  253. package/src/components/product/table/ProductPlansTable.tsx +118 -0
  254. package/src/components/product/table/ProductVersionsAdminTable.tsx +103 -0
  255. package/src/components/product/table/ProductVersionsTable.tsx +111 -0
  256. package/src/components/product/table/ProductsTable.tsx +133 -0
  257. package/src/components/projects/ProjectFilesCard.tsx +134 -0
  258. package/src/components/projects/ProjectItemOptionButton.tsx +112 -0
  259. package/src/components/projects/ProjectPickerNav.tsx +440 -0
  260. package/src/components/projects/ProjectQuickCreateModal.tsx +159 -0
  261. package/src/components/projects/ProjectSidebarList.tsx +183 -0
  262. package/src/components/projects/actions/ProjectActionsMenu.tsx +77 -0
  263. package/src/components/projects/actions/ProjectCreateModal.tsx +577 -0
  264. package/src/components/projects/actions/ProjectEditModal.tsx +345 -0
  265. package/src/components/projects/actions/ProjectFileGrid.tsx +153 -0
  266. package/src/components/projects/actions/ProjectFilesModal.tsx +259 -0
  267. package/src/components/projects/actions/ProjectFilesPicker.tsx +31 -0
  268. package/src/components/projects/actions/ProjectFilesUploadModal.tsx +181 -0
  269. package/src/components/projects/actions/ProjectInstructions.tsx +160 -0
  270. package/src/components/projects/actions/RenameProjectModal.tsx +120 -0
  271. package/src/components/projects/actions/index.tsx +98 -0
  272. package/src/components/projects/block/HeaderProjectImagePicker.tsx +52 -0
  273. package/src/components/projects/permission/ProjectPermissionInviteModal.tsx +181 -0
  274. package/src/components/projects/permission/ProjectUserPermission.tsx +170 -0
  275. package/src/components/projects/postByCategory.tsx +118 -0
  276. package/src/components/projects/projectFileHistory.tsx +48 -0
  277. package/src/components/projects/table/ProjectTable.tsx +365 -0
  278. package/src/components/provider/BuildspecForm.tsx +288 -0
  279. package/src/components/provider/CreateProviderModal.tsx +210 -0
  280. package/src/components/provider/FeaturedProviders.tsx +137 -0
  281. package/src/components/provider/ProviderConnectModal.tsx +324 -0
  282. package/src/components/provider/form/UpdateProviderForm.tsx +449 -0
  283. package/src/components/provider/table/ProvidersTable.tsx +144 -0
  284. package/src/components/providers/ProviderFeaturesSideNav.tsx +52 -0
  285. package/src/components/settings/SettingsLayout.tsx +14 -0
  286. package/src/components/settings/SettingsSidebarNav.tsx +53 -0
  287. package/src/components/settings/settingsNav.ts +96 -0
  288. package/src/components/site/modal/UpdateSiteModal.tsx +134 -0
  289. package/src/components/site/table/SiteTable.tsx +198 -0
  290. package/src/components/starter/list-panel.tsx +12 -0
  291. package/src/components/starter/starter-overview.tsx +32 -0
  292. package/src/components/starter/stats-grid.tsx +20 -0
  293. package/src/components/storage/VectorStoreFileDeleteButton.tsx +71 -0
  294. package/src/components/storage/actions/VectorStoreActionsMenu.tsx +70 -0
  295. package/src/components/storage/actions/VectorStoreEditModal.tsx +220 -0
  296. package/src/components/storage/actions/VectorStoreFileActions.tsx +61 -0
  297. package/src/components/storage/actions/index.tsx +76 -0
  298. package/src/components/storage/addStorageModal.tsx +552 -0
  299. package/src/components/storage/table/vectorStoreTable.tsx +461 -0
  300. package/src/components/storage/vectorFilesModal.tsx +209 -0
  301. package/src/components/storage/vectorStoreFileGrid.tsx +384 -0
  302. package/src/components/tag/modal/UpdateTagModal.tsx +192 -0
  303. package/src/components/tag/table/TagTable.tsx +138 -0
  304. package/src/components/user/block/BadgesBlock.tsx +26 -0
  305. package/src/components/user/form/ChangePasswordForm.tsx +119 -0
  306. package/src/components/user/form/ProfileForm.tsx +168 -0
  307. package/src/components/user/grid/UserGrid.tsx +475 -0
  308. package/src/components/user/modal/AddUserModal.tsx +165 -0
  309. package/src/components/user/modal/UpdateUserDetailsModal.tsx +319 -0
  310. package/src/components/user/modal/UpgradeUserLimitModal.tsx +123 -0
  311. package/src/components/user/modal/UserPermissionsModal.tsx +251 -0
  312. package/src/components/user/table/UserTable.tsx +202 -0
  313. package/src/config/app.ts +16 -0
  314. package/src/config/modules.ts +100 -0
  315. package/src/config/navigation.ts +28 -0
  316. package/src/config/runtime.ts +3 -0
  317. package/src/context/CheckoutContext.tsx +123 -0
  318. package/src/context/ProjectContext.tsx +123 -0
  319. package/src/context/RouterContext.tsx +127 -0
  320. package/src/context/UIContext.tsx +47 -0
  321. package/src/context/UserAuthContext.tsx +26 -0
  322. package/src/context/VectorStoreContext.tsx +51 -0
  323. package/src/context/index.ts +2 -0
  324. package/src/data/bootstrap-icons.json +2080 -0
  325. package/src/data/bootstrap.ts +196 -0
  326. package/src/data/bootstrapIcons.ts +28 -0
  327. package/src/enum/AppEnvironments.ts +4 -0
  328. package/src/enum/HTTPErrorStatus.ts +10 -0
  329. package/src/helpers/api/index.ts +123 -0
  330. package/src/helpers/constants/index.ts +4 -0
  331. package/src/helpers/constants/messages.ts +1 -0
  332. package/src/helpers/constants/regex.ts +10 -0
  333. package/src/helpers/constants/stripe.ts +1 -0
  334. package/src/helpers/constants/system-agent.ts +12 -0
  335. package/src/helpers/data-transform/bytesToSize.ts +8 -0
  336. package/src/helpers/data-transform/dropzone.ts +116 -0
  337. package/src/helpers/data-transform/filterUtils.ts +21 -0
  338. package/src/helpers/data-transform/index.ts +4 -0
  339. package/src/helpers/data-transform/operations.ts +3 -0
  340. package/src/helpers/data-transform/paging.ts +24 -0
  341. package/src/helpers/data-transform/stringCaseTransform.ts +34 -0
  342. package/src/helpers/date/index.ts +149 -0
  343. package/src/helpers/error/formErrorHandler.tsx +38 -0
  344. package/src/helpers/images/assets.ts +32 -0
  345. package/src/helpers/images/defaultProfileImage.ts +21 -0
  346. package/src/helpers/images/fileType.ts +123 -0
  347. package/src/helpers/images/index.ts +3 -0
  348. package/src/helpers/navigation/routeScroll.ts +29 -0
  349. package/src/helpers/pageScreenshot.ts +176 -0
  350. package/src/helpers/permissions/index.ts +292 -0
  351. package/src/helpers/providers/providerFeatures.ts +29 -0
  352. package/src/helpers/sharer/index.ts +44 -0
  353. package/src/helpers/sitemap/sitemap-utils.ts +50 -0
  354. package/src/helpers/slugUtils/index.ts +39 -0
  355. package/src/helpers/sonicVoices.ts +22 -0
  356. package/src/helpers/string/index.ts +93 -0
  357. package/src/helpers/theme/colors.ts +27 -0
  358. package/src/helpers/types/api.ts +22 -0
  359. package/src/helpers/types/customer-io.ts +47 -0
  360. package/src/helpers/types/data-layer.ts +25 -0
  361. package/src/helpers/types/index.ts +4 -0
  362. package/src/helpers/types/nav.ts +13 -0
  363. package/src/helpers/types/page-props.ts +31 -0
  364. package/src/helpers/types/select-option.ts +4 -0
  365. package/src/helpers/types/utils.ts +7 -0
  366. package/src/helpers/url/index.ts +26 -0
  367. package/src/hooks/auth/useAccountStore.ts +69 -0
  368. package/src/hooks/auth/useAuthStore.ts +162 -0
  369. package/src/hooks/category/useCategoryStore.ts +71 -0
  370. package/src/hooks/index.ts +17 -0
  371. package/src/hooks/media/useMediaStore.ts +46 -0
  372. package/src/hooks/post/usePostStore.ts +64 -0
  373. package/src/hooks/post/usePostUtils.ts +27 -0
  374. package/src/hooks/product/useProductPlanStore.ts +73 -0
  375. package/src/hooks/product/useProductStore.ts +64 -0
  376. package/src/hooks/product/useProductVersionStore.ts +57 -0
  377. package/src/hooks/site/useSiteStore.ts +53 -0
  378. package/src/hooks/tag/useTagStore.ts +65 -0
  379. package/src/hooks/utils/useAutosizeTextArea.ts +20 -0
  380. package/src/hooks/utils/useCountries.ts +25 -0
  381. package/src/hooks/utils/useGA4DataLayer.ts +25 -0
  382. package/src/hooks/utils/useNavOptions.ts +241 -0
  383. package/src/hooks/utils/useSearchAndFilterCommon.ts +78 -0
  384. package/src/hooks/utils/useTrackingEvents.ts +65 -0
  385. package/src/lib/app-paths.ts +19 -0
  386. package/src/lib/auth.ts +42 -0
  387. package/src/lib/next-router.ts +164 -0
  388. package/src/lib/routes.ts +36 -0
  389. package/src/lib/security.ts +19 -0
  390. package/src/pages/404.tsx +104 -0
  391. package/src/pages/500.tsx +26 -0
  392. package/src/pages/_app.tsx +87 -0
  393. package/src/pages/_document.tsx +26 -0
  394. package/src/pages/account/verify.tsx +178 -0
  395. package/src/pages/admin/activity/[activityId].tsx +77 -0
  396. package/src/pages/admin/activity/bans.tsx +197 -0
  397. package/src/pages/admin/activity/index.tsx +207 -0
  398. package/src/pages/admin/activity/settings.tsx +189 -0
  399. package/src/pages/admin/categories/index.tsx +61 -0
  400. package/src/pages/admin/coupons/index.tsx +38 -0
  401. package/src/pages/admin/entitlements/index.tsx +646 -0
  402. package/src/pages/admin/index.tsx +65 -0
  403. package/src/pages/admin/media/[id]/index.tsx +55 -0
  404. package/src/pages/admin/media/index.tsx +62 -0
  405. package/src/pages/admin/orgs/[orgId]/[name].tsx +1 -0
  406. package/src/pages/admin/orgs/index.tsx +256 -0
  407. package/src/pages/admin/plans/index.tsx +26 -0
  408. package/src/pages/admin/posts/[id].tsx +80 -0
  409. package/src/pages/admin/posts/index.tsx +63 -0
  410. package/src/pages/admin/products/[id].tsx +71 -0
  411. package/src/pages/admin/products/index.tsx +62 -0
  412. package/src/pages/admin/profile/index.tsx +26 -0
  413. package/src/pages/admin/providers/[id].tsx +77 -0
  414. package/src/pages/admin/providers/index.tsx +63 -0
  415. package/src/pages/admin/tags/index.tsx +58 -0
  416. package/src/pages/admin/users/[userId]/[name].tsx +1 -0
  417. package/src/pages/admin/users/index.tsx +295 -0
  418. package/src/pages/admin/versions/[id].tsx +211 -0
  419. package/src/pages/admin/versions/index.tsx +25 -0
  420. package/src/pages/blog/[postSlug].tsx +106 -0
  421. package/src/pages/blog/c/[categorySlug]/index.tsx +126 -0
  422. package/src/pages/blog/index.tsx +37 -0
  423. package/src/pages/cart/[productPlanSlug].tsx +631 -0
  424. package/src/pages/checkout/[productPlanSlug].tsx +368 -0
  425. package/src/pages/docs/index.tsx +24 -0
  426. package/src/pages/docs/sites/[siteId]/[siteName]/index.tsx +67 -0
  427. package/src/pages/docs/sites/[siteId]/[siteName]/pages/[pagesId].tsx +79 -0
  428. package/src/pages/docs/sites/[siteId]/[siteName]/pages/index.tsx +67 -0
  429. package/src/pages/docs/sites/[siteId]/[siteName]/preview/[[...slug]].tsx +7 -0
  430. package/src/pages/forgot.tsx +46 -0
  431. package/src/pages/groups/[groupId]/[name].tsx +337 -0
  432. package/src/pages/groups/index.tsx +62 -0
  433. package/src/pages/healthcheck.tsx +7 -0
  434. package/src/pages/index.tsx +309 -0
  435. package/src/pages/login.tsx +75 -0
  436. package/src/pages/marketplace/[slug].tsx +171 -0
  437. package/src/pages/marketplace/index.tsx +92 -0
  438. package/src/pages/openapi/index.tsx +77 -0
  439. package/src/pages/openapi/tokens/index.tsx +128 -0
  440. package/src/pages/org/[name]/settings.tsx +14 -0
  441. package/src/pages/org/[name]/token/index.tsx +109 -0
  442. package/src/pages/pricing.tsx +242 -0
  443. package/src/pages/projects/[projectId]/[name]/files/index.tsx +121 -0
  444. package/src/pages/projects/[projectId]/[name]/index.tsx +305 -0
  445. package/src/pages/projects/[projectId]/[name]/permission/index.tsx +143 -0
  446. package/src/pages/projects/[projectId]/token/index.tsx +120 -0
  447. package/src/pages/projects/index.tsx +129 -0
  448. package/src/pages/providers/[name].tsx +512 -0
  449. package/src/pages/providers/index.tsx +472 -0
  450. package/src/pages/reset.tsx +69 -0
  451. package/src/pages/settings/billing/index.tsx +41 -0
  452. package/src/pages/settings/index.tsx +133 -0
  453. package/src/pages/settings/organizations/[orgId]/invite/index.tsx +162 -0
  454. package/src/pages/settings/organizations/[orgId]/settings/index.tsx +98 -0
  455. package/src/pages/settings/organizations/[orgId]/token/index.tsx +109 -0
  456. package/src/pages/settings/organizations/index.tsx +148 -0
  457. package/src/pages/settings/organizations/new/index.tsx +252 -0
  458. package/src/pages/settings/profile/change-password.tsx +26 -0
  459. package/src/pages/settings/profile/index.tsx +103 -0
  460. package/src/pages/settings/profile/org-profile.tsx +127 -0
  461. package/src/pages/settings/profile/profile.tsx +26 -0
  462. package/src/pages/settings/sites/index.tsx +85 -0
  463. package/src/pages/settings/subscriptions/index.tsx +76 -0
  464. package/src/pages/settings/tokens/index.tsx +149 -0
  465. package/src/pages/signup/index.tsx +83 -0
  466. package/src/pages/signup/verify.tsx +138 -0
  467. package/src/pages/sites/[siteId]/[siteName]/[[...slug]].tsx +103 -0
  468. package/src/pages/sites/[siteId]/[siteName]/pages/[pageId].tsx +243 -0
  469. package/src/pages/sites/[siteId]/[siteName]/pages/index.tsx +140 -0
  470. package/src/pages/sites/host/[[...slug]].tsx +75 -0
  471. package/src/pages/storage/[vectorStoreId]/[name].tsx +653 -0
  472. package/src/pages/storage/index.tsx +526 -0
  473. package/src/pages/update/index.tsx +109 -0
  474. package/src/pages/update/verify.tsx +121 -0
  475. package/src/pages/users/[userId]/[name].tsx +791 -0
  476. package/src/pages/users/index.tsx +152 -0
  477. package/src/sass/app.scss +59 -0
  478. package/src/sass/base/_animations.scss +70 -0
  479. package/src/sass/base/_borders.scss +78 -0
  480. package/src/sass/base/_custom-backgrounds.scss +107 -0
  481. package/src/sass/base/_interactions.scss +35 -0
  482. package/src/sass/base/_main.scss +239 -0
  483. package/src/sass/base/_positions.scss +111 -0
  484. package/src/sass/base/_sizes.scss +120 -0
  485. package/src/sass/base/_typography.scss +184 -0
  486. package/src/sass/components/_accordion.scss +63 -0
  487. package/src/sass/components/_ad.scss +44 -0
  488. package/src/sass/components/_avatar.scss +18 -0
  489. package/src/sass/components/_badge.scss +6 -0
  490. package/src/sass/components/_button.scss +53 -0
  491. package/src/sass/components/_checkbox.scss +52 -0
  492. package/src/sass/components/_circle-media-picker.scss +32 -0
  493. package/src/sass/components/_code-snipped.scss +50 -0
  494. package/src/sass/components/_date-time-picker.scss +796 -0
  495. package/src/sass/components/_dialog.scss +27 -0
  496. package/src/sass/components/_gradients.scss +7 -0
  497. package/src/sass/components/_group-detail.scss +620 -0
  498. package/src/sass/components/_input.scss +567 -0
  499. package/src/sass/components/_menu.scss +31 -0
  500. package/src/sass/components/_modal.scss +273 -0
  501. package/src/sass/components/_popover.scss +29 -0
  502. package/src/sass/components/_rich-content.scss +531 -0
  503. package/src/sass/components/_spinner.scss +71 -0
  504. package/src/sass/components/_swagger.scss +7 -0
  505. package/src/sass/components/_swiper.scss +16 -0
  506. package/src/sass/components/_switch.scss +46 -0
  507. package/src/sass/components/_table.scss +39 -0
  508. package/src/sass/components/_tabs.scss +38 -0
  509. package/src/sass/components/_tag-input.scss +28 -0
  510. package/src/sass/components/_toast.scss +26 -0
  511. package/src/sass/components/_tooltip.scss +31 -0
  512. package/src/sass/layout/_base.scss +937 -0
  513. package/src/sass/layout/_footer.scss +148 -0
  514. package/src/sass/layout/_hero.scss +33 -0
  515. package/src/sass/layout/_nav.scss +77 -0
  516. package/src/sass/layout/_news-card-grid.scss +507 -0
  517. package/src/sass/utilities/_mixins.scss +21 -0
  518. package/src/sass/utilities/_sizes.scss +137 -0
  519. package/src/sass/utilities/_utils.scss +23 -0
  520. package/src/sass/utilities/_variables.scss +115 -0
  521. package/src/store/hooks.ts +5 -0
  522. package/src/store/hydrate.ts +1 -0
  523. package/src/store/model/activity.model.ts +52 -0
  524. package/src/store/model/address.model.ts +9 -0
  525. package/src/store/model/apiToken.model.ts +26 -0
  526. package/src/store/model/category.model.ts +20 -0
  527. package/src/store/model/entityStatus.model.ts +25 -0
  528. package/src/store/model/index.ts +25 -0
  529. package/src/store/model/invoice.model.ts +37 -0
  530. package/src/store/model/media.model.ts +70 -0
  531. package/src/store/model/org-group-permission.model.ts +16 -0
  532. package/src/store/model/org-group.model.ts +14 -0
  533. package/src/store/model/org-membership.model.ts +23 -0
  534. package/src/store/model/org.model.ts +13 -0
  535. package/src/store/model/page.model.ts +33 -0
  536. package/src/store/model/post.model.ts +60 -0
  537. package/src/store/model/product-coupon.model.ts +42 -0
  538. package/src/store/model/product-feature-entitlement.ts +40 -0
  539. package/src/store/model/product-feature.ts +29 -0
  540. package/src/store/model/product-plan.model.ts +120 -0
  541. package/src/store/model/product-version.model.ts +24 -0
  542. package/src/store/model/product.model.ts +91 -0
  543. package/src/store/model/project-file.model.ts +18 -0
  544. package/src/store/model/project-user-permission.model.ts +41 -0
  545. package/src/store/model/project.model.ts +48 -0
  546. package/src/store/model/provider.model.ts +118 -0
  547. package/src/store/model/purchase.model.ts +19 -0
  548. package/src/store/model/site-crawl-job.model.ts +31 -0
  549. package/src/store/model/site-page.model.ts +37 -0
  550. package/src/store/model/site.model.ts +15 -0
  551. package/src/store/model/subscription.model.ts +60 -0
  552. package/src/store/model/tag.model.ts +18 -0
  553. package/src/store/model/user-permission.model.ts +21 -0
  554. package/src/store/model/user.model.ts +97 -0
  555. package/src/store/model/vector-store-file.model.ts +40 -0
  556. package/src/store/model/vector-store.model.ts +41 -0
  557. package/src/store/slice/api/accountApiSlice.ts +92 -0
  558. package/src/store/slice/api/accountSlice.ts +57 -0
  559. package/src/store/slice/api/activityApiSlice.ts +218 -0
  560. package/src/store/slice/api/apiTokenSlice.ts +153 -0
  561. package/src/store/slice/api/authApiSlice.ts +220 -0
  562. package/src/store/slice/api/base-domain-api.ts +19 -0
  563. package/src/store/slice/api/billingUnitTypesApiSlice.ts +45 -0
  564. package/src/store/slice/api/bootstrapIconApiSlice.ts +36 -0
  565. package/src/store/slice/api/categoriesApiSlice.ts +101 -0
  566. package/src/store/slice/api/fontawesomeApiSlice.ts +43 -0
  567. package/src/store/slice/api/invoiceApiSlice.ts +37 -0
  568. package/src/store/slice/api/leadApiSlice.ts +48 -0
  569. package/src/store/slice/api/mediaApiSlice.ts +276 -0
  570. package/src/store/slice/api/orgApiSlice.ts +185 -0
  571. package/src/store/slice/api/orgGroupApiSlice.ts +146 -0
  572. package/src/store/slice/api/pageApiSlice.ts +111 -0
  573. package/src/store/slice/api/paymentApiSlice.ts +27 -0
  574. package/src/store/slice/api/postApiSlice.ts +369 -0
  575. package/src/store/slice/api/productCouponsApiSlice.ts +101 -0
  576. package/src/store/slice/api/productFeaturesApiSlice.ts +93 -0
  577. package/src/store/slice/api/productPlansApiSlice.ts +142 -0
  578. package/src/store/slice/api/productSubscriptionsApiSlice.ts +156 -0
  579. package/src/store/slice/api/productVersionsApiSlice.ts +116 -0
  580. package/src/store/slice/api/productsApiSlice.ts +169 -0
  581. package/src/store/slice/api/projectApiSlice.ts +135 -0
  582. package/src/store/slice/api/projectFileApiSlice.ts +152 -0
  583. package/src/store/slice/api/projectUserPermissionApiSlice.ts +153 -0
  584. package/src/store/slice/api/providerApiSlice.ts +259 -0
  585. package/src/store/slice/api/providerSettingApiSlice.ts +174 -0
  586. package/src/store/slice/api/siteApiSlice.ts +93 -0
  587. package/src/store/slice/api/stripeApiSlice.ts +114 -0
  588. package/src/store/slice/api/tagsApiSlice.ts +96 -0
  589. package/src/store/slice/api/userApiSlice.ts +305 -0
  590. package/src/store/slice/api/vectorStoreApiSlice.ts +119 -0
  591. package/src/store/slice/api/vectorStoreFileApiSlice.ts +127 -0
  592. package/src/store/store.ts +130 -0
  593. package/src/types/bootstrap.ts +30 -0
  594. package/tsconfig.json +103 -0
package/README.md ADDED
@@ -0,0 +1,705 @@
1
+ # App Studio
2
+
3
+ App Studio is a reusable full-stack SaaS admin starter for building and operating custom products.
4
+
5
+ By default, the admin app is intended to run under a mounted path such as `/admin`, while the root `/` can be served by a separate CMS or public website.
6
+
7
+ The intended use is:
8
+
9
+ - start with a real repo, not just a UI kit
10
+ - keep a reusable core for auth, users, orgs, billing, settings, and admin
11
+ - add your own product-specific models, pages, and workflows on top
12
+ - ship with your own containers, pipelines, and deployment flow
13
+ - bootstrap new products with `app.sh`, install the NPM UI/API packages, then generate app code from an editable schema
14
+
15
+ This is the right shape for products such as:
16
+
17
+ - an admin portal
18
+ - a site provisioning portal
19
+ - a multi-tenant control plane
20
+ - a customer success or operations dashboard
21
+ - a product that sells plans and manages installations
22
+
23
+ ## What App Studio Is
24
+
25
+ App Studio is a repo-level starter for:
26
+
27
+ - `app`: React/Next admin UI
28
+ - `api`: backend service
29
+ - `devops`: Docker and pipeline setup
30
+ - `billing`: Stripe-ready product model pattern
31
+ - `core domains`: users, orgs, projects, providers, settings, admin
32
+
33
+ App Studio now supports a hybrid bootstrap model: this repo remains the source foundation, while reusable API/UI pieces can be published as NPM packages and installed into product repos.
34
+
35
+ ## Bootstrap With app.sh
36
+
37
+ For new projects, start with a blank repo and download `app.sh` into the repo root.
38
+
39
+ ```bash
40
+ curl -fsSL "$APPSTUDIO_BOOTSTRAP_URL" -o app.sh
41
+ chmod +x app.sh
42
+ ./app.sh init --name my-product
43
+ ./app.sh edit-schema
44
+ ./app.sh install
45
+ ./app.sh generate
46
+ ```
47
+
48
+ The release pipeline publishes the latest script to the `application-studio` S3 bucket by default:
49
+
50
+ ```bash
51
+ curl -fsSL "https://s3.amazonaws.com/application-studio/app.sh" -o app.sh
52
+ ```
53
+
54
+ The S3 release upload is configured with:
55
+
56
+ ```text
57
+ APPSTUDIO_BOOTSTRAP_S3_URI=s3://application-studio/app.sh
58
+ ```
59
+
60
+ The bucket or CloudFront distribution should allow public read access to that object. If the bucket still uses object ACLs, set `APPSTUDIO_BOOTSTRAP_S3_ACL=public-read`; otherwise leave it unset and use a bucket policy. The pipeline also uploads a versioned copy next to it, such as `app-0.1.0.sh`, unless `APPSTUDIO_BOOTSTRAP_S3_VERSION_URI` is set.
61
+
62
+ If you already have `app.sh`, the local commands are:
63
+
64
+ ```bash
65
+ ./app.sh init --name my-product
66
+ ./app.sh edit-schema
67
+ ./app.sh install
68
+ ./app.sh generate
69
+ ```
70
+
71
+ The intended flow is:
72
+
73
+ 1. `init` creates a lightweight local skeleton and `appstudio.schema.json`.
74
+ 2. You edit the schema for the product shape.
75
+ 3. `install` installs the reusable UI and API packages from NPM, or links local checkouts when configured.
76
+ 4. `generate` links local packages when available, then overlays local routes, models, pages, and module code on top.
77
+
78
+ The generated repo also gets its own deployable-app scaffold:
79
+
80
+ - `bitbucket-pipelines.yml` for Docker image publish and CloudFormation deploy
81
+ - `docker-compose.yml` for local app/API development
82
+ - `devops/docker/Dockerfile.app`
83
+ - `devops/docker/Dockerfile.api`
84
+ - `devops/cloudformation/app.yml`
85
+
86
+ The default packages are `@spacemade/ui` and `@spacemade/api`:
87
+
88
+ ```bash
89
+ ./app.sh install
90
+ ```
91
+
92
+ When developing the reusable packages and a product app side by side, point the app at the local checkout so imports resolve through `node_modules` exactly like the published packages:
93
+
94
+ ```bash
95
+ SPACEMADE_UI_PATH=../appstudio \
96
+ SPACEMADE_API_PATH=../appstudio/api \
97
+ ./app.sh install
98
+ ./app.sh generate
99
+ ```
100
+
101
+ `./app.sh link-core ../appstudio` also works directly. With no path, it checks common sibling folders such as `../appstudio`, `../spacemade-ui`, and `../ui`.
102
+
103
+ That creates:
104
+
105
+ ```text
106
+ node_modules/@spacemade/ui -> ../appstudio
107
+ node_modules/@spacemade/api -> ../appstudio/api
108
+ ```
109
+
110
+ This is the best local loop because the product app exercises the real package names and package boundaries while still picking up edits from the reusable package checkout immediately.
111
+
112
+ ## Repo And NPM Package
113
+
114
+ Use the repo when you need:
115
+
116
+ - frontend app structure
117
+ - backend API structure
118
+ - data model conventions
119
+ - Docker and deployment setup
120
+ - pipelines
121
+ - environment contracts
122
+ - product bootstrapping
123
+
124
+ Use NPM packages for:
125
+
126
+ - reusable API/UI core
127
+ - shared UI components
128
+ - shared types and schemas
129
+ - Stripe and auth helpers
130
+ - the schema-driven generator
131
+
132
+ Recommended strategy:
133
+
134
+ 1. Keep `appstudio` as the source repo for the reusable UI, API, and generator.
135
+ 2. Publish stable pieces as `@spacemade/*` packages.
136
+ 3. Build product repos from a blank skeleton using `app.sh`.
137
+ 4. Let the generator add product-specific modules on top of the installed packages.
138
+
139
+ For example:
140
+
141
+ ```text
142
+ appstudio/ # starter repo
143
+ admin-app/ # product repo built from appstudio
144
+
145
+ @spacemade/ui # reusable admin UI and generator CLI
146
+ @spacemade/api # reusable API service
147
+ @spacemade/types # shared types
148
+ @spacemade/stripe # Stripe helpers
149
+ @spacemade/auth # auth helpers
150
+ ```
151
+
152
+ ## Best Fit Product Example
153
+
154
+ If you are building an Admin portal, `appstudio` should power:
155
+
156
+ - account creation and login
157
+ - organization and workspace management
158
+ - user invites and roles
159
+ - pricing and subscriptions
160
+ - product instance creation
161
+ - install management
162
+ - environment and provider configuration
163
+ - support/admin operations
164
+
165
+ Then your product repo adds:
166
+
167
+ - product-specific models
168
+ - site/install lifecycle flows
169
+ - domain mapping
170
+ - provisioning actions
171
+ - template selection
172
+ - product management UI
173
+
174
+ ## Current Structure
175
+
176
+ ```text
177
+ api/
178
+ lib/
179
+ controllers/
180
+ data/
181
+ models/
182
+ repositories/
183
+ services/
184
+ pages/api/
185
+ devops/
186
+ docker/
187
+ src/
188
+ app/
189
+ components/
190
+ config/
191
+ data/
192
+ lib/
193
+ types/
194
+ docs/
195
+ cms-quickstart.md
196
+ gallery-quickstart.md
197
+ gpu-marketplace-quickstart.md
198
+ metaverse-quickstart.md
199
+ migration-plan.md
200
+ modules.md
201
+ nft-quickstart.md
202
+ simple-cms-quickstart.md
203
+ docker-compose.yml
204
+ bitbucket-pipelines.yml
205
+ cmd.sh
206
+ ```
207
+
208
+ ## Mounted Admin App
209
+
210
+ App Studio is designed to work as an admin application mounted under a subpath.
211
+
212
+ Examples:
213
+
214
+ - `/admin`
215
+ - `/custom`
216
+
217
+ Recommended deployment shape:
218
+
219
+ - `/` serves the public CMS or website
220
+ - `/admin` proxies to the App Studio React app
221
+ - `/admin/api` or a sibling API hostname proxies to the App Studio API service
222
+
223
+ Main setting:
224
+
225
+ - `NEXT_PUBLIC_APP_BASE_PATH=/admin`
226
+
227
+ This is wired through:
228
+
229
+ - [`next.config.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/next.config.ts)
230
+ - [`src/config/app.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/config/app.ts)
231
+ - [`src/lib/app-paths.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/lib/app-paths.ts)
232
+ - [`middleware.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/middleware.ts)
233
+
234
+ ## Core Architecture
235
+
236
+ App Studio should own the reusable SaaS backbone.
237
+
238
+ Core domains:
239
+
240
+ - auth
241
+ - users
242
+ - orgs
243
+ - projects
244
+ - providers
245
+ - pricing
246
+ - settings
247
+ - admin
248
+
249
+ Product-specific domains should be added by the product repo.
250
+
251
+ Examples:
252
+
253
+ - `admin-install`
254
+ - `admin-template`
255
+ - `managed-site`
256
+ - `managed-domain`
257
+ - `managed-module`
258
+ - `managed-theme`
259
+ - `deployment-job`
260
+
261
+ ## How To Build A Custom Product On Top
262
+
263
+ ### 1. Start With App Studio Core
264
+
265
+ Keep these areas generic:
266
+
267
+ - login and session model
268
+ - org and membership model
269
+ - user roles and admin permissions
270
+ - plans and billing entities
271
+ - provider registry
272
+ - settings pages
273
+ - admin shell
274
+
275
+ ### 2. Add Your Product Domain
276
+
277
+ For a notepad app, add models such as:
278
+
279
+ - `Notebook`
280
+ - `Note`
281
+ - `NoteTag`
282
+ - `SharedNotePermission`
283
+
284
+ For an Admin portal, add models such as:
285
+
286
+ - `AdminInstall`
287
+ - `AdminTemplate`
288
+ - `AdminDomain`
289
+ - `ProvisionJob`
290
+ - `ManagedEnvironment`
291
+ - `BackupJob`
292
+
293
+ ### 3. Add Product Routes
294
+
295
+ Examples:
296
+
297
+ - `/installs`
298
+ - `/installs/[id]`
299
+ - `/templates`
300
+ - `/domains`
301
+ - `/deployments`
302
+
303
+ ### 4. Add Product API
304
+
305
+ Examples:
306
+
307
+ - `api/pages/api/installs/index.ts`
308
+ - `api/pages/api/installs/[id].ts`
309
+ - `api/pages/api/templates/index.ts`
310
+ - `api/pages/api/provision/index.ts`
311
+
312
+ ### 5. Add Product Services
313
+
314
+ Examples:
315
+
316
+ - install provisioning service
317
+ - domain connection service
318
+ - deployment orchestration service
319
+ - backup and restore service
320
+
321
+ ## Backend Pattern
322
+
323
+ The API follows this structure:
324
+
325
+ - `models`: domain shapes
326
+ - `repositories`: data access
327
+ - `services`: business logic
328
+ - `controllers`: response assembly
329
+ - `pages/api`: HTTP handlers
330
+
331
+ Example flow:
332
+
333
+ ```text
334
+ HTTP route
335
+ -> controller
336
+ -> service
337
+ -> repository
338
+ -> model/data
339
+ ```
340
+
341
+ Current reusable examples live in:
342
+
343
+ - [`api/lib/models`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/models)
344
+ - [`api/lib/services`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/services)
345
+ - [`api/lib/controllers`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/controllers)
346
+ - [`api/pages/api`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/pages/api)
347
+
348
+ ## Base App Startup
349
+
350
+ The reusable admin base now includes starter coverage for:
351
+
352
+ - activity
353
+ - addresses
354
+ - forms
355
+ - invoices
356
+ - media
357
+ - orgs
358
+ - posts
359
+ - products
360
+ - projects
361
+ - providers
362
+ - purchases
363
+ - sites
364
+ - subscriptions
365
+ - tags
366
+ - tickets
367
+ - usage
368
+ - users
369
+
370
+ For database startup in the API service:
371
+
372
+ 1. Configure database env vars for `api`
373
+ 2. Run `npm run migrate:up`
374
+ 3. Run `npm run seed:up`
375
+
376
+ Reference files:
377
+
378
+ - [`api/migrations/20260326093000-baseline.js`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/migrations/20260326093000-baseline.js)
379
+ - [`api/seeders/20260326094500-base-app.js`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/seeders/20260326094500-base-app.js)
380
+ - [`api/doc/migration-baseline.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/doc/migration-baseline.md)
381
+
382
+ ## Local Docker Dev
383
+
384
+ App Studio is set up for local containerized development with bind mounts and watch-friendly polling.
385
+
386
+ Main files:
387
+
388
+ - [`docker-compose.yml`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docker-compose.yml)
389
+ - [`devops/docker/Dockerfile.app`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/Dockerfile.app)
390
+ - [`devops/docker/Dockerfile.api`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/Dockerfile.api)
391
+ - [`devops/docker/entrypoint/app-docker-entrypoint.sh`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/entrypoint/app-docker-entrypoint.sh)
392
+ - [`devops/docker/entrypoint/api-docker-entrypoint.sh`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/entrypoint/api-docker-entrypoint.sh)
393
+ - [`.env`](/mnt/c/wsl/osirus-ai/submodules/appstudio/.env)
394
+
395
+ Recommended local flow:
396
+
397
+ 1. Configure `.env`
398
+ 2. Start containers with `docker compose up --build`
399
+ 3. Open the app on `http://localhost:3000`
400
+ 4. Open the API on `http://localhost:3001`
401
+ 5. Run `npm run migrate:up` and `npm run seed:up` inside the API container when ready
402
+
403
+ Dev-friendly behavior included:
404
+
405
+ - bind mounts for app and API source
406
+ - polling enabled for WSL/docker watch behavior
407
+ - named volumes for `node_modules` and `.next` cache
408
+ - API bind mounts for `config`, `migrations`, `seeders`, and `lib`
409
+ - default local auth/session env values for quick access
410
+
411
+ Important local envs:
412
+
413
+ - `NEXT_PUBLIC_APP_BASE_PATH`
414
+ - `WATCHPACK_POLLING_INTERVAL`
415
+ - `API_WATCHPACK_POLLING_INTERVAL`
416
+ - `NEXT_PUBLIC_DEFAULT_USER_ID`
417
+ - `NEXT_PUBLIC_DEFAULT_ROLE`
418
+ - `NEXT_PUBLIC_DEFAULT_ORG_ROLE`
419
+ - `DEFAULT_USER_ID`
420
+ - `DEFAULT_ROLE`
421
+ - `DEFAULT_ORG_ROLE`
422
+
423
+ ## Security Layer
424
+
425
+ App Studio now includes a reusable starter security layer for the admin surface.
426
+
427
+ Frontend security files:
428
+
429
+ - [`middleware.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/middleware.ts)
430
+ - [`src/helpers/permissions/index.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/helpers/permissions/index.ts)
431
+ - [`src/lib/auth.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/lib/auth.ts)
432
+ - [`src/lib/security.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/lib/security.ts)
433
+
434
+ API security files:
435
+
436
+ - [`api/lib/auth/session.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/auth/session.ts)
437
+ - [`api/lib/security/permissions.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/security/permissions.ts)
438
+ - [`api/lib/middleware/with-auth.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/middleware/with-auth.ts)
439
+
440
+ Default behavior:
441
+
442
+ - `/` and `/pricing` remain public
443
+ - core app routes require an authenticated session
444
+ - `admin` requires admin-style access
445
+ - API domain routes require auth and check CRUD permission by role
446
+
447
+ ## Agents
448
+
449
+ App Studio now includes starter agent scaffolding, but agents are treated as part of the product being built, not tied to a fixed legacy app.
450
+
451
+ Files:
452
+
453
+ - [`src/app/agents/page.tsx`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/app/agents/page.tsx)
454
+ - [`api/lib/models/agent.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/models/agent.ts)
455
+ - [`api/lib/data/agents.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/lib/data/agents.ts)
456
+ - [`api/pages/api/agents/index.ts`](/mnt/c/wsl/osirus-ai/submodules/appstudio/api/pages/api/agents/index.ts)
457
+
458
+ Use agents for the current product:
459
+
460
+ - support agents for the admin portal
461
+ - publishing agents for the CMS website
462
+ - provisioning agents for install systems
463
+ - product-specific automation workers
464
+
465
+ Starter session inputs:
466
+
467
+ - frontend cookies: `appstudio_user_id`, `appstudio_role`, `appstudio_org_role`, `appstudio_active_org_id`, `appstudio_active_project_id`
468
+ - API headers: `x-appstudio-user-id`, `x-appstudio-role`, `x-appstudio-org-role`, `x-appstudio-org-id`, `x-appstudio-project-id`
469
+ - env fallbacks for local setup: `NEXT_PUBLIC_DEFAULT_USER_ID`, `NEXT_PUBLIC_DEFAULT_ROLE`, `NEXT_PUBLIC_DEFAULT_ORG_ROLE`, `DEFAULT_USER_ID`, `DEFAULT_ROLE`, `DEFAULT_ORG_ROLE`
470
+
471
+ ## Frontend Pattern
472
+
473
+ The frontend should stay focused on:
474
+
475
+ - dashboards
476
+ - settings
477
+ - admin workflows
478
+ - product configuration
479
+ - entity listing/detail pages
480
+
481
+ The reusable shell lives in:
482
+
483
+ - [`src/app/layout.tsx`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/app/layout.tsx)
484
+ - [`src/components`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/components)
485
+ - [`src/config`](/mnt/c/wsl/osirus-ai/submodules/appstudio/src/config)
486
+
487
+ ## Stripe Setup
488
+
489
+ Use Stripe as part of the reusable core, not as product-only code.
490
+
491
+ Stripe belongs in the platform layer because most admin products need:
492
+
493
+ - products
494
+ - plans
495
+ - subscriptions
496
+ - invoices
497
+ - payment method handling
498
+ - entitlement checks
499
+
500
+ ### Recommended Stripe Model
501
+
502
+ Create platform entities like:
503
+
504
+ - `BillingProduct`
505
+ - `BillingPlan`
506
+ - `Subscription`
507
+ - `Invoice`
508
+ - `UsageEvent`
509
+
510
+ Then map product-specific entitlements on top:
511
+
512
+ - `install_limit`
513
+ - `template_limit`
514
+ - `custom_domain_limit`
515
+ - `backup_retention_days`
516
+
517
+ ### Suggested Stripe Flow
518
+
519
+ 1. User signs up.
520
+ 2. User creates or joins an org.
521
+ 3. User selects a plan.
522
+ 4. Stripe checkout creates a subscription.
523
+ 5. Webhook updates local subscription state.
524
+ 6. Entitlements unlock product actions.
525
+
526
+ ### Stripe Setup In App Studio
527
+
528
+ Add these areas next:
529
+
530
+ - `api/lib/models/billing-*`
531
+ - `api/lib/services/stripe-service.ts`
532
+ - `api/lib/controllers/stripe-controller.ts`
533
+ - `api/pages/api/webhook/stripe.ts`
534
+ - `src/app/pricing`
535
+ - `src/app/settings/billing`
536
+
537
+ ### Example Environment Variables
538
+
539
+ ```env
540
+ STRIPE_SECRET_KEY=sk_test_xxx
541
+ STRIPE_PUBLISHABLE_KEY=pk_test_xxx
542
+ STRIPE_WEBHOOK_SECRET=whsec_xxx
543
+ ```
544
+
545
+ ## Handling Users
546
+
547
+ User handling belongs in core.
548
+
549
+ Recommended platform user model:
550
+
551
+ - `User`
552
+ - `UserPassword` or auth provider identity
553
+ - `Org`
554
+ - `OrgMembership`
555
+ - `UserRole`
556
+ - `Invite`
557
+
558
+ Recommended roles:
559
+
560
+ - owner
561
+ - admin
562
+ - editor
563
+ - viewer
564
+
565
+ For an Admin portal, users should be scoped through org/workspace membership, not just global access.
566
+
567
+ That gives you:
568
+
569
+ - multi-tenant separation
570
+ - team billing ownership
571
+ - shared installations inside an org
572
+ - support/admin escalation paths
573
+
574
+ ## Admin Portal Design
575
+
576
+ If the goal is “buy and launch and manage product installs”, your product repo should likely include these domains:
577
+
578
+ ### Platform Core
579
+
580
+ - users
581
+ - orgs
582
+ - billing
583
+ - admin
584
+ - providers
585
+ - settings
586
+
587
+ ### Product Layer
588
+
589
+ - install catalog
590
+ - provisioning jobs
591
+ - deployment environments
592
+ - connected domains
593
+ - backups
594
+ - templates
595
+ - themes
596
+ - plugins/modules
597
+
598
+ ### Key Workflows
599
+
600
+ 1. Customer signs up.
601
+ 2. Customer picks a plan.
602
+ 3. Customer creates an org/workspace.
603
+ 4. Customer launches an install.
604
+ 5. System provisions the install.
605
+ 6. Customer manages domains, templates, and billing.
606
+ 7. Admin/support can inspect and intervene when needed.
607
+
608
+ ## Containers
609
+
610
+ App Studio includes starter container files:
611
+
612
+ - [`docker-compose.yml`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docker-compose.yml)
613
+ - [`devops/docker/Dockerfile.app`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/Dockerfile.app)
614
+ - [`devops/docker/Dockerfile.api`](/mnt/c/wsl/osirus-ai/submodules/appstudio/devops/docker/Dockerfile.api)
615
+
616
+ Current local services:
617
+
618
+ - `app`
619
+ - `api`
620
+ - `mysql`
621
+
622
+ Start from:
623
+
624
+ - [`.env`](/mnt/c/wsl/osirus-ai/submodules/appstudio/.env)
625
+
626
+ ## Commands
627
+
628
+ App Studio includes a repo command wrapper modeled after the parent project:
629
+
630
+ - [`cmd.sh`](/mnt/c/wsl/osirus-ai/submodules/appstudio/cmd.sh)
631
+
632
+ Examples:
633
+
634
+ ```bash
635
+ ./cmd.sh init cms
636
+ ./cmd.sh init cms --force
637
+ ./cmd.sh init simple-cms
638
+ ./cmd.sh init gallery
639
+ ./cmd.sh init nft
640
+ ./cmd.sh init gpu
641
+ ./cmd.sh init metaverse
642
+ ./cmd.sh init all --force
643
+ ```
644
+
645
+ ## Pipelines
646
+
647
+ Bitbucket pipeline file:
648
+
649
+ - [`bitbucket-pipelines.yml`](/mnt/c/wsl/osirus-ai/submodules/appstudio/bitbucket-pipelines.yml)
650
+
651
+ Current pipeline shape:
652
+
653
+ - PR/package verification with `npm pack --dry-run`
654
+ - tag-based publish for `@spacemade/ui`
655
+ - tag-based publish for `@spacemade/api`
656
+ - tag-based upload of `app.sh` to `s3://application-studio/app.sh`
657
+
658
+ Generated product apps should own their Docker images, CloudFormation templates, and runtime deployment pipeline.
659
+
660
+ ## Environment Contract
661
+
662
+ Example frontend/platform config:
663
+
664
+ ```env
665
+ NEXT_PUBLIC_APP_NAME=App Studio
666
+ NEXT_PUBLIC_ENABLED_MODULES=projects,orgs,providers,users,pricing,settings,admin
667
+ ```
668
+
669
+ Example richer product:
670
+
671
+ ```env
672
+ NEXT_PUBLIC_APP_NAME=Admin
673
+ NEXT_PUBLIC_ENABLED_MODULES=projects,orgs,providers,users,pricing,settings,admin
674
+ ```
675
+
676
+ For an Admin product, avoid turning on AI-style modules unless you actually build them.
677
+
678
+ ## Recommended Next Steps
679
+
680
+ 1. Add auth and session handling.
681
+ 2. Add org membership and invite models.
682
+ 3. Add Stripe models and webhook handling.
683
+ 4. Add install models.
684
+ 5. Add provisioning job service.
685
+ 6. Add deployment/provider adapters.
686
+ 7. Add admin pages for install lifecycle management.
687
+
688
+ ## Practical Recommendation
689
+
690
+ Use this repo as the source for the reusable `@spacemade/ui` and `@spacemade/api` packages.
691
+
692
+ Build each Admin product as a lightweight repo that installs or links both packages.
693
+
694
+ Keep product-specific schema, generated overlays, routes, and custom code in the product repo.
695
+
696
+ If you later discover stable cross-product modules, extract them into additional `@spacemade/*` packages.
697
+
698
+ For a CMS-style install system, see:
699
+
700
+ - [`docs/cms-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/cms-quickstart.md)
701
+ - [`docs/simple-cms-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/simple-cms-quickstart.md)
702
+ - [`docs/gallery-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/gallery-quickstart.md)
703
+ - [`docs/nft-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/nft-quickstart.md)
704
+ - [`docs/gpu-marketplace-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/gpu-marketplace-quickstart.md)
705
+ - [`docs/metaverse-quickstart.md`](/mnt/c/wsl/osirus-ai/submodules/appstudio/docs/metaverse-quickstart.md)