Compare commits

...

5 Commits

Author SHA1 Message Date
Abdullah Atta
29a461dffb editor: fix marks lost on node split 2026-03-03 10:36:11 +05:00
Abdullah Atta
95fa1efe2b editor: keep fontFamily attribute on split 2026-03-03 09:39:29 +05:00
Abdullah Atta
0e6f123265 editor: fix font family not reflected in toolbar 2026-03-03 09:27:37 +05:00
copilot-swe-agent[bot]
01dcf8c17a Fix font family resetting to sans-serif on Enter key press
When pressing Enter to create a new line, font style (monospace, serif)
was resetting to sans-serif. This happened because the Paragraph
extension's Enter handler was delegating to ProseMirror's default
splitBlock which does NOT preserve marks like font-family.

Fix: use splitBlock({ keepMarks: true }) instead of returning false in:
1. doubleSpaced=true mode (default)
2. doubleSpaced=false mode when cursor is at end of paragraph

Co-authored-by: thecodrr <7473959+thecodrr@users.noreply.github.com>
2026-03-02 07:54:59 +00:00
copilot-swe-agent[bot]
a711873e1c Initial plan 2026-03-02 07:43:22 +00:00
5 changed files with 29 additions and 12 deletions

View File

@@ -106,6 +106,8 @@ export const BlockId = Extension.create({
if (updates.length > 0) {
tr.step(new BatchAttributeStep(updates));
tr.setMeta("ignoreEdit", true);
// Transaction.addStep always clears storedMarks
if (newState.storedMarks) tr.setStoredMarks(newState.storedMarks);
return tr;
}

View File

@@ -55,6 +55,7 @@ export const FontFamily = Extension.create<FontFamilyOptions>({
attributes: {
fontFamily: {
default: null,
keepOnSplit: true,
parseHTML: (element) =>
element.style.fontFamily?.replace(/['"]+/g, ""),
renderHTML: (attributes) => {

View File

@@ -95,7 +95,8 @@ export const Paragraph = Node.create<ParagraphOptions>({
addKeyboardShortcuts() {
return {
Enter: ({ editor }) => {
if (this.options.doubleSpaced) return false;
if (this.options.doubleSpaced)
return editor.commands.splitBlock({ keepMarks: true });
const { state } = editor;
const { selection } = state;
@@ -105,17 +106,16 @@ export const Paragraph = Node.create<ParagraphOptions>({
if (
!empty ||
$from.parent.type !== this.type ||
$from.depth > 1 ||
atEnd
$from.depth > 1
) {
return false;
}
if (!atEnd) {
return createParagraph(editor, this.type, false, true);
if (atEnd) {
return editor.commands.splitBlock({ keepMarks: true });
}
return false;
return createParagraph(editor, this.type, false, true);
},
"Mod-Enter": ({ editor }) =>
createParagraph(editor, this.type, false, true),

View File

@@ -25,7 +25,7 @@ import { useCallback, useMemo } from "react";
import { Counter } from "../components/counter.js";
import { useRefValue } from "../../hooks/use-ref-value.js";
import { useToolbarStore } from "../stores/toolbar-store.js";
import { getFontById, getFontIds, getFonts } from "../../utils/font.js";
import { getFont, getFontById, getFonts } from "../../utils/font.js";
import { CodeBlock } from "../../extensions/code-block/index.js";
import { strings } from "@notesnook/intl";
@@ -66,10 +66,10 @@ export function FontSize(props: ToolProps) {
export function FontFamily(props: ToolProps) {
const { editor } = props;
const defaultFontFamily = useToolbarStore((store) => store.fontFamily);
const currentFontFamily =
getFontIds().find((id) =>
editor.isActive("textStyle", { fontFamily: id })
) || defaultFontFamily;
const currentFontFamily = editor.getAttributes("textStyle").fontFamily;
const selectedFont = currentFontFamily
? getFont(currentFontFamily)
: getFontById(defaultFontFamily);
const items = useMemo(
() => toMenuItems(editor, currentFontFamily),
@@ -81,7 +81,7 @@ export function FontFamily(props: ToolProps) {
<Dropdown
id="fontFamily"
group="font"
selectedItem={getFontById(currentFontFamily)?.title || defaultFontFamily}
selectedItem={selectedFont?.title || defaultFontFamily}
items={items}
menuWidth={130}
disabled={editor.isActive(CodeBlock.name)}

View File

@@ -45,6 +45,20 @@ export function getFontById(id: string) {
return FONTS.find((a) => a.id === id);
}
export function getFont(font: string) {
return FONTS.find(
(a) => normalizeFontFamily(a.font) === normalizeFontFamily(font)
);
}
export function getFontIds() {
return FONTS.map((a) => a.id);
}
function normalizeFontFamily(fontFamily: string) {
return fontFamily
.replace(/['"]+/g, "")
.replaceAll(", ", ",")
.replaceAll(",", "")
.replace(/\s+/g, "");
}