diff --git a/packages/app/src/components/workspace-layout/index.tsx b/packages/app/src/components/workspace-layout/index.tsx
new file mode 100644
index 0000000000..2eb06a3400
--- /dev/null
+++ b/packages/app/src/components/workspace-layout/index.tsx
@@ -0,0 +1,34 @@
+import HelpIsland from '@/components/help-island';
+import { WorkSpaceSliderBar } from '@/components/workspace-slider-bar';
+import { useRouter } from 'next/router';
+import { StyledPage, StyledWrapper } from './styles';
+import { AppStateProvider } from '@/providers/app-state-provider/provider';
+import ConfirmProvider from '@/providers/confirm-provider';
+import { ModalProvider } from '@/providers/global-modal-provider';
+import ProviderComposer from '@/components/provider-composer';
+import { PropsWithChildren } from 'react';
+
+export const WorkspaceLayout = ({ children }: PropsWithChildren) => {
+ const router = useRouter();
+ return (
+ ,
+ ,
+ ,
+ ]}
+ >
+
+
+
+ {children}
+
+
+
+
+ );
+};
+
+export default WorkspaceLayout;
diff --git a/packages/app/src/components/workspace-layout/styles.ts b/packages/app/src/components/workspace-layout/styles.ts
new file mode 100644
index 0000000000..7bffcc3bd8
--- /dev/null
+++ b/packages/app/src/components/workspace-layout/styles.ts
@@ -0,0 +1,18 @@
+import { styled } from '@/styles';
+
+export const StyledPage = styled('div')(({ theme }) => {
+ return {
+ height: '100vh',
+ backgroundColor: theme.colors.pageBackground,
+ transition: 'background-color .5s',
+ display: 'flex',
+ flexGrow: '1',
+ };
+});
+
+export const StyledWrapper = styled('div')(({ theme }) => {
+ return {
+ flexGrow: 1,
+ position: 'relative',
+ };
+});
diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx
index a5f11dc2ff..e9031d3c79 100644
--- a/packages/app/src/pages/_app.tsx
+++ b/packages/app/src/pages/_app.tsx
@@ -3,63 +3,34 @@ import dynamic from 'next/dynamic';
import '../../public/globals.css';
import '../../public/variable.css';
import './temporary.css';
-import { ModalProvider } from '@/providers/global-modal-provider';
-import { AppStateProvider } from '@/providers/app-state-provider/provider';
import { Logger } from '@toeverything/pathfinder-logger';
-import { WorkSpaceSliderBar } from '@/components/workspace-slider-bar';
import '@fontsource/space-mono';
import '@fontsource/poppins';
import '../utils/print-build-info';
-import { styled } from '@/styles';
import ProviderComposer from '@/components/provider-composer';
-import ConfirmProvider from '@/providers/confirm-provider';
-import HelpIsland from '@/components/help-island';
-import { useRouter } from 'next/router';
+import type { ReactElement, ReactNode } from 'react';
+import type { NextPage } from 'next';
const ThemeProvider = dynamic(() => import('@/providers/themeProvider'), {
ssr: false,
});
-const StyledPage = styled('div')(({ theme }) => {
- return {
- height: '100vh',
- backgroundColor: theme.colors.pageBackground,
- transition: 'background-color .5s',
- display: 'flex',
- flexGrow: '1',
- };
-});
+export type NextPageWithLayout
= NextPage
& {
+ getLayout?: (page: ReactElement) => ReactNode;
+};
-const StyledWrapper = styled('div')(({ theme }) => {
- return {
- flexGrow: 1,
- position: 'relative',
- };
-});
+type AppPropsWithLayout = AppProps & {
+ Component: NextPageWithLayout;
+};
-function MyApp({ Component, pageProps }: AppProps) {
- const router = useRouter();
+function MyApp({ Component, pageProps }: AppPropsWithLayout) {
+ const getLayout = Component.getLayout || (page => page);
return (
<>
- ,
- ,
- ,
- ,
- ]}
- >
-
-
-
-
-
-
-
+ ]}>
+ {getLayout()}
>
);
diff --git a/packages/app/src/pages/affine.tsx b/packages/app/src/pages/affine.tsx
index fed40e1f36..31bc1a53bf 100644
--- a/packages/app/src/pages/affine.tsx
+++ b/packages/app/src/pages/affine.tsx
@@ -1,5 +1,4 @@
import { displayFlex, styled } from '@/styles';
-import { ThemeModeSwitch } from '@/components/theme-mode-switch';
import { Loading } from '@/components/loading';
import Modal from '@/ui/modal';
import { useState } from 'react';
@@ -20,7 +19,6 @@ const Affine = () => {
return (
<>
-