quill-table-up 3.2.2 → 3.3.1

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 (34) hide show
  1. package/LICENSE +21 -21
  2. package/dist/index.d.ts +18 -7
  3. package/dist/index.js +14 -14
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.umd.js +9 -9
  6. package/dist/index.umd.js.map +1 -1
  7. package/package.json +20 -19
  8. package/src/__tests__/e2e/table-blots.test.ts +5 -2
  9. package/src/__tests__/e2e/table-keyboard-handler.test.ts +32 -24
  10. package/src/__tests__/e2e/table-menu.test.ts +38 -0
  11. package/src/__tests__/e2e/table-resize.test.ts +4 -2
  12. package/src/__tests__/e2e/table-scrollbar.test.ts +2 -2
  13. package/src/__tests__/e2e/table-selection.test.ts +48 -0
  14. package/src/__tests__/unit/table-cell-merge.test.ts +5 -5
  15. package/src/__tests__/unit/table-contenteditable.test.ts +222 -0
  16. package/src/__tests__/unit/table-redo-undo.test.ts +1 -1
  17. package/src/__tests__/unit/table-remove.test.ts +3 -3
  18. package/src/__tests__/unit/utils.ts +2 -2
  19. package/src/formats/table-cell-format.ts +2 -2
  20. package/src/formats/table-cell-inner-format.ts +1 -1
  21. package/src/formats/table-col-format.ts +3 -0
  22. package/src/formats/table-row-format.ts +1 -1
  23. package/src/modules/table-align.ts +1 -0
  24. package/src/modules/table-dom-selector.ts +18 -3
  25. package/src/modules/table-menu/table-menu-common.ts +1 -0
  26. package/src/modules/table-menu/table-menu-contextmenu.ts +2 -3
  27. package/src/modules/table-menu/table-menu-select.ts +4 -2
  28. package/src/modules/table-resize/table-resize-box.ts +1 -0
  29. package/src/modules/table-resize/table-resize-line.ts +2 -1
  30. package/src/modules/table-resize/table-resize-scale.ts +2 -1
  31. package/src/modules/table-scrollbar.ts +1 -0
  32. package/src/modules/table-selection.ts +5 -3
  33. package/src/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  34. package/src/table-up.ts +44 -2
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "quill-table-up",
3
3
  "type": "module",
4
- "version": "3.2.2",
5
- "packageManager": "pnpm@10.20.0",
4
+ "version": "3.3.1",
5
+ "packageManager": "pnpm@10.28.2",
6
6
  "description": "A table module for quill2.x",
7
7
  "author": "zzxming",
8
8
  "license": "MIT",
@@ -41,12 +41,12 @@
41
41
  "quill": "^2.0.3"
42
42
  },
43
43
  "dependencies": {
44
- "@floating-ui/dom": "^1.7.4"
44
+ "@floating-ui/dom": "^1.7.5"
45
45
  },
46
46
  "devDependencies": {
47
- "@babel/preset-env": "^7.28.5",
48
- "@oxc-project/runtime": "^0.96.0",
49
- "@playwright/test": "^1.56.1",
47
+ "@babel/preset-env": "^7.29.0",
48
+ "@oxc-project/runtime": "^0.112.0",
49
+ "@playwright/test": "^1.58.2",
50
50
  "@prettier/plugin-xml": "^3.4.2",
51
51
  "@rollup/plugin-babel": "^6.1.0",
52
52
  "@rollup/plugin-typescript": "^12.3.0",
@@ -54,29 +54,30 @@
54
54
  "@types/gulp-clean-css": "^4.3.4",
55
55
  "@types/gulp-less": "^0.0.36",
56
56
  "@types/gulp-postcss": "^8.0.6",
57
- "@types/node": "^24.9.2",
57
+ "@types/node": "^25.2.1",
58
58
  "@types/postcss-pxtorem": "^6.1.0",
59
59
  "@types/ws": "^8.18.1",
60
- "@typescript-eslint/eslint-plugin": "^8.46.2",
61
- "@typescript-eslint/parser": "^8.46.2",
62
- "@vitest/coverage-v8": "^4.0.6",
63
- "@vitest/ui": "^4.0.6",
64
- "@zzxming/eslint-config": "0.6.2",
65
- "autoprefixer": "^10.4.21",
66
- "eslint": "^9.39.0",
60
+ "@typescript-eslint/eslint-plugin": "^8.54.0",
61
+ "@typescript-eslint/parser": "^8.54.0",
62
+ "@vitest/coverage-v8": "^4.0.18",
63
+ "@vitest/ui": "^4.0.18",
64
+ "@zzxming/eslint-config": "0.6.3",
65
+ "autoprefixer": "^10.4.24",
66
+ "eslint": "^10.0.0",
67
67
  "gulp": "^5.0.1",
68
68
  "gulp-clean-css": "^4.3.0",
69
69
  "gulp-less": "^5.0.0",
70
70
  "gulp-postcss": "^10.0.0",
71
- "jsdom": "^27.1.0",
71
+ "jsdom": "^28.0.0",
72
+ "open": "^11.0.0",
72
73
  "parchment": "^3.0.0",
73
74
  "postcss-pxtorem": "^6.1.0",
74
75
  "resize-observer-polyfill": "^1.5.1",
75
- "tsdown": "^0.15.12",
76
+ "tsdown": "^0.20.3",
76
77
  "tslib": "^2.8.1",
77
- "tsx": "^4.20.6",
78
+ "tsx": "^4.21.0",
78
79
  "typescript": "~5.9.3",
79
- "vitest": "^4.0.6",
80
- "ws": "^8.18.3"
80
+ "vitest": "^4.0.18",
81
+ "ws": "^8.19.0"
81
82
  }
82
83
  }
@@ -56,9 +56,11 @@ extendTest.describe('test table tools should hide after table removed', () => {
56
56
  editorPage.index = 0;
57
57
  await createTableBySelect(page, 'container1', 3, 3);
58
58
  await page.locator('#container1 .ql-editor .ql-table td').nth(0).click();
59
+ await page.locator('#container1 .ql-editor .ql-table td').nth(0).click({ button: 'right' });
59
60
  await page.waitForTimeout(1000);
60
61
  await expect(page.locator('#container1 .table-up-toolbox .table-up-selection')).toBeVisible();
61
62
  await expect(page.locator('#container1 .table-up-toolbox .table-up-align')).toBeAttached();
63
+ await expect(page.locator('#container1 .table-up-menu')).toBeAttached();
62
64
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container')).toBeAttached();
63
65
  await expect(page.locator('#container1 .table-up-toolbox .table-up-resize-line__col')).toBeAttached();
64
66
  await expect(page.locator('#container1 .table-up-toolbox .table-up-resize-line__row')).toBeAttached();
@@ -67,6 +69,7 @@ extendTest.describe('test table tools should hide after table removed', () => {
67
69
  await page.waitForTimeout(1000);
68
70
  await expect(page.locator('#container1 .table-up-toolbox .table-up-selection')).not.toBeVisible();
69
71
  await expect(page.locator('#container1 .table-up-toolbox .table-up-align')).not.toBeVisible();
72
+ await expect(page.locator('#container1 .table-up-menu')).not.toBeVisible();
70
73
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container')).not.toBeVisible();
71
74
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container .table-up-scrollbar.is-vertical')).not.toBeAttached();
72
75
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container .table-up-scrollbar.is-horizontal')).not.toBeAttached();
@@ -82,15 +85,15 @@ extendTest.describe('test table tools should hide after table removed', () => {
82
85
  await page.waitForTimeout(1000);
83
86
  await expect(page.locator('#container2 .table-up-toolbox .table-up-selection')).toBeVisible();
84
87
  await expect(page.locator('#container2 .table-up-toolbox .table-up-align')).toBeAttached();
85
- await expect(page.locator('#container2 .table-up-toolbox .table-up-menu')).toBeAttached();
88
+ await expect(page.locator('#container2 .table-up-menu')).toBeAttached();
86
89
  await expect(page.locator('#container2 .table-up-toolbox .table-up-scrollbar__container')).toBeAttached();
87
90
  await expect(page.locator('#container2 .table-up-toolbox .table-up-resize-box')).toBeAttached();
88
91
  await expect(page.locator('#container2 .table-up-toolbox .table-up-scale')).toBeAttached();
89
92
  await editorPage.setContents([{ insert: 'replace' }]);
90
93
  await page.waitForTimeout(1000);
91
94
  await expect(page.locator('#container2 .table-up-toolbox .table-up-selection')).not.toBeVisible();
92
- await expect(page.locator('#container2 .table-up-toolbox .table-up-menu')).not.toBeVisible();
93
95
  await expect(page.locator('#container2 .table-up-toolbox .table-up-align')).not.toBeVisible();
96
+ await expect(page.locator('#container2 .table-up-menu')).not.toBeVisible();
94
97
  await expect(page.locator('#container2 .table-up-toolbox .table-up-scrollbar__container')).not.toBeVisible();
95
98
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container .table-up-scrollbar.is-vertical')).not.toBeAttached();
96
99
  await expect(page.locator('#container1 .table-up-toolbox .table-up-scrollbar__container .table-up-scrollbar.is-horizontal')).not.toBeAttached();
@@ -439,9 +439,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
439
439
  const newCell1Bound = (await page.locator('#container1 .ql-table-wrapper td').nth(0).boundingBox())!;
440
440
  expect(newCell1Bound).not.toBeNull();
441
441
  await page.locator('#container1 .ql-table-wrapper td').nth(0).click();
442
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
443
- page.mouse.down();
444
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 1.5, newCell1Bound.y + newCell1Bound.height * 1.5);
442
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
443
+ await page.mouse.down();
444
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 1.5, newCell1Bound.y + newCell1Bound.height * 1.5);
445
+ await page.mouse.up();
445
446
 
446
447
  await editorPage.blur();
447
448
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="1" contenteditable="false"><table class="ql-table" data-table-id="1" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 200px;"><colgroup data-table-id="1" contenteditable="false"><col width="100px" data-table-id="1" data-col-id="1"><col width="100px" data-table-id="1" data-col-id="2"></colgroup><tbody data-table-id="1"><tr class="ql-table-row" data-table-id="1" data-row-id="1" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="1" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="1" data-col-id="1" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>1</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="1" data-col-id="2" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="1" data-col-id="2" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>2</p></div></td></tr><tr class="ql-table-row" data-table-id="1" data-row-id="2" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="2" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="2"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="2" data-col-id="1" data-rowspan="1" data-colspan="2" data-tag="td" data-wrap-tag="tbody"><p>4</p><p>5</p></div></td></tr></tbody></table></div>', { browserName });
@@ -461,9 +462,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
461
462
  const newCell1Bound = (await page.locator('#container1 .ql-table-wrapper td').nth(0).boundingBox())!;
462
463
  expect(newCell1Bound).not.toBeNull();
463
464
  await page.locator('#container1 .ql-table-wrapper td').nth(0).click();
464
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
465
- page.mouse.down();
466
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
465
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
466
+ await page.mouse.down();
467
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
468
+ await page.mouse.up();
467
469
 
468
470
  await editorPage.blur();
469
471
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="1" contenteditable="false"><table class="ql-table" data-table-id="1" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 240px;"><colgroup data-table-id="1" contenteditable="false"><col width="80px" data-table-id="1" data-col-id="1"><col width="80px" data-table-id="1" data-col-id="2"><col width="80px" data-table-id="1" data-col-id="3"></colgroup><tbody data-table-id="1"><tr class="ql-table-row" data-table-id="1" data-row-id="1" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="1" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="1" data-col-id="1" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>1</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="1" data-col-id="2" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="1" data-col-id="2" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>2</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="1" data-col-id="3" data-wrap-tag="tbody" rowspan="2" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="1" data-col-id="3" data-rowspan="2" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>3</p><p>8</p></div></td></tr><tr class="ql-table-row" data-table-id="1" data-row-id="2" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="2" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="2" data-col-id="1" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>6</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="2" data-col-id="2" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="2" data-col-id="2" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>7</p></div></td></tr></tbody></table></div>', { browserName });
@@ -485,9 +487,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
485
487
  const newCell1Bound = (await page.locator('#container1 .ql-table-wrapper td').nth(0).boundingBox())!;
486
488
  expect(newCell1Bound).not.toBeNull();
487
489
  await page.locator('#container1 .ql-table-wrapper td').nth(0).click();
488
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
489
- page.mouse.down();
490
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
490
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
491
+ await page.mouse.down();
492
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
493
+ await page.mouse.up();
491
494
 
492
495
  await editorPage.blur();
493
496
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="1" contenteditable="false"><table class="ql-table" data-table-id="1" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 363px;"><colgroup data-table-id="1" contenteditable="false"><col width="121px" data-table-id="1" data-col-id="1"><col width="121px" data-table-id="1" data-col-id="2"><col width="121px" data-table-id="1" data-col-id="3"></colgroup><tbody data-table-id="1"><tr class="ql-table-row" data-table-id="1" data-row-id="2" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="2" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="2"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="2" data-col-id="1" data-rowspan="1" data-colspan="2" data-tag="td" data-wrap-tag="tbody"><p>4</p><p>5</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="2" data-col-id="3" data-wrap-tag="tbody" rowspan="2" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="2" data-col-id="3" data-rowspan="2" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>6</p><p>9</p></div></td></tr><tr class="ql-table-row" data-table-id="1" data-row-id="3" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="1" data-row-id="3" data-col-id="1" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="3" data-col-id="1" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>7</p></div></td><td class="ql-table-cell" data-table-id="1" data-row-id="3" data-col-id="2" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="1" data-row-id="3" data-col-id="2" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>8</p></div></td></tr></tbody></table></div>', { browserName });
@@ -509,9 +512,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
509
512
  const newCell1Bound = (await page.locator('#container1 .ql-table-wrapper td').nth(0).boundingBox())!;
510
513
  expect(newCell1Bound).not.toBeNull();
511
514
  await page.locator('#container1 .ql-table-wrapper td').nth(0).click();
512
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
513
- page.mouse.down();
514
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 4.5, newCell1Bound.y + newCell1Bound.height * 2.5);
515
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
516
+ await page.mouse.down();
517
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 4.5, newCell1Bound.y + newCell1Bound.height * 2.5);
518
+ await page.mouse.up();
515
519
  await editorPage.blur();
516
520
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="j89168rvqrd" contenteditable="false"><table class="ql-table" data-table-id="j89168rvqrd" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 730px;"><colgroup data-table-id="j89168rvqrd" contenteditable="false"><col width="146px" data-table-id="j89168rvqrd" data-col-id="i3bpg2i2oy"><col width="146px" data-table-id="j89168rvqrd" data-col-id="lpwv9bfkdxe"><col width="146px" data-table-id="j89168rvqrd" data-col-id="9oopcw7mbfq"><col width="146px" data-table-id="j89168rvqrd" data-col-id="ejdvsjml25"><col width="146px" data-table-id="j89168rvqrd" data-col-id="nialr8ceyks"></colgroup><tbody data-table-id="j89168rvqrd"><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="3" colspan="5" data-empty-row="["v4r34a160is","n73z32w0t9l"]"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-rowspan="3" data-colspan="5" data-tag="td" data-wrap-tag="tbody" data-empty-row="["v4r34a160is","n73z32w0t9l"]"><p></p></div></td></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="v4r34a160is" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="n73z32w0t9l" data-wrap-tag="tbody"></tr></tbody></table></div>', { browserName });
517
521
  const cell1 = page.locator('#container1 .ql-table-wrapper td').nth(0);
@@ -523,9 +527,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
523
527
  const newCell2Bound = (await page.locator('#container1 .ql-table-wrapper td').nth(0).boundingBox())!;
524
528
  expect(newCell2Bound).not.toBeNull();
525
529
  await page.locator('#container1 .ql-table-wrapper td').nth(0).click();
526
- page.mouse.move(newCell2Bound.x + newCell2Bound.width * 0.5, newCell2Bound.y + newCell2Bound.height * 0.5);
527
- page.mouse.down();
528
- page.mouse.move(newCell2Bound.x + newCell2Bound.width * 4.5, newCell2Bound.y + newCell2Bound.height * 3.5);
530
+ await page.mouse.move(newCell2Bound.x + newCell2Bound.width * 0.5, newCell2Bound.y + newCell2Bound.height * 0.5);
531
+ await page.mouse.down();
532
+ await page.mouse.move(newCell2Bound.x + newCell2Bound.width * 4.5, newCell2Bound.y + newCell2Bound.height * 3.5);
533
+ await page.mouse.up();
529
534
  await editorPage.blur();
530
535
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="j89168rvqrd" contenteditable="false"><table class="ql-table" data-table-id="j89168rvqrd" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 730px;"><colgroup data-table-id="j89168rvqrd" contenteditable="false"><col width="146px" data-table-id="j89168rvqrd" data-col-id="i3bpg2i2oy"><col width="146px" data-table-id="j89168rvqrd" data-col-id="lpwv9bfkdxe"><col width="146px" data-table-id="j89168rvqrd" data-col-id="9oopcw7mbfq"><col width="146px" data-table-id="j89168rvqrd" data-col-id="ejdvsjml25"><col width="146px" data-table-id="j89168rvqrd" data-col-id="nialr8ceyks"></colgroup><tbody data-table-id="j89168rvqrd"><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="3" colspan="5" data-empty-row="[&quot;v4r34a160is&quot;,&quot;n73z32w0t9l&quot;]" style="height: 49px;"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-rowspan="3" data-colspan="5" data-tag="td" data-wrap-tag="tbody" data-empty-row="[&quot;v4r34a160is&quot;,&quot;n73z32w0t9l&quot;]" data-style="height: 49px;"><p></p></div></td></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="v4r34a160is" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="n73z32w0t9l" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="i3bpg2i2oy" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="lpwv9bfkdxe" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="lpwv9bfkdxe" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="9oopcw7mbfq" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="9oopcw7mbfq" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="ejdvsjml25" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="ejdvsjml25" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="nialr8ceyks" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="nialr8ceyks" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td></tr></tbody></table></div>', { browserName });
531
536
  const cell2 = page.locator('#container1 .ql-table-wrapper td').nth(0);
@@ -541,9 +546,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
541
546
  const newCell1Bound = (await page.locator('#container5 .ql-table-wrapper td').nth(0).boundingBox())!;
542
547
  expect(newCell1Bound).not.toBeNull();
543
548
  await page.locator('#container5 .ql-table-wrapper td').nth(0).click();
544
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
545
- page.mouse.down();
546
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 4.5, newCell1Bound.y + newCell1Bound.height * 2.5);
549
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
550
+ await page.mouse.down();
551
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 4.5, newCell1Bound.y + newCell1Bound.height * 2.5);
552
+ await page.mouse.up();
547
553
  await editorPage.blur();
548
554
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="j89168rvqrd" contenteditable="false"><table class="ql-table" data-table-id="j89168rvqrd" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 730px;"><colgroup data-table-id="j89168rvqrd" contenteditable="false"><col width="146px" data-table-id="j89168rvqrd" data-col-id="i3bpg2i2oy"><col width="146px" data-table-id="j89168rvqrd" data-col-id="lpwv9bfkdxe"><col width="146px" data-table-id="j89168rvqrd" data-col-id="9oopcw7mbfq"><col width="146px" data-table-id="j89168rvqrd" data-col-id="ejdvsjml25"><col width="146px" data-table-id="j89168rvqrd" data-col-id="nialr8ceyks"></colgroup><tbody data-table-id="j89168rvqrd"><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="3" colspan="5" data-empty-row="["v4r34a160is","n73z32w0t9l"]"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-rowspan="3" data-colspan="5" data-tag="td" data-wrap-tag="tbody" data-empty-row="["v4r34a160is","n73z32w0t9l"]"><p></p></div></td></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="v4r34a160is" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="n73z32w0t9l" data-wrap-tag="tbody"></tr></tbody></table></div>', { browserName });
549
555
  const cell1 = page.locator('#container5 .ql-table-wrapper td').nth(0);
@@ -564,9 +570,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
564
570
  const newCell2Bound = (await page.locator('#container5 .ql-table-wrapper td').nth(0).boundingBox())!;
565
571
  expect(newCell2Bound).not.toBeNull();
566
572
  await page.locator('#container5 .ql-table-wrapper td').nth(0).click();
567
- page.mouse.move(newCell2Bound.x + newCell2Bound.width * 0.5, newCell2Bound.y + newCell2Bound.height * 0.5);
568
- page.mouse.down();
569
- page.mouse.move(newCell2Bound.x + newCell2Bound.width * 4.5, newCell2Bound.y + newCell2Bound.height * 3.5);
573
+ await page.mouse.move(newCell2Bound.x + newCell2Bound.width * 0.5, newCell2Bound.y + newCell2Bound.height * 0.5);
574
+ await page.mouse.down();
575
+ await page.mouse.move(newCell2Bound.x + newCell2Bound.width * 4.5, newCell2Bound.y + newCell2Bound.height * 3.5);
576
+ await page.mouse.up();
570
577
  await editorPage.blur();
571
578
  await pasteHTML(page, '<div class="ql-table-wrapper" data-table-id="j89168rvqrd" contenteditable="false"><table class="ql-table" data-table-id="j89168rvqrd" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 730px;"><colgroup data-table-id="j89168rvqrd" contenteditable="false"><col width="146px" data-table-id="j89168rvqrd" data-col-id="i3bpg2i2oy"><col width="146px" data-table-id="j89168rvqrd" data-col-id="lpwv9bfkdxe"><col width="146px" data-table-id="j89168rvqrd" data-col-id="9oopcw7mbfq"><col width="146px" data-table-id="j89168rvqrd" data-col-id="ejdvsjml25"><col width="146px" data-table-id="j89168rvqrd" data-col-id="nialr8ceyks"></colgroup><tbody data-table-id="j89168rvqrd"><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="3" colspan="5" data-empty-row="[&quot;v4r34a160is&quot;,&quot;n73z32w0t9l&quot;]" style="height: 49px;"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="m8wb3vitcit" data-col-id="i3bpg2i2oy" data-rowspan="3" data-colspan="5" data-tag="td" data-wrap-tag="tbody" data-empty-row="[&quot;v4r34a160is&quot;,&quot;n73z32w0t9l&quot;]" data-style="height: 49px;"><p></p></div></td></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="v4r34a160is" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="n73z32w0t9l" data-wrap-tag="tbody"></tr><tr class="ql-table-row" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="i3bpg2i2oy" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="i3bpg2i2oy" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="lpwv9bfkdxe" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="lpwv9bfkdxe" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="9oopcw7mbfq" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="9oopcw7mbfq" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="ejdvsjml25" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="ejdvsjml25" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td><td class="ql-table-cell" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="nialr8ceyks" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="j89168rvqrd" data-row-id="rfiuu54tyn" data-col-id="nialr8ceyks" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p></p></div></td></tr></tbody></table></div>', { browserName });
572
579
  const cell2 = page.locator('#container5 .ql-table-wrapper td').nth(0);
@@ -591,9 +598,10 @@ extendTest.describe('TableSelection keyboard handler', () => {
591
598
  const newCell1Bound = (await page.locator('#container5 .ql-table-wrapper td').nth(0).boundingBox())!;
592
599
  expect(newCell1Bound).not.toBeNull();
593
600
  await page.locator('#container5 .ql-table-wrapper td').nth(0).click();
594
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
595
- page.mouse.down();
596
- page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
601
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 0.5, newCell1Bound.y + newCell1Bound.height * 0.5);
602
+ await page.mouse.down();
603
+ await page.mouse.move(newCell1Bound.x + newCell1Bound.width * 2.5, newCell1Bound.y + newCell1Bound.height * 1.5);
604
+ await page.mouse.up();
597
605
  await editorPage.blur();
598
606
  await pasteHTML(page, `<div class="ql-table-wrapper" data-table-id="bein21b5pui" contenteditable="false"><table class="ql-table" data-table-id="bein21b5pui" cellpadding="0" cellspacing="0" style="margin-right: auto; width: 444px;"><colgroup data-table-id="bein21b5pui" contenteditable="false"><col width="142px" data-table-id="bein21b5pui" data-col-id="481dzooan6g"><col width="159px" data-table-id="bein21b5pui" data-col-id="hz2gh55d0ib"><col width="143px" data-table-id="bein21b5pui" data-col-id="feqmvzorecq"></colgroup><tbody data-table-id="bein21b5pui"><tr class="ql-table-row" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="481dzooan6g" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="481dzooan6g" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>1</p></div></td><td class="ql-table-cell" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="hz2gh55d0ib" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="hz2gh55d0ib" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>2<strong>123</strong>4</p><pre data-language="plain">www
599
607
  </pre></div></td><td class="ql-table-cell" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="feqmvzorecq" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="bein21b5pui" data-row-id="ge4p39olq3t" data-col-id="feqmvzorecq" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><h1>3</h1></div></td></tr><tr class="ql-table-row" data-table-id="bein21b5pui" data-row-id="nvid3wj1n3" data-wrap-tag="tbody"><td class="ql-table-cell" data-table-id="bein21b5pui" data-row-id="nvid3wj1n3" data-col-id="481dzooan6g" data-wrap-tag="tbody" rowspan="1" colspan="2"><div class="ql-table-cell-inner" data-table-id="bein21b5pui" data-row-id="nvid3wj1n3" data-col-id="481dzooan6g" data-rowspan="1" data-colspan="2" data-tag="td" data-wrap-tag="tbody"><ol><li>4</li><li>5</li></ol><p></p></div></td><td class="ql-table-cell" data-table-id="bein21b5pui" data-row-id="nvid3wj1n3" data-col-id="feqmvzorecq" data-wrap-tag="tbody" rowspan="1" colspan="1"><div class="ql-table-cell-inner" data-table-id="bein21b5pui" data-row-id="nvid3wj1n3" data-col-id="feqmvzorecq" data-rowspan="1" data-colspan="1" data-tag="td" data-wrap-tag="tbody"><p>6</p></div></td></tr></tbody></table></div>`, { browserName });
@@ -170,3 +170,41 @@ extendTest('table width switch should work', async ({ page }) => {
170
170
  await page.locator('.table-up-menu.is-contextmenu .table-up-menu__item').filter({ hasText: 'Switch table width' }).first().click();
171
171
  expect(await page.locator('#editor1 .ql-editor .ql-table col:not([data-full])').count()).toBe(4);
172
172
  });
173
+
174
+ test.describe('contextmenu behavior', () => {
175
+ extendTest('should show custom menu when cell is selected', async ({ page }) => {
176
+ await createTableBySelect(page, 'container1', 3, 3);
177
+
178
+ const cell = page.locator('#editor1 .ql-editor .ql-table td').nth(0);
179
+ await cell.click();
180
+ await expect(page.locator('#container1 .table-up-toolbox .table-up-selection .table-up-selection__line')).toBeVisible();
181
+
182
+ await cell.click({ button: 'right' });
183
+ await expect(page.locator('.table-up-menu.is-contextmenu')).toBeVisible();
184
+ });
185
+
186
+ extendTest('should not show custom menu when right-click on table without selection', async ({ page }) => {
187
+ await createTableBySelect(page, 'container1', 3, 3);
188
+
189
+ const cell = page.locator('#editor1 .ql-editor .ql-table td').nth(0);
190
+
191
+ // Deselect by clicking elsewhere
192
+ await page.locator('#editor1 .ql-editor > p').first().click();
193
+ await expect(page.locator('#container1 .table-up-toolbox .table-up-selection .table-up-selection__line')).not.toBeVisible();
194
+
195
+ // Right-click on table without selection
196
+ await cell.click({ button: 'right' });
197
+ await expect(page.locator('.table-up-menu.is-contextmenu')).not.toBeVisible();
198
+ });
199
+
200
+ extendTest('should not show custom menu when right-click outside table', async ({ page }) => {
201
+ await createTableBySelect(page, 'container1', 3, 3);
202
+
203
+ const editorParagraph = page.locator('#editor1 .ql-editor > p').first();
204
+ await editorParagraph.click();
205
+
206
+ const paragraphBox = (await editorParagraph.boundingBox())!;
207
+ await page.mouse.click(paragraphBox.x + 10, paragraphBox.y + 10, { button: 'right' });
208
+ await expect(page.locator('.table-up-menu.is-contextmenu')).not.toBeVisible();
209
+ });
210
+ });
@@ -166,7 +166,7 @@ extendTest('TableResize on full width should not outer 100%', async ({ page, edi
166
166
  for (let i = 0; i < colCount; i++) {
167
167
  width += Number.parseFloat((await cols.nth(i).getAttribute('width'))!);
168
168
  }
169
- expect(width).toBeCloseTo(100, 3);
169
+ expect(width).toBeCloseTo(100, 2);
170
170
  });
171
171
 
172
172
  extendTest.describe('TableResizeScale functional', () => {
@@ -282,8 +282,10 @@ extendTest.describe('TableResizeScale functional', () => {
282
282
  await page.locator('#editor1 .ql-table-wrapper').evaluate((el) => {
283
283
  el.scrollLeft = el.scrollWidth;
284
284
  });
285
+ // Wait for scroll to complete
286
+ await page.waitForTimeout(100);
285
287
  const scrollBlockBounding = (await block.boundingBox())!;
286
- expect(scrollBlockBounding.x + scrollBlockBounding.width).toBeLessThanOrEqual(scaleWrapperBounding.x + scaleWrapperBounding.width);
288
+ expect(scrollBlockBounding.x + scrollBlockBounding.width).toBeLessThanOrEqual(scaleWrapperBounding.x + scaleWrapperBounding.width + 1); // Add 1px tolerance for floating point precision
287
289
  });
288
290
  });
289
291
 
@@ -99,12 +99,12 @@ extendTest('test TableScrollbar should not effect selection', async ({ page, edi
99
99
  await page.mouse.move(bound.x + bound.width / 2, bound.y + bound.height / 2);
100
100
  await page.mouse.down();
101
101
  expect(await page.evaluate(() => {
102
- return document.onselectstart && document.onselectstart(new Event('selectstart')) === false;
102
+ return document.onselectstart?.(new Event('selectstart')) === false;
103
103
  })).toBe(true);
104
104
 
105
105
  await page.mouse.up();
106
106
  expect(await page.evaluate(() => {
107
- return !document.onselectstart || (document.onselectstart && document.onselectstart(new Event('selectstart')) === true);
107
+ return !document.onselectstart || (document.onselectstart?.(new Event('selectstart')) === true);
108
108
  })).toBe(true);
109
109
  });
110
110
 
@@ -425,6 +425,54 @@ extendTest('TableSelection should not update when input composition', async ({ p
425
425
  expect(composingBounding).toEqual(bounding);
426
426
  });
427
427
 
428
+ extendTest('TableSelection should allow text selection when editor is not editable', async ({ page, editorPage }) => {
429
+ editorPage.index = 0;
430
+ await editorPage.setContents([
431
+ { insert: '\n' },
432
+ { insert: { 'table-up-col': { tableId: '1', colId: '1', full: false, width: 150 } } },
433
+ { insert: { 'table-up-col': { tableId: '1', colId: '2', full: false, width: 150 } } },
434
+ { insert: 'Hello World' },
435
+ { attributes: { 'table-up-cell-inner': { tableId: '1', rowId: '1', colId: '1', rowspan: 1, colspan: 1 } }, insert: '\n' },
436
+ { insert: 'Test Content' },
437
+ { attributes: { 'table-up-cell-inner': { tableId: '1', rowId: '1', colId: '2', rowspan: 1, colspan: 1 } }, insert: '\n' },
438
+ { insert: '\n' },
439
+ ]);
440
+ await page.waitForTimeout(500);
441
+
442
+ // Disable editor (set contenteditable to false)
443
+ await editorPage.enable(false);
444
+ await page.waitForTimeout(100);
445
+
446
+ // Verify editor is not editable
447
+ const isEditable = await page.locator('#editor1 .ql-editor').getAttribute('contenteditable');
448
+ expect(isEditable).toBe('false');
449
+
450
+ // Get two cells with text content
451
+ const cell0 = page.locator('#editor1 .ql-editor td').nth(0);
452
+ const cell1 = page.locator('#editor1 .ql-editor td').nth(1);
453
+ const cell0Bounding = (await cell0.boundingBox())!;
454
+ const cell1Bounding = (await cell1.boundingBox())!;
455
+ expect(cell0Bounding).not.toBeNull();
456
+ expect(cell1Bounding).not.toBeNull();
457
+
458
+ // Perform text selection by dragging from first cell to second cell
459
+ await page.mouse.move(cell0Bounding.x + 5, cell0Bounding.y + cell0Bounding.height / 2);
460
+ await page.mouse.down();
461
+ await page.mouse.move(cell1Bounding.x + 5, cell1Bounding.y + cell1Bounding.height * 2);
462
+ await page.mouse.up();
463
+
464
+ // Verify that text can be selected across cells (native selection should work)
465
+ const selectedText = await page.evaluate(() => {
466
+ const selection = window.getSelection();
467
+ return selection?.toString() || '';
468
+ });
469
+
470
+ // Should be able to select text content across multiple cells in non-editable mode
471
+ expect(selectedText.length).toBeGreaterThan(0);
472
+ expect(selectedText).toContain('Hello');
473
+ expect(selectedText).toContain('Test');
474
+ });
475
+
428
476
  extendTest.describe('TableSelection should work correct when wrapper scroll', () => {
429
477
  extendTest('TableSelection in quill root scroll', async ({ page, editorPage }) => {
430
478
  editorPage.index = 0;
@@ -28,7 +28,7 @@ describe('merge and split cell', () => {
28
28
  <div>
29
29
  <table cellpadding="0" cellspacing="0" data-full="true">
30
30
  <colgroup data-full="true">
31
- ${new Array(3).fill(0).map(() => `<col width="${1 / 3 * 100}%" data-full="true" />`).join('\n')}
31
+ ${new Array(3).fill(0).map(() => `<col width="33.3333%" data-full="true" />`).join('\n')}
32
32
  </colgroup>
33
33
  <tbody>
34
34
  <tr>
@@ -113,9 +113,9 @@ describe('merge and split cell', () => {
113
113
  <div>
114
114
  <table cellpadding="0" cellspacing="0" data-full="true">
115
115
  <colgroup data-full="true">
116
- ${new Array(4).fill(0).map(() => `<col width="${1 / 7 * 100}%" data-full="true" />`).join('\n')}
117
- <col width="${2 / 7 * 100}%" data-full="true" />
118
- <col width="${1 / 7 * 100}%" data-full="true" />
116
+ ${new Array(4).fill(0).map(() => `<col width="14.2857%" data-full="true" />`).join('\n')}
117
+ <col width="28.5714%" data-full="true" />
118
+ <col width="14.2857%" data-full="true" />
119
119
  </colgroup>
120
120
  <tbody>
121
121
  <tr>
@@ -178,7 +178,7 @@ describe('merge and split cell', () => {
178
178
  <div>
179
179
  <table cellpadding="0" cellspacing="0" data-full="true">
180
180
  <colgroup data-full="true">
181
- ${new Array(3).fill(0).map(() => `<col width="${1 / 3 * 100}%" data-full="true" />`).join('\n')}
181
+ ${new Array(3).fill(0).map(() => `<col width="33.3333%" data-full="true" />`).join('\n')}
182
182
  </colgroup>
183
183
  <tbody>
184
184
  <tr>