diff --git a/packages/common/env/package.json b/packages/common/env/package.json
index 803e36720d..cd694ddb07 100644
--- a/packages/common/env/package.json
+++ b/packages/common/env/package.json
@@ -27,4 +27,4 @@
"zod": "^3.22.4"
},
"version": "0.15.0"
-}
+}
\ No newline at end of file
diff --git a/packages/common/infra/package.json b/packages/common/infra/package.json
index 9e1430e0c1..b16510f66e 100644
--- a/packages/common/infra/package.json
+++ b/packages/common/infra/package.json
@@ -74,4 +74,4 @@
}
},
"version": "0.15.0"
-}
+}
\ No newline at end of file
diff --git a/packages/frontend/component/package.json b/packages/frontend/component/package.json
index 3ab57f7ecc..934965fe7c 100644
--- a/packages/frontend/component/package.json
+++ b/packages/frontend/component/package.json
@@ -111,4 +111,4 @@
"vitest": "1.6.0"
},
"version": "0.15.0"
-}
+}
\ No newline at end of file
diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json
index e8fbc17943..a15b08d639 100644
--- a/packages/frontend/core/package.json
+++ b/packages/frontend/core/package.json
@@ -116,4 +116,4 @@
"mime-types": "^2.1.35",
"vitest": "1.6.0"
}
-}
+}
\ No newline at end of file
diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-header/menu/index.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-header/menu/index.tsx
index 511a0dcfe3..1a84e8c261 100644
--- a/packages/frontend/core/src/components/blocksuite/block-suite-header/menu/index.tsx
+++ b/packages/frontend/core/src/components/blocksuite/block-suite-header/menu/index.tsx
@@ -20,6 +20,7 @@ import { useTrashModalHelper } from '@affine/core/hooks/affine/use-trash-modal-h
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import { mixpanel } from '@affine/core/mixpanel';
import { WorkbenchService } from '@affine/core/modules/workbench';
+import { ViewService } from '@affine/core/modules/workbench/services/view';
import { useDetailPageHeaderResponsive } from '@affine/core/pages/workspace/detail-page/use-header-responsive';
import { WorkspaceFlavour } from '@affine/env/workspace';
import { useI18n } from '@affine/i18n';
@@ -29,6 +30,7 @@ import {
EditIcon,
FavoritedIcon,
FavoriteIcon,
+ FrameIcon,
HistoryIcon,
ImportIcon,
InformationIcon,
@@ -36,6 +38,7 @@ import {
PageIcon,
ShareIcon,
SplitViewIcon,
+ TocIcon,
} from '@blocksuite/icons/rc';
import type { Doc } from '@blocksuite/store';
import {
@@ -84,6 +87,24 @@ export const PageHeaderMenuButton = ({
const { importFile } = usePageHelper(docCollection);
const { setTrashModal } = useTrashModalHelper(docCollection);
+ const view = useService(ViewService).view;
+
+ const openSidePanel = useCallback(
+ (id: string) => {
+ workbench.openSidebar();
+ view.activeSidebarTab(id);
+ },
+ [workbench, view]
+ );
+
+ const openAllFrames = useCallback(() => {
+ openSidePanel('frame');
+ }, [openSidePanel]);
+
+ const openOutlinePanel = useCallback(() => {
+ openSidePanel('outline');
+ }, [openSidePanel]);
+
const [historyModalOpen, setHistoryModalOpen] = useState(false);
const setOpenHistoryTipsModal = useSetAtom(openHistoryTipsModalAtom);
@@ -297,6 +318,33 @@ export const PageHeaderMenuButton = ({
{t['com.affine.page-properties.page-info.view']()}
)}
+ {currentMode === 'page' ? (
+
+ ) : (
+
+ )}