diff --git a/packages/frontend/component/src/components/affine-other-page-layout/index.css.ts b/packages/frontend/component/src/components/affine-other-page-layout/index.css.ts
index b805d3f557..dfa8b094be 100644
--- a/packages/frontend/component/src/components/affine-other-page-layout/index.css.ts
+++ b/packages/frontend/component/src/components/affine-other-page-layout/index.css.ts
@@ -27,6 +27,12 @@ export const topNav = style({
},
},
});
+export const draggableHeader = style({
+ height: '52px',
+ width: '100%',
+ position: 'fixed',
+ ['WebkitAppRegion' as string]: 'drag',
+});
export const topNavLinks = style({
display: 'flex',
columnGap: 4,
diff --git a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx
index 6899a07b9d..c7a06af802 100644
--- a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx
+++ b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx
@@ -1,7 +1,7 @@
import { Button } from '@affine/component/ui/button';
import { useI18n } from '@affine/i18n';
import { Logo1Icon } from '@blocksuite/icons/rc';
-import { useCallback } from 'react';
+import { type ReactNode, useCallback } from 'react';
import { DesktopNavbar } from './desktop-navbar';
import * as styles from './index.css';
@@ -10,7 +10,7 @@ import { MobileNavbar } from './mobile-navbar';
export const AffineOtherPageLayout = ({
children,
}: {
- children: React.ReactNode;
+ children: ReactNode;
}) => {
const t = useI18n();
@@ -20,7 +20,9 @@ export const AffineOtherPageLayout = ({
return (
- {environment.isElectron ? null : (
+ {environment.isElectron ? (
+
+ ) : (
diff --git a/packages/frontend/component/src/components/auth-components/auth-page-container.tsx b/packages/frontend/component/src/components/auth-components/auth-page-container.tsx
index 49a4bde37a..5ee0dbc1a2 100644
--- a/packages/frontend/component/src/components/auth-components/auth-page-container.tsx
+++ b/packages/frontend/component/src/components/auth-components/auth-page-container.tsx
@@ -5,7 +5,10 @@ import { AffineOtherPageLayout } from '../affine-other-page-layout';
import { authPageContainer, hideInSmallScreen } from './share.css';
export const AuthPageContainer: FC<
- PropsWithChildren<{ title?: ReactNode; subtitle?: ReactNode }>
+ PropsWithChildren<{
+ title?: ReactNode;
+ subtitle?: ReactNode;
+ }>
> = ({ children, title, subtitle }) => {
return (
diff --git a/packages/frontend/component/src/components/auth-components/email-verified-email.tsx b/packages/frontend/component/src/components/auth-components/email-verified-email.tsx
index 332a77ba48..b0adc83844 100644
--- a/packages/frontend/component/src/components/auth-components/email-verified-email.tsx
+++ b/packages/frontend/component/src/components/auth-components/email-verified-email.tsx
@@ -4,7 +4,7 @@ import type { FC } from 'react';
import { Button } from '../../ui/button';
import { AuthPageContainer } from './auth-page-container';
-export const ConfirmChangeEmail: FC<{
+export const ConfirmVerifiedEmail: FC<{
onOpenAffine: () => void;
}> = ({ onOpenAffine }) => {
const t = useI18n();
diff --git a/packages/frontend/component/src/components/auth-components/index.tsx b/packages/frontend/component/src/components/auth-components/index.tsx
index 2993906ecd..a179b3ca07 100644
--- a/packages/frontend/component/src/components/auth-components/index.tsx
+++ b/packages/frontend/component/src/components/auth-components/index.tsx
@@ -6,6 +6,7 @@ export * from './change-email-page';
export * from './change-password-page';
export * from './confirm-change-email';
export * from './count-down-render';
+export * from './email-verified-email';
export * from './modal';
export * from './modal-header';
export * from './onboarding-page';
diff --git a/packages/frontend/core/src/modules/app-tabs-header/views/app-tabs-header.tsx b/packages/frontend/core/src/modules/app-tabs-header/views/app-tabs-header.tsx
index 36eb9affe7..6812901fc2 100644
--- a/packages/frontend/core/src/modules/app-tabs-header/views/app-tabs-header.tsx
+++ b/packages/frontend/core/src/modules/app-tabs-header/views/app-tabs-header.tsx
@@ -12,7 +12,6 @@ import {
appSidebarResizingAtom,
} from '@affine/core/components/app-sidebar';
import { appSidebarWidthAtom } from '@affine/core/components/app-sidebar/index.jotai';
-import { WindowsAppControls } from '@affine/core/components/pure/header/windows-app-controls';
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import { useCatchEventCallback } from '@affine/core/hooks/use-catch-event-hook';
import { track } from '@affine/core/mixpanel';
@@ -475,7 +474,7 @@ export const AppTabsHeader = ({
{environment.isElectron && environment.isWindows ? (
-
+
) : null}
);
diff --git a/packages/frontend/core/src/modules/app-tabs-header/views/styles.css.ts b/packages/frontend/core/src/modules/app-tabs-header/views/styles.css.ts
index dd71af2788..16cfe62de8 100644
--- a/packages/frontend/core/src/modules/app-tabs-header/views/styles.css.ts
+++ b/packages/frontend/core/src/modules/app-tabs-header/views/styles.css.ts
@@ -242,6 +242,12 @@ export const spacer = style({
},
});
+export const windowsAppControlsPlaceholder = style({
+ width: '160px',
+ height: '100%',
+ flexShrink: 0,
+});
+
export const dropIndicator = style({
position: 'absolute',
height: 32,
diff --git a/packages/frontend/core/src/pages/404.tsx b/packages/frontend/core/src/pages/404.tsx
index bbc595d9c0..5e350becd2 100644
--- a/packages/frontend/core/src/pages/404.tsx
+++ b/packages/frontend/core/src/pages/404.tsx
@@ -67,4 +67,6 @@ export const PageNotFound = ({
);
};
-export const Component = PageNotFound;
+export const Component = () => {
+ return
;
+};
diff --git a/packages/frontend/core/src/pages/auth/auth.tsx b/packages/frontend/core/src/pages/auth/auth.tsx
index 96b25a254b..9bb3bb6269 100644
--- a/packages/frontend/core/src/pages/auth/auth.tsx
+++ b/packages/frontend/core/src/pages/auth/auth.tsx
@@ -3,6 +3,7 @@ import {
ChangeEmailPage,
ChangePasswordPage,
ConfirmChangeEmail,
+ ConfirmVerifiedEmail,
OnboardingPage,
SetPasswordPage,
SignInSuccessPage,
@@ -153,7 +154,7 @@ export const Component = () => {
return
;
}
case 'verify-email': {
- return
;
+ return
;
}
}
return null;
diff --git a/packages/frontend/core/src/pages/workspace/index.tsx b/packages/frontend/core/src/pages/workspace/index.tsx
index b26fa3738d..0541a9470f 100644
--- a/packages/frontend/core/src/pages/workspace/index.tsx
+++ b/packages/frontend/core/src/pages/workspace/index.tsx
@@ -1,3 +1,4 @@
+import { AffineOtherPageLayout } from '@affine/component/affine-other-page-layout';
import { AppFallback } from '@affine/core/components/affine/app-container';
import { viewRoutes } from '@affine/core/router';
import { ZipTransformer } from '@blocksuite/blocks';
@@ -108,7 +109,11 @@ export const Component = (): ReactElement => {
/>
);
}
- return
;
+ return (
+
+
+
+ );
}
if (!meta) {
return
;
diff --git a/packages/frontend/electron/renderer/app.tsx b/packages/frontend/electron/renderer/app.tsx
index 9d94b1d951..9db56814f3 100644
--- a/packages/frontend/electron/renderer/app.tsx
+++ b/packages/frontend/electron/renderer/app.tsx
@@ -4,6 +4,7 @@ import '@affine/component/theme/theme.css';
import { AffineContext } from '@affine/component/context';
import { GlobalLoading } from '@affine/component/global-loading';
import { AppFallback } from '@affine/core/components/affine/app-container';
+import { WindowsAppControls } from '@affine/core/components/pure/header/windows-app-controls';
import { configureCommonModules } from '@affine/core/modules';
import { configureAppTabsHeaderModule } from '@affine/core/modules/app-tabs-header';
import { configureElectronStateStorageImpls } from '@affine/core/modules/storage';
@@ -121,6 +122,11 @@ export function App() {
router={router}
future={future}
/>
+ {environment.isWindows && (
+
+
+
+ )}