diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.js index 623a8b673e..5e25a90ad0 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.js @@ -1,10 +1,9 @@ import { fontOfferingRenderStack, fontOfferingStack, getBuiltInToolbarFontOfferings } from '@superdoc/font-system'; /** - * Built-in toolbar font dropdown options, DERIVED from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. Bundled clean defaults and explicit - * qualified/category fallback choices are advertised; unbundled candidates are intentionally absent - * from the static defaults. + * Built-in toolbar font dropdown options, derived from the shared font-offering registry + * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative + * no-package toolbar baseline. * * Per `FontConfig`: `label` is the Word-facing logical name (stored on the selection + active-state * match), `key` is the logical CSS stack, and the row preview renders in the physical clone that diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js index e44af345a1..5a425d47f6 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js @@ -2,48 +2,35 @@ import { describe, expect, it } from 'vitest'; import { composeToolbarFontOptions, TOOLBAR_FONTS } from './constants'; describe('TOOLBAR_FONTS (built-in font dropdown, derived from the font-offering registry)', () => { - it('advertises bundled defaults and selected bundled fallback choices, in alphabetical order', () => { - expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual([ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); + it('advertises the conservative no-package baseline, in alphabetical order', () => { + expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); }); it('does not leak non-advertised fonts into the default dropdown', () => { const labels = new Set(TOOLBAR_FONTS.map((f) => f.label)); - for (const name of ['Aptos', 'Cambria', 'Calibri Light', 'Century Schoolbook', 'Arial MT', 'Courier', 'Times']) { + for (const name of [ + 'Aptos', + 'Calibri', + 'Cambria', + 'Calibri Light', + 'Century Schoolbook', + 'Helvetica', + 'Arial MT', + 'Courier', + 'Times', + ]) { expect(labels.has(name)).toBe(false); } }); it('builds a FontConfig: logical label + logical key + physical-clone preview', () => { - const calibri = TOOLBAR_FONTS.find((f) => f.label === 'Calibri'); - expect(calibri).toMatchObject({ - label: 'Calibri', // applied to the selection + active-state match (Word-facing name) - key: 'Calibri, sans-serif', // logical CSS stack (option identity) + const arial = TOOLBAR_FONTS.find((f) => f.label === 'Arial'); + expect(arial).toMatchObject({ + label: 'Arial', // applied to the selection + active-state match (Word-facing name) + key: 'Arial, sans-serif', // logical CSS stack (option identity) fontWeight: 400, props: { - style: { fontFamily: 'Carlito, sans-serif' }, // preview renders in the bundled clone that paints + style: { fontFamily: 'Liberation Sans, sans-serif' }, // preview renders in the bundled clone that paints 'data-item': 'btn-fontFamily-option', }, }); @@ -81,28 +68,11 @@ describe('composeToolbarFontOptions (document fonts unioned with the bundled def 'Apple Chancery', 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.filter((o) => o.label === 'Calibri')).toHaveLength(1); }); diff --git a/packages/super-editor/src/headless-toolbar/constants.test.ts b/packages/super-editor/src/headless-toolbar/constants.test.ts index 21c6d104e8..e81f481900 100644 --- a/packages/super-editor/src/headless-toolbar/constants.test.ts +++ b/packages/super-editor/src/headless-toolbar/constants.test.ts @@ -2,38 +2,22 @@ import { describe, expect, it } from 'vitest'; import { DEFAULT_FONT_FAMILY_OPTIONS } from './constants'; describe('DEFAULT_FONT_FAMILY_OPTIONS (headless default font options, derived from the font-offering registry)', () => { - it('advertises bundled defaults and selected bundled fallback choices (logical name + logical stack)', () => { + it('advertises the conservative no-package baseline (logical name + logical stack)', () => { expect(DEFAULT_FONT_FAMILY_OPTIONS).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, - { label: 'Arial Black', value: 'Arial Black, sans-serif' }, - { label: 'Arial Narrow', value: 'Arial Narrow, sans-serif' }, - { label: 'Baskerville Old Face', value: 'Baskerville Old Face, serif' }, - { label: 'Bookman Old Style', value: 'Bookman Old Style, serif' }, - { label: 'Brush Script MT', value: 'Brush Script MT, serif' }, - { label: 'Calibri', value: 'Calibri, sans-serif' }, - { label: 'Century', value: 'Century, serif' }, - { label: 'Century Gothic', value: 'Century Gothic, sans-serif' }, - { label: 'Comic Sans MS', value: 'Comic Sans MS, sans-serif' }, - { label: 'Cooper Black', value: 'Cooper Black, serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, - { label: 'Garamond', value: 'Garamond, serif' }, { label: 'Georgia', value: 'Georgia, serif' }, - { label: 'Gill Sans MT Condensed', value: 'Gill Sans MT Condensed, sans-serif' }, - { label: 'Helvetica', value: 'Helvetica, sans-serif' }, - { label: 'Lucida Console', value: 'Lucida Console, monospace' }, - { label: 'Segoe UI', value: 'Segoe UI, sans-serif' }, - { label: 'Tahoma', value: 'Tahoma, sans-serif' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, - { label: 'Trebuchet MS', value: 'Trebuchet MS, sans-serif' }, - { label: 'Verdana', value: 'Verdana, sans-serif' }, ]); }); it('drops non-advertised fonts from defaults', () => { const labels = new Set(DEFAULT_FONT_FAMILY_OPTIONS.map((o) => o.label)); expect(labels.has('Aptos')).toBe(false); + expect(labels.has('Calibri')).toBe(false); expect(labels.has('Cambria')).toBe(false); expect(labels.has('Calibri Light')).toBe(false); + expect(labels.has('Helvetica')).toBe(false); expect(labels.has('Century Schoolbook')).toBe(false); expect(labels.has('Arial MT')).toBe(false); expect(labels.has('Courier')).toBe(false); diff --git a/packages/super-editor/src/headless-toolbar/constants.ts b/packages/super-editor/src/headless-toolbar/constants.ts index e0cb9cce01..6e1ac46dd4 100644 --- a/packages/super-editor/src/headless-toolbar/constants.ts +++ b/packages/super-editor/src/headless-toolbar/constants.ts @@ -62,11 +62,10 @@ export const DEFAULT_FONT_SIZE_OPTIONS = [ ] as const; /** - * Default headless-toolbar font options, DERIVED from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. Bundled clean defaults and explicit - * qualified choices are advertised; customer-supplied and category fallback rows stay absent. - * `label` is the Word-facing logical name (stored/exported); `value` is the logical CSS stack applied - * to the run. + * Default headless-toolbar font options, derived from the shared font-offering registry + * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative + * no-package toolbar baseline. `label` is the Word-facing logical name (stored/exported); + * `value` is the logical CSS stack applied to the run. */ export const DEFAULT_FONT_FAMILY_OPTIONS = getDefaultFontFamilyOptions(); diff --git a/packages/super-editor/src/ui/create-super-doc-ui.test.ts b/packages/super-editor/src/ui/create-super-doc-ui.test.ts index f7ea11ea7d..92b9862981 100644 --- a/packages/super-editor/src/ui/create-super-doc-ui.test.ts +++ b/packages/super-editor/src/ui/create-super-doc-ui.test.ts @@ -152,28 +152,11 @@ describe('createSuperDocUI', () => { expect(options.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', @@ -214,55 +197,8 @@ describe('createSuperDocUI', () => { superdoc.fireSuperdoc('fonts-changed'); await flushMicrotasks(); - expect(observed.at(0)).toEqual([ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); - expect(observed.at(-1)).toEqual([ - 'Aptos', - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); + expect(observed.at(0)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); + expect(observed.at(-1)).toEqual(['Aptos', 'Arial', 'Courier New', 'Georgia', 'Times New Roman']); }); it('refreshes ui.fonts for delimiter-colliding font names', async () => { diff --git a/packages/super-editor/src/ui/react/hooks.test.tsx b/packages/super-editor/src/ui/react/hooks.test.tsx index faba8450f1..dd99a26fb1 100644 --- a/packages/super-editor/src/ui/react/hooks.test.tsx +++ b/packages/super-editor/src/ui/react/hooks.test.tsx @@ -186,27 +186,9 @@ describe('domain hooks', () => { expect(options?.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options?.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', diff --git a/shared/font-system/src/document-font-options.test.ts b/shared/font-system/src/document-font-options.test.ts index 6e2cb57d8f..3be341eb21 100644 --- a/shared/font-system/src/document-font-options.test.ts +++ b/shared/font-system/src/document-font-options.test.ts @@ -127,28 +127,11 @@ describe('buildFontFamilyOptions (custom UI font picker rows)', () => { 'Apple Chancery', 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.filter((option) => option.label === 'Calibri')).toHaveLength(1); expect(options.every((option) => !('status' in option))).toBe(true); diff --git a/shared/font-system/src/font-offerings.test.ts b/shared/font-system/src/font-offerings.test.ts index 4239f2276a..0a9058a84d 100644 --- a/shared/font-system/src/font-offerings.test.ts +++ b/shared/font-system/src/font-offerings.test.ts @@ -10,30 +10,7 @@ import { import { SUBSTITUTION_EVIDENCE } from './substitution-evidence'; const EXPECTED_DEFAULTS = ['Arial', 'Calibri', 'Courier New', 'Helvetica', 'Times New Roman']; -const EXPECTED_BUILT_IN_TOOLBAR = [ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', -]; +const EXPECTED_BUILT_IN_TOOLBAR = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; /** * Must NOT appear as DEFAULT options yet. Aptos has no clone, Cambria/Georgia/Cooper Black/ @@ -85,13 +62,15 @@ describe('font offerings', () => { } }); - it('built-in toolbar offerings include advertised bundled rows without reclassifying them as defaults', () => { + it('built-in toolbar offerings use the conservative no-package baseline', () => { expect(getBuiltInToolbarFontOfferings().map((o) => o.logicalFamily)).toEqual(EXPECTED_BUILT_IN_TOOLBAR); - expect(getBuiltInToolbarFontOfferings().find((o) => o.logicalFamily === 'Cooper Black')).toMatchObject({ + expect(getBuiltInToolbarFontOfferings().find((o) => o.logicalFamily === 'Georgia')).toMatchObject({ offering: 'qualified', - verdict: 'visual_only', + verdict: 'near_metric', bundled: true, }); + expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Calibri')).toBe(false); + expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Helvetica')).toBe(false); }); it('classifies the qualified and category rows distinctly (carried for the later fidelity layer)', () => { @@ -214,27 +193,9 @@ describe('font offerings', () => { it('getDefaultFontFamilyOptions returns logical label + logical stack', () => { expect(getDefaultFontFamilyOptions()).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, - { label: 'Arial Black', value: 'Arial Black, sans-serif' }, - { label: 'Arial Narrow', value: 'Arial Narrow, sans-serif' }, - { label: 'Baskerville Old Face', value: 'Baskerville Old Face, serif' }, - { label: 'Bookman Old Style', value: 'Bookman Old Style, serif' }, - { label: 'Brush Script MT', value: 'Brush Script MT, serif' }, - { label: 'Calibri', value: 'Calibri, sans-serif' }, - { label: 'Century', value: 'Century, serif' }, - { label: 'Century Gothic', value: 'Century Gothic, sans-serif' }, - { label: 'Comic Sans MS', value: 'Comic Sans MS, sans-serif' }, - { label: 'Cooper Black', value: 'Cooper Black, serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, - { label: 'Garamond', value: 'Garamond, serif' }, { label: 'Georgia', value: 'Georgia, serif' }, - { label: 'Gill Sans MT Condensed', value: 'Gill Sans MT Condensed, sans-serif' }, - { label: 'Helvetica', value: 'Helvetica, sans-serif' }, - { label: 'Lucida Console', value: 'Lucida Console, monospace' }, - { label: 'Segoe UI', value: 'Segoe UI, sans-serif' }, - { label: 'Tahoma', value: 'Tahoma, sans-serif' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, - { label: 'Trebuchet MS', value: 'Trebuchet MS, sans-serif' }, - { label: 'Verdana', value: 'Verdana, sans-serif' }, ]); }); diff --git a/shared/font-system/src/font-offerings.ts b/shared/font-system/src/font-offerings.ts index b0da75d2c8..19d943b446 100644 --- a/shared/font-system/src/font-offerings.ts +++ b/shared/font-system/src/font-offerings.ts @@ -53,24 +53,11 @@ export interface FontOffering { const BUNDLED_FAMILIES: ReadonlySet = new Set(BUNDLED_MANIFEST.map((f) => f.family)); const SUPPORTED_ALIAS_FAMILIES: ReadonlySet = new Set(['Arial MT', 'Courier', 'Times']); -const ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES: ReadonlySet = new Set([ - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Century', - 'Century Gothic', - 'Cooper Black', - 'Comic Sans MS', - 'Garamond', +const BUILT_IN_TOOLBAR_BASELINE_FAMILIES: ReadonlySet = new Set([ + 'Arial', + 'Courier New', 'Georgia', - 'Gill Sans MT Condensed', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Trebuchet MS', - 'Verdana', + 'Times New Roman', ]); /** Classify one evidence row by its policy action, verdict, and whether its target is bundled. */ @@ -128,18 +115,16 @@ export function getDefaultFontOfferings(): FontOffering[] { } /** - * Built-in font picker options SuperDoc can render from its bundled assets. Includes clean defaults plus - * explicitly advertised qualified/category fallbacks. Consumers that need strict metric-safe choices - * should use {@link getDefaultFontOfferings}. + * Built-in font picker options shown without any customer font configuration. + * + * AIDEV-NOTE: Keep this SD-3441 toolbar baseline conservative while the optional + * font-pack selection UX is settled. Documents still resolve the full reviewed + * substitute table through the resolver. */ export function getBuiltInToolbarFontOfferings(): FontOffering[] { - return FONT_OFFERINGS.filter( - (o) => - o.offering === 'default' || - (o.bundled && - ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES.has(o.logicalFamily) && - (o.offering === 'qualified' || o.offering === 'category_fallback')), - ).sort(compareLogicalFamily); + return FONT_OFFERINGS.filter((o) => o.bundled && BUILT_IN_TOOLBAR_BASELINE_FAMILIES.has(o.logicalFamily)).sort( + compareLogicalFamily, + ); } /** The logical CSS stack stored/applied when an offering is chosen, e.g. "Calibri, sans-serif". */ diff --git a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts index 52946ad67e..c2362e5f38 100644 --- a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts +++ b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts @@ -5,30 +5,7 @@ test.use({ config: { toolbar: 'full', showSelection: true } }); const FONT_OPTION = '[data-item="btn-fontFamily-option"]'; const FONT_TOGGLE = '[data-item="btn-fontFamily-toggle"]'; const OPTION_LABEL = `${FONT_OPTION} .toolbar-dropdown-option__label`; -const DEFAULT_FONT_LABELS = [ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', -]; +const DEFAULT_FONT_LABELS = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; function expectedLabelsWithDocumentFonts(documentLabels: string[]): string[] { return Array.from(new Set([...DEFAULT_FONT_LABELS, ...documentLabels])).sort((left, right) => @@ -110,7 +87,17 @@ test('font dropdown opens immediately with the built-in font list and an enabled const labels = await fontOptionLabels(superdoc); expect(labels).toEqual(DEFAULT_FONT_LABELS); - for (const absent of ['Aptos', 'Cambria', 'Calibri Light', 'Century Schoolbook', 'Arial MT', 'Courier', 'Times']) { + for (const absent of [ + 'Aptos', + 'Calibri', + 'Cambria', + 'Calibri Light', + 'Century Schoolbook', + 'Helvetica', + 'Arial MT', + 'Courier', + 'Times', + ]) { expect(labels).not.toContain(absent); } }); @@ -124,10 +111,10 @@ test('selecting a default font applies its logical Word-facing family to the sel await superdoc.waitForStable(); await openFontFamilyDropdown(superdoc); - await selectFontOption(superdoc, 'Helvetica'); + await selectFontOption(superdoc, 'Georgia'); - await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Helvetica'); - await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Helvetica' }); + await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Georgia'); + await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Georgia' }); }); test('typing in the font combobox applies to the selected text without opening the list', async ({ superdoc }) => { @@ -189,14 +176,14 @@ test('tabbing through font family and size preserves formatting when all text is await superdoc.waitForStable(); await replaceSelectionThroughFontInputs(superdoc, { - fontPrefix: 'cal', + fontPrefix: 'geo', fontSize: '20', replacement: 'done', }); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Calibri', + fontFamily: 'Georgia', fontSize: '20pt', }); }); @@ -215,14 +202,14 @@ test('pressing Enter in the font combobox preserves formatting when all text is await fontInput.click(); await expectFontFamilyDropdownClosed(superdoc); - await superdoc.page.keyboard.type('cal'); + await superdoc.page.keyboard.type('geo'); await superdoc.page.keyboard.press('Enter'); await superdoc.page.keyboard.type('done'); await superdoc.waitForStable(); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Calibri', + fontFamily: 'Georgia', }); });