@blocknote/core 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/blocknote.cjs +12 -0
  2. package/dist/blocknote.cjs.map +1 -0
  3. package/dist/blocknote.js +4754 -3514
  4. package/dist/blocknote.js.map +1 -1
  5. package/dist/comments.cjs +2 -0
  6. package/dist/comments.cjs.map +1 -0
  7. package/dist/comments.js +593 -0
  8. package/dist/comments.js.map +1 -0
  9. package/dist/style.css +1 -1
  10. package/dist/tsconfig.tsbuildinfo +1 -1
  11. package/dist/webpack-stats.json +1 -1
  12. package/package.json +39 -26
  13. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +1022 -378
  14. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +730 -270
  15. package/src/api/blockManipulation/commands/moveBlocks/__snapshots__/moveBlocks.test.ts.snap +3100 -1260
  16. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +438 -162
  17. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +1168 -432
  18. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +930 -378
  19. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +2485 -1015
  20. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +28 -1
  21. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +1 -1
  22. package/src/api/blockManipulation/selections/__snapshots__/selection.test.ts.snap +292 -108
  23. package/src/api/blockManipulation/setupTestEnv.ts +14 -1
  24. package/src/api/blockManipulation/tables/tables.test.ts +1987 -0
  25. package/src/api/blockManipulation/tables/tables.ts +887 -0
  26. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraph.html +66 -24
  27. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraphText.html +66 -24
  28. package/src/api/clipboard/__snapshots__/external/pasteImage.html +66 -24
  29. package/src/api/clipboard/__snapshots__/external/pasteParagraphInCustomBlock.html +66 -24
  30. package/src/api/clipboard/__snapshots__/external/pasteTable.html +132 -48
  31. package/src/api/clipboard/__snapshots__/external/pasteTableInExistingTable.html +136 -44
  32. package/src/api/clipboard/toClipboard/copyExtension.ts +2 -3
  33. package/src/api/exporters/html/__snapshots__/table/headerCols/external.html +1 -0
  34. package/src/api/exporters/html/__snapshots__/table/headerCols/internal.html +1 -0
  35. package/src/api/exporters/html/__snapshots__/table/headerRows/external.html +1 -0
  36. package/src/api/exporters/html/__snapshots__/table/headerRows/internal.html +1 -0
  37. package/src/api/exporters/html/__snapshots__/table/headersRows/external.html +1 -0
  38. package/src/api/exporters/html/__snapshots__/table/headersRows/internal.html +1 -0
  39. package/src/api/exporters/html/__snapshots__/table/mixedCellColors/external.html +1 -0
  40. package/src/api/exporters/html/__snapshots__/table/mixedCellColors/internal.html +1 -0
  41. package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/external.html +1 -0
  42. package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/internal.html +1 -0
  43. package/src/api/exporters/markdown/__snapshots__/table/headerCols/markdown.md +4 -0
  44. package/src/api/exporters/markdown/__snapshots__/table/headerRows/markdown.md +4 -0
  45. package/src/api/exporters/markdown/__snapshots__/table/mixedCellColors/markdown.md +5 -0
  46. package/src/api/exporters/markdown/__snapshots__/table/mixedRowspansAndColspans/markdown.md +5 -0
  47. package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +985 -20
  48. package/src/api/nodeConversions/blockToNode.ts +63 -20
  49. package/src/api/nodeConversions/nodeToBlock.ts +75 -13
  50. package/src/api/parsers/html/__snapshots__/parse-notion-html.json +145 -54
  51. package/src/api/testUtil/cases/defaultSchema.ts +782 -9
  52. package/src/api/testUtil/partialBlockTestUtil.ts +39 -4
  53. package/src/blocks/TableBlockContent/TableBlockContent.ts +11 -5
  54. package/src/blocks/defaultBlockTypeGuards.ts +8 -0
  55. package/src/comments/index.ts +9 -0
  56. package/src/comments/models/User.ts +8 -0
  57. package/src/comments/threadstore/DefaultThreadStoreAuth.ts +106 -0
  58. package/src/comments/threadstore/ThreadStore.ts +134 -0
  59. package/src/comments/threadstore/ThreadStoreAuth.ts +13 -0
  60. package/src/comments/threadstore/TipTapThreadStore.ts +292 -0
  61. package/src/comments/threadstore/yjs/RESTYjsThreadStore.ts +144 -0
  62. package/src/comments/threadstore/yjs/YjsThreadStore.test.ts +294 -0
  63. package/src/comments/threadstore/yjs/YjsThreadStore.ts +340 -0
  64. package/src/comments/threadstore/yjs/YjsThreadStoreBase.ts +48 -0
  65. package/src/comments/threadstore/yjs/yjsHelpers.ts +121 -0
  66. package/src/comments/types.ts +117 -0
  67. package/src/editor/Block.css +16 -8
  68. package/src/editor/BlockNoteEditor.ts +269 -92
  69. package/src/editor/BlockNoteExtensions.ts +24 -1
  70. package/src/editor/BlockNoteTipTapEditor.ts +5 -1
  71. package/src/editor/editor.css +17 -0
  72. package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -1
  73. package/src/extensions/Comments/CommentMark.ts +61 -0
  74. package/src/extensions/Comments/CommentsPlugin.ts +301 -0
  75. package/src/extensions/Comments/userstore/UserStore.ts +72 -0
  76. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +9 -5
  77. package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +3 -3
  78. package/src/extensions/ShowSelection/ShowSelectionPlugin.ts +52 -0
  79. package/src/extensions/TableHandles/TableHandlesPlugin.ts +409 -57
  80. package/src/extensions/TextAlignment/TextAlignmentExtension.ts +2 -0
  81. package/src/extensions/TextColor/TextColorExtension.ts +1 -1
  82. package/src/i18n/locales/ar.ts +23 -0
  83. package/src/i18n/locales/de.ts +15 -0
  84. package/src/i18n/locales/en.ts +25 -1
  85. package/src/i18n/locales/es.ts +16 -1
  86. package/src/i18n/locales/fr.ts +23 -0
  87. package/src/i18n/locales/hr.ts +18 -0
  88. package/src/i18n/locales/is.ts +24 -1
  89. package/src/i18n/locales/it.ts +15 -0
  90. package/src/i18n/locales/ja.ts +23 -0
  91. package/src/i18n/locales/ko.ts +23 -0
  92. package/src/i18n/locales/nl.ts +23 -0
  93. package/src/i18n/locales/no.ts +23 -0
  94. package/src/i18n/locales/pl.ts +23 -0
  95. package/src/i18n/locales/pt.ts +23 -0
  96. package/src/i18n/locales/ru.ts +23 -0
  97. package/src/i18n/locales/uk.ts +23 -0
  98. package/src/i18n/locales/vi.ts +23 -0
  99. package/src/i18n/locales/zh.ts +23 -0
  100. package/src/index.ts +6 -4
  101. package/src/schema/blocks/types.ts +32 -2
  102. package/src/util/browser.ts +1 -1
  103. package/src/util/table.ts +107 -0
  104. package/types/src/api/blockManipulation/tables/tables.d.ts +343 -0
  105. package/types/src/api/blockManipulation/tables/tables.test.d.ts +1 -0
  106. package/types/src/api/clipboard/toClipboard/copyExtension.d.ts +1 -1
  107. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +1 -2
  108. package/types/src/blocks/defaultBlockTypeGuards.d.ts +3 -0
  109. package/types/src/comments/index.d.ts +9 -0
  110. package/types/src/comments/models/User.d.ts +8 -0
  111. package/types/src/comments/threadstore/DefaultThreadStoreAuth.d.ts +47 -0
  112. package/types/src/comments/threadstore/ThreadStore.d.ts +121 -0
  113. package/types/src/comments/threadstore/ThreadStoreAuth.d.ts +12 -0
  114. package/types/src/comments/threadstore/TipTapThreadStore.d.ts +97 -0
  115. package/types/src/comments/threadstore/yjs/RESTYjsThreadStore.d.ts +83 -0
  116. package/types/src/comments/threadstore/yjs/YjsThreadStore.d.ts +79 -0
  117. package/types/src/comments/threadstore/yjs/YjsThreadStore.test.d.ts +1 -0
  118. package/types/src/comments/threadstore/yjs/YjsThreadStoreBase.d.ts +15 -0
  119. package/types/src/comments/threadstore/yjs/yjsHelpers.d.ts +13 -0
  120. package/types/src/comments/types.d.ts +109 -0
  121. package/types/src/editor/BlockNoteEditor.d.ts +146 -66
  122. package/types/src/editor/BlockNoteExtensions.d.ts +4 -0
  123. package/types/src/extensions/Collaboration/createCollaborationExtensions.d.ts +1 -1
  124. package/types/src/extensions/Comments/CommentMark.d.ts +2 -0
  125. package/types/src/extensions/Comments/CommentsPlugin.d.ts +49 -0
  126. package/types/src/extensions/Comments/userstore/UserStore.d.ts +31 -0
  127. package/types/src/extensions/ShowSelection/ShowSelectionPlugin.d.ts +15 -0
  128. package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +66 -1
  129. package/types/src/i18n/locales/de.d.ts +15 -0
  130. package/types/src/i18n/locales/en.d.ts +20 -0
  131. package/types/src/i18n/locales/es.d.ts +15 -0
  132. package/types/src/i18n/locales/hr.d.ts +18 -0
  133. package/types/src/i18n/locales/it.d.ts +15 -0
  134. package/types/src/index.d.ts +5 -4
  135. package/types/src/pm-nodes/BlockContainer.d.ts +2 -2
  136. package/types/src/pm-nodes/BlockGroup.d.ts +2 -2
  137. package/types/src/schema/blocks/types.d.ts +23 -2
  138. package/types/src/util/browser.d.ts +1 -1
  139. package/types/src/util/table.d.ts +12 -0
  140. package/dist/blocknote.umd.cjs +0 -11
  141. package/dist/blocknote.umd.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { Mark, Node, Schema } from "@tiptap/pm/model";
1
+ import { Attrs, Fragment, Mark, Node, Schema } from "@tiptap/pm/model";
2
2
 
3
3
  import UniqueID from "../../extensions/UniqueID/UniqueID.js";
4
4
  import type {
@@ -16,7 +16,9 @@ import {
16
16
  isPartialLinkInlineContent,
17
17
  isStyledTextInlineContent,
18
18
  } from "../../schema/inlineContent/types.js";
19
+ import { getColspan, isPartialTableCell } from "../../util/table.js";
19
20
  import { UnreachableCaseError } from "../../util/typescript.js";
21
+ import { getAbsoluteTableCells } from "../blockManipulation/tables/tables.js";
20
22
 
21
23
  /**
22
24
  * Convert a StyledText inline element to a
@@ -174,34 +176,75 @@ export function tableContentToNodes<
174
176
  styleSchema: StyleSchema
175
177
  ): Node[] {
176
178
  const rowNodes: Node[] = [];
179
+ // Header rows and columns are used to determine the type of the cell
180
+ // If headerRows is 1, then the first row is a header row
181
+ const headerRows = new Array(tableContent.headerRows ?? 0).fill(true);
182
+ // If headerCols is 1, then the first column is a header column
183
+ const headerCols = new Array(tableContent.headerCols ?? 0).fill(true);
177
184
 
178
- for (const row of tableContent.rows) {
185
+ const columnWidths: (number | undefined)[] = tableContent.columnWidths ?? [];
186
+
187
+ for (let rowIndex = 0; rowIndex < tableContent.rows.length; rowIndex++) {
188
+ const row = tableContent.rows[rowIndex];
179
189
  const columnNodes: Node[] = [];
180
- for (let i = 0; i < row.cells.length; i++) {
181
- const cell = row.cells[i];
182
- let pNode: Node;
190
+ const isHeaderRow = headerRows[rowIndex];
191
+ for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {
192
+ const cell = row.cells[cellIndex];
193
+ const isHeaderCol = headerCols[cellIndex];
194
+ /**
195
+ * The attributes of the cell to apply to the node
196
+ */
197
+ const attrs: Attrs | undefined = undefined;
198
+ /**
199
+ * The content of the cell to apply to the node
200
+ */
201
+ let content: Fragment | Node | readonly Node[] | null = null;
202
+
203
+ // Colwidths are absolutely referenced to the table, so we need to resolve the relative cell index to the absolute cell index
204
+ const absoluteCellIndex = getAbsoluteTableCells(
205
+ {
206
+ row: rowIndex,
207
+ col: cellIndex,
208
+ },
209
+ { type: "table", content: tableContent } as any
210
+ );
211
+
212
+ // Assume the column width is the width of the cell at the absolute cell index
213
+ let colwidth: (number | undefined)[] | null = columnWidths[
214
+ absoluteCellIndex.col
215
+ ]
216
+ ? [columnWidths[absoluteCellIndex.col]]
217
+ : null;
218
+
183
219
  if (!cell) {
184
- pNode = schema.nodes["tableParagraph"].createChecked({});
220
+ // No-op
185
221
  } else if (typeof cell === "string") {
186
- pNode = schema.nodes["tableParagraph"].createChecked(
187
- {},
188
- schema.text(cell)
189
- );
222
+ content = schema.text(cell);
223
+ } else if (isPartialTableCell(cell)) {
224
+ if (cell.content) {
225
+ content = inlineContentToNodes(cell.content, schema, styleSchema);
226
+ }
227
+ const colspan = getColspan(cell);
228
+
229
+ if (colspan > 1) {
230
+ // If the cell has a > 1 colspan, we need to get the column width for each cell in the span
231
+ colwidth = new Array(colspan).fill(false).map((_, i) => {
232
+ // Starting from the absolute column index, get the column width for each cell in the span
233
+ return columnWidths[absoluteCellIndex.col + i] ?? undefined;
234
+ });
235
+ }
190
236
  } else {
191
- const textNodes = inlineContentToNodes(cell, schema, styleSchema);
192
- pNode = schema.nodes["tableParagraph"].createChecked({}, textNodes);
237
+ content = inlineContentToNodes(cell, schema, styleSchema);
193
238
  }
194
239
 
195
- const cellNode = schema.nodes["tableCell"].createChecked(
240
+ const cellNode = schema.nodes[
241
+ isHeaderCol || isHeaderRow ? "tableHeader" : "tableCell"
242
+ ].createChecked(
196
243
  {
197
- // The colwidth array should have multiple values when the colspan of
198
- // a cell is greater than 1. However, this is not yet implemented so
199
- // we can always assume a length of 1.
200
- colwidth: tableContent.columnWidths?.[i]
201
- ? [tableContent.columnWidths[i]]
202
- : null,
244
+ ...(isPartialTableCell(cell) ? cell.props : {}),
245
+ colwidth,
203
246
  },
204
- pNode
247
+ schema.nodes["tableParagraph"].createChecked(attrs, content)
205
248
  );
206
249
  columnNodes.push(cellNode);
207
250
  }
@@ -10,6 +10,7 @@ import type {
10
10
  InlineContentSchema,
11
11
  StyleSchema,
12
12
  Styles,
13
+ TableCell,
13
14
  TableContent,
14
15
  } from "../../schema/index.js";
15
16
  import { getBlockInfoWithManualOffset } from "../getBlockInfoFromPos.js";
@@ -31,36 +32,97 @@ export function contentNodeToTableContent<
31
32
  const ret: TableContent<I, S> = {
32
33
  type: "tableContent",
33
34
  columnWidths: [],
35
+ headerRows: undefined,
36
+ headerCols: undefined,
34
37
  rows: [],
35
38
  };
36
39
 
37
- contentNode.content.forEach((rowNode, _offset, index) => {
40
+ /**
41
+ * A matrix of boolean values indicating whether a cell is a header.
42
+ * The first index is the row index, the second index is the cell index.
43
+ */
44
+ const headerMatrix: boolean[][] = [];
45
+
46
+ contentNode.content.forEach((rowNode, _offset, rowIndex) => {
38
47
  const row: TableContent<I, S>["rows"][0] = {
39
48
  cells: [],
40
49
  };
41
50
 
42
- if (index === 0) {
51
+ if (rowIndex === 0) {
43
52
  rowNode.content.forEach((cellNode) => {
44
- // The colwidth array should have multiple values when the colspan of a
45
- // cell is greater than 1. However, this is not yet implemented so we
46
- // can always assume a length of 1.
47
- ret.columnWidths.push(cellNode.attrs.colwidth?.[0] || undefined);
53
+ let colWidth = cellNode.attrs.colwidth as null | undefined | number[];
54
+ if (colWidth === undefined || colWidth === null) {
55
+ colWidth = new Array(cellNode.attrs.colspan ?? 1).fill(undefined);
56
+ }
57
+ ret.columnWidths.push(...colWidth);
48
58
  });
49
59
  }
50
60
 
51
- rowNode.content.forEach((cellNode) => {
52
- row.cells.push(
53
- contentNodeToInlineContent(
54
- cellNode.firstChild!,
55
- inlineContentSchema,
56
- styleSchema
61
+ row.cells = rowNode.content.content.map((cellNode, cellIndex) => {
62
+ if (!headerMatrix[rowIndex]) {
63
+ headerMatrix[rowIndex] = [];
64
+ }
65
+ // Mark the cell as a header if it is a tableHeader node.
66
+ headerMatrix[rowIndex][cellIndex] = cellNode.type.name === "tableHeader";
67
+ // Convert cell content to inline content and merge adjacent styled text nodes
68
+ const content = cellNode.content.content
69
+ .map((child) =>
70
+ contentNodeToInlineContent(child, inlineContentSchema, styleSchema)
57
71
  )
58
- );
72
+ // The reason that we merge this content is that we allow table cells to contain multiple tableParagraph nodes
73
+ // So that we can leverage prosemirror-tables native merging
74
+ // If the schema only allowed a single tableParagraph node, then the merging would not work and cause prosemirror to fit the content into a new cell
75
+ .reduce((acc, contentPartial) => {
76
+ if (!acc.length) {
77
+ return contentPartial;
78
+ }
79
+
80
+ const last = acc[acc.length - 1];
81
+ const first = contentPartial[0];
82
+
83
+ // Only merge if the last and first content are both styled text nodes and have the same styles
84
+ if (
85
+ isStyledTextInlineContent(last) &&
86
+ isStyledTextInlineContent(first) &&
87
+ JSON.stringify(last.styles) === JSON.stringify(first.styles)
88
+ ) {
89
+ // Join them together if they have the same styles
90
+ last.text += "\n" + first.text;
91
+ acc.push(...contentPartial.slice(1));
92
+ return acc;
93
+ }
94
+ acc.push(...contentPartial);
95
+ return acc;
96
+ }, [] as InlineContent<I, S>[]);
97
+
98
+ return {
99
+ type: "tableCell",
100
+ content,
101
+ props: {
102
+ colspan: cellNode.attrs.colspan,
103
+ rowspan: cellNode.attrs.rowspan,
104
+ backgroundColor: cellNode.attrs.backgroundColor,
105
+ textColor: cellNode.attrs.textColor,
106
+ textAlignment: cellNode.attrs.textAlignment,
107
+ },
108
+ } satisfies TableCell<I, S>;
59
109
  });
60
110
 
61
111
  ret.rows.push(row);
62
112
  });
63
113
 
114
+ for (let i = 0; i < headerMatrix.length; i++) {
115
+ if (headerMatrix[i].every((isHeader) => isHeader)) {
116
+ ret.headerRows = (ret.headerRows ?? 0) + 1;
117
+ }
118
+ }
119
+
120
+ for (let i = 0; i < headerMatrix[0]?.length; i++) {
121
+ if (headerMatrix.every((row) => row[i])) {
122
+ ret.headerCols = (ret.headerCols ?? 0) + 1;
123
+ }
124
+ }
125
+
64
126
  return ret;
65
127
  }
66
128
 
@@ -374,80 +374,171 @@
374
374
  null,
375
375
  null
376
376
  ],
377
+ "headerRows": 1,
377
378
  "rows": [
378
379
  {
379
380
  "cells": [
380
- [
381
- {
382
- "type": "text",
383
- "text": "Cell 1",
384
- "styles": {}
381
+ {
382
+ "type": "tableCell",
383
+ "content": [
384
+ {
385
+ "type": "text",
386
+ "text": "Cell 1",
387
+ "styles": {}
388
+ }
389
+ ],
390
+ "props": {
391
+ "colspan": 1,
392
+ "rowspan": 1,
393
+ "backgroundColor": "default",
394
+ "textColor": "default",
395
+ "textAlignment": "left"
385
396
  }
386
- ],
387
- [
388
- {
389
- "type": "text",
390
- "text": "Cell 2",
391
- "styles": {}
397
+ },
398
+ {
399
+ "type": "tableCell",
400
+ "content": [
401
+ {
402
+ "type": "text",
403
+ "text": "Cell 2",
404
+ "styles": {}
405
+ }
406
+ ],
407
+ "props": {
408
+ "colspan": 1,
409
+ "rowspan": 1,
410
+ "backgroundColor": "default",
411
+ "textColor": "default",
412
+ "textAlignment": "left"
392
413
  }
393
- ],
394
- [
395
- {
396
- "type": "text",
397
- "text": "Cell 3",
398
- "styles": {}
414
+ },
415
+ {
416
+ "type": "tableCell",
417
+ "content": [
418
+ {
419
+ "type": "text",
420
+ "text": "Cell 3",
421
+ "styles": {}
422
+ }
423
+ ],
424
+ "props": {
425
+ "colspan": 1,
426
+ "rowspan": 1,
427
+ "backgroundColor": "default",
428
+ "textColor": "default",
429
+ "textAlignment": "left"
399
430
  }
400
- ]
431
+ }
401
432
  ]
402
433
  },
403
434
  {
404
435
  "cells": [
405
- [
406
- {
407
- "type": "text",
408
- "text": "Cell 4",
409
- "styles": {}
436
+ {
437
+ "type": "tableCell",
438
+ "content": [
439
+ {
440
+ "type": "text",
441
+ "text": "Cell 4",
442
+ "styles": {}
443
+ }
444
+ ],
445
+ "props": {
446
+ "colspan": 1,
447
+ "rowspan": 1,
448
+ "backgroundColor": "default",
449
+ "textColor": "default",
450
+ "textAlignment": "left"
410
451
  }
411
- ],
412
- [
413
- {
414
- "type": "text",
415
- "text": "Cell 5",
416
- "styles": {}
452
+ },
453
+ {
454
+ "type": "tableCell",
455
+ "content": [
456
+ {
457
+ "type": "text",
458
+ "text": "Cell 5",
459
+ "styles": {}
460
+ }
461
+ ],
462
+ "props": {
463
+ "colspan": 1,
464
+ "rowspan": 1,
465
+ "backgroundColor": "default",
466
+ "textColor": "default",
467
+ "textAlignment": "left"
417
468
  }
418
- ],
419
- [
420
- {
421
- "type": "text",
422
- "text": "Cell 6",
423
- "styles": {}
469
+ },
470
+ {
471
+ "type": "tableCell",
472
+ "content": [
473
+ {
474
+ "type": "text",
475
+ "text": "Cell 6",
476
+ "styles": {}
477
+ }
478
+ ],
479
+ "props": {
480
+ "colspan": 1,
481
+ "rowspan": 1,
482
+ "backgroundColor": "default",
483
+ "textColor": "default",
484
+ "textAlignment": "left"
424
485
  }
425
- ]
486
+ }
426
487
  ]
427
488
  },
428
489
  {
429
490
  "cells": [
430
- [
431
- {
432
- "type": "text",
433
- "text": "Cell 7",
434
- "styles": {}
491
+ {
492
+ "type": "tableCell",
493
+ "content": [
494
+ {
495
+ "type": "text",
496
+ "text": "Cell 7",
497
+ "styles": {}
498
+ }
499
+ ],
500
+ "props": {
501
+ "colspan": 1,
502
+ "rowspan": 1,
503
+ "backgroundColor": "default",
504
+ "textColor": "default",
505
+ "textAlignment": "left"
435
506
  }
436
- ],
437
- [
438
- {
439
- "type": "text",
440
- "text": "Cell 8",
441
- "styles": {}
507
+ },
508
+ {
509
+ "type": "tableCell",
510
+ "content": [
511
+ {
512
+ "type": "text",
513
+ "text": "Cell 8",
514
+ "styles": {}
515
+ }
516
+ ],
517
+ "props": {
518
+ "colspan": 1,
519
+ "rowspan": 1,
520
+ "backgroundColor": "default",
521
+ "textColor": "default",
522
+ "textAlignment": "left"
442
523
  }
443
- ],
444
- [
445
- {
446
- "type": "text",
447
- "text": "Cell 9",
448
- "styles": {}
524
+ },
525
+ {
526
+ "type": "tableCell",
527
+ "content": [
528
+ {
529
+ "type": "text",
530
+ "text": "Cell 9",
531
+ "styles": {}
532
+ }
533
+ ],
534
+ "props": {
535
+ "colspan": 1,
536
+ "rowspan": 1,
537
+ "backgroundColor": "default",
538
+ "textColor": "default",
539
+ "textAlignment": "left"
449
540
  }
450
- ]
541
+ }
451
542
  ]
452
543
  }
453
544
  ]