From 357118804e52bdeca905960a75a3b68b8472f1d2 Mon Sep 17 00:00:00 2001 From: Johnny Date: Mon, 17 Nov 2025 08:55:10 +0800 Subject: [PATCH] feat(web): add Focus Mode UI entry in Insert Menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add discoverable UI entry point for Focus Mode via Insert Menu submenu: UI Changes: - Add "View" submenu to Insert Menu (+ button dropdown) - Nested menu with Focus Mode option (ChatGPT-style pattern) - Display keyboard shortcut hint (⌘⇧F) next to menu item - Uses DropdownMenuSub components from Radix UI User Access Methods: 1. Keyboard: Cmd/Ctrl+Shift+F (primary, power users) 2. Mouse: + menu → View → Focus Mode (discoverable) 3. Mobile: Touch-friendly menu access Benefits: - Improves discoverability for new users - Doesn't clutter main editor UI - Educates users about keyboard shortcut - Extensible for future view options (typewriter, reading mode, etc.) - Follows familiar UI patterns (ChatGPT, Notion) Files Modified: - web/src/components/MemoEditor/ActionButton/InsertMenu.tsx * Add DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent * Add View submenu with Focus Mode entry * Add onToggleFocusMode prop - web/src/components/MemoEditor/index.tsx * Pass toggleFocusMode to InsertMenu component - web/src/locales/en.json * Add "editor.view" translation key --- .../MemoEditor/ActionButton/InsertMenu.tsx | 27 +++++++++++++++++-- web/src/components/MemoEditor/index.tsx | 1 + web/src/locales/en.json | 3 ++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx b/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx index fdaebe2cf..6de3991b5 100644 --- a/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx +++ b/web/src/components/MemoEditor/ActionButton/InsertMenu.tsx @@ -1,10 +1,18 @@ import { LatLng } from "leaflet"; import { uniqBy } from "lodash-es"; -import { FileIcon, LinkIcon, LoaderIcon, MapPinIcon, PlusIcon } from "lucide-react"; +import { FileIcon, LinkIcon, LoaderIcon, MapPinIcon, Maximize2Icon, MoreHorizontalIcon, PlusIcon } from "lucide-react"; import { observer } from "mobx-react-lite"; import { useContext, useState } from "react"; import { Button } from "@/components/ui/button"; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; import { Attachment } from "@/types/proto/api/v1/attachment_service"; import { Location, MemoRelation } from "@/types/proto/api/v1/memo_service"; import { useTranslate } from "@/utils/i18n"; @@ -19,6 +27,7 @@ interface Props { isUploading?: boolean; location?: Location; onLocationChange: (location?: Location) => void; + onToggleFocusMode?: () => void; } const InsertMenu = observer((props: Props) => { @@ -124,6 +133,20 @@ const InsertMenu = observer((props: Props) => { {t("tooltip.select-location")} + {/* View submenu with Focus Mode */} + + + + {t("common.more")} + + + + + {t("editor.focus-mode")} + ⌘⇧F + + + diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 8064bd86d..e0b90a405 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -591,6 +591,7 @@ const MemoEditor = observer((props: Props) => { location, })) } + onToggleFocusMode={toggleFocusMode} />
diff --git a/web/src/locales/en.json b/web/src/locales/en.json index 3fd45aecb..9ab89ee62 100644 --- a/web/src/locales/en.json +++ b/web/src/locales/en.json @@ -102,7 +102,8 @@ "username": "Username", "version": "Version", "visibility": "Visibility", - "yourself": "Yourself" + "yourself": "Yourself", + "more": "More" }, "days": { "fri": "Fri",