@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.
- package/dist/blocknote.cjs +12 -0
- package/dist/blocknote.cjs.map +1 -0
- package/dist/blocknote.js +4754 -3514
- package/dist/blocknote.js.map +1 -1
- package/dist/comments.cjs +2 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.js +593 -0
- package/dist/comments.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/webpack-stats.json +1 -1
- package/package.json +39 -26
- package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +1022 -378
- package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +730 -270
- package/src/api/blockManipulation/commands/moveBlocks/__snapshots__/moveBlocks.test.ts.snap +3100 -1260
- package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +438 -162
- package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +1168 -432
- package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +930 -378
- package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +2485 -1015
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +28 -1
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +1 -1
- package/src/api/blockManipulation/selections/__snapshots__/selection.test.ts.snap +292 -108
- package/src/api/blockManipulation/setupTestEnv.ts +14 -1
- package/src/api/blockManipulation/tables/tables.test.ts +1987 -0
- package/src/api/blockManipulation/tables/tables.ts +887 -0
- package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraph.html +66 -24
- package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraphText.html +66 -24
- package/src/api/clipboard/__snapshots__/external/pasteImage.html +66 -24
- package/src/api/clipboard/__snapshots__/external/pasteParagraphInCustomBlock.html +66 -24
- package/src/api/clipboard/__snapshots__/external/pasteTable.html +132 -48
- package/src/api/clipboard/__snapshots__/external/pasteTableInExistingTable.html +136 -44
- package/src/api/clipboard/toClipboard/copyExtension.ts +2 -3
- package/src/api/exporters/html/__snapshots__/table/headerCols/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/headerCols/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/headerRows/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/headerRows/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/headersRows/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/headersRows/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedCellColors/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedCellColors/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/internal.html +1 -0
- package/src/api/exporters/markdown/__snapshots__/table/headerCols/markdown.md +4 -0
- package/src/api/exporters/markdown/__snapshots__/table/headerRows/markdown.md +4 -0
- package/src/api/exporters/markdown/__snapshots__/table/mixedCellColors/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/table/mixedRowspansAndColspans/markdown.md +5 -0
- package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +985 -20
- package/src/api/nodeConversions/blockToNode.ts +63 -20
- package/src/api/nodeConversions/nodeToBlock.ts +75 -13
- package/src/api/parsers/html/__snapshots__/parse-notion-html.json +145 -54
- package/src/api/testUtil/cases/defaultSchema.ts +782 -9
- package/src/api/testUtil/partialBlockTestUtil.ts +39 -4
- package/src/blocks/TableBlockContent/TableBlockContent.ts +11 -5
- package/src/blocks/defaultBlockTypeGuards.ts +8 -0
- package/src/comments/index.ts +9 -0
- package/src/comments/models/User.ts +8 -0
- package/src/comments/threadstore/DefaultThreadStoreAuth.ts +106 -0
- package/src/comments/threadstore/ThreadStore.ts +134 -0
- package/src/comments/threadstore/ThreadStoreAuth.ts +13 -0
- package/src/comments/threadstore/TipTapThreadStore.ts +292 -0
- package/src/comments/threadstore/yjs/RESTYjsThreadStore.ts +144 -0
- package/src/comments/threadstore/yjs/YjsThreadStore.test.ts +294 -0
- package/src/comments/threadstore/yjs/YjsThreadStore.ts +340 -0
- package/src/comments/threadstore/yjs/YjsThreadStoreBase.ts +48 -0
- package/src/comments/threadstore/yjs/yjsHelpers.ts +121 -0
- package/src/comments/types.ts +117 -0
- package/src/editor/Block.css +16 -8
- package/src/editor/BlockNoteEditor.ts +269 -92
- package/src/editor/BlockNoteExtensions.ts +24 -1
- package/src/editor/BlockNoteTipTapEditor.ts +5 -1
- package/src/editor/editor.css +17 -0
- package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -1
- package/src/extensions/Comments/CommentMark.ts +61 -0
- package/src/extensions/Comments/CommentsPlugin.ts +301 -0
- package/src/extensions/Comments/userstore/UserStore.ts +72 -0
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +9 -5
- package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +3 -3
- package/src/extensions/ShowSelection/ShowSelectionPlugin.ts +52 -0
- package/src/extensions/TableHandles/TableHandlesPlugin.ts +409 -57
- package/src/extensions/TextAlignment/TextAlignmentExtension.ts +2 -0
- package/src/extensions/TextColor/TextColorExtension.ts +1 -1
- package/src/i18n/locales/ar.ts +23 -0
- package/src/i18n/locales/de.ts +15 -0
- package/src/i18n/locales/en.ts +25 -1
- package/src/i18n/locales/es.ts +16 -1
- package/src/i18n/locales/fr.ts +23 -0
- package/src/i18n/locales/hr.ts +18 -0
- package/src/i18n/locales/is.ts +24 -1
- package/src/i18n/locales/it.ts +15 -0
- package/src/i18n/locales/ja.ts +23 -0
- package/src/i18n/locales/ko.ts +23 -0
- package/src/i18n/locales/nl.ts +23 -0
- package/src/i18n/locales/no.ts +23 -0
- package/src/i18n/locales/pl.ts +23 -0
- package/src/i18n/locales/pt.ts +23 -0
- package/src/i18n/locales/ru.ts +23 -0
- package/src/i18n/locales/uk.ts +23 -0
- package/src/i18n/locales/vi.ts +23 -0
- package/src/i18n/locales/zh.ts +23 -0
- package/src/index.ts +6 -4
- package/src/schema/blocks/types.ts +32 -2
- package/src/util/browser.ts +1 -1
- package/src/util/table.ts +107 -0
- package/types/src/api/blockManipulation/tables/tables.d.ts +343 -0
- package/types/src/api/blockManipulation/tables/tables.test.d.ts +1 -0
- package/types/src/api/clipboard/toClipboard/copyExtension.d.ts +1 -1
- package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +1 -2
- package/types/src/blocks/defaultBlockTypeGuards.d.ts +3 -0
- package/types/src/comments/index.d.ts +9 -0
- package/types/src/comments/models/User.d.ts +8 -0
- package/types/src/comments/threadstore/DefaultThreadStoreAuth.d.ts +47 -0
- package/types/src/comments/threadstore/ThreadStore.d.ts +121 -0
- package/types/src/comments/threadstore/ThreadStoreAuth.d.ts +12 -0
- package/types/src/comments/threadstore/TipTapThreadStore.d.ts +97 -0
- package/types/src/comments/threadstore/yjs/RESTYjsThreadStore.d.ts +83 -0
- package/types/src/comments/threadstore/yjs/YjsThreadStore.d.ts +79 -0
- package/types/src/comments/threadstore/yjs/YjsThreadStore.test.d.ts +1 -0
- package/types/src/comments/threadstore/yjs/YjsThreadStoreBase.d.ts +15 -0
- package/types/src/comments/threadstore/yjs/yjsHelpers.d.ts +13 -0
- package/types/src/comments/types.d.ts +109 -0
- package/types/src/editor/BlockNoteEditor.d.ts +146 -66
- package/types/src/editor/BlockNoteExtensions.d.ts +4 -0
- package/types/src/extensions/Collaboration/createCollaborationExtensions.d.ts +1 -1
- package/types/src/extensions/Comments/CommentMark.d.ts +2 -0
- package/types/src/extensions/Comments/CommentsPlugin.d.ts +49 -0
- package/types/src/extensions/Comments/userstore/UserStore.d.ts +31 -0
- package/types/src/extensions/ShowSelection/ShowSelectionPlugin.d.ts +15 -0
- package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +66 -1
- package/types/src/i18n/locales/de.d.ts +15 -0
- package/types/src/i18n/locales/en.d.ts +20 -0
- package/types/src/i18n/locales/es.d.ts +15 -0
- package/types/src/i18n/locales/hr.d.ts +18 -0
- package/types/src/i18n/locales/it.d.ts +15 -0
- package/types/src/index.d.ts +5 -4
- package/types/src/pm-nodes/BlockContainer.d.ts +2 -2
- package/types/src/pm-nodes/BlockGroup.d.ts +2 -2
- package/types/src/schema/blocks/types.d.ts +23 -2
- package/types/src/util/browser.d.ts +1 -1
- package/types/src/util/table.d.ts +12 -0
- package/dist/blocknote.umd.cjs +0 -11
- 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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
220
|
+
// No-op
|
|
185
221
|
} else if (typeof cell === "string") {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
192
|
-
pNode = schema.nodes["tableParagraph"].createChecked({}, textNodes);
|
|
237
|
+
content = inlineContentToNodes(cell, schema, styleSchema);
|
|
193
238
|
}
|
|
194
239
|
|
|
195
|
-
const cellNode = schema.nodes[
|
|
240
|
+
const cellNode = schema.nodes[
|
|
241
|
+
isHeaderCol || isHeaderRow ? "tableHeader" : "tableCell"
|
|
242
|
+
].createChecked(
|
|
196
243
|
{
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
51
|
+
if (rowIndex === 0) {
|
|
43
52
|
rowNode.content.forEach((cellNode) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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
|
]
|