{"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  DefaultBlockSchema,\n  DefaultProps,\n  pageBreakSchema,\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    typeof pageBreakSchema.blockSchema &\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}`,\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  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    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(): Promise<DocumentOptions> {\n    const externalStyles = (await import(\"./template/word/styles.xml?raw\"))\n      .default;\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      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      sectionOptions: {},\n      documentOptions: {},\n    },\n  ) {\n    const doc = new Document({\n      ...(await this.createDefaultDocumentOptions()),\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","externalStyles","bullets","_","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}