import { describe, it, expect } from 'vitest'; import { unzipSync, strFromU8 } from 'fflate'; import { buildOdt } from '../../src/lib/export/odt'; import { DEFAULT_MARGINS } from '../../src/lib/storage/pageMargins'; // The editor renders no paragraph spacing (editor.css), like LibreOffice and Word. odf-kit's // Standard style carries 0.212cm, which every paragraph and list item inherits — so the // export must zero it, or LibreOffice shows ~6pt per block that the preview never had. describe('exported Standard style', () => { it('has no bottom margin, so the export matches the preview', async () => { const json = { type: 'doc', content: [ { type: 'paragraph', content: [{ type: 'text', text: 'body' }] }, { type: 'bulletList', content: [{ type: 'listItem', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'item' }] }] }], }, ], }; const bytes = await buildOdt(json as never, DEFAULT_MARGINS, 'portrait'); const styles = strFromU8(unzipSync(bytes)['styles.xml']); const standard = styles.match(//)![0]; // The Standard style declares its zero spacing (LibreOffice's Default Paragraph Style). expect(standard).toMatch(/fo:margin-bottom="0(pt|cm)"/); expect(standard).not.toContain('0.212cm'); }); });