diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts
index 25ef393357..075bc15e5c 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts
+++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts
@@ -35,7 +35,7 @@ export const mainHeader = style([
export const sidebarHeader = style([
header,
{
- padding: '0 14px',
+ padding: '0 16px',
gap: '12px',
},
]);
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx
index 517ded84c8..e2e432e538 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx
+++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx
@@ -11,6 +11,7 @@ import { JournalTodayButton } from '@affine/core/components/blocksuite/block-sui
import { PageHeaderMenuButton } from '@affine/core/components/blocksuite/block-suite-header/menu';
import { EditorModeSwitch } from '@affine/core/components/blocksuite/block-suite-mode-switch';
import { useJournalInfoHelper } from '@affine/core/hooks/use-journal';
+import type { BlockSuiteWorkspace } from '@affine/core/shared';
import type { Workspace } from '@affine/workspace';
import { RightSidebarIcon } from '@blocksuite/icons';
import type { Page } from '@blocksuite/store';
@@ -187,7 +188,11 @@ export function DetailPageHeader(props: PageHeaderProps) {
);
}
-function WindowsSidebarHeader() {
+interface SidebarHeaderProps {
+ workspace: BlockSuiteWorkspace;
+ page: Page;
+}
+function WindowsSidebarHeader(props: SidebarHeaderProps) {
return (
<>
@@ -196,26 +201,22 @@ function WindowsSidebarHeader() {
-
+
>
);
}
-function NonWindowsSidebarHeader() {
+function NonWindowsSidebarHeader(props: SidebarHeaderProps) {
return (
);
}
-export function RightSidebarHeader() {
- return isWindowsDesktop ? (
-
- ) : (
-
- );
-}
+export const RightSidebarHeader = isWindowsDesktop
+ ? WindowsSidebarHeader
+ : NonWindowsSidebarHeader;
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx
index cf305f9d76..1c49ef9df6 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx
+++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx
@@ -193,7 +193,7 @@ const DetailPageImpl = memo(function DetailPageImpl({ page }: { page: Page }) {
sidebar={
!isInTrash ? (
-
+
) : null
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts
index fb179f6e4a..56c0031dc9 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts
+++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts
@@ -1,16 +1,18 @@
// main editor sidebar states
-import { assertExists } from '@blocksuite/global/utils';
+import { assertExists, isEqual } from '@blocksuite/global/utils';
import { atom } from 'jotai';
import { selectAtom } from 'jotai/utils';
import { copilotExtension } from './extensions/copilot';
import { framePanelExtension } from './extensions/frame';
+import { journalExtension } from './extensions/journal';
import { outlineExtension } from './extensions/outline';
import type { EditorExtension, EditorExtensionName } from './types';
// the list of all possible extensions in affine.
// order matters (determines the order of the tabs)
export const extensions: EditorExtension[] = [
+ journalExtension,
outlineExtension,
framePanelExtension,
copilotExtension,
@@ -42,7 +44,8 @@ const widthAtom = selectAtom(baseStateAtom, state => state.width);
export const editorExtensionsAtom = selectAtom(
baseStateAtom,
- state => state.extensions
+ state => state.extensions,
+ isEqual
);
// get/set sidebar open state
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx
index 1c6ec27857..4803c34ddb 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx
+++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx
@@ -1,6 +1,9 @@
import { IconButton } from '@affine/component';
+import { useJournalInfoHelper } from '@affine/core/hooks/use-journal';
import { useWorkspaceEnabledFeatures } from '@affine/core/hooks/use-workspace-features';
+import type { BlockSuiteWorkspace } from '@affine/core/shared';
import { FeatureType } from '@affine/graphql';
+import type { Page } from '@blocksuite/store';
import { assignInlineVars } from '@vanilla-extract/dynamic';
import { useAtom, useAtomValue } from 'jotai';
import { useEffect } from 'react';
@@ -11,18 +14,32 @@ import {
} from '../atoms';
import * as styles from './extensions.css';
+export interface ExtensionTabsProps {
+ workspace: BlockSuiteWorkspace;
+ page: Page;
+}
+
// provide a switcher for active extensions
// will be used in global top header (MacOS) or sidebar (Windows)
-export const ExtensionTabs = () => {
+export const ExtensionTabs = ({ page }: ExtensionTabsProps) => {
// todo: filter in editorExtensionsAtom instead?
const copilotEnabled = useWorkspaceEnabledFeatures().includes(
FeatureType.Copilot
);
+
+ const { isJournal } = useJournalInfoHelper(page.meta);
+
const exts = useAtomValue(editorExtensionsAtom).filter(ext => {
if (ext.name === 'copilot' && !copilotEnabled) return false;
return true;
});
const [selected, setSelected] = useAtom(editorSidebarActiveExtensionAtom);
+
+ // if journal is active, set selected to journal
+ useEffect(() => {
+ isJournal && setSelected('journal');
+ }, [isJournal, setSelected]);
+
const vars = assignInlineVars({
[styles.activeIdx]: String(
exts.findIndex(ext => ext.name === selected?.name) ?? 0
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx
new file mode 100644
index 0000000000..97741ca0d7
--- /dev/null
+++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx
@@ -0,0 +1,13 @@
+import { TodayIcon } from '@blocksuite/icons';
+
+import type { EditorExtension } from '..';
+
+const EditorJournalPanel = () => {
+ return journal extension
;
+};
+
+export const journalExtension: EditorExtension = {
+ name: 'journal',
+ icon: ,
+ Component: EditorJournalPanel,
+};
diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts
index b992ec9f9f..d153ca834e 100644
--- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts
+++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts
@@ -1,4 +1,4 @@
-export type EditorExtensionName = 'outline' | 'frame' | 'copilot';
+export type EditorExtensionName = 'outline' | 'frame' | 'copilot' | 'journal';
export interface EditorExtension {
name: EditorExtensionName;