From 1ea7b8a32d7d0dee95e7d34d3b4d5424faa71df8 Mon Sep 17 00:00:00 2001 From: Alice Alexandra Moore <86723305+3mdistal@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:01:21 -0400 Subject: [PATCH 1/4] Add compact Content text style selector --- .../components/editor/BubbleToolbar.test.tsx | 74 ++++++- .../app/components/editor/BubbleToolbar.tsx | 208 +++++++++++++++--- ...ing-from-one-compact-formatting-control.md | 6 + .../evidence/content-text-selector/README.md | 26 +++ .../evidence/content-text-selector/after.png | Bin 0 -> 36818 bytes .../evidence/content-text-selector/before.png | Bin 0 -> 32106 bytes 6 files changed, 283 insertions(+), 31 deletions(-) create mode 100644 templates/content/changelog/2026-08-03-choose-text-or-a-heading-from-one-compact-formatting-control.md create mode 100644 templates/content/docs/solutions/evidence/content-text-selector/README.md create mode 100644 templates/content/docs/solutions/evidence/content-text-selector/after.png create mode 100644 templates/content/docs/solutions/evidence/content-text-selector/before.png diff --git a/templates/content/app/components/editor/BubbleToolbar.test.tsx b/templates/content/app/components/editor/BubbleToolbar.test.tsx index 08ee68c75d..974621e666 100644 --- a/templates/content/app/components/editor/BubbleToolbar.test.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.test.tsx @@ -34,7 +34,15 @@ vi.mock("@/components/ui/tooltip", () => ({ TooltipTrigger: ({ children }: { children: ReactNode }) => children, })); -describe("BubbleToolbar link shortcut", () => { +vi.mock("@/components/ui/popover", () => ({ + Popover: ({ children }: { children: ReactNode }) => children, + PopoverTrigger: ({ children }: { children: ReactNode }) => children, + PopoverContent: ({ children }: { children: ReactNode }) => ( +
{children}
+ ), +})); + +describe("BubbleToolbar", () => { let editor: Editor | null = null; let root: Root | null = null; let editorElement: HTMLDivElement | null = null; @@ -147,4 +155,68 @@ describe("BubbleToolbar link shortcut", () => { toolbarElement.querySelector('input[aria-label="editor.pasteLink"]'), ).not.toBeNull(); }); + + it("shows the active text style and converts a heading to Text by keyboard", () => { + editorElement = document.createElement("div"); + toolbarElement = document.createElement("div"); + document.body.append(editorElement, toolbarElement); + editor = new Editor({ + element: editorElement, + extensions: [StarterKit], + content: "

Selected heading

", + }); + editor.commands.setTextSelection({ from: 1, to: 9 }); + + root = createRoot(toolbarElement); + act(() => root!.render()); + + const trigger = toolbarElement.querySelector( + 'button[aria-label="editor.slash.turnInto: editor.heading2"]', + ); + expect(trigger?.textContent).toContain("H2"); + + const textOption = [ + ...toolbarElement.querySelectorAll( + 'button[role="menuitemradio"]', + ), + ].find((button) => button.textContent?.includes("editor.slash.text")); + act(() => { + textOption!.dispatchEvent( + new KeyboardEvent("keydown", { + key: "Enter", + bubbles: true, + cancelable: true, + }), + ); + }); + + expect(editor.getHTML()).toContain("

Selected heading

"); + expect(editor.getHTML()).not.toContain("

Selected heading

"); + }); + + it("sets an exact heading level without toggling the current style off", () => { + editorElement = document.createElement("div"); + toolbarElement = document.createElement("div"); + document.body.append(editorElement, toolbarElement); + editor = new Editor({ + element: editorElement, + extensions: [StarterKit], + content: "

Stable heading

", + }); + editor.commands.setTextSelection({ from: 1, to: 7 }); + + root = createRoot(toolbarElement); + act(() => root!.render()); + + const headingOption = [ + ...toolbarElement.querySelectorAll( + 'button[role="menuitemradio"]', + ), + ].find((button) => button.textContent?.includes("editor.heading3")); + expect(headingOption?.getAttribute("aria-checked")).toBe("true"); + act(() => headingOption!.click()); + + expect(editor.getHTML()).toContain("

Stable heading

"); + expect(editor.getHTML()).not.toContain("

Stable heading

"); + }); }); diff --git a/templates/content/app/components/editor/BubbleToolbar.tsx b/templates/content/app/components/editor/BubbleToolbar.tsx index 2cccf27e0f..be24c56c5c 100644 --- a/templates/content/app/components/editor/BubbleToolbar.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.tsx @@ -1,15 +1,13 @@ import { useT } from "@agent-native/core/client/i18n"; import { IconBold, + IconCheck, + IconChevronDown, IconItalic, IconStrikethrough, IconCode, IconLink, IconMessageCircle, - IconH1, - IconH2, - IconH3, - IconH4, } from "@tabler/icons-react"; import { NodeSelection, @@ -20,8 +18,13 @@ import { import { Decoration, DecorationSet } from "@tiptap/pm/view"; import type { Editor } from "@tiptap/react"; import { BubbleMenu } from "@tiptap/react/menus"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; import { Tooltip, TooltipContent, @@ -56,6 +59,15 @@ type SelectionFillRange = { to: number; }; +type TextStyle = "paragraph" | 1 | 2 | 3 | 4; + +function activeTextStyle(editor: Editor): TextStyle { + for (const level of [1, 2, 3, 4] as const) { + if (editor.isActive("heading", { level })) return level; + } + return "paragraph"; +} + const selectionFillPluginKey = new PluginKey( "contentSelectionFill", ); @@ -106,6 +118,79 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { const t = useT(); const [showLinkInput, setShowLinkInput] = useState(false); const [linkUrl, setLinkUrl] = useState(""); + const [textStyleOpen, setTextStyleOpen] = useState(false); + const textStyleSelection = useRef<{ from: number; to: number } | null>(null); + const [textStyle, setTextStyle] = useState(() => + activeTextStyle(editor), + ); + + useEffect(() => { + const syncTextStyle = () => { + setTextStyle(activeTextStyle(editor)); + const { from, to } = editor.state.selection; + if (from !== to) textStyleSelection.current = { from, to }; + }; + editor.on("selectionUpdate", syncTextStyle); + editor.on("transaction", syncTextStyle); + syncTextStyle(); + return () => { + editor.off("selectionUpdate", syncTextStyle); + editor.off("transaction", syncTextStyle); + }; + }, [editor]); + + const textStyles = [ + { + value: "paragraph" as const, + shortLabel: t("editor.slash.text"), + menuLabel: "T", + label: t("editor.slash.text"), + }, + { + value: 1 as const, + shortLabel: "H1", + menuLabel: "H1", + label: t("editor.heading1"), + }, + { + value: 2 as const, + shortLabel: "H2", + menuLabel: "H2", + label: t("editor.heading2"), + }, + { + value: 3 as const, + shortLabel: "H3", + menuLabel: "H3", + label: t("editor.heading3"), + }, + { + value: 4 as const, + shortLabel: "H4", + menuLabel: "H4", + label: t("editor.heading4"), + }, + ]; + const selectedTextStyle = + textStyles.find((style) => style.value === textStyle) ?? textStyles[0]; + + const applyTextStyle = (style: TextStyle) => { + const chain = editor.chain(); + if (textStyleSelection.current) { + chain.setTextSelection(textStyleSelection.current); + } + if (style === "paragraph") { + if (textStyle === "paragraph") { + chain.focus().run(); + } else { + chain.toggleHeading({ level: textStyle }).focus().run(); + } + } else { + chain.setHeading({ level: style }).focus().run(); + } + setTextStyle(style); + setTextStyleOpen(false); + }; const openLinkInput = useCallback(() => { setLinkUrl(editor.getAttributes("link").href || ""); @@ -251,30 +336,7 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { isActive: () => editor.isActive("code"), }, { type: "divider" as const }, - { - icon: IconH1, - title: t("editor.heading1"), - action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), - isActive: () => editor.isActive("heading", { level: 1 }), - }, - { - icon: IconH2, - title: t("editor.heading2"), - action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), - isActive: () => editor.isActive("heading", { level: 2 }), - }, - { - icon: IconH3, - title: t("editor.heading3"), - action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), - isActive: () => editor.isActive("heading", { level: 3 }), - }, - { - icon: IconH4, - title: t("editor.heading4"), - action: () => editor.chain().focus().toggleHeading({ level: 4 }).run(), - isActive: () => editor.isActive("heading", { level: 4 }), - }, + { type: "text-style" as const }, { type: "divider" as const }, { icon: IconLink, @@ -354,7 +416,7 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { ) : (
e.preventDefault()} > {items.map((item, i) => { @@ -363,6 +425,92 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) {
); } + if ("type" in item && item.type === "text-style") { + return ( + { + if (open) { + const { from, to } = editor.state.selection; + if (from !== to) + textStyleSelection.current = { from, to }; + } + setTextStyleOpen(open); + }} + > + + + + event.preventDefault()} + > +
+ {t("editor.slash.turnInto")} +
+
+ {textStyles.map((style) => { + const isSelected = style.value === textStyle; + return ( + + ); + })} +
+
+
+ ); + } const { icon: Icon, title, diff --git a/templates/content/changelog/2026-08-03-choose-text-or-a-heading-from-one-compact-formatting-control.md b/templates/content/changelog/2026-08-03-choose-text-or-a-heading-from-one-compact-formatting-control.md new file mode 100644 index 0000000000..9319af1709 --- /dev/null +++ b/templates/content/changelog/2026-08-03-choose-text-or-a-heading-from-one-compact-formatting-control.md @@ -0,0 +1,6 @@ +--- +type: improved +date: 2026-08-03 +--- + +Choose Text or a heading from one compact formatting control. diff --git a/templates/content/docs/solutions/evidence/content-text-selector/README.md b/templates/content/docs/solutions/evidence/content-text-selector/README.md new file mode 100644 index 0000000000..a8f56b0a5c --- /dev/null +++ b/templates/content/docs/solutions/evidence/content-text-selector/README.md @@ -0,0 +1,26 @@ +# Content text selector visual evidence + +Matched desktop captures for the compact Text/H1-H4 selector in the Content editor. + +## Before + +- Source revision: `dcc028cb7d67a0f9279f9235cdc4c16710ce5689` +- Route: `http://127.0.0.1:3317/page/j4a5KAEDBHXY` +- Viewport: `1496 x 846`, desktop Chrome +- Fixture account: disposable local account `toolbar-demo@example.com` +- Fixture page: `Toolbar comparison` +- Fixture paragraph: `Select this sentence to compare the formatting toolbar.` +- UI state: Personal workspace expanded, agent panel closed, full paragraph selected, formatting bubble open, text-style submenu closed + +![Before: separate H1-H4 toolbar buttons](./before.png) + +## After + +- Source: this pull request's production build +- Route: `http://127.0.0.1:3317/page/vDisteHisXMq` +- Viewport: `1496 x 846`, desktop Chrome +- Fixture account, page title, paragraph, sidebar state, and agent-panel state match the before capture +- UI state: full paragraph selected, formatting bubble open, Text selector expanded, Text checked, H1-H4 visible +- The route differs because the isolated worktree uses its own disposable local fixture database; the rendered fixture and viewport are matched + +![After: compact Text selector with H1-H4 menu](./after.png) diff --git a/templates/content/docs/solutions/evidence/content-text-selector/after.png b/templates/content/docs/solutions/evidence/content-text-selector/after.png new file mode 100644 index 0000000000000000000000000000000000000000..f563cecf30e9ccf64ce0fc00bd995161359046e0 GIT binary patch literal 36818 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

s_)9d}EWM-S4qU7$*jd>EET=dep= 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

-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 X_Vc`vgZam7B=p1A{_q;|-ROS-Y5reI literal 0 HcmV?d00001 From dcd157c403af30490eeab546c93ce2bff0bbff54 Mon Sep 17 00:00:00 2001 From: Alice Alexandra Moore <86723305+3mdistal@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:05:34 -0400 Subject: [PATCH 2/4] Fix pointer selection in text style menu --- .../components/editor/BubbleToolbar.test.tsx | 33 +++++++++++++++++++ .../app/components/editor/BubbleToolbar.tsx | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/templates/content/app/components/editor/BubbleToolbar.test.tsx b/templates/content/app/components/editor/BubbleToolbar.test.tsx index 974621e666..1c2911cc51 100644 --- a/templates/content/app/components/editor/BubbleToolbar.test.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.test.tsx @@ -219,4 +219,37 @@ describe("BubbleToolbar", () => { expect(editor.getHTML()).toContain("

Stable heading

"); expect(editor.getHTML()).not.toContain("

Stable heading

"); }); + + it("sets a heading from a pointer-style mouse interaction", () => { + editorElement = document.createElement("div"); + toolbarElement = document.createElement("div"); + document.body.append(editorElement, toolbarElement); + editor = new Editor({ + element: editorElement, + extensions: [StarterKit], + content: "

Selected paragraph

", + }); + editor.commands.setTextSelection({ from: 1, to: 9 }); + + root = createRoot(toolbarElement); + act(() => root!.render()); + + const headingOption = [ + ...toolbarElement.querySelectorAll( + 'button[role="menuitemradio"]', + ), + ].find((button) => button.textContent?.includes("editor.heading3")); + act(() => { + headingOption!.dispatchEvent( + new MouseEvent("mousedown", { + button: 0, + bubbles: true, + cancelable: true, + }), + ); + }); + + expect(editor.getHTML()).toContain("

Selected paragraph

"); + expect(editor.getHTML()).not.toContain("

Selected paragraph

"); + }); }); diff --git a/templates/content/app/components/editor/BubbleToolbar.tsx b/templates/content/app/components/editor/BubbleToolbar.tsx index be24c56c5c..d0030a4ded 100644 --- a/templates/content/app/components/editor/BubbleToolbar.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.tsx @@ -472,7 +472,7 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { type="button" role="menuitemradio" aria-checked={isSelected} - onPointerDown={(event) => { + onMouseDown={(event) => { event.preventDefault(); event.stopPropagation(); applyTextStyle(style.value); From cf108b1b648b8c37a7ba863bc96eee5f762972fe Mon Sep 17 00:00:00 2001 From: Alice Alexandra Moore <86723305+3mdistal@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:28:56 -0400 Subject: [PATCH 3/4] Use native selector activation events --- .../content/app/components/editor/BubbleToolbar.test.tsx | 9 +++++---- .../content/app/components/editor/BubbleToolbar.tsx | 9 +-------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/templates/content/app/components/editor/BubbleToolbar.test.tsx b/templates/content/app/components/editor/BubbleToolbar.test.tsx index 1c2911cc51..16c7553e2e 100644 --- a/templates/content/app/components/editor/BubbleToolbar.test.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.test.tsx @@ -182,8 +182,8 @@ describe("BubbleToolbar", () => { ].find((button) => button.textContent?.includes("editor.slash.text")); act(() => { textOption!.dispatchEvent( - new KeyboardEvent("keydown", { - key: "Enter", + new MouseEvent("click", { + detail: 0, bubbles: true, cancelable: true, }), @@ -220,7 +220,7 @@ describe("BubbleToolbar", () => { expect(editor.getHTML()).not.toContain("

Stable heading

"); }); - it("sets a heading from a pointer-style mouse interaction", () => { + it("sets a heading from a pointer click", () => { editorElement = document.createElement("div"); toolbarElement = document.createElement("div"); document.body.append(editorElement, toolbarElement); @@ -239,9 +239,10 @@ describe("BubbleToolbar", () => { 'button[role="menuitemradio"]', ), ].find((button) => button.textContent?.includes("editor.heading3")); + editor.commands.blur(); act(() => { headingOption!.dispatchEvent( - new MouseEvent("mousedown", { + new PointerEvent("pointerdown", { button: 0, bubbles: true, cancelable: true, diff --git a/templates/content/app/components/editor/BubbleToolbar.tsx b/templates/content/app/components/editor/BubbleToolbar.tsx index d0030a4ded..0a67a0617e 100644 --- a/templates/content/app/components/editor/BubbleToolbar.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.tsx @@ -472,7 +472,7 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { type="button" role="menuitemradio" aria-checked={isSelected} - onMouseDown={(event) => { + onPointerDown={(event) => { event.preventDefault(); event.stopPropagation(); applyTextStyle(style.value); @@ -482,13 +482,6 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { applyTextStyle(style.value); } }} - onKeyDown={(event) => { - if (event.key === "Enter" || event.key === " ") { - event.preventDefault(); - event.stopPropagation(); - applyTextStyle(style.value); - } - }} className={cn( "flex h-8 w-full items-center gap-2 rounded px-2 text-left text-sm", isSelected From f8b64139fe43ff7bbf25728f9330992f00cffbbb Mon Sep 17 00:00:00 2001 From: Alice Alexandra Moore <86723305+3mdistal@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:26:31 -0400 Subject: [PATCH 4/4] Handle legacy heading styles in text selector --- .../components/editor/BubbleToolbar.test.tsx | 56 +++++++++++++++++++ .../app/components/editor/BubbleToolbar.tsx | 14 ++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/templates/content/app/components/editor/BubbleToolbar.test.tsx b/templates/content/app/components/editor/BubbleToolbar.test.tsx index 16c7553e2e..5deaa972d7 100644 --- a/templates/content/app/components/editor/BubbleToolbar.test.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.test.tsx @@ -194,6 +194,62 @@ describe("BubbleToolbar", () => { expect(editor.getHTML()).not.toContain("

Selected heading

"); }); + it.each([5, 6] as const)( + "identifies an H%s block and converts it to Text", + (level) => { + editorElement = document.createElement("div"); + toolbarElement = document.createElement("div"); + document.body.append(editorElement, toolbarElement); + editor = new Editor({ + element: editorElement, + extensions: [StarterKit], + content: `Selected heading`, + }); + editor.commands.setTextSelection({ from: 1, to: 9 }); + + root = createRoot(toolbarElement); + act(() => root!.render()); + + const trigger = toolbarElement.querySelector( + `button[aria-label="editor.slash.turnInto: editor.heading${level}"]`, + ); + expect(trigger?.textContent).toContain(`H${level}`); + + const textOption = [ + ...toolbarElement.querySelectorAll( + 'button[role="menuitemradio"]', + ), + ].find((button) => button.textContent?.includes("editor.slash.text")); + act(() => textOption!.click()); + + expect(editor.getHTML()).toContain("

Selected heading

"); + expect(editor.getHTML()).not.toContain( + `Selected heading`, + ); + }, + ); + + it("updates the selector when the active block becomes an H5", () => { + editorElement = document.createElement("div"); + toolbarElement = document.createElement("div"); + document.body.append(editorElement, toolbarElement); + editor = new Editor({ + element: editorElement, + extensions: [StarterKit], + content: "

Selected heading

", + }); + editor.commands.setTextSelection({ from: 1, to: 9 }); + + root = createRoot(toolbarElement); + act(() => root!.render()); + act(() => editor!.commands.setHeading({ level: 5 })); + + const trigger = toolbarElement.querySelector( + 'button[aria-label="editor.slash.turnInto: editor.heading5"]', + ); + expect(trigger?.textContent).toContain("H5"); + }); + it("sets an exact heading level without toggling the current style off", () => { editorElement = document.createElement("div"); toolbarElement = document.createElement("div"); diff --git a/templates/content/app/components/editor/BubbleToolbar.tsx b/templates/content/app/components/editor/BubbleToolbar.tsx index 0a67a0617e..2326beb9bd 100644 --- a/templates/content/app/components/editor/BubbleToolbar.tsx +++ b/templates/content/app/components/editor/BubbleToolbar.tsx @@ -59,10 +59,10 @@ type SelectionFillRange = { to: number; }; -type TextStyle = "paragraph" | 1 | 2 | 3 | 4; +type TextStyle = "paragraph" | 1 | 2 | 3 | 4 | 5 | 6; function activeTextStyle(editor: Editor): TextStyle { - for (const level of [1, 2, 3, 4] as const) { + for (const level of [1, 2, 3, 4, 5, 6] as const) { if (editor.isActive("heading", { level })) return level; } return "paragraph"; @@ -172,7 +172,15 @@ export function BubbleToolbar({ editor, onComment }: BubbleToolbarProps) { }, ]; const selectedTextStyle = - textStyles.find((style) => style.value === textStyle) ?? textStyles[0]; + textStyles.find((style) => style.value === textStyle) ?? + (typeof textStyle === "number" + ? { + value: textStyle, + shortLabel: `H${textStyle}`, + menuLabel: `H${textStyle}`, + label: textStyle === 5 ? t("editor.heading5") : t("editor.heading6"), + } + : textStyles[0]); const applyTextStyle = (style: TextStyle) => { const chain = editor.chain();