@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.
- package/README.md +705 -0
- package/app.sh +806 -0
- package/cmd.sh +152 -0
- package/docs/cms-quickstart.md +206 -0
- package/docs/gallery-quickstart.md +24 -0
- package/docs/gpu-marketplace-quickstart.md +27 -0
- package/docs/metaverse-quickstart.md +25 -0
- package/docs/migration-plan.md +41 -0
- package/docs/modules.md +34 -0
- package/docs/nft-quickstart.md +26 -0
- package/docs/simple-cms-quickstart.md +22 -0
- package/middleware.ts +77 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +39 -0
- package/package.json +92 -0
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/images/default-profile/1.png +0 -0
- package/public/images/default-profile/2.png +0 -0
- package/public/images/default-profile/3.png +0 -0
- package/public/images/default-profile/4.png +0 -0
- package/public/images/default-profile/5.png +0 -0
- package/public/images/default-profile/6.png +0 -0
- package/public/images/default-profile/7.png +0 -0
- package/public/images/defaults/Login-Person-Icon-dark.svg +13 -0
- package/public/images/defaults/Login-Person-Icon.svg +16 -0
- package/public/images/defaults/default-avatar.png +0 -0
- package/public/images/defaults/image-not-available.jpg +0 -0
- package/public/images/icons/amazon-icon.jpg +0 -0
- package/public/images/icons/azure-icon.png +0 -0
- package/public/images/icons/google-icon.jpg +0 -0
- package/public/site.webmanifest +1 -0
- package/scripts/crud-scaffold/bin/crud-scaffold.mjs +23 -0
- package/scripts/crud-scaffold/src/api/index.mjs +666 -0
- package/scripts/crud-scaffold/src/app/patches.mjs +355 -0
- package/scripts/crud-scaffold/src/core/fields.mjs +165 -0
- package/scripts/crud-scaffold/src/core/utils.mjs +161 -0
- package/scripts/crud-scaffold/src/frontend/index.mjs +1078 -0
- package/scripts/crud-scaffold/src/generator.mjs +103 -0
- package/scripts/crud-scaffold/src/templates/.gitkeep +1 -0
- package/scripts/crud-scaffold/src/utils/generator-utils.mjs +35 -0
- package/scripts/defs/cms-definition.mjs +1393 -0
- package/scripts/defs/gallery-definition.mjs +171 -0
- package/scripts/defs/gpu-definition.mjs +174 -0
- package/scripts/defs/metaverse-definition.mjs +170 -0
- package/scripts/defs/nft-definition.mjs +191 -0
- package/scripts/defs/simple-cms-definition.mjs +141 -0
- package/scripts/generate-cms-install-system.mjs +4 -0
- package/scripts/generate-gallery-system.mjs +4 -0
- package/scripts/generate-gpu-marketplace-system.mjs +4 -0
- package/scripts/generate-metaverse-system.mjs +4 -0
- package/scripts/generate-nft-system.mjs +4 -0
- package/scripts/generate-simple-cms-system.mjs +4 -0
- package/scripts/link-core.mjs +72 -0
- package/scripts/spacemade.mjs +446 -0
- package/scripts/test-generate-app.mjs +60 -0
- package/src/components/Dashboard/DashboardList.tsx +70 -0
- package/src/components/Dashboard/dashboardLayout.tsx +57 -0
- package/src/components/admin/nav/AdminLeftNav.tsx +168 -0
- package/src/components/auth/AuthBootstrap.tsx +47 -0
- package/src/components/auth/auth-card-shell.tsx +23 -0
- package/src/components/auth/forgot-password-form-template.tsx +37 -0
- package/src/components/auth/form/ForgotForm.tsx +146 -0
- package/src/components/auth/form/ResetPasswordForm.tsx +122 -0
- package/src/components/auth/form/SignInForm.tsx +139 -0
- package/src/components/auth/form/SignUpForm.tsx +166 -0
- package/src/components/auth/form/UpdateForm.tsx +165 -0
- package/src/components/auth/login-form-template.tsx +45 -0
- package/src/components/billing/CardBrandIcon.tsx +126 -0
- package/src/components/billing/block/BillingDetailsCard.tsx +120 -0
- package/src/components/billing/block/BillingHistory.tsx +143 -0
- package/src/components/billing/block/PlanDetails.tsx +138 -0
- package/src/components/billing/modal/UpdateCardDetailsModal.tsx +451 -0
- package/src/components/billing/modal/UpdatePlanModal.tsx +194 -0
- package/src/components/category/modal/UpdateCategoryModal.tsx +170 -0
- package/src/components/category/table/CategoryTable.tsx +137 -0
- package/src/components/common/Icons/BrainCircuitIcon.tsx +14 -0
- package/src/components/common/Icons/MagnifyingGlassChartIcon.tsx +14 -0
- package/src/components/common/Icons/PeopleGroupIcon.tsx +14 -0
- package/src/components/common/Icons/ScrewdriverWrenchIcon.tsx +14 -0
- package/src/components/common/Icons/SendMessageIcon.tsx +15 -0
- package/src/components/common/Icons/ShareIcon.tsx +22 -0
- package/src/components/common/Icons/XTwitterIcon.tsx +14 -0
- package/src/components/common/Image/OptimizedImage.tsx +17 -0
- package/src/components/common/SettingsPanel.tsx +119 -0
- package/src/components/common/badge/Badge.tsx +69 -0
- package/src/components/common/blocks/BackgroundImageBlock.tsx +43 -0
- package/src/components/common/blocks/Carousel.tsx +59 -0
- package/src/components/common/blocks/CodeSnippet.tsx +46 -0
- package/src/components/common/blocks/InfinityScrollWrapper.tsx +43 -0
- package/src/components/common/blocks/SplitBlock.tsx +47 -0
- package/src/components/common/blocks/TopImageBlock.tsx +39 -0
- package/src/components/common/button/Button.tsx +49 -0
- package/src/components/common/button/ButtonWithActions.tsx +71 -0
- package/src/components/common/button/DropdownButton.tsx +61 -0
- package/src/components/common/button/ScrollDownArrow.tsx +23 -0
- package/src/components/common/button/SharerActionBox.tsx +248 -0
- package/src/components/common/button/UserButton.tsx +209 -0
- package/src/components/common/contact/ContactForm.tsx +214 -0
- package/src/components/common/cta/Cta.tsx +18 -0
- package/src/components/common/dialog/ConversationFullscreenModal.tsx +95 -0
- package/src/components/common/dialog/DeleteDialog.tsx +90 -0
- package/src/components/common/dialog/MobileFiltersDrawer.tsx +60 -0
- package/src/components/common/dialog/RenameDialog.tsx +128 -0
- package/src/components/common/faq/FAQSection.tsx +119 -0
- package/src/components/common/filters/NameSearch.tsx +87 -0
- package/src/components/common/footer/SmallFooter.tsx +62 -0
- package/src/components/common/forms/AdvanceAccordion.tsx +154 -0
- package/src/components/common/forms/CheckBox.tsx +29 -0
- package/src/components/common/forms/DateTimePicker.tsx +101 -0
- package/src/components/common/forms/Dropzone.tsx +278 -0
- package/src/components/common/forms/EmailTagInput.tsx +67 -0
- package/src/components/common/forms/FieldAssistantBar.tsx +32 -0
- package/src/components/common/forms/HTMLEditor.tsx +48 -0
- package/src/components/common/forms/IconPicker.tsx +129 -0
- package/src/components/common/forms/Input.tsx +362 -0
- package/src/components/common/forms/InputColor.tsx +36 -0
- package/src/components/common/forms/RadioInputs.tsx +62 -0
- package/src/components/common/forms/Select.tsx +214 -0
- package/src/components/common/forms/SimpleTagsInput.tsx +89 -0
- package/src/components/common/forms/TagInput.tsx +111 -0
- package/src/components/common/forms/Textarea.tsx +99 -0
- package/src/components/common/forms/ToggleButton.tsx +67 -0
- package/src/components/common/forms/UserInvitePicker.tsx +600 -0
- package/src/components/common/header/AppPageTitle.tsx +34 -0
- package/src/components/common/header/SubtitleAccordion.tsx +63 -0
- package/src/components/common/home/block/GetStarted.tsx +17 -0
- package/src/components/common/home/block/Hero.tsx +33 -0
- package/src/components/common/home/block/InstallShortcut.tsx +41 -0
- package/src/components/common/home/block/MarketplaceBlock.tsx +34 -0
- package/src/components/common/home/block/OriginStoryBanner.tsx +17 -0
- package/src/components/common/home/block/OsirusCTABlock.tsx +21 -0
- package/src/components/common/home/block/PromoFeatureSlider.tsx +260 -0
- package/src/components/common/layout/DetailHero.tsx +87 -0
- package/src/components/common/layout/SideNavLayout.tsx +1016 -0
- package/src/components/common/layout/account/AccountLayout.tsx +99 -0
- package/src/components/common/layout/admin/AdminLayout.tsx +17 -0
- package/src/components/common/layout/explore/ExploreLayout.tsx +23 -0
- package/src/components/common/layout/explore/ExploreLayoutContent.tsx +20 -0
- package/src/components/common/layout/explore/ExploreLayoutFilters.tsx +28 -0
- package/src/components/common/loading/LoadingScreen.tsx +86 -0
- package/src/components/common/loading/Spinner.tsx +12 -0
- package/src/components/common/state/InvalidInviteCard.tsx +32 -0
- package/src/components/common/table/TableFilter.tsx +205 -0
- package/src/components/common/table/TableHeader.tsx +33 -0
- package/src/components/common/table/TablePaging.tsx +190 -0
- package/src/components/common/table/TablePagingButton.tsx +64 -0
- package/src/components/common/table/TablePagingInput.tsx +79 -0
- package/src/components/common/useUrlSelectedModel.ts +7 -0
- package/src/components/docs/DocsSitePreviewPage.tsx +122 -0
- package/src/components/docs/block/DocsPageDetailBlock.tsx +333 -0
- package/src/components/docs/block/DocsSidebarTopContent.tsx +8 -0
- package/src/components/docs/block/DocsSitePagesBlock.tsx +81 -0
- package/src/components/docs/block/DocsSitesBlock.tsx +35 -0
- package/src/components/docs/modal/CreateDocsSiteModal.tsx +132 -0
- package/src/components/docs/table/DocsPagesTable.tsx +163 -0
- package/src/components/docs/table/DocsSitesTable.tsx +109 -0
- package/src/components/groups/block/GroupInitialAvatar.tsx +53 -0
- package/src/components/groups/grid/OrgGroupMembersGrid.tsx +253 -0
- package/src/components/groups/modal/AddGroupModal.tsx +138 -0
- package/src/components/groups/modal/OrgGroupMembersModal.tsx +171 -0
- package/src/components/groups/modal/OrgGroupPermissionsModal.tsx +184 -0
- package/src/components/groups/table/OrgGroupsTable.tsx +470 -0
- package/src/components/head/DefaultMetadata.tsx +135 -0
- package/src/components/head/PageSeo.tsx +198 -0
- package/src/components/hoc/WithAuth.tsx +82 -0
- package/src/components/hoc/WithCustomerIO.tsx +48 -0
- package/src/components/hoc/WithGTM.tsx +31 -0
- package/src/components/hoc/WithGlobalContext.tsx +30 -0
- package/src/components/hoc/WithReCaptcha.tsx +31 -0
- package/src/components/hoc/WithStripe.tsx +68 -0
- package/src/components/layout/SidebarSizer.tsx +63 -0
- package/src/components/layout/app-left-nav.tsx +31 -0
- package/src/components/layout/app-main-layout.tsx +39 -0
- package/src/components/layout/site-footer.tsx +11 -0
- package/src/components/layout/site-header.tsx +19 -0
- package/src/components/marketplace/card/ProductCard.tsx +178 -0
- package/src/components/media/blocks/MediaAttachmentsList.tsx +79 -0
- package/src/components/media/blocks/MediaDetails.tsx +139 -0
- package/src/components/media/blocks/MediaGrid.tsx +245 -0
- package/src/components/media/form/MediaMiniForm.tsx +105 -0
- package/src/components/media/form/UpdateMediaForm.tsx +209 -0
- package/src/components/media/items/CircleMediaPicker.tsx +76 -0
- package/src/components/media/items/MediaAttachmentLinks.tsx +98 -0
- package/src/components/media/items/MediaDocumentPreview.tsx +43 -0
- package/src/components/media/items/MediaFileIcon.tsx +30 -0
- package/src/components/media/items/MediaPickerBox.tsx +94 -0
- package/src/components/media/items/MediaPickerButton.tsx +37 -0
- package/src/components/media/items/MediaSourcePreview.tsx +35 -0
- package/src/components/media/modal/AddMediaModal.tsx +237 -0
- package/src/components/media/modal/MediaAttachmentsModal.tsx +113 -0
- package/src/components/media/modal/MediaBulkDeleteWarningModal.tsx +142 -0
- package/src/components/media/modal/MediaDeleteWarningModal.tsx +98 -0
- package/src/components/media/modal/MediaPickerModal.tsx +201 -0
- package/src/components/media/table/MediaTable.tsx +340 -0
- package/src/components/media/table/MediaTableActions.tsx +130 -0
- package/src/components/media/table/MediaTableFilter.tsx +163 -0
- package/src/components/modules/module-card-grid.tsx +19 -0
- package/src/components/modules/module-page.tsx +27 -0
- package/src/components/modules/resource-page.tsx +15 -0
- package/src/components/nav/AdminMobileMenu.tsx +228 -0
- package/src/components/nav/AppTopNav.tsx +53 -0
- package/src/components/nav/MobileMenu.tsx +132 -0
- package/src/components/nav/TopNav.tsx +137 -0
- package/src/components/openapi/DeleteTokenModal.tsx +72 -0
- package/src/components/openapi/actions/ApiTokenActionsMenu.tsx +141 -0
- package/src/components/openapi/actions/ApiTokenCreateModal.tsx +107 -0
- package/src/components/openapi/actions/ApiTokenEditModal.tsx +168 -0
- package/src/components/orgs/OrgCreateModal.tsx +126 -0
- package/src/components/orgs/OrgJumpRedirect.tsx +150 -0
- package/src/components/page/SiteContentPage.tsx +129 -0
- package/src/components/post/accordion/FilterPostCategoriesAccordion.tsx +126 -0
- package/src/components/post/block/FeaturedProductCard.tsx +31 -0
- package/src/components/post/block/FeaturedProviderCard.tsx +51 -0
- package/src/components/post/block/InTheNews.tsx +77 -0
- package/src/components/post/block/PostCardsGrid.tsx +56 -0
- package/src/components/post/block/PostContent.tsx +128 -0
- package/src/components/post/block/PostDetailPage.tsx +95 -0
- package/src/components/post/block/PostList.tsx +111 -0
- package/src/components/post/block/PostNextAndPrevButtons.tsx +78 -0
- package/src/components/post/block/PostPeopleAlsoReadBlock.tsx +69 -0
- package/src/components/post/block/PostRelatedCards.tsx +43 -0
- package/src/components/post/card/FeaturedPostCard.tsx +107 -0
- package/src/components/post/card/InTheNewsCard.tsx +162 -0
- package/src/components/post/card/PostCard.tsx +125 -0
- package/src/components/post/card/RelatedPostCard.tsx +115 -0
- package/src/components/post/form/UpdatePostForm.tsx +639 -0
- package/src/components/post/modal/CreatePostModal.tsx +115 -0
- package/src/components/post/modal/PreviewPostModal.tsx +82 -0
- package/src/components/post/nav/BlogCategoriesSideNav.tsx +55 -0
- package/src/components/post/table/PostsTable.tsx +284 -0
- package/src/components/pricing/block/AddOnRow.tsx +78 -0
- package/src/components/pricing/block/CompletePurchase.tsx +546 -0
- package/src/components/pricing/block/PlanPicker.tsx +76 -0
- package/src/components/pricing/card/PricingCard.tsx +291 -0
- package/src/components/pricing/form/AddBillingInformationForm.tsx +212 -0
- package/src/components/pricing/form/AddPaymentMethodForm.tsx +252 -0
- package/src/components/pricing/form/CouponCodeForm.tsx +118 -0
- package/src/components/pricing/form/StripePaymentForm.tsx +106 -0
- package/src/components/product/block/ProductScreenshot.tsx +22 -0
- package/src/components/product/block/ProductScreenshotPreview.tsx +46 -0
- package/src/components/product/button/MediaScreenshotPicker.tsx +72 -0
- package/src/components/product/form/UpdateProductForm.tsx +718 -0
- package/src/components/product/modal/CreateProductModal.tsx +128 -0
- package/src/components/product/modal/UpdateProductCouponModal.tsx +227 -0
- package/src/components/product/modal/UpdateProductPlanModal.tsx +291 -0
- package/src/components/product/modal/UpdateProductVersionModal.tsx +236 -0
- package/src/components/product/table/ProductCouponsTable.tsx +100 -0
- package/src/components/product/table/ProductPlansTable.tsx +118 -0
- package/src/components/product/table/ProductVersionsAdminTable.tsx +103 -0
- package/src/components/product/table/ProductVersionsTable.tsx +111 -0
- package/src/components/product/table/ProductsTable.tsx +133 -0
- package/src/components/projects/ProjectFilesCard.tsx +134 -0
- package/src/components/projects/ProjectItemOptionButton.tsx +112 -0
- package/src/components/projects/ProjectPickerNav.tsx +440 -0
- package/src/components/projects/ProjectQuickCreateModal.tsx +159 -0
- package/src/components/projects/ProjectSidebarList.tsx +183 -0
- package/src/components/projects/actions/ProjectActionsMenu.tsx +77 -0
- package/src/components/projects/actions/ProjectCreateModal.tsx +577 -0
- package/src/components/projects/actions/ProjectEditModal.tsx +345 -0
- package/src/components/projects/actions/ProjectFileGrid.tsx +153 -0
- package/src/components/projects/actions/ProjectFilesModal.tsx +259 -0
- package/src/components/projects/actions/ProjectFilesPicker.tsx +31 -0
- package/src/components/projects/actions/ProjectFilesUploadModal.tsx +181 -0
- package/src/components/projects/actions/ProjectInstructions.tsx +160 -0
- package/src/components/projects/actions/RenameProjectModal.tsx +120 -0
- package/src/components/projects/actions/index.tsx +98 -0
- package/src/components/projects/block/HeaderProjectImagePicker.tsx +52 -0
- package/src/components/projects/permission/ProjectPermissionInviteModal.tsx +181 -0
- package/src/components/projects/permission/ProjectUserPermission.tsx +170 -0
- package/src/components/projects/postByCategory.tsx +118 -0
- package/src/components/projects/projectFileHistory.tsx +48 -0
- package/src/components/projects/table/ProjectTable.tsx +365 -0
- package/src/components/provider/BuildspecForm.tsx +288 -0
- package/src/components/provider/CreateProviderModal.tsx +210 -0
- package/src/components/provider/FeaturedProviders.tsx +137 -0
- package/src/components/provider/ProviderConnectModal.tsx +324 -0
- package/src/components/provider/form/UpdateProviderForm.tsx +449 -0
- package/src/components/provider/table/ProvidersTable.tsx +144 -0
- package/src/components/providers/ProviderFeaturesSideNav.tsx +52 -0
- package/src/components/settings/SettingsLayout.tsx +14 -0
- package/src/components/settings/SettingsSidebarNav.tsx +53 -0
- package/src/components/settings/settingsNav.ts +96 -0
- package/src/components/site/modal/UpdateSiteModal.tsx +134 -0
- package/src/components/site/table/SiteTable.tsx +198 -0
- package/src/components/starter/list-panel.tsx +12 -0
- package/src/components/starter/starter-overview.tsx +32 -0
- package/src/components/starter/stats-grid.tsx +20 -0
- package/src/components/storage/VectorStoreFileDeleteButton.tsx +71 -0
- package/src/components/storage/actions/VectorStoreActionsMenu.tsx +70 -0
- package/src/components/storage/actions/VectorStoreEditModal.tsx +220 -0
- package/src/components/storage/actions/VectorStoreFileActions.tsx +61 -0
- package/src/components/storage/actions/index.tsx +76 -0
- package/src/components/storage/addStorageModal.tsx +552 -0
- package/src/components/storage/table/vectorStoreTable.tsx +461 -0
- package/src/components/storage/vectorFilesModal.tsx +209 -0
- package/src/components/storage/vectorStoreFileGrid.tsx +384 -0
- package/src/components/tag/modal/UpdateTagModal.tsx +192 -0
- package/src/components/tag/table/TagTable.tsx +138 -0
- package/src/components/user/block/BadgesBlock.tsx +26 -0
- package/src/components/user/form/ChangePasswordForm.tsx +119 -0
- package/src/components/user/form/ProfileForm.tsx +168 -0
- package/src/components/user/grid/UserGrid.tsx +475 -0
- package/src/components/user/modal/AddUserModal.tsx +165 -0
- package/src/components/user/modal/UpdateUserDetailsModal.tsx +319 -0
- package/src/components/user/modal/UpgradeUserLimitModal.tsx +123 -0
- package/src/components/user/modal/UserPermissionsModal.tsx +251 -0
- package/src/components/user/table/UserTable.tsx +202 -0
- package/src/config/app.ts +16 -0
- package/src/config/modules.ts +100 -0
- package/src/config/navigation.ts +28 -0
- package/src/config/runtime.ts +3 -0
- package/src/context/CheckoutContext.tsx +123 -0
- package/src/context/ProjectContext.tsx +123 -0
- package/src/context/RouterContext.tsx +127 -0
- package/src/context/UIContext.tsx +47 -0
- package/src/context/UserAuthContext.tsx +26 -0
- package/src/context/VectorStoreContext.tsx +51 -0
- package/src/context/index.ts +2 -0
- package/src/data/bootstrap-icons.json +2080 -0
- package/src/data/bootstrap.ts +196 -0
- package/src/data/bootstrapIcons.ts +28 -0
- package/src/enum/AppEnvironments.ts +4 -0
- package/src/enum/HTTPErrorStatus.ts +10 -0
- package/src/helpers/api/index.ts +123 -0
- package/src/helpers/constants/index.ts +4 -0
- package/src/helpers/constants/messages.ts +1 -0
- package/src/helpers/constants/regex.ts +10 -0
- package/src/helpers/constants/stripe.ts +1 -0
- package/src/helpers/constants/system-agent.ts +12 -0
- package/src/helpers/data-transform/bytesToSize.ts +8 -0
- package/src/helpers/data-transform/dropzone.ts +116 -0
- package/src/helpers/data-transform/filterUtils.ts +21 -0
- package/src/helpers/data-transform/index.ts +4 -0
- package/src/helpers/data-transform/operations.ts +3 -0
- package/src/helpers/data-transform/paging.ts +24 -0
- package/src/helpers/data-transform/stringCaseTransform.ts +34 -0
- package/src/helpers/date/index.ts +149 -0
- package/src/helpers/error/formErrorHandler.tsx +38 -0
- package/src/helpers/images/assets.ts +32 -0
- package/src/helpers/images/defaultProfileImage.ts +21 -0
- package/src/helpers/images/fileType.ts +123 -0
- package/src/helpers/images/index.ts +3 -0
- package/src/helpers/navigation/routeScroll.ts +29 -0
- package/src/helpers/pageScreenshot.ts +176 -0
- package/src/helpers/permissions/index.ts +292 -0
- package/src/helpers/providers/providerFeatures.ts +29 -0
- package/src/helpers/sharer/index.ts +44 -0
- package/src/helpers/sitemap/sitemap-utils.ts +50 -0
- package/src/helpers/slugUtils/index.ts +39 -0
- package/src/helpers/sonicVoices.ts +22 -0
- package/src/helpers/string/index.ts +93 -0
- package/src/helpers/theme/colors.ts +27 -0
- package/src/helpers/types/api.ts +22 -0
- package/src/helpers/types/customer-io.ts +47 -0
- package/src/helpers/types/data-layer.ts +25 -0
- package/src/helpers/types/index.ts +4 -0
- package/src/helpers/types/nav.ts +13 -0
- package/src/helpers/types/page-props.ts +31 -0
- package/src/helpers/types/select-option.ts +4 -0
- package/src/helpers/types/utils.ts +7 -0
- package/src/helpers/url/index.ts +26 -0
- package/src/hooks/auth/useAccountStore.ts +69 -0
- package/src/hooks/auth/useAuthStore.ts +162 -0
- package/src/hooks/category/useCategoryStore.ts +71 -0
- package/src/hooks/index.ts +17 -0
- package/src/hooks/media/useMediaStore.ts +46 -0
- package/src/hooks/post/usePostStore.ts +64 -0
- package/src/hooks/post/usePostUtils.ts +27 -0
- package/src/hooks/product/useProductPlanStore.ts +73 -0
- package/src/hooks/product/useProductStore.ts +64 -0
- package/src/hooks/product/useProductVersionStore.ts +57 -0
- package/src/hooks/site/useSiteStore.ts +53 -0
- package/src/hooks/tag/useTagStore.ts +65 -0
- package/src/hooks/utils/useAutosizeTextArea.ts +20 -0
- package/src/hooks/utils/useCountries.ts +25 -0
- package/src/hooks/utils/useGA4DataLayer.ts +25 -0
- package/src/hooks/utils/useNavOptions.ts +241 -0
- package/src/hooks/utils/useSearchAndFilterCommon.ts +78 -0
- package/src/hooks/utils/useTrackingEvents.ts +65 -0
- package/src/lib/app-paths.ts +19 -0
- package/src/lib/auth.ts +42 -0
- package/src/lib/next-router.ts +164 -0
- package/src/lib/routes.ts +36 -0
- package/src/lib/security.ts +19 -0
- package/src/pages/404.tsx +104 -0
- package/src/pages/500.tsx +26 -0
- package/src/pages/_app.tsx +87 -0
- package/src/pages/_document.tsx +26 -0
- package/src/pages/account/verify.tsx +178 -0
- package/src/pages/admin/activity/[activityId].tsx +77 -0
- package/src/pages/admin/activity/bans.tsx +197 -0
- package/src/pages/admin/activity/index.tsx +207 -0
- package/src/pages/admin/activity/settings.tsx +189 -0
- package/src/pages/admin/categories/index.tsx +61 -0
- package/src/pages/admin/coupons/index.tsx +38 -0
- package/src/pages/admin/entitlements/index.tsx +646 -0
- package/src/pages/admin/index.tsx +65 -0
- package/src/pages/admin/media/[id]/index.tsx +55 -0
- package/src/pages/admin/media/index.tsx +62 -0
- package/src/pages/admin/orgs/[orgId]/[name].tsx +1 -0
- package/src/pages/admin/orgs/index.tsx +256 -0
- package/src/pages/admin/plans/index.tsx +26 -0
- package/src/pages/admin/posts/[id].tsx +80 -0
- package/src/pages/admin/posts/index.tsx +63 -0
- package/src/pages/admin/products/[id].tsx +71 -0
- package/src/pages/admin/products/index.tsx +62 -0
- package/src/pages/admin/profile/index.tsx +26 -0
- package/src/pages/admin/providers/[id].tsx +77 -0
- package/src/pages/admin/providers/index.tsx +63 -0
- package/src/pages/admin/tags/index.tsx +58 -0
- package/src/pages/admin/users/[userId]/[name].tsx +1 -0
- package/src/pages/admin/users/index.tsx +295 -0
- package/src/pages/admin/versions/[id].tsx +211 -0
- package/src/pages/admin/versions/index.tsx +25 -0
- package/src/pages/blog/[postSlug].tsx +106 -0
- package/src/pages/blog/c/[categorySlug]/index.tsx +126 -0
- package/src/pages/blog/index.tsx +37 -0
- package/src/pages/cart/[productPlanSlug].tsx +631 -0
- package/src/pages/checkout/[productPlanSlug].tsx +368 -0
- package/src/pages/docs/index.tsx +24 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/index.tsx +67 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/pages/[pagesId].tsx +79 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/pages/index.tsx +67 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/preview/[[...slug]].tsx +7 -0
- package/src/pages/forgot.tsx +46 -0
- package/src/pages/groups/[groupId]/[name].tsx +337 -0
- package/src/pages/groups/index.tsx +62 -0
- package/src/pages/healthcheck.tsx +7 -0
- package/src/pages/index.tsx +309 -0
- package/src/pages/login.tsx +75 -0
- package/src/pages/marketplace/[slug].tsx +171 -0
- package/src/pages/marketplace/index.tsx +92 -0
- package/src/pages/openapi/index.tsx +77 -0
- package/src/pages/openapi/tokens/index.tsx +128 -0
- package/src/pages/org/[name]/settings.tsx +14 -0
- package/src/pages/org/[name]/token/index.tsx +109 -0
- package/src/pages/pricing.tsx +242 -0
- package/src/pages/projects/[projectId]/[name]/files/index.tsx +121 -0
- package/src/pages/projects/[projectId]/[name]/index.tsx +305 -0
- package/src/pages/projects/[projectId]/[name]/permission/index.tsx +143 -0
- package/src/pages/projects/[projectId]/token/index.tsx +120 -0
- package/src/pages/projects/index.tsx +129 -0
- package/src/pages/providers/[name].tsx +512 -0
- package/src/pages/providers/index.tsx +472 -0
- package/src/pages/reset.tsx +69 -0
- package/src/pages/settings/billing/index.tsx +41 -0
- package/src/pages/settings/index.tsx +133 -0
- package/src/pages/settings/organizations/[orgId]/invite/index.tsx +162 -0
- package/src/pages/settings/organizations/[orgId]/settings/index.tsx +98 -0
- package/src/pages/settings/organizations/[orgId]/token/index.tsx +109 -0
- package/src/pages/settings/organizations/index.tsx +148 -0
- package/src/pages/settings/organizations/new/index.tsx +252 -0
- package/src/pages/settings/profile/change-password.tsx +26 -0
- package/src/pages/settings/profile/index.tsx +103 -0
- package/src/pages/settings/profile/org-profile.tsx +127 -0
- package/src/pages/settings/profile/profile.tsx +26 -0
- package/src/pages/settings/sites/index.tsx +85 -0
- package/src/pages/settings/subscriptions/index.tsx +76 -0
- package/src/pages/settings/tokens/index.tsx +149 -0
- package/src/pages/signup/index.tsx +83 -0
- package/src/pages/signup/verify.tsx +138 -0
- package/src/pages/sites/[siteId]/[siteName]/[[...slug]].tsx +103 -0
- package/src/pages/sites/[siteId]/[siteName]/pages/[pageId].tsx +243 -0
- package/src/pages/sites/[siteId]/[siteName]/pages/index.tsx +140 -0
- package/src/pages/sites/host/[[...slug]].tsx +75 -0
- package/src/pages/storage/[vectorStoreId]/[name].tsx +653 -0
- package/src/pages/storage/index.tsx +526 -0
- package/src/pages/update/index.tsx +109 -0
- package/src/pages/update/verify.tsx +121 -0
- package/src/pages/users/[userId]/[name].tsx +791 -0
- package/src/pages/users/index.tsx +152 -0
- package/src/sass/app.scss +59 -0
- package/src/sass/base/_animations.scss +70 -0
- package/src/sass/base/_borders.scss +78 -0
- package/src/sass/base/_custom-backgrounds.scss +107 -0
- package/src/sass/base/_interactions.scss +35 -0
- package/src/sass/base/_main.scss +239 -0
- package/src/sass/base/_positions.scss +111 -0
- package/src/sass/base/_sizes.scss +120 -0
- package/src/sass/base/_typography.scss +184 -0
- package/src/sass/components/_accordion.scss +63 -0
- package/src/sass/components/_ad.scss +44 -0
- package/src/sass/components/_avatar.scss +18 -0
- package/src/sass/components/_badge.scss +6 -0
- package/src/sass/components/_button.scss +53 -0
- package/src/sass/components/_checkbox.scss +52 -0
- package/src/sass/components/_circle-media-picker.scss +32 -0
- package/src/sass/components/_code-snipped.scss +50 -0
- package/src/sass/components/_date-time-picker.scss +796 -0
- package/src/sass/components/_dialog.scss +27 -0
- package/src/sass/components/_gradients.scss +7 -0
- package/src/sass/components/_group-detail.scss +620 -0
- package/src/sass/components/_input.scss +567 -0
- package/src/sass/components/_menu.scss +31 -0
- package/src/sass/components/_modal.scss +273 -0
- package/src/sass/components/_popover.scss +29 -0
- package/src/sass/components/_rich-content.scss +531 -0
- package/src/sass/components/_spinner.scss +71 -0
- package/src/sass/components/_swagger.scss +7 -0
- package/src/sass/components/_swiper.scss +16 -0
- package/src/sass/components/_switch.scss +46 -0
- package/src/sass/components/_table.scss +39 -0
- package/src/sass/components/_tabs.scss +38 -0
- package/src/sass/components/_tag-input.scss +28 -0
- package/src/sass/components/_toast.scss +26 -0
- package/src/sass/components/_tooltip.scss +31 -0
- package/src/sass/layout/_base.scss +937 -0
- package/src/sass/layout/_footer.scss +148 -0
- package/src/sass/layout/_hero.scss +33 -0
- package/src/sass/layout/_nav.scss +77 -0
- package/src/sass/layout/_news-card-grid.scss +507 -0
- package/src/sass/utilities/_mixins.scss +21 -0
- package/src/sass/utilities/_sizes.scss +137 -0
- package/src/sass/utilities/_utils.scss +23 -0
- package/src/sass/utilities/_variables.scss +115 -0
- package/src/store/hooks.ts +5 -0
- package/src/store/hydrate.ts +1 -0
- package/src/store/model/activity.model.ts +52 -0
- package/src/store/model/address.model.ts +9 -0
- package/src/store/model/apiToken.model.ts +26 -0
- package/src/store/model/category.model.ts +20 -0
- package/src/store/model/entityStatus.model.ts +25 -0
- package/src/store/model/index.ts +25 -0
- package/src/store/model/invoice.model.ts +37 -0
- package/src/store/model/media.model.ts +70 -0
- package/src/store/model/org-group-permission.model.ts +16 -0
- package/src/store/model/org-group.model.ts +14 -0
- package/src/store/model/org-membership.model.ts +23 -0
- package/src/store/model/org.model.ts +13 -0
- package/src/store/model/page.model.ts +33 -0
- package/src/store/model/post.model.ts +60 -0
- package/src/store/model/product-coupon.model.ts +42 -0
- package/src/store/model/product-feature-entitlement.ts +40 -0
- package/src/store/model/product-feature.ts +29 -0
- package/src/store/model/product-plan.model.ts +120 -0
- package/src/store/model/product-version.model.ts +24 -0
- package/src/store/model/product.model.ts +91 -0
- package/src/store/model/project-file.model.ts +18 -0
- package/src/store/model/project-user-permission.model.ts +41 -0
- package/src/store/model/project.model.ts +48 -0
- package/src/store/model/provider.model.ts +118 -0
- package/src/store/model/purchase.model.ts +19 -0
- package/src/store/model/site-crawl-job.model.ts +31 -0
- package/src/store/model/site-page.model.ts +37 -0
- package/src/store/model/site.model.ts +15 -0
- package/src/store/model/subscription.model.ts +60 -0
- package/src/store/model/tag.model.ts +18 -0
- package/src/store/model/user-permission.model.ts +21 -0
- package/src/store/model/user.model.ts +97 -0
- package/src/store/model/vector-store-file.model.ts +40 -0
- package/src/store/model/vector-store.model.ts +41 -0
- package/src/store/slice/api/accountApiSlice.ts +92 -0
- package/src/store/slice/api/accountSlice.ts +57 -0
- package/src/store/slice/api/activityApiSlice.ts +218 -0
- package/src/store/slice/api/apiTokenSlice.ts +153 -0
- package/src/store/slice/api/authApiSlice.ts +220 -0
- package/src/store/slice/api/base-domain-api.ts +19 -0
- package/src/store/slice/api/billingUnitTypesApiSlice.ts +45 -0
- package/src/store/slice/api/bootstrapIconApiSlice.ts +36 -0
- package/src/store/slice/api/categoriesApiSlice.ts +101 -0
- package/src/store/slice/api/fontawesomeApiSlice.ts +43 -0
- package/src/store/slice/api/invoiceApiSlice.ts +37 -0
- package/src/store/slice/api/leadApiSlice.ts +48 -0
- package/src/store/slice/api/mediaApiSlice.ts +276 -0
- package/src/store/slice/api/orgApiSlice.ts +185 -0
- package/src/store/slice/api/orgGroupApiSlice.ts +146 -0
- package/src/store/slice/api/pageApiSlice.ts +111 -0
- package/src/store/slice/api/paymentApiSlice.ts +27 -0
- package/src/store/slice/api/postApiSlice.ts +369 -0
- package/src/store/slice/api/productCouponsApiSlice.ts +101 -0
- package/src/store/slice/api/productFeaturesApiSlice.ts +93 -0
- package/src/store/slice/api/productPlansApiSlice.ts +142 -0
- package/src/store/slice/api/productSubscriptionsApiSlice.ts +156 -0
- package/src/store/slice/api/productVersionsApiSlice.ts +116 -0
- package/src/store/slice/api/productsApiSlice.ts +169 -0
- package/src/store/slice/api/projectApiSlice.ts +135 -0
- package/src/store/slice/api/projectFileApiSlice.ts +152 -0
- package/src/store/slice/api/projectUserPermissionApiSlice.ts +153 -0
- package/src/store/slice/api/providerApiSlice.ts +259 -0
- package/src/store/slice/api/providerSettingApiSlice.ts +174 -0
- package/src/store/slice/api/siteApiSlice.ts +93 -0
- package/src/store/slice/api/stripeApiSlice.ts +114 -0
- package/src/store/slice/api/tagsApiSlice.ts +96 -0
- package/src/store/slice/api/userApiSlice.ts +305 -0
- package/src/store/slice/api/vectorStoreApiSlice.ts +119 -0
- package/src/store/slice/api/vectorStoreFileApiSlice.ts +127 -0
- package/src/store/store.ts +130 -0
- package/src/types/bootstrap.ts +30 -0
- 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)
|