@solidxai/core-ui 0.1.5-beta.9 → 0.1.6
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/dist/components/auth/AuthTabs.d.ts +14 -0
- package/dist/components/auth/AuthTabs.d.ts.map +1 -0
- package/dist/components/auth/AuthTabs.js +19 -0
- package/dist/components/auth/AuthTabs.js.map +1 -0
- package/dist/components/auth/AuthTabs.tsx +38 -0
- package/dist/components/auth/GoogleAuthChecking.d.ts.map +1 -1
- package/dist/components/auth/GoogleAuthChecking.js +10 -10
- package/dist/components/auth/GoogleAuthChecking.js.map +1 -1
- package/dist/components/auth/GoogleAuthChecking.tsx +8 -9
- package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.js +9 -10
- package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.tsx +6 -9
- package/dist/components/auth/SolidForgotPassword.d.ts.map +1 -1
- package/dist/components/auth/SolidForgotPassword.js +8 -8
- package/dist/components/auth/SolidForgotPassword.js.map +1 -1
- package/dist/components/auth/SolidForgotPassword.tsx +6 -8
- package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.js +57 -57
- package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.tsx +10 -11
- package/dist/components/auth/SolidInitiateRegisterOtp.d.ts.map +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.js +57 -57
- package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
- package/dist/components/auth/SolidInitiateRegisterOtp.tsx +10 -11
- package/dist/components/auth/SolidLogin.d.ts.map +1 -1
- package/dist/components/auth/SolidLogin.js +12 -12
- package/dist/components/auth/SolidLogin.js.map +1 -1
- package/dist/components/auth/SolidLogin.tsx +11 -16
- package/dist/components/auth/SolidRegister.d.ts.map +1 -1
- package/dist/components/auth/SolidRegister.js +19 -19
- package/dist/components/auth/SolidRegister.js.map +1 -1
- package/dist/components/auth/SolidRegister.tsx +18 -23
- package/dist/components/auth/SolidResetPassword.d.ts.map +1 -1
- package/dist/components/auth/SolidResetPassword.js +15 -15
- package/dist/components/auth/SolidResetPassword.js.map +1 -1
- package/dist/components/auth/SolidResetPassword.tsx +7 -8
- package/dist/components/common/GeneralSettings.d.ts.map +1 -1
- package/dist/components/common/GeneralSettings.js +87 -120
- package/dist/components/common/GeneralSettings.js.map +1 -1
- package/dist/components/common/GeneralSettings.tsx +12 -42
- package/dist/components/common/GlobalToast.d.ts +2 -0
- package/dist/components/common/GlobalToast.d.ts.map +1 -0
- package/dist/components/common/GlobalToast.js +25 -0
- package/dist/components/common/GlobalToast.js.map +1 -0
- package/dist/components/common/GlobalToast.tsx +25 -0
- package/dist/components/common/SolidErrorStatePage.d.ts +12 -0
- package/dist/components/common/SolidErrorStatePage.d.ts.map +1 -0
- package/dist/components/common/SolidErrorStatePage.js +16 -0
- package/dist/components/common/SolidErrorStatePage.js.map +1 -0
- package/dist/components/common/SolidErrorStatePage.tsx +55 -0
- package/dist/components/common/SolidExport.d.ts.map +1 -1
- package/dist/components/common/SolidExport.js +19 -31
- package/dist/components/common/SolidExport.js.map +1 -1
- package/dist/components/common/SolidExport.tsx +7 -19
- package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
- package/dist/components/common/SolidFormStepper.js +41 -41
- package/dist/components/common/SolidFormStepper.js.map +1 -1
- package/dist/components/common/SolidFormStepper.tsx +5 -6
- package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.js +9 -9
- package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidChangePassword.tsx +8 -9
- package/dist/components/core/common/SolidAccountSettings/SolidNotifications.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js +8 -8
- package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidNotifications.tsx +7 -9
- package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.js +11 -11
- package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidPersonalInfo.tsx +10 -11
- package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.d.ts.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.js +9 -9
- package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.js.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportDropzone.tsx +8 -9
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.d.ts.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js +7 -7
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +6 -7
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +78 -21
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +65 -10
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +6 -8
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +5 -9
- package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.js +9 -11
- package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/GenerateModelCodeRowAction.tsx +5 -10
- package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.js +5 -6
- package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/DeleteModuleRowAction.tsx +5 -8
- package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.js +10 -12
- package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction.tsx +6 -11
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +11 -6
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +13 -1
- package/dist/components/core/form/SolidFormUserViewLayout.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormUserViewLayout.js +7 -8
- package/dist/components/core/form/SolidFormUserViewLayout.js.map +1 -1
- package/dist/components/core/form/SolidFormUserViewLayout.tsx +5 -7
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +12 -21
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +11 -33
- package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.js +22 -15
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +14 -2
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +37 -26
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +38 -5
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +11 -11
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +9 -11
- package/dist/components/core/kanban/KanbanUserViewLayout.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanUserViewLayout.js +7 -8
- package/dist/components/core/kanban/KanbanUserViewLayout.js.map +1 -1
- package/dist/components/core/kanban/KanbanUserViewLayout.tsx +4 -6
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +5 -7
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +4 -9
- package/dist/components/core/list/PLAN.md +92 -0
- package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.d.ts.map +1 -1
- package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.js +13 -13
- package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.js.map +1 -1
- package/dist/components/core/list/SolidColumnSelector/SolidListColumnSelector.tsx +5 -6
- package/dist/components/core/list/SolidDataTable.d.ts +58 -0
- package/dist/components/core/list/SolidDataTable.d.ts.map +1 -0
- package/dist/components/core/list/SolidDataTable.js +141 -0
- package/dist/components/core/list/SolidDataTable.js.map +1 -0
- package/dist/components/core/list/SolidDataTable.tsx +314 -0
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +20 -67
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +9 -76
- package/dist/components/core/model/CreateModel.d.ts.map +1 -1
- package/dist/components/core/model/CreateModel.js +15 -25
- package/dist/components/core/model/CreateModel.js.map +1 -1
- package/dist/components/core/model/CreateModel.tsx +12 -32
- package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaData.js +6 -17
- package/dist/components/core/model/FieldMetaData.js.map +1 -1
- package/dist/components/core/model/FieldMetaData.tsx +5 -26
- package/dist/components/core/model/ModelMetaData.d.ts.map +1 -1
- package/dist/components/core/model/ModelMetaData.js +48 -55
- package/dist/components/core/model/ModelMetaData.js.map +1 -1
- package/dist/components/core/model/ModelMetaData.tsx +4 -22
- package/dist/components/core/module/CreateModule.d.ts.map +1 -1
- package/dist/components/core/module/CreateModule.js +42 -44
- package/dist/components/core/module/CreateModule.js.map +1 -1
- package/dist/components/core/module/CreateModule.tsx +13 -27
- package/dist/components/core/module/ModuleListViewData.d.ts.map +1 -1
- package/dist/components/core/module/ModuleListViewData.js +11 -7
- package/dist/components/core/module/ModuleListViewData.js.map +1 -1
- package/dist/components/core/module/ModuleListViewData.tsx +10 -8
- package/dist/components/core/solid-ai/SolidAiChat.d.ts +3 -0
- package/dist/components/core/solid-ai/SolidAiChat.d.ts.map +1 -0
- package/dist/components/core/solid-ai/SolidAiChat.js +1043 -0
- package/dist/components/core/solid-ai/SolidAiChat.js.map +1 -0
- package/dist/components/core/solid-ai/SolidAiChat.module.css +1339 -0
- package/dist/components/core/solid-ai/SolidAiChat.tsx +1237 -0
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +32 -69
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +8 -47
- package/dist/components/core/users/CreateUser.d.ts.map +1 -1
- package/dist/components/core/users/CreateUser.js +24 -37
- package/dist/components/core/users/CreateUser.js.map +1 -1
- package/dist/components/core/users/CreateUser.tsx +8 -46
- package/dist/components/core/users/UserListView.d.ts.map +1 -1
- package/dist/components/core/users/UserListView.js +9 -16
- package/dist/components/core/users/UserListView.js.map +1 -1
- package/dist/components/core/users/UserListView.tsx +5 -21
- package/dist/components/layout/AdminLayout.d.ts.map +1 -1
- package/dist/components/layout/AdminLayout.js +4 -2
- package/dist/components/layout/AdminLayout.js.map +1 -1
- package/dist/components/layout/AdminLayout.tsx +4 -2
- package/dist/components/layout/AdminTopHeader.d.ts +2 -0
- package/dist/components/layout/AdminTopHeader.d.ts.map +1 -0
- package/dist/components/layout/AdminTopHeader.js +80 -0
- package/dist/components/layout/AdminTopHeader.js.map +1 -0
- package/dist/components/layout/AdminTopHeader.tsx +165 -0
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +1 -2
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +0 -2
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +2 -1
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/layout/Layout.tsx +2 -0
- package/dist/components/layout/SolidAiStudioLayout.d.ts +10 -0
- package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -0
- package/dist/components/layout/SolidAiStudioLayout.js +159 -0
- package/dist/components/layout/SolidAiStudioLayout.js.map +1 -0
- package/dist/components/layout/SolidAiStudioLayout.tsx +333 -0
- package/dist/components/layout/navbar-one.d.ts.map +1 -1
- package/dist/components/layout/navbar-one.js +1 -2
- package/dist/components/layout/navbar-one.js.map +1 -1
- package/dist/components/layout/navbar-one.tsx +0 -2
- package/dist/components/layout/navbar-two-menu.d.ts.map +1 -1
- package/dist/components/layout/navbar-two-menu.js +50 -24
- package/dist/components/layout/navbar-two-menu.js.map +1 -1
- package/dist/components/layout/navbar-two-menu.tsx +48 -30
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +24 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.js +224 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +339 -0
- package/dist/components/shad-cn-ui/SolidButton.d.ts +14 -0
- package/dist/components/shad-cn-ui/SolidButton.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidButton.js +36 -0
- package/dist/components/shad-cn-ui/SolidButton.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidButton.tsx +54 -0
- package/dist/components/shad-cn-ui/SolidInput.d.ts +5 -0
- package/dist/components/shad-cn-ui/SolidInput.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidInput.js +35 -0
- package/dist/components/shad-cn-ui/SolidInput.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidInput.tsx +12 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts +10 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.js +33 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.tsx +24 -0
- package/dist/components/shad-cn-ui/SolidSelect.d.ts +16 -0
- package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidSelect.js +26 -0
- package/dist/components/shad-cn-ui/SolidSelect.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidSelect.tsx +65 -0
- package/dist/components/shad-cn-ui/SolidTabs.d.ts +18 -0
- package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidTabs.js +22 -0
- package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidTabs.tsx +73 -0
- package/dist/components/shad-cn-ui/index.d.ts +7 -0
- package/dist/components/shad-cn-ui/index.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/index.js +7 -0
- package/dist/components/shad-cn-ui/index.js.map +1 -0
- package/dist/components/shad-cn-ui/index.ts +6 -0
- package/dist/helpers/studioSandbox.d.ts +31 -0
- package/dist/helpers/studioSandbox.d.ts.map +1 -0
- package/dist/helpers/studioSandbox.js +104 -0
- package/dist/helpers/studioSandbox.js.map +1 -0
- package/dist/helpers/studioSandbox.ts +117 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.ts +4 -0
- package/dist/redux/features/solidStudioSlice.d.ts +9 -0
- package/dist/redux/features/solidStudioSlice.d.ts.map +1 -0
- package/dist/redux/features/solidStudioSlice.js +72 -0
- package/dist/redux/features/solidStudioSlice.js.map +1 -0
- package/dist/redux/features/solidStudioSlice.ts +78 -0
- package/dist/redux/features/toastSlice.d.ts +15 -0
- package/dist/redux/features/toastSlice.d.ts.map +1 -0
- package/dist/redux/features/toastSlice.js +20 -0
- package/dist/redux/features/toastSlice.js.map +1 -0
- package/dist/redux/features/toastSlice.ts +35 -0
- package/dist/redux/store/defaultStoreConfig.d.ts +1 -0
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +2 -1
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +2 -0
- package/dist/resources/images/errors/error-astronaut-404.png +0 -0
- package/dist/resources/shadcn-base.css +4171 -0
- package/dist/routes/SolidLayoutRegistry.d.ts +51 -0
- package/dist/routes/SolidLayoutRegistry.d.ts.map +1 -0
- package/dist/routes/SolidLayoutRegistry.js +108 -0
- package/dist/routes/SolidLayoutRegistry.js.map +1 -0
- package/dist/routes/SolidLayoutRegistry.tsx +157 -0
- package/dist/routes/guards/AdminGuard.d.ts +2 -0
- package/dist/routes/guards/AdminGuard.d.ts.map +1 -0
- package/dist/routes/guards/AdminGuard.js +16 -0
- package/dist/routes/guards/AdminGuard.js.map +1 -0
- package/dist/routes/guards/AdminGuard.tsx +17 -0
- package/dist/routes/pages/studio/StudioHomePage.d.ts +2 -0
- package/dist/routes/pages/studio/StudioHomePage.d.ts.map +1 -0
- package/dist/routes/pages/studio/StudioHomePage.js +22 -0
- package/dist/routes/pages/studio/StudioHomePage.js.map +1 -0
- package/dist/routes/pages/studio/StudioHomePage.tsx +106 -0
- package/dist/routes/pages/studio/StudioLandingPage.d.ts +2 -0
- package/dist/routes/pages/studio/StudioLandingPage.d.ts.map +1 -0
- package/dist/routes/pages/studio/StudioLandingPage.js +78 -0
- package/dist/routes/pages/studio/StudioLandingPage.js.map +1 -0
- package/dist/routes/pages/studio/StudioLandingPage.tsx +320 -0
- package/package.json +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { RouteObject } from "react-router-dom";
|
|
3
|
+
export interface SolidLayoutEntry {
|
|
4
|
+
/** The root path of this layout, e.g. "/jenendar" */
|
|
5
|
+
path: string;
|
|
6
|
+
/** Display title. Falls back to title-casing the path segment. */
|
|
7
|
+
title: string;
|
|
8
|
+
/** Optional subtitle shown on the card. */
|
|
9
|
+
description?: string;
|
|
10
|
+
/** Resolved URL to navigate to when the card is clicked (first child). */
|
|
11
|
+
to: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Optionally attach this to a route's `handle` to customise the card.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* {
|
|
19
|
+
* path: "/my-layout",
|
|
20
|
+
* handle: { title: "My Layout", description: "Custom layout" } satisfies SolidLayoutHandle,
|
|
21
|
+
* element: <MyLayout />,
|
|
22
|
+
* children: [...],
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export interface SolidLayoutHandle {
|
|
27
|
+
title?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Called by getSolidRoutes() whenever extraRoutes are provided.
|
|
32
|
+
* @internal — not part of the public API.
|
|
33
|
+
*/
|
|
34
|
+
export declare function _solidRegisterExtraRoutes(routes: RouteObject[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Optional — most apps do NOT need this.
|
|
37
|
+
* Use only when you need to override the auto-registered list at runtime.
|
|
38
|
+
*/
|
|
39
|
+
export declare function SolidLayoutRegistryProvider({ routes, children, }: {
|
|
40
|
+
routes: RouteObject[];
|
|
41
|
+
children: ReactNode;
|
|
42
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the registered layout entries.
|
|
45
|
+
*
|
|
46
|
+
* Priority order:
|
|
47
|
+
* 1. SolidLayoutRegistryProvider context (if mounted)
|
|
48
|
+
* 2. Routes auto-registered when getSolidRoutes({ extraRoutes }) was called
|
|
49
|
+
*/
|
|
50
|
+
export declare function useSolidLayoutRegistry(): SolidLayoutEntry[];
|
|
51
|
+
//# sourceMappingURL=SolidLayoutRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolidLayoutRegistry.d.ts","sourceRoot":"","sources":["../../src/routes/SolidLayoutRegistry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAErE;AA+ED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAOA;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,EAAE,CAI3D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from "react";
|
|
3
|
+
// ── Module-level store ────────────────────────────────────────────────────────
|
|
4
|
+
// Populated automatically inside getSolidRoutes() — no consumer changes needed.
|
|
5
|
+
var _autoRoutes = [];
|
|
6
|
+
/**
|
|
7
|
+
* Called by getSolidRoutes() whenever extraRoutes are provided.
|
|
8
|
+
* @internal — not part of the public API.
|
|
9
|
+
*/
|
|
10
|
+
export function _solidRegisterExtraRoutes(routes) {
|
|
11
|
+
_autoRoutes = routes;
|
|
12
|
+
}
|
|
13
|
+
// ── Context (optional override) ───────────────────────────────────────────────
|
|
14
|
+
// Mount SolidLayoutRegistryProvider anywhere above StudioLandingPage to
|
|
15
|
+
// override the auto-registered list (e.g. async / runtime route lists).
|
|
16
|
+
var SolidLayoutRegistryContext = createContext(null);
|
|
17
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
18
|
+
function pathToTitle(path) {
|
|
19
|
+
return (path
|
|
20
|
+
.replace(/^\//, "")
|
|
21
|
+
.split(/[-_/]/)
|
|
22
|
+
.filter(Boolean)
|
|
23
|
+
.map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1); })
|
|
24
|
+
.join(" ") || path);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Walk a route tree and return the first concrete relative or absolute path found.
|
|
28
|
+
* Skips index routes (they render at the parent path) and pathless wrappers
|
|
29
|
+
* (guards, layout wrappers) by looking inside their children recursively.
|
|
30
|
+
*/
|
|
31
|
+
function findFirstConcretePath(children) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
// 1. FIRST PASS → prioritize index (including inside pathless wrappers)
|
|
34
|
+
for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
|
|
35
|
+
var child = children_1[_i];
|
|
36
|
+
if (child.index || child.path === "") {
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
// Deep check for pathless wrappers in the first pass too
|
|
40
|
+
if (!child.path && ((_a = child.children) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
41
|
+
var nested = findFirstConcretePath(child.children);
|
|
42
|
+
if (nested === "")
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// 2. SECOND PASS → find first path
|
|
47
|
+
for (var _c = 0, children_2 = children; _c < children_2.length; _c++) {
|
|
48
|
+
var child = children_2[_c];
|
|
49
|
+
if (child.path)
|
|
50
|
+
return child.path;
|
|
51
|
+
if ((_b = child.children) === null || _b === void 0 ? void 0 : _b.length) {
|
|
52
|
+
var nested = findFirstConcretePath(child.children);
|
|
53
|
+
if (nested !== undefined)
|
|
54
|
+
return nested;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
function resolveFirstChildTo(basePath, children) {
|
|
60
|
+
var concretePath = findFirstConcretePath(children);
|
|
61
|
+
if (concretePath === undefined || concretePath === "")
|
|
62
|
+
return basePath;
|
|
63
|
+
if (concretePath.startsWith("/"))
|
|
64
|
+
return concretePath;
|
|
65
|
+
return "".concat(basePath.replace(/\/$/, ""), "/").concat(concretePath);
|
|
66
|
+
}
|
|
67
|
+
function extractLayouts(routes) {
|
|
68
|
+
return routes
|
|
69
|
+
.filter(function (r) { return !!r.path; })
|
|
70
|
+
.map(function (r) {
|
|
71
|
+
var _a, _b;
|
|
72
|
+
var handle = r.handle;
|
|
73
|
+
var to = ((_a = r.children) === null || _a === void 0 ? void 0 : _a.length)
|
|
74
|
+
? resolveFirstChildTo(r.path, r.children)
|
|
75
|
+
: r.path; // 👈 fallback for standalone routes
|
|
76
|
+
return {
|
|
77
|
+
path: r.path,
|
|
78
|
+
title: (_b = handle === null || handle === void 0 ? void 0 : handle.title) !== null && _b !== void 0 ? _b : pathToTitle(r.path),
|
|
79
|
+
description: handle === null || handle === void 0 ? void 0 : handle.description,
|
|
80
|
+
to: to,
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// ── Provider (optional override) ──────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Optional — most apps do NOT need this.
|
|
87
|
+
* Use only when you need to override the auto-registered list at runtime.
|
|
88
|
+
*/
|
|
89
|
+
export function SolidLayoutRegistryProvider(_a) {
|
|
90
|
+
var routes = _a.routes, children = _a.children;
|
|
91
|
+
var layouts = useMemo(function () { return extractLayouts(routes); }, [routes]);
|
|
92
|
+
return (_jsx(SolidLayoutRegistryContext.Provider, { value: layouts, children: children }));
|
|
93
|
+
}
|
|
94
|
+
// ── Hook ──────────────────────────────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Returns the registered layout entries.
|
|
97
|
+
*
|
|
98
|
+
* Priority order:
|
|
99
|
+
* 1. SolidLayoutRegistryProvider context (if mounted)
|
|
100
|
+
* 2. Routes auto-registered when getSolidRoutes({ extraRoutes }) was called
|
|
101
|
+
*/
|
|
102
|
+
export function useSolidLayoutRegistry() {
|
|
103
|
+
var contextLayouts = useContext(SolidLayoutRegistryContext);
|
|
104
|
+
if (contextLayouts !== null)
|
|
105
|
+
return contextLayouts;
|
|
106
|
+
return extractLayouts(_autoRoutes);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=SolidLayoutRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolidLayoutRegistry.js","sourceRoot":"","sources":["../../src/routes/SolidLayoutRegistry.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface SolidLayoutEntry {\n /** The root path of this layout, e.g. \"/jenendar\" */\n path: string;\n /** Display title. Falls back to title-casing the path segment. */\n title: string;\n /** Optional subtitle shown on the card. */\n description?: string;\n /** Resolved URL to navigate to when the card is clicked (first child). */\n to: string;\n}\n\n/**\n * Optionally attach this to a route's `handle` to customise the card.\n *\n * @example\n * ```tsx\n * {\n * path: \"/my-layout\",\n * handle: { title: \"My Layout\", description: \"Custom layout\" } satisfies SolidLayoutHandle,\n * element: <MyLayout />,\n * children: [...],\n * }\n * ```\n */\nexport interface SolidLayoutHandle {\n title?: string;\n description?: string;\n}\n\n// ── Module-level store ────────────────────────────────────────────────────────\n// Populated automatically inside getSolidRoutes() — no consumer changes needed.\n\nlet _autoRoutes: RouteObject[] = [];\n\n/**\n * Called by getSolidRoutes() whenever extraRoutes are provided.\n * @internal — not part of the public API.\n */\nexport function _solidRegisterExtraRoutes(routes: RouteObject[]): void {\n _autoRoutes = routes;\n}\n\n// ── Context (optional override) ───────────────────────────────────────────────\n// Mount SolidLayoutRegistryProvider anywhere above StudioLandingPage to\n// override the auto-registered list (e.g. async / runtime route lists).\n\nconst SolidLayoutRegistryContext = createContext<SolidLayoutEntry[] | null>(null);\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction pathToTitle(path: string): string {\n return (\n path\n .replace(/^\\//, \"\")\n .split(/[-_/]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \") || path\n );\n}\n\n/**\n * Walk a route tree and return the first concrete relative or absolute path found.\n * Skips index routes (they render at the parent path) and pathless wrappers\n * (guards, layout wrappers) by looking inside their children recursively.\n */\nfunction findFirstConcretePath(children: RouteObject[]): string | undefined {\n // 1. FIRST PASS → prioritize index (including inside pathless wrappers)\n for (const child of children) {\n if ((child as any).index || child.path === \"\") {\n return \"\";\n }\n // Deep check for pathless wrappers in the first pass too\n if (!child.path && child.children?.length) {\n const nested = findFirstConcretePath(child.children);\n if (nested === \"\") return \"\";\n }\n }\n\n // 2. SECOND PASS → find first path\n for (const child of children) {\n if (child.path) return child.path;\n\n if (child.children?.length) {\n const nested = findFirstConcretePath(child.children);\n if (nested !== undefined) return nested;\n }\n }\n\n return undefined;\n}\nfunction resolveFirstChildTo(basePath: string, children: RouteObject[]): string {\n const concretePath = findFirstConcretePath(children);\n if (concretePath === undefined || concretePath === \"\") return basePath;\n if (concretePath.startsWith(\"/\")) return concretePath;\n return `${basePath.replace(/\\/$/, \"\")}/${concretePath}`;\n}\n\nfunction extractLayouts(routes: RouteObject[]): SolidLayoutEntry[] {\n return routes\n .filter((r) => !!r.path)\n .map((r) => {\n const handle = r.handle as SolidLayoutHandle | undefined;\n\n const to = r.children?.length\n ? resolveFirstChildTo(r.path!, r.children)\n : r.path!; // 👈 fallback for standalone routes\n\n return {\n path: r.path!,\n title: handle?.title ?? pathToTitle(r.path!),\n description: handle?.description,\n to,\n };\n });\n}\n\n// ── Provider (optional override) ──────────────────────────────────────────────\n\n/**\n * Optional — most apps do NOT need this.\n * Use only when you need to override the auto-registered list at runtime.\n */\nexport function SolidLayoutRegistryProvider({\n routes,\n children,\n}: {\n routes: RouteObject[];\n children: ReactNode;\n}) {\n const layouts = useMemo(() => extractLayouts(routes), [routes]);\n return (\n <SolidLayoutRegistryContext.Provider value={layouts}>\n {children}\n </SolidLayoutRegistryContext.Provider>\n );\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the registered layout entries.\n *\n * Priority order:\n * 1. SolidLayoutRegistryProvider context (if mounted)\n * 2. Routes auto-registered when getSolidRoutes({ extraRoutes }) was called\n */\nexport function useSolidLayoutRegistry(): SolidLayoutEntry[] {\n const contextLayouts = useContext(SolidLayoutRegistryContext);\n if (contextLayouts !== null) return contextLayouts;\n return extractLayouts(_autoRoutes);\n}\n"]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { createContext, useContext, useMemo, type ReactNode } from "react";
|
|
2
|
+
import type { RouteObject } from "react-router-dom";
|
|
3
|
+
|
|
4
|
+
// ── Types ─────────────────────────────────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
export interface SolidLayoutEntry {
|
|
7
|
+
/** The root path of this layout, e.g. "/jenendar" */
|
|
8
|
+
path: string;
|
|
9
|
+
/** Display title. Falls back to title-casing the path segment. */
|
|
10
|
+
title: string;
|
|
11
|
+
/** Optional subtitle shown on the card. */
|
|
12
|
+
description?: string;
|
|
13
|
+
/** Resolved URL to navigate to when the card is clicked (first child). */
|
|
14
|
+
to: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Optionally attach this to a route's `handle` to customise the card.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* {
|
|
23
|
+
* path: "/my-layout",
|
|
24
|
+
* handle: { title: "My Layout", description: "Custom layout" } satisfies SolidLayoutHandle,
|
|
25
|
+
* element: <MyLayout />,
|
|
26
|
+
* children: [...],
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export interface SolidLayoutHandle {
|
|
31
|
+
title?: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ── Module-level store ────────────────────────────────────────────────────────
|
|
36
|
+
// Populated automatically inside getSolidRoutes() — no consumer changes needed.
|
|
37
|
+
|
|
38
|
+
let _autoRoutes: RouteObject[] = [];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Called by getSolidRoutes() whenever extraRoutes are provided.
|
|
42
|
+
* @internal — not part of the public API.
|
|
43
|
+
*/
|
|
44
|
+
export function _solidRegisterExtraRoutes(routes: RouteObject[]): void {
|
|
45
|
+
_autoRoutes = routes;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ── Context (optional override) ───────────────────────────────────────────────
|
|
49
|
+
// Mount SolidLayoutRegistryProvider anywhere above StudioLandingPage to
|
|
50
|
+
// override the auto-registered list (e.g. async / runtime route lists).
|
|
51
|
+
|
|
52
|
+
const SolidLayoutRegistryContext = createContext<SolidLayoutEntry[] | null>(null);
|
|
53
|
+
|
|
54
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
function pathToTitle(path: string): string {
|
|
57
|
+
return (
|
|
58
|
+
path
|
|
59
|
+
.replace(/^\//, "")
|
|
60
|
+
.split(/[-_/]/)
|
|
61
|
+
.filter(Boolean)
|
|
62
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
63
|
+
.join(" ") || path
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Walk a route tree and return the first concrete relative or absolute path found.
|
|
69
|
+
* Skips index routes (they render at the parent path) and pathless wrappers
|
|
70
|
+
* (guards, layout wrappers) by looking inside their children recursively.
|
|
71
|
+
*/
|
|
72
|
+
function findFirstConcretePath(children: RouteObject[]): string | undefined {
|
|
73
|
+
// 1. FIRST PASS → prioritize index (including inside pathless wrappers)
|
|
74
|
+
for (const child of children) {
|
|
75
|
+
if ((child as any).index || child.path === "") {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
// Deep check for pathless wrappers in the first pass too
|
|
79
|
+
if (!child.path && child.children?.length) {
|
|
80
|
+
const nested = findFirstConcretePath(child.children);
|
|
81
|
+
if (nested === "") return "";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 2. SECOND PASS → find first path
|
|
86
|
+
for (const child of children) {
|
|
87
|
+
if (child.path) return child.path;
|
|
88
|
+
|
|
89
|
+
if (child.children?.length) {
|
|
90
|
+
const nested = findFirstConcretePath(child.children);
|
|
91
|
+
if (nested !== undefined) return nested;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
function resolveFirstChildTo(basePath: string, children: RouteObject[]): string {
|
|
98
|
+
const concretePath = findFirstConcretePath(children);
|
|
99
|
+
if (concretePath === undefined || concretePath === "") return basePath;
|
|
100
|
+
if (concretePath.startsWith("/")) return concretePath;
|
|
101
|
+
return `${basePath.replace(/\/$/, "")}/${concretePath}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function extractLayouts(routes: RouteObject[]): SolidLayoutEntry[] {
|
|
105
|
+
return routes
|
|
106
|
+
.filter((r) => !!r.path)
|
|
107
|
+
.map((r) => {
|
|
108
|
+
const handle = r.handle as SolidLayoutHandle | undefined;
|
|
109
|
+
|
|
110
|
+
const to = r.children?.length
|
|
111
|
+
? resolveFirstChildTo(r.path!, r.children)
|
|
112
|
+
: r.path!; // 👈 fallback for standalone routes
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
path: r.path!,
|
|
116
|
+
title: handle?.title ?? pathToTitle(r.path!),
|
|
117
|
+
description: handle?.description,
|
|
118
|
+
to,
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ── Provider (optional override) ──────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Optional — most apps do NOT need this.
|
|
127
|
+
* Use only when you need to override the auto-registered list at runtime.
|
|
128
|
+
*/
|
|
129
|
+
export function SolidLayoutRegistryProvider({
|
|
130
|
+
routes,
|
|
131
|
+
children,
|
|
132
|
+
}: {
|
|
133
|
+
routes: RouteObject[];
|
|
134
|
+
children: ReactNode;
|
|
135
|
+
}) {
|
|
136
|
+
const layouts = useMemo(() => extractLayouts(routes), [routes]);
|
|
137
|
+
return (
|
|
138
|
+
<SolidLayoutRegistryContext.Provider value={layouts}>
|
|
139
|
+
{children}
|
|
140
|
+
</SolidLayoutRegistryContext.Provider>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ── Hook ──────────────────────────────────────────────────────────────────────
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Returns the registered layout entries.
|
|
148
|
+
*
|
|
149
|
+
* Priority order:
|
|
150
|
+
* 1. SolidLayoutRegistryProvider context (if mounted)
|
|
151
|
+
* 2. Routes auto-registered when getSolidRoutes({ extraRoutes }) was called
|
|
152
|
+
*/
|
|
153
|
+
export function useSolidLayoutRegistry(): SolidLayoutEntry[] {
|
|
154
|
+
const contextLayouts = useContext(SolidLayoutRegistryContext);
|
|
155
|
+
if (contextLayouts !== null) return contextLayouts;
|
|
156
|
+
return extractLayouts(_autoRoutes);
|
|
157
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminGuard.d.ts","sourceRoot":"","sources":["../../../src/routes/guards/AdminGuard.tsx"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,4CAYzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Navigate, Outlet } from "react-router-dom";
|
|
3
|
+
import { useSession } from "../../hooks/useSession";
|
|
4
|
+
import { hasAnyRole } from "../../helpers/rolesHelper";
|
|
5
|
+
export function AdminGuard() {
|
|
6
|
+
var _a;
|
|
7
|
+
var _b = useSession(), session = _b.data, status = _b.status;
|
|
8
|
+
if (status === "loading") {
|
|
9
|
+
return _jsx("div", { children: "Loading..." });
|
|
10
|
+
}
|
|
11
|
+
if (!hasAnyRole((_a = session === null || session === void 0 ? void 0 : session.user) === null || _a === void 0 ? void 0 : _a.roles, ["Admin"])) {
|
|
12
|
+
return _jsx(Navigate, { to: "/not-found", replace: true });
|
|
13
|
+
}
|
|
14
|
+
return _jsx(Outlet, {});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=AdminGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminGuard.js","sourceRoot":"","sources":["../../../src/routes/guards/AdminGuard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,UAAU,UAAU;;IAClB,IAAA,KAA4B,UAAU,EAAE,EAAhC,OAAO,UAAA,EAAE,MAAM,YAAiB,CAAC;IAE/C,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,OAAO,uCAAqB,CAAC;KAC9B;IAED,IAAI,CAAC,UAAU,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE;QAChD,OAAO,KAAC,QAAQ,IAAC,EAAE,EAAC,YAAY,EAAC,OAAO,SAAG,CAAC;KAC7C;IAED,OAAO,KAAC,MAAM,KAAG,CAAC;AACpB,CAAC","sourcesContent":["import { Navigate, Outlet } from \"react-router-dom\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\n\nexport function AdminGuard() {\n const { data: session, status } = useSession();\n\n if (status === \"loading\") {\n return <div>Loading...</div>;\n }\n\n if (!hasAnyRole(session?.user?.roles, [\"Admin\"])) {\n return <Navigate to=\"/not-found\" replace />;\n }\n\n return <Outlet />;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Navigate, Outlet } from "react-router-dom";
|
|
2
|
+
import { useSession } from "../../hooks/useSession";
|
|
3
|
+
import { hasAnyRole } from "../../helpers/rolesHelper";
|
|
4
|
+
|
|
5
|
+
export function AdminGuard() {
|
|
6
|
+
const { data: session, status } = useSession();
|
|
7
|
+
|
|
8
|
+
if (status === "loading") {
|
|
9
|
+
return <div>Loading...</div>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (!hasAnyRole(session?.user?.roles, ["Admin"])) {
|
|
13
|
+
return <Navigate to="/not-found" replace />;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return <Outlet />;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StudioHomePage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioHomePage.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,cAAc,4CA2E7B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useDispatch } from "react-redux";
|
|
4
|
+
import { useNavigate } from "react-router-dom";
|
|
5
|
+
import { enterStudioMode, setStudioView } from "../../../redux/features/solidStudioSlice";
|
|
6
|
+
var BackendIcon = function () { return (_jsxs("svg", { width: "28", height: "28", viewBox: "0 0 32 32", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "2", y: "6", width: "28", height: "20", rx: "3", stroke: "currentColor", strokeWidth: "1.6" }), _jsx("path", { d: "M2 11h28", stroke: "currentColor", strokeWidth: "1.6" }), _jsx("circle", { cx: "6.5", cy: "8.5", r: "1", fill: "currentColor" }), _jsx("circle", { cx: "10", cy: "8.5", r: "1", fill: "currentColor" }), _jsx("circle", { cx: "13.5", cy: "8.5", r: "1", fill: "currentColor" }), _jsx("path", { d: "M9 17l3 3-3 3M15 23h6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
|
|
7
|
+
var FrontendIcon = function () { return (_jsxs("svg", { width: "28", height: "28", viewBox: "0 0 32 32", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "2", y: "4", width: "28", height: "18", rx: "3", stroke: "currentColor", strokeWidth: "1.6" }), _jsx("path", { d: "M10 28h12M16 22v6", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }), _jsx("path", { d: "M11 13l3-3-3-3M17 10h5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
|
|
8
|
+
var ArrowIcon = function () { return (_jsx("svg", { width: "15", height: "15", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M3 8h10M9 4l4 4-4 4", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round" }) })); };
|
|
9
|
+
export function StudioHomePage() {
|
|
10
|
+
var dispatch = useDispatch();
|
|
11
|
+
var navigate = useNavigate();
|
|
12
|
+
useEffect(function () {
|
|
13
|
+
dispatch(enterStudioMode());
|
|
14
|
+
dispatch(setStudioView(null));
|
|
15
|
+
}, [dispatch]);
|
|
16
|
+
var handleSelect = function (view) {
|
|
17
|
+
dispatch(setStudioView(view));
|
|
18
|
+
navigate(view === "backend" ? "/admin" : "/landing");
|
|
19
|
+
};
|
|
20
|
+
return (_jsx("div", { className: "solid-studio-home", children: _jsxs("div", { className: "solid-studio-home-inner solid-studio-home-inner--wide", children: [_jsxs("div", { className: "solid-studio-home-heading", children: [_jsx("div", { className: "solid-studio-home-badge", children: "SolidX Studio" }), _jsx("h1", { children: "Welcome to SolidX Studio" }), _jsx("p", { children: "Choose your workspace to get started." })] }), _jsxs("div", { className: "solid-studio-home-cards solid-studio-home-cards--2col", children: [_jsx("button", { type: "button", className: "solid-studio-home-card solid-studio-home-card--backend", onClick: function () { return handleSelect("backend"); }, "aria-label": "Open Backend Studio", children: _jsxs("div", { className: "solid-studio-home-card-body", children: [_jsx("div", { className: "solid-studio-home-card-icon solid-studio-home-card-icon--backend", children: _jsx(BackendIcon, {}) }), _jsxs("div", { className: "solid-studio-home-card-content", children: [_jsx("span", { className: "solid-studio-home-card-title", children: "Backend Studio" }), _jsx("span", { className: "solid-studio-home-card-desc", children: "Admin panel, data management, APIs, configuration, and settings." })] }), _jsxs("div", { className: "solid-studio-home-card-cta", children: [_jsx("span", { children: "Open" }), _jsx(ArrowIcon, {})] })] }) }), _jsx("button", { type: "button", className: "solid-studio-home-card solid-studio-home-card--frontend", onClick: function () { return handleSelect("frontend"); }, "aria-label": "Open Frontend Studio", children: _jsxs("div", { className: "solid-studio-home-card-body", children: [_jsx("div", { className: "solid-studio-home-card-icon solid-studio-home-card-icon--frontend", children: _jsx(FrontendIcon, {}) }), _jsxs("div", { className: "solid-studio-home-card-content", children: [_jsx("span", { className: "solid-studio-home-card-title", children: "Frontend Studio" }), _jsx("span", { className: "solid-studio-home-card-desc", children: "Custom UI, landing pages, components, and user-facing layouts." })] }), _jsxs("div", { className: "solid-studio-home-card-cta", children: [_jsx("span", { children: "Open" }), _jsx(ArrowIcon, {})] })] }) })] })] }) }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=StudioHomePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StudioHomePage.js","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioHomePage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nimport { enterStudioMode, setStudioView } from \"../../../redux/features/solidStudioSlice\";\n\nconst BackendIcon = () => (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"6\" width=\"28\" height=\"20\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path d=\"M2 11h28\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <circle cx=\"6.5\" cy=\"8.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"8.5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"13.5\" cy=\"8.5\" r=\"1\" fill=\"currentColor\" />\n <path d=\"M9 17l3 3-3 3M15 23h6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 32 32\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"4\" width=\"28\" height=\"18\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path d=\"M10 28h12M16 22v6\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M11 13l3-3-3-3M17 10h5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ArrowIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport function StudioHomePage() {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n\n useEffect(() => {\n dispatch(enterStudioMode());\n dispatch(setStudioView(null));\n }, [dispatch]);\n\n const handleSelect = (view: \"backend\" | \"frontend\") => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n return (\n <div className=\"solid-studio-home\">\n <div className=\"solid-studio-home-inner solid-studio-home-inner--wide\">\n <div className=\"solid-studio-home-heading\">\n <div className=\"solid-studio-home-badge\">SolidX Studio</div>\n <h1>Welcome to SolidX Studio</h1>\n <p>Choose your workspace to get started.</p>\n </div>\n\n <div className=\"solid-studio-home-cards solid-studio-home-cards--2col\">\n {/* Backend Studio Card */}\n <button\n type=\"button\"\n className=\"solid-studio-home-card solid-studio-home-card--backend\"\n onClick={() => handleSelect(\"backend\")}\n aria-label=\"Open Backend Studio\"\n >\n <div className=\"solid-studio-home-card-body\">\n <div className=\"solid-studio-home-card-icon solid-studio-home-card-icon--backend\">\n <BackendIcon />\n </div>\n <div className=\"solid-studio-home-card-content\">\n <span className=\"solid-studio-home-card-title\">Backend Studio</span>\n <span className=\"solid-studio-home-card-desc\">\n Admin panel, data management, APIs, configuration, and settings.\n </span>\n </div>\n <div className=\"solid-studio-home-card-cta\">\n <span>Open</span>\n <ArrowIcon />\n </div>\n </div>\n </button>\n\n {/* Frontend Studio Card */}\n <button\n type=\"button\"\n className=\"solid-studio-home-card solid-studio-home-card--frontend\"\n onClick={() => handleSelect(\"frontend\")}\n aria-label=\"Open Frontend Studio\"\n >\n <div className=\"solid-studio-home-card-body\">\n <div className=\"solid-studio-home-card-icon solid-studio-home-card-icon--frontend\">\n <FrontendIcon />\n </div>\n <div className=\"solid-studio-home-card-content\">\n <span className=\"solid-studio-home-card-title\">Frontend Studio</span>\n <span className=\"solid-studio-home-card-desc\">\n Custom UI, landing pages, components, and user-facing layouts.\n </span>\n </div>\n <div className=\"solid-studio-home-card-cta\">\n <span>Open</span>\n <ArrowIcon />\n </div>\n </div>\n </button>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { useDispatch } from "react-redux";
|
|
3
|
+
import { useNavigate } from "react-router-dom";
|
|
4
|
+
import { enterStudioMode, setStudioView } from "../../../redux/features/solidStudioSlice";
|
|
5
|
+
|
|
6
|
+
const BackendIcon = () => (
|
|
7
|
+
<svg width="28" height="28" viewBox="0 0 32 32" fill="none" aria-hidden="true">
|
|
8
|
+
<rect x="2" y="6" width="28" height="20" rx="3" stroke="currentColor" strokeWidth="1.6" />
|
|
9
|
+
<path d="M2 11h28" stroke="currentColor" strokeWidth="1.6" />
|
|
10
|
+
<circle cx="6.5" cy="8.5" r="1" fill="currentColor" />
|
|
11
|
+
<circle cx="10" cy="8.5" r="1" fill="currentColor" />
|
|
12
|
+
<circle cx="13.5" cy="8.5" r="1" fill="currentColor" />
|
|
13
|
+
<path d="M9 17l3 3-3 3M15 23h6" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
|
|
14
|
+
</svg>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const FrontendIcon = () => (
|
|
18
|
+
<svg width="28" height="28" viewBox="0 0 32 32" fill="none" aria-hidden="true">
|
|
19
|
+
<rect x="2" y="4" width="28" height="18" rx="3" stroke="currentColor" strokeWidth="1.6" />
|
|
20
|
+
<path d="M10 28h12M16 22v6" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
|
|
21
|
+
<path d="M11 13l3-3-3-3M17 10h5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
|
|
22
|
+
</svg>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const ArrowIcon = () => (
|
|
26
|
+
<svg width="15" height="15" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
27
|
+
<path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" />
|
|
28
|
+
</svg>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export function StudioHomePage() {
|
|
32
|
+
const dispatch = useDispatch();
|
|
33
|
+
const navigate = useNavigate();
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
dispatch(enterStudioMode());
|
|
37
|
+
dispatch(setStudioView(null));
|
|
38
|
+
}, [dispatch]);
|
|
39
|
+
|
|
40
|
+
const handleSelect = (view: "backend" | "frontend") => {
|
|
41
|
+
dispatch(setStudioView(view));
|
|
42
|
+
navigate(view === "backend" ? "/admin" : "/landing");
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div className="solid-studio-home">
|
|
47
|
+
<div className="solid-studio-home-inner solid-studio-home-inner--wide">
|
|
48
|
+
<div className="solid-studio-home-heading">
|
|
49
|
+
<div className="solid-studio-home-badge">SolidX Studio</div>
|
|
50
|
+
<h1>Welcome to SolidX Studio</h1>
|
|
51
|
+
<p>Choose your workspace to get started.</p>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div className="solid-studio-home-cards solid-studio-home-cards--2col">
|
|
55
|
+
{/* Backend Studio Card */}
|
|
56
|
+
<button
|
|
57
|
+
type="button"
|
|
58
|
+
className="solid-studio-home-card solid-studio-home-card--backend"
|
|
59
|
+
onClick={() => handleSelect("backend")}
|
|
60
|
+
aria-label="Open Backend Studio"
|
|
61
|
+
>
|
|
62
|
+
<div className="solid-studio-home-card-body">
|
|
63
|
+
<div className="solid-studio-home-card-icon solid-studio-home-card-icon--backend">
|
|
64
|
+
<BackendIcon />
|
|
65
|
+
</div>
|
|
66
|
+
<div className="solid-studio-home-card-content">
|
|
67
|
+
<span className="solid-studio-home-card-title">Backend Studio</span>
|
|
68
|
+
<span className="solid-studio-home-card-desc">
|
|
69
|
+
Admin panel, data management, APIs, configuration, and settings.
|
|
70
|
+
</span>
|
|
71
|
+
</div>
|
|
72
|
+
<div className="solid-studio-home-card-cta">
|
|
73
|
+
<span>Open</span>
|
|
74
|
+
<ArrowIcon />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</button>
|
|
78
|
+
|
|
79
|
+
{/* Frontend Studio Card */}
|
|
80
|
+
<button
|
|
81
|
+
type="button"
|
|
82
|
+
className="solid-studio-home-card solid-studio-home-card--frontend"
|
|
83
|
+
onClick={() => handleSelect("frontend")}
|
|
84
|
+
aria-label="Open Frontend Studio"
|
|
85
|
+
>
|
|
86
|
+
<div className="solid-studio-home-card-body">
|
|
87
|
+
<div className="solid-studio-home-card-icon solid-studio-home-card-icon--frontend">
|
|
88
|
+
<FrontendIcon />
|
|
89
|
+
</div>
|
|
90
|
+
<div className="solid-studio-home-card-content">
|
|
91
|
+
<span className="solid-studio-home-card-title">Frontend Studio</span>
|
|
92
|
+
<span className="solid-studio-home-card-desc">
|
|
93
|
+
Custom UI, landing pages, components, and user-facing layouts.
|
|
94
|
+
</span>
|
|
95
|
+
</div>
|
|
96
|
+
<div className="solid-studio-home-card-cta">
|
|
97
|
+
<span>Open</span>
|
|
98
|
+
<ArrowIcon />
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</button>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StudioLandingPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioLandingPage.tsx"],"names":[],"mappings":"AAgQA,wBAAgB,iBAAiB,4CA+DhC"}
|