From 3aba8c307f1d64cd6d6e36e11ed88b57d3f498d3 Mon Sep 17 00:00:00 2001 From: Sam Vargas Date: Mon, 2 Nov 2026 16:40:14 +0000 Subject: [PATCH 1/3] fix(editor): add uppercase mark to inspector text panel MARK_NAMES missed 'uppercase', so inspector marks state never tracked the mark while the bubble menu toggle worked. Closes #3849 --- .changeset/inspector-uppercase-mark.md | 5 +++++ packages/editor/src/ui/inspector/text.tsx | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .changeset/inspector-uppercase-mark.md diff --git a/.changeset/inspector-uppercase-mark.md b/.changeset/inspector-uppercase-mark.md new file mode 100644 index 0000000000..f2305e9300 --- /dev/null +++ b/.changeset/inspector-uppercase-mark.md @@ -0,0 +1,5 @@ +--- +"@react-email/editor": patch +--- + +Show the uppercase mark toggle in the inspector text panel, matching the bubble menu. \ No newline at end of file diff --git a/packages/editor/src/ui/inspector/text.tsx b/packages/editor/src/ui/inspector/text.tsx index b04c7f81ed..8101557d4a 100644 --- a/packages/editor/src/ui/inspector/text.tsx +++ b/packages/editor/src/ui/inspector/text.tsx @@ -41,7 +41,14 @@ export interface InspectorTextProps { children?: (context: InspectorTextContext) => React.ReactNode; } -const MARK_NAMES = ['bold', 'italic', 'underline', 'strike', 'code'] as const; +const MARK_NAMES = [ + 'bold', + 'italic', + 'underline', + 'strike', + 'code', + 'uppercase', +] as const; export function InspectorText({ children }: InspectorTextProps) { const { editor } = useCurrentEditor(); From 0dd4a4d4236d7a2f632cef454ed4a2d7164be42b Mon Sep 17 00:00:00 2001 From: Sam Vargas Date: Mon, 2 Nov 2026 16:40:14 +0000 Subject: [PATCH 2/3] test(editor): cover uppercase toggle in inspector panel --- .../editor/src/ui/inspector/text.spec.tsx | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 packages/editor/src/ui/inspector/text.spec.tsx diff --git a/packages/editor/src/ui/inspector/text.spec.tsx b/packages/editor/src/ui/inspector/text.spec.tsx new file mode 100644 index 0000000000..7e755625ef --- /dev/null +++ b/packages/editor/src/ui/inspector/text.spec.tsx @@ -0,0 +1,65 @@ +import { act, render, screen, waitFor } from '@testing-library/react'; +import { Editor } from '@tiptap/core'; +import { EditorContext } from '@tiptap/react'; +import { afterEach, describe, expect, it } from 'vitest'; +import { StarterKit } from '../../extensions'; +import { EmailTheming } from '../../plugins'; +import { InspectorRoot } from './root'; +import { InspectorText } from './text'; + +let editor: Editor | null = null; +let element: HTMLElement | null = null; + +function createEditor() { + element = document.createElement('div'); + document.body.append(element); + + editor = new Editor({ + element, + extensions: [StarterKit.configure(), EmailTheming], + content: '

Hello world

', + }); + + return editor; +} + +function focusTextSelection(ed: Editor) { + ed.view.dom.dispatchEvent(new FocusEvent('focusin', { bubbles: true })); + ed.commands.setTextSelection({ from: 1, to: 12 }); +} + +afterEach(() => { + editor?.destroy(); + editor = null; + element?.remove(); + element = null; +}); + +describe('InspectorText mark toggles', () => { + it('shows an uppercase toggle and reflects the active mark state', async () => { + const editor = createEditor(); + + render( + + + + + , + ); + + focusTextSelection(editor); + + const toggle = await waitFor(() => + screen.getByRole('button', { name: 'Uppercase' }), + ); + expect(toggle.getAttribute('aria-pressed')).toBe('false'); + + act(() => { + editor.chain().focus().toggleUppercase().run(); + }); + + await waitFor(() => + expect(toggle.getAttribute('aria-pressed')).toBe('true'), + ); + }); +}); From d83bcff708e0ea7c89a1ec32ab5344d9100cade1 Mon Sep 17 00:00:00 2001 From: Felipe Freitag Date: Fri, 13 Nov 2026 11:03:50 -0300 Subject: [PATCH 3/3] chore(editor): describe the uppercase toggle fix in the changeset The toggle was always visible. Only its pressed state was wrong. --- .changeset/inspector-uppercase-mark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/inspector-uppercase-mark.md b/.changeset/inspector-uppercase-mark.md index f2305e9300..0a1a62f87d 100644 --- a/.changeset/inspector-uppercase-mark.md +++ b/.changeset/inspector-uppercase-mark.md @@ -2,4 +2,4 @@ "@react-email/editor": patch --- -Show the uppercase mark toggle in the inspector text panel, matching the bubble menu. \ No newline at end of file +Fix the Uppercase toggle in the inspector text panel so it shows as pressed when the selection has the uppercase mark.