{"version":3,"file":"blocknote-xl-docx-exporter.cjs","sources":["../../../shared/util/imageUtil.ts","../src/docx/util/Table.tsx","../src/docx/defaultSchema/blocks.ts","../src/docx/defaultSchema/inlinecontent.ts","../src/docx/defaultSchema/styles.ts","../src/docx/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/docx/docxExporter.ts"],"sourcesContent":["export async function getImageDimensions(blob: Blob) {\n  if (typeof window !== \"undefined\" && import.meta.env.NODE_ENV !== \"test\") {\n    const bmp = await createImageBitmap(blob);\n    const { width, height } = bmp;\n    bmp.close(); // free memory\n    return { width, height };\n  } else {\n    // node or vitest\n    const imageMetaFunc = (await import(\"image-meta\")).imageMeta;\n    const bytes = new Uint8Array(await blob.arrayBuffer());\n    const meta = imageMetaFunc(bytes);\n    if (!meta.width || !meta.height) {\n      throw new Error(\"Image dimensions not found\");\n    }\n    return { width: meta.width, height: meta.height };\n  }\n}\n","import {\n  Exporter,\n  InlineContentSchema,\n  mapTableCell,\n  TableContent,\n  UnreachableCaseError,\n} from \"@blocknote/core\";\nimport {\n  Table as DocxTable,\n  Paragraph,\n  ParagraphChild,\n  ShadingType,\n  TableCell,\n  TableRow,\n} from \"docx\";\n\nexport const Table = (\n  data: TableContent<InlineContentSchema>,\n  t: Exporter<any, any, any, any, ParagraphChild, any, any>,\n) => {\n  const DEFAULT_COLUMN_WIDTH = 120;\n\n  // If headerRows is 1, then the first row is a header row\n  const headerRows = new Array(data.headerRows ?? 0).fill(true);\n  // If headerCols is 1, then the first column is a header column\n  const headerCols = new Array(data.headerCols ?? 0).fill(true);\n\n  return new DocxTable({\n    layout: \"autofit\",\n    columnWidths: data.columnWidths.map(\n      (w) =>\n        (w ?? DEFAULT_COLUMN_WIDTH) * /* to points */ 0.75 * /* to twips */ 20,\n    ),\n    rows: data.rows.map((row, rowIndex) => {\n      const isHeaderRow = headerRows[rowIndex];\n      return new TableRow({\n        tableHeader: isHeaderRow,\n        children: row.cells.map((c, colIndex) => {\n          const width = data.columnWidths?.[colIndex];\n          const cell = mapTableCell(c);\n          const isHeaderColumn = headerCols[colIndex];\n\n          return new TableCell({\n            width: width\n              ? {\n                  size: `${width * 0.75}pt`,\n                  type: \"dxa\",\n                }\n              : undefined,\n            columnSpan: cell.props.colspan,\n            rowSpan: cell.props.rowspan,\n            shading:\n              cell.props.backgroundColor === \"default\" ||\n              !cell.props.backgroundColor\n                ? undefined\n                : {\n                    type: ShadingType.SOLID,\n                    color:\n                      t.options.colors[\n                        cell.props\n                          .backgroundColor as keyof typeof t.options.colors\n                      ].background.slice(1),\n                  },\n            children: [\n              new Paragraph({\n                children: t.transformInlineContent(cell.content),\n\n                alignment:\n                  !cell.props.textAlignment ||\n                  cell.props.textAlignment === \"left\"\n                    ? undefined\n                    : cell.props.textAlignment === \"center\"\n                      ? \"center\"\n                      : cell.props.textAlignment === \"right\"\n                        ? \"right\"\n                        : cell.props.textAlignment === \"justify\"\n                          ? \"distribute\"\n                          : (() => {\n                              throw new UnreachableCaseError(\n                                cell.props.textAlignment,\n                              );\n                            })(),\n                run: {\n                  // TODO add support for table headers exporting, bolding seems to not be working at the moment\n                  bold: isHeaderRow || isHeaderColumn,\n                  // TODO table paragraph color seems to not be working at the moment\n                  // Probably because the runs are setting their own color\n                  color:\n                    cell.props.textColor === \"default\" || !cell.props.textColor\n                      ? undefined\n                      : t.options.colors[\n                          cell.props.textColor as keyof typeof t.options.colors\n                        ].text.slice(1),\n                },\n              }),\n            ],\n          });\n        }),\n      });\n    }),\n  });\n};\n","import {\n  BlockMapping,\n  COLORS_DEFAULT,\n  createPageBreakBlockConfig,\n  DefaultBlockSchema,\n  DefaultProps,\n  StyledText,\n  UnreachableCaseError,\n} from \"@blocknote/core\";\nimport { getImageDimensions } from \"@shared/util/imageUtil.js\";\nimport {\n  CheckBox,\n  Table as DocxTable,\n  ExternalHyperlink,\n  ImageRun,\n  IParagraphOptions,\n  PageBreak,\n  Paragraph,\n  ParagraphChild,\n  ShadingType,\n  TableCell,\n  TableRow,\n  TextRun,\n} from \"docx\";\nimport { Table } from \"../util/Table.js\";\nimport { multiColumnSchema } from \"@blocknote/xl-multi-column\";\n\nfunction blockPropsToStyles(\n  props: Partial<DefaultProps>,\n  colors: typeof COLORS_DEFAULT,\n): IParagraphOptions {\n  return {\n    shading:\n      props.backgroundColor === \"default\" || !props.backgroundColor\n        ? undefined\n        : {\n            type: ShadingType.SOLID,\n            color:\n              colors[\n                props.backgroundColor as keyof typeof colors\n              ].background.slice(1),\n          },\n    run:\n      props.textColor === \"default\" || !props.textColor\n        ? undefined\n        : {\n            color: colors[props.textColor as keyof typeof colors].text.slice(1),\n          },\n    alignment:\n      !props.textAlignment || props.textAlignment === \"left\"\n        ? undefined\n        : props.textAlignment === \"center\"\n          ? \"center\"\n          : props.textAlignment === \"right\"\n            ? \"right\"\n            : props.textAlignment === \"justify\"\n              ? \"distribute\"\n              : (() => {\n                  throw new UnreachableCaseError(props.textAlignment);\n                })(),\n  };\n}\nexport const docxBlockMappingForDefaultSchema: BlockMapping<\n  DefaultBlockSchema & {\n    pageBreak: ReturnType<typeof createPageBreakBlockConfig>;\n  } & typeof multiColumnSchema.blockSchema,\n  any,\n  any,\n  | Promise<Paragraph[] | Paragraph | DocxTable>\n  | Paragraph[]\n  | Paragraph\n  | DocxTable,\n  ParagraphChild\n> = {\n  paragraph: (block, exporter) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: exporter.transformInlineContent(block.content),\n      style: \"Normal\",\n      run: {\n        font: \"Inter\",\n      },\n    });\n  },\n  toggleListItem: (block, exporter) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: [\n        new TextRun({\n          children: [\"> \"],\n        }),\n        ...exporter.transformInlineContent(block.content),\n      ],\n    });\n  },\n  numberedListItem: (block, exporter, nestingLevel) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: exporter.transformInlineContent(block.content),\n      numbering: {\n        reference: \"blocknote-numbered-list\",\n        level: nestingLevel,\n      },\n    });\n  },\n  bulletListItem: (block, exporter, nestingLevel) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: exporter.transformInlineContent(block.content),\n      numbering: {\n        reference: \"blocknote-bullet-list\",\n        level: nestingLevel,\n      },\n    });\n  },\n  checkListItem: (block, exporter) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: [\n        new CheckBox({ checked: block.props.checked }),\n        new TextRun({\n          children: [\" \"],\n        }),\n        ...exporter.transformInlineContent(block.content),\n      ],\n    });\n  },\n  heading: (block, exporter) => {\n    return new Paragraph({\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: exporter.transformInlineContent(block.content),\n      heading: `Heading${block.props.level as 1 | 2 | 3 | 4 | 5 | 6}`,\n    });\n  },\n  quote: (block, exporter) => {\n    return new Paragraph({\n      shading: {\n        color: \"#7D797A\",\n      },\n      border: {\n        left: {\n          color: \"#7D797A\",\n          space: 100,\n          style: \"single\",\n          size: 8,\n        },\n      },\n      ...blockPropsToStyles(block.props, exporter.options.colors),\n      children: exporter.transformInlineContent(block.content),\n    });\n  },\n  audio: (block, exporter) => {\n    return [\n      file(block.props, \"Open audio\", exporter),\n      ...caption(block.props, exporter),\n    ];\n  },\n  video: (block, exporter) => {\n    return [\n      file(block.props, \"Open video\", exporter),\n      ...caption(block.props, exporter),\n    ];\n  },\n  file: (block, exporter) => {\n    return [\n      file(block.props, \"Open file\", exporter),\n      ...caption(block.props, exporter),\n    ];\n  },\n  codeBlock: (block) => {\n    const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n\n    return new Paragraph({\n      style: \"Codeblock\",\n      shading: {\n        type: ShadingType.SOLID,\n        fill: \"161616\",\n        color: \"161616\",\n      },\n      children: [\n        ...textContent.split(\"\\n\").map((line, index) => {\n          return new TextRun({\n            text: line,\n            break: index > 0 ? 1 : 0,\n          });\n        }),\n      ],\n    });\n  },\n  pageBreak: () => {\n    return new Paragraph({\n      children: [new PageBreak()],\n    });\n  },\n  divider: () => {\n    return new Paragraph({\n      border: {\n        top: {\n          color: \"auto\",\n          space: 1,\n          style: \"single\",\n          size: 1,\n        },\n      },\n    });\n  },\n  column: (block, _exporter, _nestingLevel, _numberedListIndex, children) => {\n    return new TableCell({\n      width: {\n        size: `${block.props.width * 100}%`,\n        type: \"pct\",\n      },\n      children: (children || []).flatMap((child) => {\n        if (Array.isArray(child)) {\n          return child;\n        }\n\n        return [child];\n      }),\n    }) as any;\n  },\n  columnList: (\n    _block,\n    _exporter,\n    _nestingLevel,\n    _numberedListIndex,\n    children,\n  ) => {\n    return new DocxTable({\n      layout: \"autofit\",\n      borders: {\n        bottom: { style: \"nil\" },\n        top: { style: \"nil\" },\n        left: { style: \"nil\" },\n        right: { style: \"nil\" },\n        insideHorizontal: { style: \"nil\" },\n        insideVertical: { style: \"nil\" },\n      },\n      rows: [\n        new TableRow({\n          children: (children as unknown as TableCell[]).map(\n            (cell, _index, children) => {\n              return new TableCell({\n                width: {\n                  size: `${(parseFloat(`${cell.options.width?.size || \"100%\"}`) / (children.length * 100)) * 100}%`,\n                  type: \"pct\",\n                },\n                children: cell.options.children,\n              });\n            },\n          ),\n        }),\n      ],\n    });\n  },\n  image: async (block, exporter) => {\n    const blob = await exporter.resolveFile(block.props.url);\n    const { width, height } = await getImageDimensions(blob);\n\n    return [\n      new Paragraph({\n        ...blockPropsToStyles(block.props, exporter.options.colors),\n        children: [\n          new ImageRun({\n            data: await blob.arrayBuffer(),\n            // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type\n            // detector. atm passing gif does not seem to be causing issues as the \"type\" is mainly used by docxjs internally\n            // (i.e.: to make sure it's not svg)\n            type: \"gif\",\n            altText: block.props.caption\n              ? {\n                  description: block.props.caption,\n                  name: block.props.caption,\n                  title: block.props.caption,\n                }\n              : undefined,\n            transformation: {\n              width: block.props.previewWidth || width,\n              height: ((block.props.previewWidth || width) / width) * height,\n            },\n          }),\n        ],\n      }),\n      ...caption(block.props, exporter),\n    ];\n  },\n  table: (block, exporter) => {\n    return Table(block.content, exporter);\n  },\n};\n\nfunction file(\n  props: Partial<DefaultProps & { name: string; url: string }>,\n  defaultText: string,\n  exporter: any,\n) {\n  return new Paragraph({\n    ...blockPropsToStyles(props, exporter.options.colors),\n    children: [\n      new ExternalHyperlink({\n        children: [\n          new TextRun({\n            text: props.name || defaultText,\n            style: \"Hyperlink\",\n          }),\n        ],\n        link: props.url!,\n      }),\n    ],\n  });\n}\n\nfunction caption(\n  props: Partial<DefaultProps & { caption: string }>,\n  exporter: any,\n) {\n  if (!props.caption) {\n    return [];\n  }\n  return [\n    new Paragraph({\n      ...blockPropsToStyles(props, exporter.options.colors),\n      children: [\n        new TextRun({\n          text: props.caption,\n        }),\n      ],\n      style: \"Caption\",\n    }),\n  ];\n}\n","import {\n  DefaultInlineContentSchema,\n  DefaultStyleSchema,\n  InlineContentMapping,\n} from \"@blocknote/core\";\nimport { ExternalHyperlink, ParagraphChild, TextRun } from \"docx\";\nimport type { DOCXExporter } from \"../docxExporter.js\";\n\nexport const docxInlineContentMappingForDefaultSchema: InlineContentMapping<\n  DefaultInlineContentSchema,\n  DefaultStyleSchema,\n  ParagraphChild,\n  TextRun\n> = {\n  link: (ic, exporter) => {\n    return new ExternalHyperlink({\n      children: ic.content.map((content) => {\n        return (exporter as DOCXExporter<any, any, any>).transformStyledText(\n          content,\n          true,\n        );\n      }),\n      link: ic.href,\n    });\n  },\n  text: (ic, t) => {\n    return t.transformStyledText(ic);\n  },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { IRunPropertiesOptions } from \"docx\";\n\nexport const docxStyleMappingForDefaultSchema: StyleMapping<\n  DefaultStyleSchema,\n  IRunPropertiesOptions\n> = {\n  bold: (val) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      bold: val,\n    };\n  },\n  italic: (val) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      italics: val,\n    };\n  },\n  underline: (val) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      underline: {\n        type: \"single\",\n      },\n    };\n  },\n  strike: (val) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      strike: val,\n    };\n  },\n  backgroundColor: (val, exporter) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      shading: {\n        fill: exporter.options.colors[\n          val as keyof typeof exporter.options.colors\n        ].background.slice(1),\n      },\n    };\n  },\n  textColor: (val, exporter) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      color:\n        exporter.options.colors[\n          val as keyof typeof exporter.options.colors\n        ].text.slice(1),\n    };\n  },\n  code: (val) => {\n    if (!val) {\n      return {};\n    }\n    return {\n      font: \"GeistMono\",\n    };\n  },\n};\n","import { docxBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { docxInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { docxStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const docxDefaultSchemaMappings = {\n  blockMapping: docxBlockMappingForDefaultSchema,\n  inlineContentMapping: docxInlineContentMappingForDefaultSchema,\n  styleMapping: docxStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n  return (\n    \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n    encodeURIComponent(url)\n  );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n  requireUrl: { default: string },\n  mimeType: string,\n) {\n  if (import.meta.env.NODE_ENV === \"test\") {\n    const buffer = await loadFileBuffer(requireUrl);\n    const fileBase64 = buffer.toString(\"base64\");\n\n    const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n    return dataUrl;\n  } else {\n    // in browser, this is already a data url\n    return requireUrl.default as string;\n  }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n  return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n  default: string;\n}): Promise<Buffer | ArrayBuffer> {\n  if (import.meta.env.NODE_ENV === \"test\") {\n    // in vitest, this is the url we need to load with readfilesync\n    // eslint-disable-next-line\n    const fs = require(\"fs\");\n    let url = requireUrl.default;\n\n    if (url.startsWith(\"/@fs/\")) {\n      url = url.substring(\"/@fs\".length);\n    }\n    // On Windows, vite/vitest may yield paths like \"/C:/...\" after removing /@fs\n    // Node on Windows treats paths starting with \"/\" as relative to current drive,\n    // which would produce \"C:\\C:\\...\". Strip leading slash when followed by a drive letter.\n    if (/^\\/[A-Za-z]:/.test(url)) {\n      url = url.slice(1);\n    }\n    const buffer = fs.readFileSync(url);\n    return buffer;\n  } else {\n    // in browser, this is already a data url\n    const dataUrl = requireUrl.default as string;\n    // convert to buffer on browser\n    const response = await fetch(dataUrl);\n    const arrayBuffer = await response.arrayBuffer();\n    return arrayBuffer;\n  }\n}\n\n/**\n * usage:\n * \n *  await loadFontDataUrl(\n      await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n    );\n */\n","import {\n  Block,\n  BlockNoteSchema,\n  BlockSchema,\n  COLORS_DEFAULT,\n  InlineContentSchema,\n  StyleSchema,\n  StyledText,\n} from \"@blocknote/core\";\nimport {\n  AlignmentType,\n  Document,\n  IRunPropertiesOptions,\n  ISectionOptions,\n  LevelFormat,\n  Packer,\n  Paragraph,\n  ParagraphChild,\n  Tab,\n  Table,\n  TextRun,\n} from \"docx\";\n\nimport { Exporter, ExporterOptions } from \"@blocknote/core\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFileBuffer } from \"@shared/util/fileUtil.js\";\n\n// get constructor arg type from Document\ntype DocumentOptions = Partial<ConstructorParameters<typeof Document>[0]>;\n\nconst DEFAULT_TAB_STOP =\n  /* default font size */ 16 *\n  /* 1 pixel is 0.75 points */ 0.75 *\n  /* 1.5em*/ 1.5 *\n  /* 1 point is 20 twips */ 20;\n\n/**\n * Exports a BlockNote document to a .docx file using the docxjs library.\n */\nexport class DOCXExporter<\n  B extends BlockSchema,\n  S extends StyleSchema,\n  I extends InlineContentSchema,\n> extends Exporter<\n  B,\n  I,\n  S,\n  Promise<Paragraph[] | Paragraph | Table> | Paragraph[] | Paragraph | Table,\n  ParagraphChild,\n  IRunPropertiesOptions,\n  TextRun\n> {\n  public constructor(\n    /**\n     * The schema of your editor. The mappings are automatically typed checked against this schema.\n     */\n    protected readonly schema: BlockNoteSchema<B, I, S>,\n    /**\n     * The mappings that map the BlockNote schema to the docxjs content.\n     * Pass {@link docxDefaultSchemaMappings} for the default schema.\n     */\n    protected readonly mappings: Exporter<\n      NoInfer<B>,\n      NoInfer<I>,\n      NoInfer<S>,\n      | Promise<Paragraph[] | Paragraph | Table>\n      | Paragraph[]\n      | Paragraph\n      | Table,\n      ParagraphChild,\n      IRunPropertiesOptions,\n      TextRun\n    >[\"mappings\"],\n    options?: Partial<ExporterOptions>,\n  ) {\n    const defaults = {\n      colors: COLORS_DEFAULT,\n      resolveFileUrl: corsProxyResolveFileUrl,\n    } satisfies Partial<ExporterOptions>;\n\n    const newOptions = {\n      ...defaults,\n      ...options,\n    };\n    super(schema, mappings, newOptions);\n  }\n\n  /**\n   * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n   */\n  public transformStyledText(styledText: StyledText<S>, hyperlink?: boolean) {\n    const stylesArray = this.mapStyles(styledText.styles);\n\n    const styles: IRunPropertiesOptions = Object.assign(\n      {} as IRunPropertiesOptions,\n      ...stylesArray,\n    );\n\n    return new TextRun({\n      ...styles,\n      style: hyperlink ? \"Hyperlink\" : undefined,\n      text: styledText.text,\n    });\n  }\n\n  /**\n   * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n   */\n  public async transformBlocks(\n    blocks: Block<B, I, S>[],\n    nestingLevel = 0,\n  ): Promise<Array<Paragraph | Table>> {\n    const ret: Array<Paragraph | Table> = [];\n\n    for (const b of blocks) {\n      let children = await this.transformBlocks(b.children, nestingLevel + 1);\n\n      if (![\"columnList\", \"column\"].includes(b.type)) {\n        children = children.map((c, _i) => {\n          // NOTE: nested tables not supported (we can't insert the new Tab before a table)\n          if (\n            c instanceof Paragraph &&\n            !(c as any).properties.numberingReferences.length\n          ) {\n            c.addRunToFront(\n              new TextRun({\n                children: [new Tab()],\n              }),\n            );\n          }\n          return c;\n        });\n      }\n\n      const self = await this.mapBlock(\n        b as any,\n        nestingLevel,\n        0 /*unused*/,\n        children,\n      ); // TODO: any\n      if ([\"columnList\", \"column\"].includes(b.type)) {\n        ret.push(self as Table);\n      } else if (Array.isArray(self)) {\n        ret.push(...self, ...children);\n      } else {\n        ret.push(self, ...children);\n      }\n    }\n    return ret;\n  }\n\n  protected async getFonts(): Promise<DocumentOptions[\"fonts\"]> {\n    // Unfortunately, loading the variable font doesn't work\n    // \"./src/fonts/Inter-VariableFont_opsz,wght.ttf\",\n\n    let interFont = await loadFileBuffer(\n      await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\"),\n    );\n    let geistMonoFont = await loadFileBuffer(\n      await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\"),\n    );\n\n    if (\n      interFont instanceof ArrayBuffer ||\n      geistMonoFont instanceof ArrayBuffer\n    ) {\n      // conversion with Polyfill needed because docxjs requires Buffer\n      // NOTE: the buffer/ import is intentional and as documented in\n      // the `buffer` package usage instructions\n      // https://github.com/feross/buffer?tab=readme-ov-file#usage\n      const Buffer = (await import(\"buffer/\")).Buffer;\n\n      if (interFont instanceof ArrayBuffer) {\n        interFont = Buffer.from(interFont) as unknown as Buffer;\n      }\n      if (geistMonoFont instanceof ArrayBuffer) {\n        geistMonoFont = Buffer.from(geistMonoFont) as unknown as Buffer;\n      }\n    }\n\n    return [\n      { name: \"Inter\", data: interFont },\n      {\n        name: \"GeistMono\",\n        data: geistMonoFont,\n      },\n    ];\n  }\n\n  protected async createDefaultDocumentOptions(\n    locale?: string,\n  ): Promise<DocumentOptions> {\n    let externalStyles = (await import(\"./template/word/styles.xml?raw\"))\n      .default;\n\n    // Replace the default language in styles.xml with the provided locale.\n    // If not provided, default to en-US.\n    const resolvedLocale = (locale && locale.trim()) || \"en-US\";\n\n    externalStyles = externalStyles.replace(\n      /(<w:lang\\b[^>]*\\bw:val=\")([^\"]+)(\"[^>]*\\/>)/g,\n      `$1${resolvedLocale}$3`,\n    );\n\n    const bullets = [\"•\"]; //, \"◦\", \"▪\"]; (these don't look great, just use solid bullet for now)\n    return {\n      numbering: {\n        config: [\n          {\n            reference: \"blocknote-numbered-list\",\n            levels: Array.from({ length: 9 }, (_, i) => ({\n              start: 1,\n              level: i,\n              format: LevelFormat.DECIMAL,\n              text: `%${i + 1}.`,\n              alignment: AlignmentType.LEFT,\n              style: {\n                paragraph: {\n                  indent: {\n                    left: DEFAULT_TAB_STOP * (i + 1),\n                    hanging: DEFAULT_TAB_STOP,\n                  },\n                },\n              },\n            })),\n          },\n          {\n            reference: \"blocknote-bullet-list\",\n            levels: Array.from({ length: 9 }, (_, i) => ({\n              start: 1,\n              level: i,\n              format: LevelFormat.BULLET,\n              text: bullets[i % bullets.length],\n              alignment: AlignmentType.LEFT,\n              style: {\n                paragraph: {\n                  indent: {\n                    left: DEFAULT_TAB_STOP * (i + 1),\n                    hanging: DEFAULT_TAB_STOP,\n                  },\n                },\n              },\n            })),\n          },\n        ],\n      },\n      fonts: await this.getFonts(),\n      defaultTabStop: 200,\n      externalStyles,\n    };\n  }\n\n  /**\n   * Convert a document (array of Blocks to a Blob representing a .docx file)\n   */\n  public async toBlob(\n    blocks: Block<B, I, S>[],\n    options: {\n      sectionOptions: Omit<ISectionOptions, \"children\">;\n      documentOptions: DocumentOptions;\n      /**\n       * The document locale in OOXML format (e.g. en-US, fr-FR, de-DE).\n       * If omitted, defaults to en-US.\n       */\n      locale?: string;\n    } = {\n      sectionOptions: {},\n      documentOptions: {},\n    },\n  ) {\n    const doc = await this.toDocxJsDocument(blocks, options);\n    type GlobalThis = typeof globalThis & { Buffer?: any };\n    const prevBuffer = (globalThis as GlobalThis).Buffer;\n    try {\n      if (!(globalThis as GlobalThis).Buffer) {\n        // load Buffer polyfill because docxjs requires this\n        (globalThis as GlobalThis).Buffer = (\n          await import(\"buffer\")\n        ).default.Buffer;\n      }\n      return Packer.toBlob(doc);\n    } finally {\n      (globalThis as GlobalThis).Buffer = prevBuffer;\n    }\n  }\n\n  /**\n   * Convert a document (array of Blocks to a docxjs Document)\n   */\n  public async toDocxJsDocument(\n    blocks: Block<B, I, S>[],\n    options: {\n      sectionOptions: Omit<ISectionOptions, \"children\">;\n      documentOptions: DocumentOptions;\n      /**\n       * The document locale in OOXML format (e.g. en-US, fr-FR, de-DE).\n       * If omitted, defaults to en-US.\n       */\n      locale?: string;\n    } = {\n      sectionOptions: {},\n      documentOptions: {},\n    },\n  ) {\n    const doc = new Document({\n      ...(await this.createDefaultDocumentOptions(options.locale)),\n      ...options.documentOptions,\n      sections: [\n        {\n          children: await this.transformBlocks(blocks),\n          ...options.sectionOptions,\n        },\n      ],\n    });\n\n    return doc;\n  }\n}\n"],"names":["getImageDimensions","blob","bmp","width","height","imageMetaFunc","bytes","meta","Table","data","headerRows","headerCols","DocxTable","w","row","rowIndex","isHeaderRow","TableRow","c","colIndex","_a","cell","mapTableCell","isHeaderColumn","TableCell","ShadingType","Paragraph","UnreachableCaseError","blockPropsToStyles","props","colors","docxBlockMappingForDefaultSchema","block","exporter","TextRun","nestingLevel","CheckBox","file","caption","textContent","line","index","PageBreak","_exporter","_nestingLevel","_numberedListIndex","children","child","_block","_index","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","dataUrl","DEFAULT_TAB_STOP","DOCXExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","styledText","hyperlink","stylesArray","styles","blocks","ret","b","_i","Tab","self","interFont","geistMonoFont","Buffer","n","locale","externalStyles","resolvedLocale","bullets","_","i","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}