diff --git a/packages/editor/src/styles/variables.css b/packages/editor/src/styles/variables.css index 31b64fa56..44690cf52 100644 --- a/packages/editor/src/styles/variables.css +++ b/packages/editor/src/styles/variables.css @@ -151,11 +151,11 @@ /* end font size and style */ /* layout config */ -#page-header-container { - container-name: page-header-container; +#page-toolbar-container { + container-name: page-toolbar-container; container-type: inline-size; - .page-header-content { + .page-toolbar-content { --header-width: var(--normal-content-width); &.wide-layout { @@ -186,23 +186,23 @@ } /* keep a static padding of 96px for wide layouts for container width >912px and <1344px */ -@container page-header-container (min-width: 912px) and (max-width: 1344px) { - .page-header-content.wide-layout { +@container page-toolbar-container (min-width: 912px) and (max-width: 1344px) { + .page-toolbar-content.wide-layout { padding-left: var(--wide-content-margin) !important; } } /* keep a static padding of 96px for wide layouts for container width <912px */ -@container page-header-container (max-width: 912) { - .page-header-content.wide-layout { +@container page-toolbar-container (max-width: 912) { + .page-toolbar-content.wide-layout { padding-left: var(--wide-content-margin) !important; } } /* end layout config */ /* keep a static padding of 20px for wide layouts for container width <760px */ -@container page-header-container (max-width: 760px) { - .page-header-content { +@container page-toolbar-container (max-width: 760px) { + .page-toolbar-content { padding-left: var(--normal-content-margin) !important; } } @@ -211,7 +211,7 @@ /* keep a static padding of 96px for wide layouts for container width >912px and <1344px */ @container page-content-container (min-width: 912px) and (max-width: 1344px) { .editor-container.wide-layout, - .page-title-container { + .page-header-container { padding-left: var(--wide-content-margin); padding-right: var(--wide-content-margin); } @@ -220,7 +220,7 @@ /* keep a static padding of 20px for wide layouts for container width <912px */ @container page-content-container (max-width: 912px) { .editor-container.wide-layout, - .page-title-container { + .page-header-container { padding-left: var(--normal-content-margin); padding-right: var(--normal-content-margin); } @@ -229,7 +229,7 @@ /* keep a static padding of 20px for normal layouts for container width <760px */ @container page-content-container (max-width: 760px) { .editor-container:not(.wide-layout), - .page-title-container { + .page-header-container { padding-left: var(--normal-content-margin); padding-right: var(--normal-content-margin); } diff --git a/web/core/components/pages/editor/editor-body.tsx b/web/core/components/pages/editor/editor-body.tsx index fce7f2e88..beb33a20c 100644 --- a/web/core/components/pages/editor/editor-body.tsx +++ b/web/core/components/pages/editor/editor-body.tsx @@ -30,6 +30,8 @@ import { useEditorFlagging } from "@/plane-web/hooks/use-editor-flagging"; import { useIssueEmbed } from "@/plane-web/hooks/use-issue-embed"; // store import { TPageInstance } from "@/store/pages/base-page"; +// local imports +import { PageEditorHeaderRoot } from "./header"; export type TEditorBodyConfig = { fileHandler: TFileHandler; @@ -161,10 +163,10 @@ export const PageEditorBody: React.FC = observer((props) => { return ( -
+
{/* table of content */}
@@ -178,13 +180,17 @@ export const PageEditorBody: React.FC = observer((props) => {
- +
+
+ + +
+
= observer((props) => { + const { className, page } = props; + // states + const [isLogoPickerOpen, setIsLogoPickerOpen] = useState(false); + // derived values + const { logo_props, isContentEditable, updatePageLogo } = page; + const isLogoSelected = !!logo_props?.in_use; + + return ( +
+ setIsLogoPickerOpen(val)} + className="flex items-center justify-center" + buttonClassName="flex items-center justify-center" + label={ +
+ {isLogoSelected && } +
+ } + onChange={updatePageLogo} + defaultIconColor={logo_props?.in_use && logo_props.in_use === "icon" ? logo_props?.icon?.color : undefined} + defaultOpen={ + logo_props?.in_use && logo_props?.in_use === "emoji" ? EmojiIconPickerTypes.EMOJI : EmojiIconPickerTypes.ICON + } + disabled={!isContentEditable} + /> +
+ ); +}); diff --git a/web/core/components/pages/editor/header/root.tsx b/web/core/components/pages/editor/header/root.tsx index 1099e838f..e8dd98e9a 100644 --- a/web/core/components/pages/editor/header/root.tsx +++ b/web/core/components/pages/editor/header/root.tsx @@ -1,56 +1,70 @@ +import { useState } from "react"; import { observer } from "mobx-react"; -import { EditorRefApi } from "@plane/editor"; -// components -import { PageEditorMobileHeaderRoot, PageExtraOptions, PageToolbar } from "@/components/pages"; -// helpers -import { cn } from "@/helpers/common.helper"; -// hooks -import { usePageFilters } from "@/hooks/use-page-filters"; -// plane web hooks -import { EPageStoreType } from "@/plane-web/hooks/store"; +import { SmilePlus } from "lucide-react"; +// plane imports +import { EmojiIconPicker, EmojiIconPickerTypes } from "@plane/ui"; +import { cn } from "@plane/utils"; // store import { TPageInstance } from "@/store/pages/base-page"; +// local imports +import { PageEditorHeaderLogoPicker } from "./logo-picker"; type Props = { - editorReady: boolean; - editorRef: React.RefObject; page: TPageInstance; - storeType: EPageStoreType; }; export const PageEditorHeaderRoot: React.FC = observer((props) => { - const { editorReady, editorRef, page, storeType } = props; + const { page } = props; + // states + const [isLogoPickerOpen, setIsLogoPickerOpen] = useState(false); // derived values - const { isContentEditable } = page; - // page filters - const { isFullWidth, isStickyToolbarEnabled } = usePageFilters(); - // derived values - const resolvedEditorRef = editorRef.current; - - if (!resolvedEditorRef) return null; + const { isContentEditable, logo_props, name, updatePageLogo } = page; + const isLogoSelected = !!logo_props?.in_use; + const isTitleEmpty = !name || name.trim() === ""; return ( -
-
-
-
- {isStickyToolbarEnabled && editorReady && isContentEditable && editorRef.current && ( - - )} + <> +
+ {!isLogoSelected && ( +
+ setIsLogoPickerOpen(val)} + className="flex items-center justify-center" + buttonClassName="flex items-center justify-center" + label={ + + } + onChange={updatePageLogo} + defaultIconColor={ + logo_props?.in_use && logo_props.in_use === "icon" ? logo_props?.icon?.color : undefined + } + defaultOpen={ + logo_props?.in_use && logo_props?.in_use === "emoji" + ? EmojiIconPickerTypes.EMOJI + : EmojiIconPickerTypes.ICON + } + disabled={!isContentEditable} + />
- -
+ )}
-
- -
-
+ + ); }); diff --git a/web/core/components/pages/editor/index.ts b/web/core/components/pages/editor/index.ts index 02f264301..0c3912e09 100644 --- a/web/core/components/pages/editor/index.ts +++ b/web/core/components/pages/editor/index.ts @@ -1,5 +1,5 @@ -export * from "./header"; -export * from "./summary"; export * from "./editor-body"; -export * from "./title"; export * from "./page-root"; +export * from "./summary"; +export * from "./title"; +export * from "./toolbar"; diff --git a/web/core/components/pages/editor/page-root.tsx b/web/core/components/pages/editor/page-root.tsx index 8949d1556..bb4bcb759 100644 --- a/web/core/components/pages/editor/page-root.tsx +++ b/web/core/components/pages/editor/page-root.tsx @@ -7,7 +7,7 @@ import { EditorRefApi } from "@plane/editor"; import { TDocumentPayload, TPage, TPageVersion, TWebhookConnectionQueryParams } from "@plane/types"; // components import { - PageEditorHeaderRoot, + PageEditorToolbarRoot, PageEditorBody, PageVersionsOverlay, PagesVersionEditor, @@ -103,7 +103,7 @@ export const PageRoot = observer((props: TPageRootProps) => { pageId={page.id ?? ""} restoreEnabled={isContentEditable} /> - + void; - widthClassName: string; }; export const PageEditorTitle: React.FC = observer((props) => { - const { editorRef, readOnly, title, updateTitle, widthClassName } = props; + const { editorRef, readOnly, title, updateTitle } = props; // states const [isLengthVisible, setIsLengthVisible] = useState(false); // page filters @@ -33,12 +32,11 @@ export const PageEditorTitle: React.FC = observer((props) => { }); return ( -
+
{readOnly ? (
= observer((props) => { {getPageName(title)}
) : ( -
+