@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/cmd.sh ADDED
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
6
+
7
+ args=("$@")
8
+
9
+ load_env() {
10
+ if [[ -f "$ENV_FILE" ]]; then
11
+ while IFS='=' read -r key value; do
12
+ [[ -z "${key:-}" ]] && continue
13
+ [[ "$key" =~ ^# ]] && continue
14
+
15
+ key="$(echo -e "${key}" | tr -d '[:space:]')"
16
+ value="$(echo -e "${value:-}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
17
+
18
+ [[ -z "$key" ]] && continue
19
+ [[ "$key" =~ [^A-Za-z0-9_]+ ]] && continue
20
+
21
+ export "$key"="$value"
22
+ done < "$ENV_FILE"
23
+ fi
24
+ }
25
+ load_env
26
+
27
+ usage() {
28
+ cat <<'EOFUSAGE'
29
+ Usage: ./cmd.sh <command> [args]
30
+
31
+ General:
32
+ init cms [--force] Generate the default CMS install system scaffold
33
+ init simple-cms [--force] Generate the simple CMS scaffold
34
+ init gallery [--force] Generate the image gallery scaffold
35
+ init nft [--force] Generate the NFT marketplace scaffold
36
+ init gpu [--force] Generate the GPU marketplace scaffold
37
+ init metaverse [--force] Generate the metaverse hosting scaffold
38
+ init all [--force] Run all product scaffolds
39
+ migrate <product> Run product migrations from api/lib/<product>/migrations
40
+ help Show this help output
41
+ EOFUSAGE
42
+ }
43
+
44
+ run_generator() {
45
+ local script_name="${1:-}"
46
+ local extra_arg="${2:-}"
47
+ cd "$ROOT_DIR"
48
+
49
+ if [[ "$extra_arg" == "--force" ]]; then
50
+ npm run "$script_name" -- --force
51
+ else
52
+ npm run "$script_name"
53
+ fi
54
+ }
55
+
56
+ init() {
57
+ local mode="${1:-cms}"
58
+ local extra_arg="${2:-}"
59
+
60
+ case "$mode" in
61
+ cms)
62
+ run_generator "generate:cms" "$extra_arg"
63
+ ;;
64
+ simple-cms)
65
+ run_generator "generate:simple-cms" "$extra_arg"
66
+ ;;
67
+ gallery)
68
+ run_generator "generate:gallery" "$extra_arg"
69
+ ;;
70
+ nft)
71
+ run_generator "generate:nft" "$extra_arg"
72
+ ;;
73
+ gpu)
74
+ run_generator "generate:gpu" "$extra_arg"
75
+ ;;
76
+ metaverse)
77
+ run_generator "generate:metaverse" "$extra_arg"
78
+ ;;
79
+ all)
80
+ run_generator "generate:cms" "$extra_arg"
81
+ run_generator "generate:simple-cms" "$extra_arg"
82
+ run_generator "generate:gallery" "$extra_arg"
83
+ run_generator "generate:nft" "$extra_arg"
84
+ run_generator "generate:gpu" "$extra_arg"
85
+ run_generator "generate:metaverse" "$extra_arg"
86
+ ;;
87
+ *)
88
+ echo "Unknown init mode: $mode" >&2
89
+ echo "Use one of: cms, simple-cms, gallery, nft, gpu, metaverse, all" >&2
90
+ exit 1
91
+ ;;
92
+ esac
93
+ }
94
+
95
+ docker_compose_available() {
96
+ command -v docker-compose >/dev/null 2>&1
97
+ }
98
+
99
+ docker_api_is_running() {
100
+ docker_compose_available && docker-compose ps -q api >/dev/null 2>&1 && [[ -n "$(docker-compose ps -q api)" ]]
101
+ }
102
+
103
+ migrate() {
104
+ local product="${1:-}"
105
+
106
+ if [[ -z "$product" ]]; then
107
+ echo "Missing product name. Example: ./cmd.sh migrate simple-cms" >&2
108
+ exit 1
109
+ fi
110
+
111
+ if [[ ! "$product" =~ ^[a-z0-9][a-z0-9-]*$ ]]; then
112
+ echo "Invalid product name: $product" >&2
113
+ exit 1
114
+ fi
115
+
116
+ local migration_path="lib/${product}/migrations"
117
+ local migration_dir="${ROOT_DIR}/api/${migration_path}"
118
+
119
+ if [[ ! -d "$migration_dir" ]]; then
120
+ echo "No migrations found at api/${migration_path}" >&2
121
+ exit 1
122
+ fi
123
+
124
+ cd "$ROOT_DIR"
125
+
126
+ if docker_api_is_running; then
127
+ docker-compose exec -T api npx sequelize db:migrate --migrations-path "$migration_path"
128
+ return
129
+ fi
130
+
131
+ cd "${ROOT_DIR}/api"
132
+ npx sequelize db:migrate --migrations-path "$migration_path"
133
+ }
134
+
135
+ main() {
136
+ local cmd="${1:-}"
137
+ shift || true
138
+ load_env
139
+
140
+ case "$cmd" in
141
+ init) init "$@" ;;
142
+ migrate) migrate "$@" ;;
143
+ help|-h|--help|"") usage ;;
144
+ *)
145
+ echo "Unknown command: $cmd" >&2
146
+ usage
147
+ exit 1
148
+ ;;
149
+ esac
150
+ }
151
+
152
+ main "$@"
@@ -0,0 +1,206 @@
1
+ # CMS Quickstart
2
+
3
+ This guide is for using `appstudio` as the base repo for a CMS-focused admin product.
4
+
5
+ The main `README.md` stays generic on purpose. This file is the product-specific quickstart for a CMS-style control plane.
6
+
7
+ ## Goal
8
+
9
+ Build an Admin app that can:
10
+
11
+ - sell plans
12
+ - launch subscribed products as deployments
13
+ - connect deployments to core sites
14
+ - handle backups
15
+ - support operations teams
16
+
17
+ ## Recommended Domain Models
18
+
19
+ Start with these product models on top of the App Studio core:
20
+
21
+ - `DeploymentTemplate`
22
+ - `Deployment`
23
+ - `DeploymentJob`
24
+ - `DeploymentBackup`
25
+
26
+ ## Suggested Responsibilities
27
+
28
+ ### `Deployment`
29
+
30
+ Use for the primary customer-owned launch record for a subscribed product.
31
+
32
+ Suggested fields:
33
+
34
+ - `id`
35
+ - `orgId`
36
+ - `projectId`
37
+ - `siteId`
38
+ - `productId`
39
+ - `productPlanId`
40
+ - `subscriptionId`
41
+ - `providerId`
42
+ - `deploymentSpecKey`
43
+ - `deploymentValues`
44
+ - `name`
45
+ - `slug`
46
+ - `status`
47
+ - `templateId`
48
+ - `runtimeKey`
49
+ - `ownerUserId`
50
+ - `createdAt`
51
+ - `updatedAt`
52
+
53
+ ### Product Deployment Metadata
54
+
55
+ Use the core product layer to store reusable deployment metadata. This follows the older cloud app pattern where catalog/product versions hold `resourceUrl`, `resourceSpec`, and `resourceParams`, while deployments hold only runtime selection and values.
56
+
57
+ Until `ProductVersion` exists in App Studio, store provider-specific deployment options in `Product.formSpecs`.
58
+
59
+ For example:
60
+
61
+ - CMS on AWS can save a deployment option with `providerKey: aws`, `specFormat: cloudformation`, and a `resourceUrl` pointing at the CloudFormation template.
62
+ - CMS on Google can save a deployment option with `providerKey: google`, `specFormat: terraform`, and Terraform source/module metadata.
63
+ - CMS on Azure can save a deployment option with `providerKey: azure`, `specFormat: terraform`, `script`, or a future Azure-native format.
64
+
65
+ Example `formSpecs` value:
66
+
67
+ ```json
68
+ [
69
+ {
70
+ "key": "aws-cloudformation",
71
+ "label": "AWS CloudFormation",
72
+ "providerKey": "aws",
73
+ "specFormat": "cloudformation",
74
+ "resourceUrl": "s3://templates/cms/cloudformation.yaml"
75
+ },
76
+ {
77
+ "key": "google-terraform",
78
+ "label": "Google Terraform",
79
+ "providerKey": "google",
80
+ "specFormat": "terraform",
81
+ "resourceUrl": "git::https://example.com/cms/terraform/google.git"
82
+ }
83
+ ]
84
+ ```
85
+
86
+ Deployments should not pass template/buildspec blobs through URLs or launch requests. The launch request should pass IDs plus the selected `deploymentSpecKey` and runtime `deploymentValues`.
87
+
88
+ ### `DeploymentTemplate`
89
+
90
+ Use for deployment blueprints or starter site definitions.
91
+
92
+ Suggested fields:
93
+
94
+ - `id`
95
+ - `name`
96
+ - `slug`
97
+ - `description`
98
+ - `version`
99
+ - `isActive`
100
+
101
+ ### `DeploymentJob`
102
+
103
+ Use for async deployment creation and operational jobs.
104
+
105
+ Suggested fields:
106
+
107
+ - `id`
108
+ - `deploymentId`
109
+ - `productId`
110
+ - `subscriptionId`
111
+ - `providerId`
112
+ - `deploymentSpecKey`
113
+ - `jobType`
114
+ - `status`
115
+ - `payload`
116
+ - `startedAt`
117
+ - `finishedAt`
118
+ - `errorMessage`
119
+
120
+ ### `DeploymentBackup`
121
+
122
+ Use for backup and restore tracking.
123
+
124
+ Suggested fields:
125
+
126
+ - `id`
127
+ - `deploymentId`
128
+ - `backupType`
129
+ - `storageKey`
130
+ - `status`
131
+ - `createdAt`
132
+
133
+ ## Recommended API Areas
134
+
135
+ Create API routes such as:
136
+
137
+ - `api/pages/api/cms-templates/index.ts`
138
+ - `api/pages/api/cms-deployments/index.ts`
139
+ - `api/pages/api/cms-deployments/launchable-products.ts`
140
+ - `api/pages/api/cms-deployment-jobs/index.ts`
141
+ - `api/pages/api/cms-backups/index.ts`
142
+
143
+ ## Generator
144
+
145
+ App Studio includes a generator script for the default CMS install system scaffold.
146
+
147
+ Run:
148
+
149
+ ```bash
150
+ npm run generate:cms
151
+ ```
152
+
153
+ This creates starter files for:
154
+
155
+ - API models
156
+ - services
157
+ - controllers
158
+ - API route handlers
159
+ - frontend store placeholders
160
+ - starter product pages
161
+
162
+ Use overwrite mode when you intentionally want to regenerate:
163
+
164
+ ```bash
165
+ npm run generate:cms -- --force
166
+ ```
167
+
168
+ ## Recommended UI Areas
169
+
170
+ The app picker should show `Deployments` as the top-level app entry, matching the `/storage` pattern. The related CMS routes remain available inside the generated deployments area:
171
+
172
+ - `/templates`
173
+ - `/deployments`
174
+ - `/deployment-jobs`
175
+ - `/backups`
176
+
177
+ Deployment detail pages should expose quick actions for Templates, Deployment Jobs, and Backups. Those actions can be wired to deployment-scoped views later.
178
+
179
+ ## Deployment Flow
180
+
181
+ Typical lifecycle:
182
+
183
+ 1. Customer signs up.
184
+ 2. Customer creates an org.
185
+ 3. Customer picks a product or plan.
186
+ 4. Billing creates an active subscription.
187
+ 5. The deployment UI calls `/cms-deployments/launchable-products` to list subscribed product plans that do not yet have a `Deployment`.
188
+ 6. Customer selects one subscribed product and one provider/deployment option, such as AWS/CloudFormation or Google/Terraform.
189
+ 7. System creates a `Deployment` with `productId`, `productPlanId`, `subscriptionId`, `providerId`, `deploymentSpecKey`, and `deploymentValues`, then queues a `DeploymentJob`.
190
+ 8. Provisioning marks the deployment ready and links it to a core `Site`.
191
+ 9. Customer manages domains through the site layer and manages backups/settings through the deployment layer.
192
+
193
+ ## Billing Mapping
194
+
195
+ Map Stripe entitlements to CMS-specific limits such as:
196
+
197
+ - `deployment_limit`
198
+ - `cms_template_limit`
199
+ - `backup_retention_days`
200
+
201
+ ## Recommendation
202
+
203
+ Keep this as a product-layer guide.
204
+
205
+ - `README.md` stays generic for all Admin products
206
+ - `docs/cms-quickstart.md` stays specific for CMS products
@@ -0,0 +1,24 @@
1
+ # Gallery Quickstart
2
+
3
+ Use this when you want an art gallery product where users type prompts, generate images, and organize those images into galleries.
4
+
5
+ Suggested models:
6
+
7
+ - `Gallery`
8
+ - `GalleryImage`
9
+ - `ImageGeneration`
10
+ - `PromptTemplate`
11
+ - `GalleryShareLink`
12
+
13
+ Suggested workflows:
14
+
15
+ - prompt for image generation
16
+ - review outputs
17
+ - move images into galleries
18
+ - share galleries publicly
19
+
20
+ Generate the scaffold with:
21
+
22
+ ```bash
23
+ ./cmd.sh init gallery
24
+ ```
@@ -0,0 +1,27 @@
1
+ # GPU Marketplace Quickstart
2
+
3
+ Use this when you want to build a marketplace where home GPU owners list devices online and renters consume them as provider-backed capacity.
4
+
5
+ Suggested models:
6
+
7
+ - `GpuHost`
8
+ - `GpuDevice`
9
+ - `GpuListing`
10
+ - `GpuBooking`
11
+ - `GpuProviderAdapter`
12
+
13
+ Suggested workflows:
14
+
15
+ - onboard GPU hosts
16
+ - register GPU devices
17
+ - publish listings with hourly pricing
18
+ - create renter bookings
19
+ - expose listings as provider inventory for the parent Osirus app
20
+
21
+ Generate the scaffold with:
22
+
23
+ ```bash
24
+ ./cmd.sh init gpu
25
+ ```
26
+
27
+ Use domains and proxy routing later to direct renters or provider traffic into the correct host endpoints.
@@ -0,0 +1,25 @@
1
+ # Metaverse Quickstart
2
+
3
+ Use this when you want to build a company that hosts and manages virtual worlds and their item inventories.
4
+
5
+ Suggested models:
6
+
7
+ - `World`
8
+ - `WorldItem`
9
+ - `WorldInstance`
10
+ - `WorldDomain`
11
+ - `WorldDeployJob`
12
+
13
+ Suggested workflows:
14
+
15
+ - create hosted worlds
16
+ - deploy and update worlds
17
+ - attach domains to worlds
18
+ - manage world items and assets
19
+ - track hosting lifecycle by world
20
+
21
+ Generate the scaffold with:
22
+
23
+ ```bash
24
+ ./cmd.sh init metaverse
25
+ ```
@@ -0,0 +1,41 @@
1
+ # Migration Plan
2
+
3
+ ## Goal
4
+
5
+ Build `appstudio` as the reusable starter while keeping `osirus-ai` free to continue as a product implementation.
6
+
7
+ ## Sequence
8
+
9
+ 1. Extract shared configuration:
10
+ - app identity
11
+ - navigation
12
+ - enabled modules
13
+ - billing defaults
14
+ 2. Extract core backend domains:
15
+ - auth
16
+ - user
17
+ - org
18
+ - project
19
+ - provider
20
+ - product
21
+ - subscription
22
+ - invoice
23
+ 3. Extract core frontend surfaces:
24
+ - auth pages
25
+ - account/settings
26
+ - admin shell
27
+ - projects
28
+ - providers
29
+ - billing
30
+ 4. Gate AI features behind module registration.
31
+ 5. Port AI features one module at a time when needed.
32
+
33
+ ## First Success Criteria
34
+
35
+ The first successful bootstrap should:
36
+
37
+ - sign in and sign up users
38
+ - manage orgs and projects
39
+ - manage providers
40
+ - show pricing and checkout flows
41
+ - run without chat, search, images, video, or speech enabled
@@ -0,0 +1,34 @@
1
+ # App Studio Modules
2
+
3
+ ## Core Modules
4
+
5
+ These should exist in every generated application:
6
+
7
+ - `auth`
8
+ - `users`
9
+ - `orgs`
10
+ - `projects`
11
+ - `providers`
12
+ - `billing`
13
+ - `media`
14
+ - `admin`
15
+
16
+ ## Optional Modules
17
+
18
+ These should be installable only when a product needs them:
19
+
20
+ - `ai-chat`
21
+ - `ai-search`
22
+ - `ai-images`
23
+ - `ai-video`
24
+ - `ai-speech`
25
+ - `ai-agents`
26
+ - `vector-store`
27
+ - `cms`
28
+
29
+ ## Module Rules
30
+
31
+ - Core modules must not depend on optional AI modules.
32
+ - Optional modules may depend on core modules.
33
+ - Product branding and homepage content belong outside modules.
34
+ - Seed data should be split into core data and product-specific data.
@@ -0,0 +1,26 @@
1
+ # NFT Quickstart
2
+
3
+ Use this when you want an NFT gallery or marketplace product with collections, minted items, and listings.
4
+
5
+ Suggested models:
6
+
7
+ - `NftCollection`
8
+ - `NftItem`
9
+ - `MintJob`
10
+ - `WalletAccount`
11
+ - `MarketplaceListing`
12
+ - `RoyaltyProfile`
13
+
14
+ Suggested workflows:
15
+
16
+ - create collections
17
+ - add token items
18
+ - mint to blockchain
19
+ - connect wallets
20
+ - list items for sale
21
+
22
+ Generate the scaffold with:
23
+
24
+ ```bash
25
+ ./cmd.sh init nft
26
+ ```
@@ -0,0 +1,22 @@
1
+ # Simple CMS Quickstart
2
+
3
+ Use this when you want lightweight file publishing on top of the core `Site` system instead of a full deployment product.
4
+
5
+ Suggested models:
6
+
7
+ - `Site` from the core app
8
+ - `AppFile`
9
+ - `AppFileRevision`
10
+
11
+ Suggested workflows:
12
+
13
+ - create sites with the core site tools
14
+ - create app files under sites
15
+ - publish and unpublish files
16
+ - manage domains through the site layer
17
+
18
+ Generate the scaffold with:
19
+
20
+ ```bash
21
+ ./cmd.sh init simple-cms
22
+ ```
package/middleware.ts ADDED
@@ -0,0 +1,77 @@
1
+ import type { NextRequest } from 'next/server'
2
+ import { NextResponse } from 'next/server'
3
+
4
+ import { readSessionFromRequest, isAuthenticatedSession } from './src/lib/auth'
5
+ import { getAppBasePath, isInsideAppBasePath, stripAppBasePath } from './src/lib/app-paths'
6
+ import { canAccessRouteModule } from './src/lib/security'
7
+ import { isRouteAllowed } from './src/lib/routes'
8
+ import type { ModuleKey } from './src/config/modules'
9
+
10
+ const publicRoutes = new Set(['/', '/pricing'])
11
+
12
+ const routeToModule: Array<{ prefix: string; key: ModuleKey }> = [
13
+ { prefix: '/activity', key: 'activity' },
14
+ { prefix: '/addresses', key: 'addresses' },
15
+ { prefix: '/forms', key: 'forms' },
16
+ { prefix: '/invoices', key: 'invoices' },
17
+ { prefix: '/media', key: 'media' },
18
+ { prefix: '/orgs', key: 'orgs' },
19
+ { prefix: '/posts', key: 'posts' },
20
+ { prefix: '/products', key: 'products' },
21
+ { prefix: '/projects', key: 'projects' },
22
+ { prefix: '/providers', key: 'providers' },
23
+ { prefix: '/purchases', key: 'purchases' },
24
+ { prefix: '/settings', key: 'settings' },
25
+ { prefix: '/sites', key: 'sites' },
26
+ { prefix: '/subscriptions', key: 'subscriptions' },
27
+ { prefix: '/tags', key: 'tags' },
28
+ { prefix: '/tickets', key: 'tickets' },
29
+ { prefix: '/usage', key: 'usage' },
30
+ { prefix: '/users', key: 'users' },
31
+ { prefix: '/admin', key: 'admin' },
32
+ ]
33
+
34
+ export function middleware(request: NextRequest) {
35
+ const { pathname } = request.nextUrl
36
+ const appBasePath = getAppBasePath()
37
+
38
+ if (
39
+ pathname.startsWith('/_next') ||
40
+ pathname.startsWith('/api') ||
41
+ pathname === '/favicon.ico'
42
+ ) {
43
+ return NextResponse.next()
44
+ }
45
+
46
+ if (appBasePath && pathname === '/') {
47
+ return NextResponse.redirect(new URL(appBasePath, request.url))
48
+ }
49
+
50
+ if (!isInsideAppBasePath(pathname)) {
51
+ return NextResponse.next()
52
+ }
53
+
54
+ const appPathname = stripAppBasePath(pathname)
55
+ const session = readSessionFromRequest(request)
56
+ const matchedRoute = routeToModule.find(
57
+ (item) => appPathname === item.prefix || appPathname.startsWith(`${item.prefix}/`)
58
+ )
59
+
60
+ if (matchedRoute && !isAuthenticatedSession(session) && !publicRoutes.has(appPathname)) {
61
+ return NextResponse.redirect(new URL('/?auth=required', request.url))
62
+ }
63
+
64
+ if (isRouteAllowed(appPathname)) {
65
+ if (matchedRoute && !canAccessRouteModule(session, matchedRoute.key)) {
66
+ return NextResponse.redirect(new URL('/?denied=1', request.url))
67
+ }
68
+
69
+ return NextResponse.next()
70
+ }
71
+
72
+ return NextResponse.redirect(new URL('/', request.url))
73
+ }
74
+
75
+ export const config = {
76
+ matcher: ['/((?!.*\\..*).*)'],
77
+ }
package/next-env.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ import "./.next/dev/types/routes.d.ts";
4
+
5
+ // NOTE: This file should not be edited
6
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
package/next.config.ts ADDED
@@ -0,0 +1,39 @@
1
+ import type { NextConfig } from 'next'
2
+ import path from 'path'
3
+
4
+ const apiOrigin = (() => {
5
+ const envApiUrl =
6
+ process.env.NEXT_PUBLIC_API_URL ||
7
+ process.env.NEXT_PUBLIC_API_HOST
8
+
9
+ if (envApiUrl) {
10
+ return envApiUrl.replace(/\/+$/, '')
11
+ }
12
+
13
+ const apiHost = process.env.API_HOST || 'api'
14
+ const apiPort = process.env.API_PORT || '3001'
15
+ return `http://${apiHost}:${apiPort}`
16
+ })()
17
+
18
+ const nextConfig: NextConfig = {
19
+ reactStrictMode: true,
20
+ transpilePackages: ['@spacemade/ui', '@spacemade/api'],
21
+ async rewrites() {
22
+ return [
23
+ {
24
+ source: '/api/:path*',
25
+ destination: `${apiOrigin}/api/:path*`,
26
+ },
27
+ ]
28
+ },
29
+ env: {
30
+ NEXT_PUBLIC_APP_ENV: process.env.APP_ENV,
31
+ },
32
+ sassOptions: {
33
+ includePaths: [path.join(process.cwd(), 'src', 'sass')],
34
+ quietDeps: true,
35
+ silenceDeprecations: ['import', 'global-builtin', 'color-functions'],
36
+ },
37
+ }
38
+
39
+ export default nextConfig