From 008ef20b5988aa4b0d95db8e3f89aa8f72eeb5f6 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 14 May 2026 15:09:09 +0200 Subject: [PATCH 1/5] Add justify option to block --- .../BlockNoteToolBar/BlockNoteToolbar.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx index c110772e65..a433a812d3 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-editor/components/BlockNoteToolBar/BlockNoteToolbar.tsx @@ -1,6 +1,7 @@ import { FormattingToolbar, FormattingToolbarController, + TextAlignButton, blockTypeSelectItems, getFormattingToolbarItems, useDictionary, @@ -74,6 +75,25 @@ export const BlockNoteToolbar = ({ aiAllowed }: { aiAllowed: boolean }) => { return true; }); + const rightAlignIndex = toolbarItems.findIndex( + (item) => + typeof item === 'object' && + item !== null && + 'key' in item && + item.key === 'textAlignRightButton', + ); + + if (rightAlignIndex !== -1) { + toolbarItems.splice( + rightAlignIndex + 1, + 0, + , + ); + } + return toolbarItems; }, [dict, t]); From e0906adb9a043adc73ba3f85581ca7e04dc75d5a Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 14 May 2026 15:23:02 +0200 Subject: [PATCH 2/5] Tentatively improve justify handling when downloading as docx --- .../blocks-mapping/blockNoteDocxBlockProps.ts | 57 +++++++++++++++ .../defaultBlocksDocxJustify.tsx | 69 +++++++++++++++++++ .../doc-export/blocks-mapping/imageDocx.tsx | 2 +- .../docs/doc-export/blocks-mapping/index.ts | 2 + .../features/docs/doc-export/mappingDocx.tsx | 12 ++++ .../src/features/docs/doc-export/utils.ts | 2 +- 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts create mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts new file mode 100644 index 0000000000..f90ceb7dff --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts @@ -0,0 +1,57 @@ +import { + COLORS_DEFAULT, + DefaultProps, + UnreachableCaseError, +} from '@blocknote/core'; +import { IParagraphOptions, ShadingType } from 'docx'; + +/** + * Same semantics as `@blocknote/xl-docx-exporter` `blockPropsToStyles`, but + * `textAlignment: justify` maps to OOXML `both` (normal justified paragraphs). + * Upstream maps justify to `distribute`, which uses “distribute all characters equally” + * and does not match browser/Word paragraph justification. + */ +export function blockNoteDocxBlockPropsToStyles( + props: Partial, + colors: typeof COLORS_DEFAULT, +): IParagraphOptions { + return { + shading: + props.backgroundColor === 'default' || !props.backgroundColor + ? undefined + : { + type: ShadingType.CLEAR, + fill: (() => { + const color = colors[props.backgroundColor]?.background; + if (!color) { + return undefined; + } + return color.slice(1); + })(), + }, + run: + props.textColor === 'default' || !props.textColor + ? undefined + : { + color: (() => { + const color = colors[props.textColor]?.text; + if (!color) { + return undefined; + } + return color.slice(1); + })(), + }, + alignment: + !props.textAlignment || props.textAlignment === 'left' + ? undefined + : props.textAlignment === 'center' + ? 'center' + : props.textAlignment === 'right' + ? 'right' + : props.textAlignment === 'justify' + ? 'both' + : (() => { + throw new UnreachableCaseError(props.textAlignment); + })(), + }; +} diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx new file mode 100644 index 0000000000..e3e817a6fb --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx @@ -0,0 +1,69 @@ +import { CheckBox, Paragraph, TextRun } from 'docx'; + +import { DocsExporterDocx } from '../types'; + +import { blockNoteDocxBlockPropsToStyles } from './blockNoteDocxBlockProps'; + +/** Default-schema DOCX blocks with correct `justify` → `both` (see blockNoteDocxBlockProps). */ + +export const blockMappingParagraphDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['paragraph'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + }); + +export const blockMappingHeadingDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['heading'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + heading: `Heading${block.props.level as 1 | 2 | 3 | 4 | 5 | 6}`, + }); + +export const blockMappingBulletListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['bulletListItem'] = + (block, exporter, nestingLevel) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + numbering: { + reference: 'blocknote-bullet-list', + level: nestingLevel, + }, + }); + +export const blockMappingNumberedListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['numberedListItem'] = + (block, exporter, nestingLevel) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + numbering: { + reference: 'blocknote-numbered-list', + level: nestingLevel, + }, + }); + +export const blockMappingToggleListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['toggleListItem'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: [ + new TextRun({ + children: ['> '], + }), + ...exporter.transformInlineContent(block.content), + ], + }); + +export const blockMappingCheckListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['checkListItem'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: [ + new CheckBox({ checked: block.props.checked }), + new TextRun({ + children: [' '], + }), + ...exporter.transformInlineContent(block.content), + ], + }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx index 3eb26bb251..b1ba28c8b2 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/imageDocx.tsx @@ -111,7 +111,7 @@ function blockPropsToStyles( : props.textAlignment === 'right' ? 'right' : props.textAlignment === 'justify' - ? 'distribute' + ? 'both' : (() => { throw new UnreachableCaseError(props.textAlignment); })(), diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts index 1d98efe889..adcaa260ec 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts @@ -1,4 +1,6 @@ +export * from './blockNoteDocxBlockProps'; export * from './calloutDocx'; +export * from './defaultBlocksDocxJustify'; export * from './calloutODT'; export * from './calloutPDF'; export * from './headingPDF'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx index dc8afc2f47..11c67239b8 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx @@ -1,9 +1,15 @@ import { docxDefaultSchemaMappings } from '@blocknote/xl-docx-exporter'; import { + blockMappingBulletListItemDocxJustifyBoth, blockMappingCalloutDocx, + blockMappingCheckListItemDocxJustifyBoth, + blockMappingHeadingDocxJustifyBoth, blockMappingImageDocx, + blockMappingNumberedListItemDocxJustifyBoth, + blockMappingParagraphDocxJustifyBoth, blockMappingQuoteDocx, + blockMappingToggleListItemDocxJustifyBoth, blockMappingUploadLoaderDocx, } from './blocks-mapping'; import { inlineContentMappingInterlinkingLinkDocx } from './inline-content-mapping'; @@ -13,6 +19,12 @@ export const docxDocsSchemaMappings: DocsExporterDocx['mappings'] = { ...docxDefaultSchemaMappings, blockMapping: { ...docxDefaultSchemaMappings.blockMapping, + paragraph: blockMappingParagraphDocxJustifyBoth, + heading: blockMappingHeadingDocxJustifyBoth, + bulletListItem: blockMappingBulletListItemDocxJustifyBoth, + numberedListItem: blockMappingNumberedListItemDocxJustifyBoth, + toggleListItem: blockMappingToggleListItemDocxJustifyBoth, + checkListItem: blockMappingCheckListItemDocxJustifyBoth, callout: blockMappingCalloutDocx, // We're reusing the file block mapping for PDF blocks; both share the same // implementation signature, so we can reuse the handler directly. diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts b/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts index 72992ea2a1..1f22966bb6 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-export/utils.ts @@ -110,7 +110,7 @@ export function docxBlockPropsToStyles( : props.textAlignment === 'right' ? 'right' : props.textAlignment === 'justify' - ? 'distribute' + ? 'both' : (() => { throw new UnreachableCaseError(props.textAlignment); })(), From b04df388cda3440a17ec2863aa9c866e1e5fb209 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 14 May 2026 15:30:14 +0200 Subject: [PATCH 3/5] Propose yarn patch --- src/frontend/Dockerfile | 1 + .../blocks-mapping/blockNoteDocxBlockProps.ts | 57 -------- .../defaultBlocksDocxJustify.tsx | 69 ---------- .../docs/doc-export/blocks-mapping/index.ts | 2 - .../features/docs/doc-export/mappingDocx.tsx | 12 -- src/frontend/package.json | 6 +- .../@blocknote+xl-docx-exporter+0.49.0.patch | 32 +++++ src/frontend/yarn.lock | 128 +++++++++++++++--- 8 files changed, 146 insertions(+), 161 deletions(-) delete mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts delete mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx create mode 100644 src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 1c12846da0..01acfe598c 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -11,6 +11,7 @@ WORKDIR /home/frontend/ COPY ./src/frontend/package.json ./package.json COPY ./src/frontend/yarn.lock ./yarn.lock +COPY ./src/frontend/patches ./patches COPY ./src/frontend/apps/impress/package.json ./apps/impress/package.json COPY ./src/frontend/packages/eslint-plugin-docs/package.json ./packages/eslint-plugin-docs/package.json diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts deleted file mode 100644 index f90ceb7dff..0000000000 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - COLORS_DEFAULT, - DefaultProps, - UnreachableCaseError, -} from '@blocknote/core'; -import { IParagraphOptions, ShadingType } from 'docx'; - -/** - * Same semantics as `@blocknote/xl-docx-exporter` `blockPropsToStyles`, but - * `textAlignment: justify` maps to OOXML `both` (normal justified paragraphs). - * Upstream maps justify to `distribute`, which uses “distribute all characters equally” - * and does not match browser/Word paragraph justification. - */ -export function blockNoteDocxBlockPropsToStyles( - props: Partial, - colors: typeof COLORS_DEFAULT, -): IParagraphOptions { - return { - shading: - props.backgroundColor === 'default' || !props.backgroundColor - ? undefined - : { - type: ShadingType.CLEAR, - fill: (() => { - const color = colors[props.backgroundColor]?.background; - if (!color) { - return undefined; - } - return color.slice(1); - })(), - }, - run: - props.textColor === 'default' || !props.textColor - ? undefined - : { - color: (() => { - const color = colors[props.textColor]?.text; - if (!color) { - return undefined; - } - return color.slice(1); - })(), - }, - alignment: - !props.textAlignment || props.textAlignment === 'left' - ? undefined - : props.textAlignment === 'center' - ? 'center' - : props.textAlignment === 'right' - ? 'right' - : props.textAlignment === 'justify' - ? 'both' - : (() => { - throw new UnreachableCaseError(props.textAlignment); - })(), - }; -} diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx deleted file mode 100644 index e3e817a6fb..0000000000 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { CheckBox, Paragraph, TextRun } from 'docx'; - -import { DocsExporterDocx } from '../types'; - -import { blockNoteDocxBlockPropsToStyles } from './blockNoteDocxBlockProps'; - -/** Default-schema DOCX blocks with correct `justify` → `both` (see blockNoteDocxBlockProps). */ - -export const blockMappingParagraphDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['paragraph'] = - (block, exporter) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: exporter.transformInlineContent(block.content), - }); - -export const blockMappingHeadingDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['heading'] = - (block, exporter) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: exporter.transformInlineContent(block.content), - heading: `Heading${block.props.level as 1 | 2 | 3 | 4 | 5 | 6}`, - }); - -export const blockMappingBulletListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['bulletListItem'] = - (block, exporter, nestingLevel) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: exporter.transformInlineContent(block.content), - numbering: { - reference: 'blocknote-bullet-list', - level: nestingLevel, - }, - }); - -export const blockMappingNumberedListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['numberedListItem'] = - (block, exporter, nestingLevel) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: exporter.transformInlineContent(block.content), - numbering: { - reference: 'blocknote-numbered-list', - level: nestingLevel, - }, - }); - -export const blockMappingToggleListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['toggleListItem'] = - (block, exporter) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: [ - new TextRun({ - children: ['> '], - }), - ...exporter.transformInlineContent(block.content), - ], - }); - -export const blockMappingCheckListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['checkListItem'] = - (block, exporter) => - new Paragraph({ - ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), - children: [ - new CheckBox({ checked: block.props.checked }), - new TextRun({ - children: [' '], - }), - ...exporter.transformInlineContent(block.content), - ], - }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts index adcaa260ec..1d98efe889 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts @@ -1,6 +1,4 @@ -export * from './blockNoteDocxBlockProps'; export * from './calloutDocx'; -export * from './defaultBlocksDocxJustify'; export * from './calloutODT'; export * from './calloutPDF'; export * from './headingPDF'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx index 11c67239b8..dc8afc2f47 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx @@ -1,15 +1,9 @@ import { docxDefaultSchemaMappings } from '@blocknote/xl-docx-exporter'; import { - blockMappingBulletListItemDocxJustifyBoth, blockMappingCalloutDocx, - blockMappingCheckListItemDocxJustifyBoth, - blockMappingHeadingDocxJustifyBoth, blockMappingImageDocx, - blockMappingNumberedListItemDocxJustifyBoth, - blockMappingParagraphDocxJustifyBoth, blockMappingQuoteDocx, - blockMappingToggleListItemDocxJustifyBoth, blockMappingUploadLoaderDocx, } from './blocks-mapping'; import { inlineContentMappingInterlinkingLinkDocx } from './inline-content-mapping'; @@ -19,12 +13,6 @@ export const docxDocsSchemaMappings: DocsExporterDocx['mappings'] = { ...docxDefaultSchemaMappings, blockMapping: { ...docxDefaultSchemaMappings.blockMapping, - paragraph: blockMappingParagraphDocxJustifyBoth, - heading: blockMappingHeadingDocxJustifyBoth, - bulletListItem: blockMappingBulletListItemDocxJustifyBoth, - numberedListItem: blockMappingNumberedListItemDocxJustifyBoth, - toggleListItem: blockMappingToggleListItemDocxJustifyBoth, - checkListItem: blockMappingCheckListItemDocxJustifyBoth, callout: blockMappingCalloutDocx, // We're reusing the file block mapping for PDF blocks; both share the same // implementation signature, so we can reuse the handler directly. diff --git a/src/frontend/package.json b/src/frontend/package.json index 5515652c00..235fabcbca 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -13,6 +13,7 @@ ] }, "scripts": { + "postinstall": "patch-package", "APP_IMPRESS": "yarn workspace app-impress", "APP_E2E": "yarn workspace app-e2e", "I18N": "yarn workspace packages-i18n", @@ -46,5 +47,8 @@ "wrap-ansi": "10.0.0", "yjs": "13.6.30" }, - "packageManager": "yarn@1.22.22" + "packageManager": "yarn@1.22.22", + "devDependencies": { + "patch-package": "^8.0.1" + } } diff --git a/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch b/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch new file mode 100644 index 0000000000..003e2f6091 --- /dev/null +++ b/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch @@ -0,0 +1,32 @@ +diff --git a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js +index 0000000..1111111 100644 +--- a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js ++++ b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js +@@ -46,7 +46,7 @@ + }, + children: [new f({ + children: t.transformInlineContent(l.content), +- alignment: !l.props.textAlignment || l.props.textAlignment === "left" ? void 0 : l.props.textAlignment === "center" ? "center" : l.props.textAlignment === "right" ? "right" : l.props.textAlignment === "justify" ? "distribute" : (() => { ++ alignment: !l.props.textAlignment || l.props.textAlignment === "left" ? void 0 : l.props.textAlignment === "center" ? "center" : l.props.textAlignment === "right" ? "right" : l.props.textAlignment === "justify" ? "both" : (() => { + throw new n(l.props.textAlignment); + })(), + run: { +@@ -78,7 +78,7 @@ + let n = t[e.textColor]?.text; + if (n) return n.slice(1); + })() }, +- alignment: !e.textAlignment || e.textAlignment === "left" ? void 0 : e.textAlignment === "center" ? "center" : e.textAlignment === "right" ? "right" : e.textAlignment === "justify" ? "distribute" : (() => { ++ alignment: !e.textAlignment || e.textAlignment === "left" ? void 0 : e.textAlignment === "center" ? "center" : e.textAlignment === "right" ? "right" : e.textAlignment === "justify" ? "both" : (() => { + throw new n(e.textAlignment); + })() + }; +diff --git a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs +index 0000000..1111111 100644 +--- a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs ++++ b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs +@@ -1,3 +1,3 @@ +-Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@blocknote/core`),t=require(`docx`);async function n(e){if(typeof window<`u`){let t=await createImageBitmap(e),{width:n,height:r}=t;return t.close(),{width:n,height:r}}else{let t=(await import(`image-meta`)).imageMeta,n=t(new Uint8Array(await e.arrayBuffer()));if(!n.width||!n.height)throw Error(`Image dimensions not found`);return{width:n.width,height:n.height}}}var r=(n,r)=>{let i=Array(n.headerRows??0).fill(!0),a=Array(n.headerCols??0).fill(!0);return new t.Table({layout:`autofit`,columnWidths:n.columnWidths.map(e=>(e??120)*.75*20),rows:n.rows.map((o,s)=>{let c=i[s];return new t.TableRow({tableHeader:c,children:o.cells.map((i,o)=>{let s=n.columnWidths?.[o],l=(0,e.mapTableCell)(i),u=a[o];return new t.TableCell({width:s?{size:s*.75*20,type:`dxa`}:void 0,columnSpan:l.props.colspan,rowSpan:l.props.rowspan,shading:l.props.backgroundColor===`default`||!l.props.backgroundColor?void 0:{type:t.ShadingType.SOLID,color:(()=>{let e=r.options.colors[l.props.backgroundColor]?.background;if(e)return e.slice(1)})()},children:[new t.Paragraph({children:r.transformInlineContent(l.content),alignment:!l.props.textAlignment||l.props.textAlignment===`left`?void 0:l.props.textAlignment===`center`?`center`:l.props.textAlignment===`right`?`right`:l.props.textAlignment===`justify`?`distribute`:(()=>{throw new e.UnreachableCaseError(l.props.textAlignment)})(),run:{bold:c||u,color:l.props.textColor===`default`||!l.props.textColor?void 0:(()=>{let e=r.options.colors[l.props.textColor]?.text;if(e)return e.slice(1)})()}})]})})})})})};function i(n,r){return{shading:n.backgroundColor===`default`||!n.backgroundColor?void 0:{type:t.ShadingType.CLEAR,fill:(()=>{let e=r[n.backgroundColor]?.background;if(e)return e.slice(1)})()},run:n.textColor===`default`||!n.textColor?void 0:{color:(()=>{let e=r[n.textColor]?.text;if(e)return e.slice(1)})()},alignment:!n.textAlignment||n.textAlignment===`left`?void 0:n.textAlignment===`center`?`center`:n.textAlignment===`right`?`right`:n.textAlignment===`justify`?`distribute`:(()=>{throw new e.UnreachableCaseError(n.textAlignment)})()}}var a={paragraph:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),toggleListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.TextRun({children:[`> `]}),...n.transformInlineContent(e.content)]}),numberedListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-numbered-list`,level:r}}),bulletListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-bullet-list`,level:r}}),checkListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.CheckBox({checked:e.props.checked}),new t.TextRun({children:[` `]}),...n.transformInlineContent(e.content)]}),heading:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),quote:(e,n)=>new t.Paragraph({style:`BlockQuote`,...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),audio:(e,t)=>[o(e.props,`Open audio`,t),...s(e.props,t)],video:(e,t)=>[o(e.props,`Open video`,t),...s(e.props,t)],file:(e,t)=>[o(e.props,`Open file`,t),...s(e.props,t)],codeBlock:e=>new t.Paragraph({style:`SourceCode`,children:[...(e.content[0]?.text||``).split(` ++Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@blocknote/core`),t=require(`docx`);async function n(e){if(typeof window<`u`){let t=await createImageBitmap(e),{width:n,height:r}=t;return t.close(),{width:n,height:r}}else{let t=(await import(`image-meta`)).imageMeta,n=t(new Uint8Array(await e.arrayBuffer()));if(!n.width||!n.height)throw Error(`Image dimensions not found`);return{width:n.width,height:n.height}}}var r=(n,r)=>{let i=Array(n.headerRows??0).fill(!0),a=Array(n.headerCols??0).fill(!0);return new t.Table({layout:`autofit`,columnWidths:n.columnWidths.map(e=>(e??120)*.75*20),rows:n.rows.map((o,s)=>{let c=i[s];return new t.TableRow({tableHeader:c,children:o.cells.map((i,o)=>{let s=n.columnWidths?.[o],l=(0,e.mapTableCell)(i),u=a[o];return new t.TableCell({width:s?{size:s*.75*20,type:`dxa`}:void 0,columnSpan:l.props.colspan,rowSpan:l.props.rowspan,shading:l.props.backgroundColor===`default`||!l.props.backgroundColor?void 0:{type:t.ShadingType.SOLID,color:(()=>{let e=r.options.colors[l.props.backgroundColor]?.background;if(e)return e.slice(1)})()},children:[new t.Paragraph({children:r.transformInlineContent(l.content),alignment:!l.props.textAlignment||l.props.textAlignment===`left`?void 0:l.props.textAlignment===`center`?`center`:l.props.textAlignment===`right`?`right`:l.props.textAlignment===`justify`?`both`:(()=>{throw new e.UnreachableCaseError(l.props.textAlignment)})(),run:{bold:c||u,color:l.props.textColor===`default`||!l.props.textColor?void 0:(()=>{let e=r.options.colors[l.props.textColor]?.text;if(e)return e.slice(1)})()}})]})})})})})};function i(n,r){return{shading:n.backgroundColor===`default`||!n.backgroundColor?void 0:{type:t.ShadingType.CLEAR,fill:(()=>{let e=r[n.backgroundColor]?.background;if(e)return e.slice(1)})()},run:n.textColor===`default`||!n.textColor?void 0:{color:(()=>{let e=r[n.textColor]?.text;if(e)return e.slice(1)})()},alignment:!n.textAlignment||n.textAlignment===`left`?void 0:n.textAlignment===`center`?`center`:n.textAlignment===`right`?`right`:n.textAlignment===`justify`?`both`:(()=>{throw new e.UnreachableCaseError(n.textAlignment)})()}}var a={paragraph:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),toggleListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.TextRun({children:[`> `]}),...n.transformInlineContent(e.content)]}),numberedListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-numbered-list`,level:r}}),bulletListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-bullet-list`,level:r}}),checkListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.CheckBox({checked:e.props.checked}),new t.TextRun({children:[` `]}),...n.transformInlineContent(e.content)]}),heading:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),quote:(e,n)=>new t.Paragraph({style:`BlockQuote`,...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),audio:(e,t)=>[o(e.props,`Open audio`,t),...s(e.props,t)],video:(e,t)=>[o(e.props,`Open video`,t),...s(e.props,t)],file:(e,t)=>[o(e.props,`Open file`,t),...s(e.props,t)],codeBlock:e=>new t.Paragraph({style:`SourceCode`,children:[...(e.content[0]?.text||``).split(` + `).map((e,n)=>new t.TextRun({text:e,break:+(n>0)}))]}),pageBreak:()=>new t.Paragraph({children:[new t.PageBreak]}),divider:()=>new t.Paragraph({border:{top:{color:`auto`,space:1,style:`single`,size:1}}}),column:(e,n,r,i,a)=>new t.TableCell({width:{size:`${e.props.width*100}%`,type:`pct`},children:(a||[]).flatMap(e=>Array.isArray(e)?e:[e])}),columnList:(e,n,r,i,a)=>new t.Table({layout:`autofit`,borders:{bottom:{style:`nil`},top:{style:`nil`},left:{style:`nil`},right:{style:`nil`},insideHorizontal:{style:`nil`},insideVertical:{style:`nil`}},rows:[new t.TableRow({children:a.map((e,n,r)=>new t.TableCell({width:{size:`${parseFloat(`${e.options.width?.size||`100%`}`)/(r.length*100)*100}%`,type:`pct`},children:e.options.children}))})]}),image:async(e,r)=>{let a=await r.resolveFile(e.props.url),{width:o,height:c}=await n(a);return[new t.Paragraph({...i(e.props,r.options.colors),children:[new t.ImageRun({data:await a.arrayBuffer(),type:`gif`,altText:e.props.caption?{description:e.props.caption,name:e.props.caption,title:e.props.caption}:void 0,transformation:{width:e.props.previewWidth||o,height:(e.props.previewWidth||o)/o*c}})]}),...s(e.props,r)]},table:(e,t)=>r(e.content,t)};function o(e,n,r){return new t.Paragraph({...i(e,r.options.colors),children:[new t.ExternalHyperlink({children:[new t.TextRun({text:e.name||n,style:`Hyperlink`})],link:e.url})]})}function s(e,n){return e.caption?[new t.Paragraph({...i(e,n.options.colors),children:[new t.TextRun({text:e.caption})],style:`Caption`})]:[]}var c={blockMapping:a,inlineContentMapping:{link:(e,n)=>new t.ExternalHyperlink({children:e.content.map(e=>n.transformStyledText(e,!0)),link:e.href}),text:(e,t)=>t.transformStyledText(e)},styleMapping:{bold:e=>e?{bold:e}:{},italic:e=>e?{italics:e}:{},underline:e=>e?{underline:{type:`single`}}:{},strike:e=>e?{strike:e}:{},backgroundColor:(e,n)=>{if(!e)return{};let r=n.options.colors[e]?.background;return r?{shading:{type:t.ShadingType.CLEAR,fill:r.slice(1)}}:{}},textColor:(e,t)=>{if(!e)return{};let n=t.options.colors[e]?.text;return n?{color:n.slice(1)}:{}},code:e=>e?{style:`VerbatimChar`}:{}}};async function l(e){return`https://corsproxy.api.blocknotejs.org/corsproxy/?url=`+encodeURIComponent(e)}async function u(e){{let t=e.default;return await(await fetch(t)).arrayBuffer()}}var d=16*.75*1.5*20,f=class extends e.Exporter{constructor(t,n,r){let i={colors:e.COLORS_DEFAULT,resolveFileUrl:l,...r};super(t,n,i),this.schema=t,this.mappings=n}transformStyledText(e,n){let r=this.mapStyles(e.styles),i=Object.assign({},...r);return new t.TextRun({...i,style:n?`Hyperlink`:i.style,text:e.text})}async transformBlocks(e,n=0){let r=[];for(let i of e){let e=await this.transformBlocks(i.children,n+1);[`columnList`,`column`].includes(i.type)||(e=e.map((e,n)=>(e instanceof t.Paragraph&&!e.properties.numberingReferences.length&&e.addRunToFront(new t.TextRun({children:[new t.Tab]})),e)));let a=await this.mapBlock(i,n,0,e);[`columnList`,`column`].includes(i.type)?r.push(a):Array.isArray(a)?r.push(...a,...e):r.push(a,...e)}return r}async getFonts(){let e=await u(await Promise.resolve().then(()=>require(`./Inter_18pt-Regular-PkBfh_8C.cjs`))),t=await u(await Promise.resolve().then(()=>require(`./GeistMono-Regular-CHVKamKz.cjs`)));if(e instanceof ArrayBuffer||t instanceof ArrayBuffer){let n=(await import(`buffer/`)).Buffer;e instanceof ArrayBuffer&&(e=n.from(e)),t instanceof ArrayBuffer&&(t=n.from(t))}return[{name:`Inter`,data:e},{name:`GeistMono`,data:t}]}async createDefaultDocumentOptions(e){let n=(await Promise.resolve().then(()=>require(`./styles-Cz94-HtD.cjs`))).default,r=e?.trim();n=r?n.replace(/(]*\bw:val=")([^"]+)("[^>]*\/>)/g,(e,t,n,i)=>`${t}${r}${i}`):n.replace(/\s*]*\/>/g,``);let i=[`•`];return{numbering:{config:[{reference:`blocknote-numbered-list`,levels:Array.from({length:9},(e,n)=>({start:1,level:n,format:t.LevelFormat.DECIMAL,text:`%${n+1}.`,alignment:t.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(n+1),hanging:d}}}}))},{reference:`blocknote-bullet-list`,levels:Array.from({length:9},(e,n)=>({start:1,level:n,format:t.LevelFormat.BULLET,text:i[n%i.length],alignment:t.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(n+1),hanging:d}}}}))}]},fonts:await this.getFonts(),defaultTabStop:200,externalStyles:n}}async toBlob(e,n={sectionOptions:{},documentOptions:{}}){let r=await this.toDocxJsDocument(e,n),i=globalThis.Buffer;try{return globalThis.Buffer||(globalThis.Buffer=(await import(`buffer`)).default.Buffer),t.Packer.toBlob(r)}finally{globalThis.Buffer=i}}async toDocxJsDocument(e,n={sectionOptions:{},documentOptions:{}}){return new t.Document({...await this.createDefaultDocumentOptions(n.locale),...n.documentOptions,sections:[{children:await this.transformBlocks(e),...n.sectionOptions}]})}};exports.DOCXExporter=f,exports.docxDefaultSchemaMappings=c; + //# sourceMappingURL=blocknote-xl-docx-exporter.cjs.map +\ No newline at end of file diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index 7431b1b671..ea24a60724 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -7412,6 +7412,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + "@zip.js/zip.js@^2.8.8": version "2.8.10" resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.8.10.tgz#98a0cc7fdef9d6e227236271af412db02b18a5b2" @@ -8268,6 +8273,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + ci-info@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa" @@ -9922,6 +9932,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -10025,6 +10042,15 @@ fresh@^2.0.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.2.0: version "11.3.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" @@ -10334,7 +10360,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -11034,6 +11060,11 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -11230,6 +11261,13 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -11858,6 +11896,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" + integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -11886,6 +11935,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -11930,6 +11984,13 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^4.1.4: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" @@ -12761,7 +12822,7 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^4.0.4, micromatch@^4.0.8: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -13130,6 +13191,14 @@ oniguruma-to-es@^4.3.4: regex "^6.0.1" regex-recursion "^6.0.2" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -13260,6 +13329,26 @@ parseurl@^1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +patch-package@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^10.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.2.4" + yaml "^2.2.2" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -14978,6 +15067,11 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -15156,16 +15250,7 @@ string-length@^4.0.2: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15299,14 +15384,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15730,6 +15808,11 @@ tldts@^7.0.5: dependencies: tldts-core "^7.0.17" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -16960,6 +17043,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== +yaml@^2.2.2: + version "2.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From 0c829a713a79d8c3a356faa68daf520594543c07 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 14 May 2026 15:30:21 +0200 Subject: [PATCH 4/5] Revert "Propose yarn patch" This reverts commit b04df388cda3440a17ec2863aa9c866e1e5fb209. --- src/frontend/Dockerfile | 1 - .../blocks-mapping/blockNoteDocxBlockProps.ts | 57 ++++++++ .../defaultBlocksDocxJustify.tsx | 69 ++++++++++ .../docs/doc-export/blocks-mapping/index.ts | 2 + .../features/docs/doc-export/mappingDocx.tsx | 12 ++ src/frontend/package.json | 6 +- .../@blocknote+xl-docx-exporter+0.49.0.patch | 32 ----- src/frontend/yarn.lock | 128 +++--------------- 8 files changed, 161 insertions(+), 146 deletions(-) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts create mode 100644 src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx delete mode 100644 src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 01acfe598c..1c12846da0 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -11,7 +11,6 @@ WORKDIR /home/frontend/ COPY ./src/frontend/package.json ./package.json COPY ./src/frontend/yarn.lock ./yarn.lock -COPY ./src/frontend/patches ./patches COPY ./src/frontend/apps/impress/package.json ./apps/impress/package.json COPY ./src/frontend/packages/eslint-plugin-docs/package.json ./packages/eslint-plugin-docs/package.json diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts new file mode 100644 index 0000000000..f90ceb7dff --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/blockNoteDocxBlockProps.ts @@ -0,0 +1,57 @@ +import { + COLORS_DEFAULT, + DefaultProps, + UnreachableCaseError, +} from '@blocknote/core'; +import { IParagraphOptions, ShadingType } from 'docx'; + +/** + * Same semantics as `@blocknote/xl-docx-exporter` `blockPropsToStyles`, but + * `textAlignment: justify` maps to OOXML `both` (normal justified paragraphs). + * Upstream maps justify to `distribute`, which uses “distribute all characters equally” + * and does not match browser/Word paragraph justification. + */ +export function blockNoteDocxBlockPropsToStyles( + props: Partial, + colors: typeof COLORS_DEFAULT, +): IParagraphOptions { + return { + shading: + props.backgroundColor === 'default' || !props.backgroundColor + ? undefined + : { + type: ShadingType.CLEAR, + fill: (() => { + const color = colors[props.backgroundColor]?.background; + if (!color) { + return undefined; + } + return color.slice(1); + })(), + }, + run: + props.textColor === 'default' || !props.textColor + ? undefined + : { + color: (() => { + const color = colors[props.textColor]?.text; + if (!color) { + return undefined; + } + return color.slice(1); + })(), + }, + alignment: + !props.textAlignment || props.textAlignment === 'left' + ? undefined + : props.textAlignment === 'center' + ? 'center' + : props.textAlignment === 'right' + ? 'right' + : props.textAlignment === 'justify' + ? 'both' + : (() => { + throw new UnreachableCaseError(props.textAlignment); + })(), + }; +} diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx new file mode 100644 index 0000000000..e3e817a6fb --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/defaultBlocksDocxJustify.tsx @@ -0,0 +1,69 @@ +import { CheckBox, Paragraph, TextRun } from 'docx'; + +import { DocsExporterDocx } from '../types'; + +import { blockNoteDocxBlockPropsToStyles } from './blockNoteDocxBlockProps'; + +/** Default-schema DOCX blocks with correct `justify` → `both` (see blockNoteDocxBlockProps). */ + +export const blockMappingParagraphDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['paragraph'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + }); + +export const blockMappingHeadingDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['heading'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + heading: `Heading${block.props.level as 1 | 2 | 3 | 4 | 5 | 6}`, + }); + +export const blockMappingBulletListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['bulletListItem'] = + (block, exporter, nestingLevel) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + numbering: { + reference: 'blocknote-bullet-list', + level: nestingLevel, + }, + }); + +export const blockMappingNumberedListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['numberedListItem'] = + (block, exporter, nestingLevel) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: exporter.transformInlineContent(block.content), + numbering: { + reference: 'blocknote-numbered-list', + level: nestingLevel, + }, + }); + +export const blockMappingToggleListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['toggleListItem'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: [ + new TextRun({ + children: ['> '], + }), + ...exporter.transformInlineContent(block.content), + ], + }); + +export const blockMappingCheckListItemDocxJustifyBoth: DocsExporterDocx['mappings']['blockMapping']['checkListItem'] = + (block, exporter) => + new Paragraph({ + ...blockNoteDocxBlockPropsToStyles(block.props, exporter.options.colors), + children: [ + new CheckBox({ checked: block.props.checked }), + new TextRun({ + children: [' '], + }), + ...exporter.transformInlineContent(block.content), + ], + }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts index 1d98efe889..adcaa260ec 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-export/blocks-mapping/index.ts @@ -1,4 +1,6 @@ +export * from './blockNoteDocxBlockProps'; export * from './calloutDocx'; +export * from './defaultBlocksDocxJustify'; export * from './calloutODT'; export * from './calloutPDF'; export * from './headingPDF'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx index dc8afc2f47..11c67239b8 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/mappingDocx.tsx @@ -1,9 +1,15 @@ import { docxDefaultSchemaMappings } from '@blocknote/xl-docx-exporter'; import { + blockMappingBulletListItemDocxJustifyBoth, blockMappingCalloutDocx, + blockMappingCheckListItemDocxJustifyBoth, + blockMappingHeadingDocxJustifyBoth, blockMappingImageDocx, + blockMappingNumberedListItemDocxJustifyBoth, + blockMappingParagraphDocxJustifyBoth, blockMappingQuoteDocx, + blockMappingToggleListItemDocxJustifyBoth, blockMappingUploadLoaderDocx, } from './blocks-mapping'; import { inlineContentMappingInterlinkingLinkDocx } from './inline-content-mapping'; @@ -13,6 +19,12 @@ export const docxDocsSchemaMappings: DocsExporterDocx['mappings'] = { ...docxDefaultSchemaMappings, blockMapping: { ...docxDefaultSchemaMappings.blockMapping, + paragraph: blockMappingParagraphDocxJustifyBoth, + heading: blockMappingHeadingDocxJustifyBoth, + bulletListItem: blockMappingBulletListItemDocxJustifyBoth, + numberedListItem: blockMappingNumberedListItemDocxJustifyBoth, + toggleListItem: blockMappingToggleListItemDocxJustifyBoth, + checkListItem: blockMappingCheckListItemDocxJustifyBoth, callout: blockMappingCalloutDocx, // We're reusing the file block mapping for PDF blocks; both share the same // implementation signature, so we can reuse the handler directly. diff --git a/src/frontend/package.json b/src/frontend/package.json index 235fabcbca..5515652c00 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -13,7 +13,6 @@ ] }, "scripts": { - "postinstall": "patch-package", "APP_IMPRESS": "yarn workspace app-impress", "APP_E2E": "yarn workspace app-e2e", "I18N": "yarn workspace packages-i18n", @@ -47,8 +46,5 @@ "wrap-ansi": "10.0.0", "yjs": "13.6.30" }, - "packageManager": "yarn@1.22.22", - "devDependencies": { - "patch-package": "^8.0.1" - } + "packageManager": "yarn@1.22.22" } diff --git a/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch b/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch deleted file mode 100644 index 003e2f6091..0000000000 --- a/src/frontend/patches/@blocknote+xl-docx-exporter+0.49.0.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js -index 0000000..1111111 100644 ---- a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js -+++ b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.js -@@ -46,7 +46,7 @@ - }, - children: [new f({ - children: t.transformInlineContent(l.content), -- alignment: !l.props.textAlignment || l.props.textAlignment === "left" ? void 0 : l.props.textAlignment === "center" ? "center" : l.props.textAlignment === "right" ? "right" : l.props.textAlignment === "justify" ? "distribute" : (() => { -+ alignment: !l.props.textAlignment || l.props.textAlignment === "left" ? void 0 : l.props.textAlignment === "center" ? "center" : l.props.textAlignment === "right" ? "right" : l.props.textAlignment === "justify" ? "both" : (() => { - throw new n(l.props.textAlignment); - })(), - run: { -@@ -78,7 +78,7 @@ - let n = t[e.textColor]?.text; - if (n) return n.slice(1); - })() }, -- alignment: !e.textAlignment || e.textAlignment === "left" ? void 0 : e.textAlignment === "center" ? "center" : e.textAlignment === "right" ? "right" : e.textAlignment === "justify" ? "distribute" : (() => { -+ alignment: !e.textAlignment || e.textAlignment === "left" ? void 0 : e.textAlignment === "center" ? "center" : e.textAlignment === "right" ? "right" : e.textAlignment === "justify" ? "both" : (() => { - throw new n(e.textAlignment); - })() - }; -diff --git a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs -index 0000000..1111111 100644 ---- a/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs -+++ b/node_modules/@blocknote/xl-docx-exporter/dist/blocknote-xl-docx-exporter.cjs -@@ -1,3 +1,3 @@ --Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@blocknote/core`),t=require(`docx`);async function n(e){if(typeof window<`u`){let t=await createImageBitmap(e),{width:n,height:r}=t;return t.close(),{width:n,height:r}}else{let t=(await import(`image-meta`)).imageMeta,n=t(new Uint8Array(await e.arrayBuffer()));if(!n.width||!n.height)throw Error(`Image dimensions not found`);return{width:n.width,height:n.height}}}var r=(n,r)=>{let i=Array(n.headerRows??0).fill(!0),a=Array(n.headerCols??0).fill(!0);return new t.Table({layout:`autofit`,columnWidths:n.columnWidths.map(e=>(e??120)*.75*20),rows:n.rows.map((o,s)=>{let c=i[s];return new t.TableRow({tableHeader:c,children:o.cells.map((i,o)=>{let s=n.columnWidths?.[o],l=(0,e.mapTableCell)(i),u=a[o];return new t.TableCell({width:s?{size:s*.75*20,type:`dxa`}:void 0,columnSpan:l.props.colspan,rowSpan:l.props.rowspan,shading:l.props.backgroundColor===`default`||!l.props.backgroundColor?void 0:{type:t.ShadingType.SOLID,color:(()=>{let e=r.options.colors[l.props.backgroundColor]?.background;if(e)return e.slice(1)})()},children:[new t.Paragraph({children:r.transformInlineContent(l.content),alignment:!l.props.textAlignment||l.props.textAlignment===`left`?void 0:l.props.textAlignment===`center`?`center`:l.props.textAlignment===`right`?`right`:l.props.textAlignment===`justify`?`distribute`:(()=>{throw new e.UnreachableCaseError(l.props.textAlignment)})(),run:{bold:c||u,color:l.props.textColor===`default`||!l.props.textColor?void 0:(()=>{let e=r.options.colors[l.props.textColor]?.text;if(e)return e.slice(1)})()}})]})})})})})};function i(n,r){return{shading:n.backgroundColor===`default`||!n.backgroundColor?void 0:{type:t.ShadingType.CLEAR,fill:(()=>{let e=r[n.backgroundColor]?.background;if(e)return e.slice(1)})()},run:n.textColor===`default`||!n.textColor?void 0:{color:(()=>{let e=r[n.textColor]?.text;if(e)return e.slice(1)})()},alignment:!n.textAlignment||n.textAlignment===`left`?void 0:n.textAlignment===`center`?`center`:n.textAlignment===`right`?`right`:n.textAlignment===`justify`?`distribute`:(()=>{throw new e.UnreachableCaseError(n.textAlignment)})()}}var a={paragraph:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),toggleListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.TextRun({children:[`> `]}),...n.transformInlineContent(e.content)]}),numberedListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-numbered-list`,level:r}}),bulletListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-bullet-list`,level:r}}),checkListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.CheckBox({checked:e.props.checked}),new t.TextRun({children:[` `]}),...n.transformInlineContent(e.content)]}),heading:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),quote:(e,n)=>new t.Paragraph({style:`BlockQuote`,...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),audio:(e,t)=>[o(e.props,`Open audio`,t),...s(e.props,t)],video:(e,t)=>[o(e.props,`Open video`,t),...s(e.props,t)],file:(e,t)=>[o(e.props,`Open file`,t),...s(e.props,t)],codeBlock:e=>new t.Paragraph({style:`SourceCode`,children:[...(e.content[0]?.text||``).split(` -+Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@blocknote/core`),t=require(`docx`);async function n(e){if(typeof window<`u`){let t=await createImageBitmap(e),{width:n,height:r}=t;return t.close(),{width:n,height:r}}else{let t=(await import(`image-meta`)).imageMeta,n=t(new Uint8Array(await e.arrayBuffer()));if(!n.width||!n.height)throw Error(`Image dimensions not found`);return{width:n.width,height:n.height}}}var r=(n,r)=>{let i=Array(n.headerRows??0).fill(!0),a=Array(n.headerCols??0).fill(!0);return new t.Table({layout:`autofit`,columnWidths:n.columnWidths.map(e=>(e??120)*.75*20),rows:n.rows.map((o,s)=>{let c=i[s];return new t.TableRow({tableHeader:c,children:o.cells.map((i,o)=>{let s=n.columnWidths?.[o],l=(0,e.mapTableCell)(i),u=a[o];return new t.TableCell({width:s?{size:s*.75*20,type:`dxa`}:void 0,columnSpan:l.props.colspan,rowSpan:l.props.rowspan,shading:l.props.backgroundColor===`default`||!l.props.backgroundColor?void 0:{type:t.ShadingType.SOLID,color:(()=>{let e=r.options.colors[l.props.backgroundColor]?.background;if(e)return e.slice(1)})()},children:[new t.Paragraph({children:r.transformInlineContent(l.content),alignment:!l.props.textAlignment||l.props.textAlignment===`left`?void 0:l.props.textAlignment===`center`?`center`:l.props.textAlignment===`right`?`right`:l.props.textAlignment===`justify`?`both`:(()=>{throw new e.UnreachableCaseError(l.props.textAlignment)})(),run:{bold:c||u,color:l.props.textColor===`default`||!l.props.textColor?void 0:(()=>{let e=r.options.colors[l.props.textColor]?.text;if(e)return e.slice(1)})()}})]})})})})})};function i(n,r){return{shading:n.backgroundColor===`default`||!n.backgroundColor?void 0:{type:t.ShadingType.CLEAR,fill:(()=>{let e=r[n.backgroundColor]?.background;if(e)return e.slice(1)})()},run:n.textColor===`default`||!n.textColor?void 0:{color:(()=>{let e=r[n.textColor]?.text;if(e)return e.slice(1)})()},alignment:!n.textAlignment||n.textAlignment===`left`?void 0:n.textAlignment===`center`?`center`:n.textAlignment===`right`?`right`:n.textAlignment===`justify`?`both`:(()=>{throw new e.UnreachableCaseError(n.textAlignment)})()}}var a={paragraph:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),toggleListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.TextRun({children:[`> `]}),...n.transformInlineContent(e.content)]}),numberedListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-numbered-list`,level:r}}),bulletListItem:(e,n,r)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),numbering:{reference:`blocknote-bullet-list`,level:r}}),checkListItem:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:[new t.CheckBox({checked:e.props.checked}),new t.TextRun({children:[` `]}),...n.transformInlineContent(e.content)]}),heading:(e,n)=>new t.Paragraph({...i(e.props,n.options.colors),children:n.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),quote:(e,n)=>new t.Paragraph({style:`BlockQuote`,...i(e.props,n.options.colors),children:n.transformInlineContent(e.content)}),audio:(e,t)=>[o(e.props,`Open audio`,t),...s(e.props,t)],video:(e,t)=>[o(e.props,`Open video`,t),...s(e.props,t)],file:(e,t)=>[o(e.props,`Open file`,t),...s(e.props,t)],codeBlock:e=>new t.Paragraph({style:`SourceCode`,children:[...(e.content[0]?.text||``).split(` - `).map((e,n)=>new t.TextRun({text:e,break:+(n>0)}))]}),pageBreak:()=>new t.Paragraph({children:[new t.PageBreak]}),divider:()=>new t.Paragraph({border:{top:{color:`auto`,space:1,style:`single`,size:1}}}),column:(e,n,r,i,a)=>new t.TableCell({width:{size:`${e.props.width*100}%`,type:`pct`},children:(a||[]).flatMap(e=>Array.isArray(e)?e:[e])}),columnList:(e,n,r,i,a)=>new t.Table({layout:`autofit`,borders:{bottom:{style:`nil`},top:{style:`nil`},left:{style:`nil`},right:{style:`nil`},insideHorizontal:{style:`nil`},insideVertical:{style:`nil`}},rows:[new t.TableRow({children:a.map((e,n,r)=>new t.TableCell({width:{size:`${parseFloat(`${e.options.width?.size||`100%`}`)/(r.length*100)*100}%`,type:`pct`},children:e.options.children}))})]}),image:async(e,r)=>{let a=await r.resolveFile(e.props.url),{width:o,height:c}=await n(a);return[new t.Paragraph({...i(e.props,r.options.colors),children:[new t.ImageRun({data:await a.arrayBuffer(),type:`gif`,altText:e.props.caption?{description:e.props.caption,name:e.props.caption,title:e.props.caption}:void 0,transformation:{width:e.props.previewWidth||o,height:(e.props.previewWidth||o)/o*c}})]}),...s(e.props,r)]},table:(e,t)=>r(e.content,t)};function o(e,n,r){return new t.Paragraph({...i(e,r.options.colors),children:[new t.ExternalHyperlink({children:[new t.TextRun({text:e.name||n,style:`Hyperlink`})],link:e.url})]})}function s(e,n){return e.caption?[new t.Paragraph({...i(e,n.options.colors),children:[new t.TextRun({text:e.caption})],style:`Caption`})]:[]}var c={blockMapping:a,inlineContentMapping:{link:(e,n)=>new t.ExternalHyperlink({children:e.content.map(e=>n.transformStyledText(e,!0)),link:e.href}),text:(e,t)=>t.transformStyledText(e)},styleMapping:{bold:e=>e?{bold:e}:{},italic:e=>e?{italics:e}:{},underline:e=>e?{underline:{type:`single`}}:{},strike:e=>e?{strike:e}:{},backgroundColor:(e,n)=>{if(!e)return{};let r=n.options.colors[e]?.background;return r?{shading:{type:t.ShadingType.CLEAR,fill:r.slice(1)}}:{}},textColor:(e,t)=>{if(!e)return{};let n=t.options.colors[e]?.text;return n?{color:n.slice(1)}:{}},code:e=>e?{style:`VerbatimChar`}:{}}};async function l(e){return`https://corsproxy.api.blocknotejs.org/corsproxy/?url=`+encodeURIComponent(e)}async function u(e){{let t=e.default;return await(await fetch(t)).arrayBuffer()}}var d=16*.75*1.5*20,f=class extends e.Exporter{constructor(t,n,r){let i={colors:e.COLORS_DEFAULT,resolveFileUrl:l,...r};super(t,n,i),this.schema=t,this.mappings=n}transformStyledText(e,n){let r=this.mapStyles(e.styles),i=Object.assign({},...r);return new t.TextRun({...i,style:n?`Hyperlink`:i.style,text:e.text})}async transformBlocks(e,n=0){let r=[];for(let i of e){let e=await this.transformBlocks(i.children,n+1);[`columnList`,`column`].includes(i.type)||(e=e.map((e,n)=>(e instanceof t.Paragraph&&!e.properties.numberingReferences.length&&e.addRunToFront(new t.TextRun({children:[new t.Tab]})),e)));let a=await this.mapBlock(i,n,0,e);[`columnList`,`column`].includes(i.type)?r.push(a):Array.isArray(a)?r.push(...a,...e):r.push(a,...e)}return r}async getFonts(){let e=await u(await Promise.resolve().then(()=>require(`./Inter_18pt-Regular-PkBfh_8C.cjs`))),t=await u(await Promise.resolve().then(()=>require(`./GeistMono-Regular-CHVKamKz.cjs`)));if(e instanceof ArrayBuffer||t instanceof ArrayBuffer){let n=(await import(`buffer/`)).Buffer;e instanceof ArrayBuffer&&(e=n.from(e)),t instanceof ArrayBuffer&&(t=n.from(t))}return[{name:`Inter`,data:e},{name:`GeistMono`,data:t}]}async createDefaultDocumentOptions(e){let n=(await Promise.resolve().then(()=>require(`./styles-Cz94-HtD.cjs`))).default,r=e?.trim();n=r?n.replace(/(]*\bw:val=")([^"]+)("[^>]*\/>)/g,(e,t,n,i)=>`${t}${r}${i}`):n.replace(/\s*]*\/>/g,``);let i=[`•`];return{numbering:{config:[{reference:`blocknote-numbered-list`,levels:Array.from({length:9},(e,n)=>({start:1,level:n,format:t.LevelFormat.DECIMAL,text:`%${n+1}.`,alignment:t.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(n+1),hanging:d}}}}))},{reference:`blocknote-bullet-list`,levels:Array.from({length:9},(e,n)=>({start:1,level:n,format:t.LevelFormat.BULLET,text:i[n%i.length],alignment:t.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(n+1),hanging:d}}}}))}]},fonts:await this.getFonts(),defaultTabStop:200,externalStyles:n}}async toBlob(e,n={sectionOptions:{},documentOptions:{}}){let r=await this.toDocxJsDocument(e,n),i=globalThis.Buffer;try{return globalThis.Buffer||(globalThis.Buffer=(await import(`buffer`)).default.Buffer),t.Packer.toBlob(r)}finally{globalThis.Buffer=i}}async toDocxJsDocument(e,n={sectionOptions:{},documentOptions:{}}){return new t.Document({...await this.createDefaultDocumentOptions(n.locale),...n.documentOptions,sections:[{children:await this.transformBlocks(e),...n.sectionOptions}]})}};exports.DOCXExporter=f,exports.docxDefaultSchemaMappings=c; - //# sourceMappingURL=blocknote-xl-docx-exporter.cjs.map -\ No newline at end of file diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock index ea24a60724..7431b1b671 100644 --- a/src/frontend/yarn.lock +++ b/src/frontend/yarn.lock @@ -7412,11 +7412,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - "@zip.js/zip.js@^2.8.8": version "2.8.10" resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.8.10.tgz#98a0cc7fdef9d6e227236271af412db02b18a5b2" @@ -8273,11 +8268,6 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -ci-info@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - ci-info@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa" @@ -9932,13 +9922,6 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -10042,15 +10025,6 @@ fresh@^2.0.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^11.2.0: version "11.3.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" @@ -10360,7 +10334,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -11060,11 +11034,6 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -11261,13 +11230,6 @@ is-weakset@^2.0.3: call-bound "^1.0.3" get-intrinsic "^1.2.6" -is-wsl@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -11896,17 +11858,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" - integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -11935,11 +11886,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -11984,13 +11930,6 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - kleur@^4.1.4: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" @@ -12822,7 +12761,7 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8: +micromatch@^4.0.4, micromatch@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -13191,14 +13130,6 @@ oniguruma-to-es@^4.3.4: regex "^6.0.1" regex-recursion "^6.0.2" -open@^7.4.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -13329,26 +13260,6 @@ parseurl@^1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -patch-package@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" - integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - ci-info "^3.7.0" - cross-spawn "^7.0.3" - find-yarn-workspace-root "^2.0.0" - fs-extra "^10.0.0" - json-stable-stringify "^1.0.2" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - semver "^7.5.3" - slash "^2.0.0" - tmp "^0.2.4" - yaml "^2.2.2" - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -15067,11 +14978,6 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -15250,7 +15156,16 @@ string-length@^4.0.2: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15384,7 +15299,14 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15808,11 +15730,6 @@ tldts@^7.0.5: dependencies: tldts-core "^7.0.17" -tmp@^0.2.4: - version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" - integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -17043,11 +16960,6 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== -yaml@^2.2.2: - version "2.9.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" - integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From 74c623422c736d957b787779fb9d8ea998eab430 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 14 May 2026 15:44:22 +0200 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86cf1aba98..289994f2fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,11 @@ and this project adheres to ### Added - ✨(backend) support creating subdoc from file #1987 +- ✨(frontend) justified text alignment in the formatting toolbar ### Fixed +- 🐛(frontend) DOCX export helpers map justified text to OOXML `both` for blocks using app-provided paragraph mappings (e.g. callout, quote, image caption) - 🐛(docs) run migration 0027 without superuser role