docxmlater 10.3.6 → 10.4.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 (184) hide show
  1. package/README.md +158 -7
  2. package/dist/core/Document.d.ts +97 -3
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +727 -50
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentContent.d.ts.map +1 -1
  7. package/dist/core/DocumentContent.js +0 -8
  8. package/dist/core/DocumentContent.js.map +1 -1
  9. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  10. package/dist/core/DocumentGenerator.js +9 -5
  11. package/dist/core/DocumentGenerator.js.map +1 -1
  12. package/dist/core/DocumentParser.d.ts.map +1 -1
  13. package/dist/core/DocumentParser.js +573 -101
  14. package/dist/core/DocumentParser.js.map +1 -1
  15. package/dist/core/RelationshipManager.d.ts.map +1 -1
  16. package/dist/core/RelationshipManager.js +4 -3
  17. package/dist/core/RelationshipManager.js.map +1 -1
  18. package/dist/elements/Bookmark.d.ts +7 -0
  19. package/dist/elements/Bookmark.d.ts.map +1 -1
  20. package/dist/elements/Bookmark.js +24 -4
  21. package/dist/elements/Bookmark.js.map +1 -1
  22. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  23. package/dist/elements/BookmarkManager.js +4 -3
  24. package/dist/elements/BookmarkManager.js.map +1 -1
  25. package/dist/elements/CommonTypes.d.ts +2 -2
  26. package/dist/elements/CommonTypes.d.ts.map +1 -1
  27. package/dist/elements/CommonTypes.js +14 -1
  28. package/dist/elements/CommonTypes.js.map +1 -1
  29. package/dist/elements/Field.d.ts +1 -1
  30. package/dist/elements/Field.d.ts.map +1 -1
  31. package/dist/elements/Field.js +1 -1
  32. package/dist/elements/Field.js.map +1 -1
  33. package/dist/elements/Footer.d.ts +2 -0
  34. package/dist/elements/Footer.d.ts.map +1 -1
  35. package/dist/elements/Footer.js +6 -0
  36. package/dist/elements/Footer.js.map +1 -1
  37. package/dist/elements/Header.d.ts +2 -0
  38. package/dist/elements/Header.d.ts.map +1 -1
  39. package/dist/elements/Header.js +6 -0
  40. package/dist/elements/Header.js.map +1 -1
  41. package/dist/elements/Image.d.ts.map +1 -1
  42. package/dist/elements/Image.js +3 -0
  43. package/dist/elements/Image.js.map +1 -1
  44. package/dist/elements/Paragraph.d.ts +81 -1
  45. package/dist/elements/Paragraph.d.ts.map +1 -1
  46. package/dist/elements/Paragraph.js +515 -21
  47. package/dist/elements/Paragraph.js.map +1 -1
  48. package/dist/elements/Revision.d.ts +0 -1
  49. package/dist/elements/Revision.d.ts.map +1 -1
  50. package/dist/elements/Revision.js +0 -12
  51. package/dist/elements/Revision.js.map +1 -1
  52. package/dist/elements/RevisionManager.d.ts +0 -1
  53. package/dist/elements/RevisionManager.d.ts.map +1 -1
  54. package/dist/elements/RevisionManager.js +0 -2
  55. package/dist/elements/RevisionManager.js.map +1 -1
  56. package/dist/elements/Run.d.ts +16 -4
  57. package/dist/elements/Run.d.ts.map +1 -1
  58. package/dist/elements/Run.js +114 -22
  59. package/dist/elements/Run.js.map +1 -1
  60. package/dist/elements/Section.d.ts +7 -1
  61. package/dist/elements/Section.d.ts.map +1 -1
  62. package/dist/elements/Section.js +185 -4
  63. package/dist/elements/Section.js.map +1 -1
  64. package/dist/elements/Shape.js.map +1 -1
  65. package/dist/elements/Table.d.ts +30 -1
  66. package/dist/elements/Table.d.ts.map +1 -1
  67. package/dist/elements/Table.js +357 -40
  68. package/dist/elements/Table.js.map +1 -1
  69. package/dist/elements/TableCell.d.ts +3 -0
  70. package/dist/elements/TableCell.d.ts.map +1 -1
  71. package/dist/elements/TableCell.js +30 -3
  72. package/dist/elements/TableCell.js.map +1 -1
  73. package/dist/elements/TableGridChange.d.ts +0 -1
  74. package/dist/elements/TableGridChange.d.ts.map +1 -1
  75. package/dist/elements/TableGridChange.js +0 -10
  76. package/dist/elements/TableGridChange.js.map +1 -1
  77. package/dist/elements/TableRow.d.ts +4 -0
  78. package/dist/elements/TableRow.d.ts.map +1 -1
  79. package/dist/elements/TableRow.js +31 -3
  80. package/dist/elements/TableRow.js.map +1 -1
  81. package/dist/formatting/AbstractNumbering.d.ts +5 -0
  82. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  83. package/dist/formatting/AbstractNumbering.js +22 -0
  84. package/dist/formatting/AbstractNumbering.js.map +1 -1
  85. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  86. package/dist/formatting/NumberingLevel.js +3 -3
  87. package/dist/formatting/NumberingLevel.js.map +1 -1
  88. package/dist/formatting/Style.d.ts +1 -0
  89. package/dist/formatting/Style.d.ts.map +1 -1
  90. package/dist/formatting/Style.js +25 -59
  91. package/dist/formatting/Style.js.map +1 -1
  92. package/dist/formatting/StylesManager.d.ts +1 -0
  93. package/dist/formatting/StylesManager.d.ts.map +1 -1
  94. package/dist/formatting/StylesManager.js +12 -0
  95. package/dist/formatting/StylesManager.js.map +1 -1
  96. package/dist/helpers/CleanupHelper.js.map +1 -1
  97. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  98. package/dist/images/ImageOptimizer.js +0 -1
  99. package/dist/images/ImageOptimizer.js.map +1 -1
  100. package/dist/index.d.ts +1 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/managers/DrawingManager.d.ts.map +1 -1
  104. package/dist/managers/DrawingManager.js +4 -2
  105. package/dist/managers/DrawingManager.js.map +1 -1
  106. package/dist/types/formatting.d.ts +2 -2
  107. package/dist/types/formatting.d.ts.map +1 -1
  108. package/dist/types/formatting.js.map +1 -1
  109. package/dist/utils/ChangelogGenerator.d.ts +2 -2
  110. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  111. package/dist/utils/ChangelogGenerator.js +4 -5
  112. package/dist/utils/ChangelogGenerator.js.map +1 -1
  113. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  114. package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
  115. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  116. package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
  117. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  118. package/dist/utils/RevisionAwareProcessor.js +2 -2
  119. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  120. package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
  121. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  122. package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
  123. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  124. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  125. package/dist/utils/ShadingResolver.js.map +1 -1
  126. package/dist/utils/acceptRevisions.js +1 -1
  127. package/dist/utils/acceptRevisions.js.map +1 -1
  128. package/dist/utils/stripTrackedChanges.js +1 -1
  129. package/dist/utils/stripTrackedChanges.js.map +1 -1
  130. package/dist/utils/units.d.ts.map +1 -1
  131. package/dist/utils/units.js +1 -1
  132. package/dist/utils/units.js.map +1 -1
  133. package/dist/validation/RevisionAutoFixer.d.ts +2 -1
  134. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  135. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  136. package/package.json +10 -1
  137. package/src/constants/CLAUDE.md +28 -0
  138. package/src/core/CLAUDE.md +4 -0
  139. package/src/core/Document.ts +1755 -85
  140. package/src/core/DocumentContent.ts +0 -11
  141. package/src/core/DocumentGenerator.ts +11 -12
  142. package/src/core/DocumentParser.ts +599 -138
  143. package/src/core/RelationshipManager.ts +6 -3
  144. package/src/elements/Bookmark.ts +39 -4
  145. package/src/elements/BookmarkManager.ts +4 -3
  146. package/src/elements/CLAUDE.md +18 -2
  147. package/src/elements/CommonTypes.ts +35 -8
  148. package/src/elements/Field.ts +1 -1
  149. package/src/elements/Footer.ts +23 -0
  150. package/src/elements/Header.ts +25 -0
  151. package/src/elements/Image.ts +5 -0
  152. package/src/elements/Paragraph.ts +1069 -41
  153. package/src/elements/Revision.ts +0 -19
  154. package/src/elements/RevisionManager.ts +1 -3
  155. package/src/elements/Run.ts +265 -35
  156. package/src/elements/Section.ts +214 -8
  157. package/src/elements/Shape.ts +1 -1
  158. package/src/elements/Table.ts +850 -61
  159. package/src/elements/TableCell.ts +84 -10
  160. package/src/elements/TableGridChange.ts +2 -16
  161. package/src/elements/TableRow.ts +94 -9
  162. package/src/formatting/AbstractNumbering.ts +42 -1
  163. package/src/formatting/CLAUDE.md +4 -0
  164. package/src/formatting/NumberingLevel.ts +11 -7
  165. package/src/formatting/Style.ts +39 -71
  166. package/src/formatting/StylesManager.ts +36 -0
  167. package/src/helpers/CleanupHelper.ts +1 -1
  168. package/src/images/ImageOptimizer.ts +0 -3
  169. package/src/index.ts +1 -1
  170. package/src/managers/DrawingManager.ts +5 -3
  171. package/src/tracking/CLAUDE.md +30 -0
  172. package/src/types/CLAUDE.md +39 -0
  173. package/src/types/formatting.ts +2 -2
  174. package/src/utils/CLAUDE.md +15 -0
  175. package/src/utils/ChangelogGenerator.ts +4 -5
  176. package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
  177. package/src/utils/RevisionAwareProcessor.ts +2 -3
  178. package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
  179. package/src/utils/ShadingResolver.ts +0 -1
  180. package/src/utils/acceptRevisions.ts +1 -1
  181. package/src/utils/stripTrackedChanges.ts +1 -1
  182. package/src/utils/units.ts +2 -1
  183. package/src/validation/CLAUDE.md +40 -0
  184. package/src/validation/RevisionAutoFixer.ts +2 -1
@@ -96,6 +96,8 @@ export interface PageSize {
96
96
  height: number;
97
97
  /** Orientation */
98
98
  orientation?: PageOrientation;
99
+ /** Paper size code per ECMA-376 ST_PaperSize (1=Letter, 9=A4, 5=Legal, etc.) */
100
+ code?: number;
99
101
  }
100
102
 
101
103
  /**
@@ -132,6 +134,8 @@ export interface Columns {
132
134
  separator?: boolean;
133
135
  /** Individual column widths (for unequal columns) in twips */
134
136
  columnWidths?: number[];
137
+ /** Individual column spacings (space after each column) in twips — per ECMA-376 CT_Column */
138
+ columnSpaces?: number[];
135
139
  }
136
140
 
137
141
  /**
@@ -560,6 +564,16 @@ export class Section {
560
564
  : undefined;
561
565
  }
562
566
 
567
+ /**
568
+ * Gets per-column spacing (space after each column) in twips
569
+ * @returns Array of column spacings, or undefined if not set
570
+ */
571
+ getColumnSpaces(): number[] | undefined {
572
+ return this.properties.columns?.columnSpaces
573
+ ? [...this.properties.columns.columnSpaces]
574
+ : undefined;
575
+ }
576
+
563
577
  /**
564
578
  * Gets the text direction
565
579
  * @returns Text direction or undefined if not set
@@ -1107,6 +1121,9 @@ export class Section {
1107
1121
  if (this.properties.pageSize.orientation === 'landscape') {
1108
1122
  attrs['w:orient'] = 'landscape';
1109
1123
  }
1124
+ if (this.properties.pageSize.code !== undefined) {
1125
+ attrs['w:code'] = this.properties.pageSize.code.toString();
1126
+ }
1110
1127
  children.push(XMLBuilder.wSelf('pgSz', attrs));
1111
1128
  }
1112
1129
 
@@ -1229,8 +1246,17 @@ export class Section {
1229
1246
 
1230
1247
  const colChildren: XMLElement[] = [];
1231
1248
  if (this.properties.columns.columnWidths) {
1232
- for (const width of this.properties.columns.columnWidths) {
1233
- colChildren.push(XMLBuilder.wSelf('col', { 'w:w': width.toString() }));
1249
+ const widths = this.properties.columns.columnWidths;
1250
+ const spaces = this.properties.columns.columnSpaces;
1251
+ for (let i = 0; i < widths.length; i++) {
1252
+ const colAttrs: Record<string, string | number> = {
1253
+ 'w:w': widths[i]!.toString(),
1254
+ };
1255
+ const spaceVal = spaces?.[i];
1256
+ if (spaceVal !== undefined) {
1257
+ colAttrs['w:space'] = spaceVal.toString();
1258
+ }
1259
+ colChildren.push(XMLBuilder.wSelf('col', colAttrs));
1234
1260
  }
1235
1261
  }
1236
1262
 
@@ -1324,8 +1350,50 @@ export class Section {
1324
1350
  const prevChildren: XMLElement[] = [];
1325
1351
  const prev = this.sectPrChange.previousProperties;
1326
1352
  if (prev) {
1327
- // Ordered per CT_SectPrBase:
1328
- // typepgSzpgMarlnNumTypepgNumTypecolsformProt vAlign → titlePg → textDirection
1353
+ // Ordered per CT_SectPrBase (ECMA-376 §17.6.18):
1354
+ // footnotePrendnotePrtypepgSzpgMarpaperSrcpgBorders
1355
+ // lnNumType → pgNumType → cols → formProt → vAlign → noEndnote → titlePg →
1356
+ // textDirection → bidi → rtlGutter → docGrid
1357
+ if (prev.footnotePr) {
1358
+ const fnChildren: XMLElement[] = [];
1359
+ if (prev.footnotePr.position) {
1360
+ fnChildren.push(XMLBuilder.wSelf('pos', { 'w:val': prev.footnotePr.position }));
1361
+ }
1362
+ if (prev.footnotePr.numberFormat) {
1363
+ fnChildren.push(XMLBuilder.wSelf('numFmt', { 'w:val': prev.footnotePr.numberFormat }));
1364
+ }
1365
+ if (prev.footnotePr.startNumber !== undefined) {
1366
+ fnChildren.push(
1367
+ XMLBuilder.wSelf('numStart', { 'w:val': prev.footnotePr.startNumber.toString() })
1368
+ );
1369
+ }
1370
+ if (prev.footnotePr.restart) {
1371
+ fnChildren.push(XMLBuilder.wSelf('numRestart', { 'w:val': prev.footnotePr.restart }));
1372
+ }
1373
+ if (fnChildren.length > 0) {
1374
+ prevChildren.push(XMLBuilder.w('footnotePr', undefined, fnChildren));
1375
+ }
1376
+ }
1377
+ if (prev.endnotePr) {
1378
+ const enChildren: XMLElement[] = [];
1379
+ if (prev.endnotePr.position) {
1380
+ enChildren.push(XMLBuilder.wSelf('pos', { 'w:val': prev.endnotePr.position }));
1381
+ }
1382
+ if (prev.endnotePr.numberFormat) {
1383
+ enChildren.push(XMLBuilder.wSelf('numFmt', { 'w:val': prev.endnotePr.numberFormat }));
1384
+ }
1385
+ if (prev.endnotePr.startNumber !== undefined) {
1386
+ enChildren.push(
1387
+ XMLBuilder.wSelf('numStart', { 'w:val': prev.endnotePr.startNumber.toString() })
1388
+ );
1389
+ }
1390
+ if (prev.endnotePr.restart) {
1391
+ enChildren.push(XMLBuilder.wSelf('numRestart', { 'w:val': prev.endnotePr.restart }));
1392
+ }
1393
+ if (enChildren.length > 0) {
1394
+ prevChildren.push(XMLBuilder.w('endnotePr', undefined, enChildren));
1395
+ }
1396
+ }
1329
1397
  if (prev.type) {
1330
1398
  prevChildren.push(XMLBuilder.wSelf('type', { 'w:val': prev.type }));
1331
1399
  }
@@ -1337,6 +1405,9 @@ export class Section {
1337
1405
  if (prev.pageSize.orientation === 'landscape') {
1338
1406
  pgSzAttrs['w:orient'] = 'landscape';
1339
1407
  }
1408
+ if (prev.pageSize.code !== undefined) {
1409
+ pgSzAttrs['w:code'] = prev.pageSize.code.toString();
1410
+ }
1340
1411
  prevChildren.push(XMLBuilder.wSelf('pgSz', pgSzAttrs));
1341
1412
  }
1342
1413
  if (prev.margins) {
@@ -1351,8 +1422,50 @@ export class Section {
1351
1422
  pgMarAttrs['w:header'] = prev.margins.header.toString();
1352
1423
  if (prev.margins.footer !== undefined)
1353
1424
  pgMarAttrs['w:footer'] = prev.margins.footer.toString();
1425
+ if (prev.margins.gutter !== undefined)
1426
+ pgMarAttrs['w:gutter'] = prev.margins.gutter.toString();
1354
1427
  prevChildren.push(XMLBuilder.wSelf('pgMar', pgMarAttrs));
1355
1428
  }
1429
+ if (prev.paperSource) {
1430
+ const psAttrs: Record<string, string> = {};
1431
+ if (prev.paperSource.first !== undefined) {
1432
+ psAttrs['w:first'] = prev.paperSource.first.toString();
1433
+ }
1434
+ if (prev.paperSource.other !== undefined) {
1435
+ psAttrs['w:other'] = prev.paperSource.other.toString();
1436
+ }
1437
+ if (Object.keys(psAttrs).length > 0) {
1438
+ prevChildren.push(XMLBuilder.wSelf('paperSrc', psAttrs));
1439
+ }
1440
+ }
1441
+ if (prev.pageBorders) {
1442
+ const pgb = prev.pageBorders;
1443
+ const pgbAttrs: Record<string, string> = {};
1444
+ if (pgb.offsetFrom) pgbAttrs['w:offsetFrom'] = pgb.offsetFrom;
1445
+ if (pgb.display) pgbAttrs['w:display'] = pgb.display;
1446
+ if (pgb.zOrder) pgbAttrs['w:zOrder'] = pgb.zOrder;
1447
+ const borderChildren: XMLElement[] = [];
1448
+ const buildPrevBorder = (side: string, def: PageBorderDef) => {
1449
+ const bAttrs: Record<string, string | number> = {};
1450
+ if (def.style) bAttrs['w:val'] = def.style;
1451
+ if (def.size !== undefined) bAttrs['w:sz'] = Math.max(2, Math.min(96, def.size));
1452
+ if (def.color) bAttrs['w:color'] = def.color;
1453
+ if (def.space !== undefined)
1454
+ bAttrs['w:space'] = Math.max(0, Math.min(31680, def.space));
1455
+ if (def.shadow) bAttrs['w:shadow'] = '1';
1456
+ if (def.frame) bAttrs['w:frame'] = '1';
1457
+ if (def.themeColor) bAttrs['w:themeColor'] = def.themeColor;
1458
+ if (def.artId !== undefined) bAttrs['w:id'] = def.artId;
1459
+ borderChildren.push(XMLBuilder.wSelf(side, bAttrs));
1460
+ };
1461
+ if (pgb.top) buildPrevBorder('top', pgb.top);
1462
+ if (pgb.left) buildPrevBorder('left', pgb.left);
1463
+ if (pgb.bottom) buildPrevBorder('bottom', pgb.bottom);
1464
+ if (pgb.right) buildPrevBorder('right', pgb.right);
1465
+ if (borderChildren.length > 0) {
1466
+ prevChildren.push(XMLBuilder.w('pgBorders', pgbAttrs, borderChildren));
1467
+ }
1468
+ }
1356
1469
  if (prev.lineNumbering) {
1357
1470
  const lnAttrs: Record<string, string> = {};
1358
1471
  if (prev.lineNumbering.countBy !== undefined)
@@ -1380,7 +1493,32 @@ export class Section {
1380
1493
  'w:num': prev.columns.count?.toString() || '1',
1381
1494
  };
1382
1495
  if (prev.columns.space !== undefined) colAttrs['w:space'] = prev.columns.space.toString();
1383
- prevChildren.push(XMLBuilder.wSelf('cols', colAttrs));
1496
+ if (prev.columns.equalWidth !== undefined) {
1497
+ colAttrs['w:equalWidth'] = prev.columns.equalWidth ? '1' : '0';
1498
+ }
1499
+ if (prev.columns.separator !== undefined) {
1500
+ colAttrs['w:sep'] = prev.columns.separator ? '1' : '0';
1501
+ }
1502
+ const colChildren: XMLElement[] = [];
1503
+ if (prev.columns.columnWidths) {
1504
+ const widths = prev.columns.columnWidths;
1505
+ const spaces = prev.columns.columnSpaces;
1506
+ for (let i = 0; i < widths.length; i++) {
1507
+ const cAttrs: Record<string, string | number> = {
1508
+ 'w:w': widths[i]!.toString(),
1509
+ };
1510
+ const spaceVal = spaces?.[i];
1511
+ if (spaceVal !== undefined) {
1512
+ cAttrs['w:space'] = spaceVal.toString();
1513
+ }
1514
+ colChildren.push(XMLBuilder.wSelf('col', cAttrs));
1515
+ }
1516
+ }
1517
+ prevChildren.push(
1518
+ colChildren.length > 0
1519
+ ? XMLBuilder.w('cols', colAttrs, colChildren)
1520
+ : XMLBuilder.wSelf('cols', colAttrs)
1521
+ );
1384
1522
  }
1385
1523
  if (prev.formProt) {
1386
1524
  prevChildren.push(XMLBuilder.wSelf('formProt'));
@@ -1388,6 +1526,9 @@ export class Section {
1388
1526
  if (prev.verticalAlignment) {
1389
1527
  prevChildren.push(XMLBuilder.wSelf('vAlign', { 'w:val': prev.verticalAlignment }));
1390
1528
  }
1529
+ if (prev.noEndnote) {
1530
+ prevChildren.push(XMLBuilder.wSelf('noEndnote'));
1531
+ }
1391
1532
  if (prev.titlePage) {
1392
1533
  prevChildren.push(XMLBuilder.wSelf('titlePg'));
1393
1534
  }
@@ -1408,6 +1549,12 @@ export class Section {
1408
1549
  })
1409
1550
  );
1410
1551
  }
1552
+ if (prev.bidi) {
1553
+ prevChildren.push(XMLBuilder.wSelf('bidi'));
1554
+ }
1555
+ if (prev.rtlGutter) {
1556
+ prevChildren.push(XMLBuilder.wSelf('rtlGutter'));
1557
+ }
1411
1558
  if (prev.docGrid) {
1412
1559
  const dgAttrs: Record<string, string> = {};
1413
1560
  if (prev.docGrid.type) dgAttrs['w:type'] = prev.docGrid.type;
@@ -1449,6 +1596,9 @@ export class Section {
1449
1596
  columnWidths: this.properties.columns.columnWidths
1450
1597
  ? [...this.properties.columns.columnWidths]
1451
1598
  : undefined,
1599
+ columnSpaces: this.properties.columns.columnSpaces
1600
+ ? [...this.properties.columns.columnSpaces]
1601
+ : undefined,
1452
1602
  };
1453
1603
  }
1454
1604
 
@@ -1520,12 +1670,68 @@ export class Section {
1520
1670
  });
1521
1671
  }
1522
1672
 
1673
+ /**
1674
+ * Creates a legal-sized section (8.5" x 14")
1675
+ */
1676
+ static createLegal(): Section {
1677
+ return new Section({
1678
+ pageSize: {
1679
+ width: PAGE_SIZES.LEGAL.width,
1680
+ height: PAGE_SIZES.LEGAL.height,
1681
+ orientation: 'portrait',
1682
+ },
1683
+ });
1684
+ }
1685
+
1686
+ /**
1687
+ * Creates a tabloid-sized section (11" x 17")
1688
+ */
1689
+ static createTabloid(): Section {
1690
+ return new Section({
1691
+ pageSize: {
1692
+ width: PAGE_SIZES.TABLOID.width,
1693
+ height: PAGE_SIZES.TABLOID.height,
1694
+ orientation: 'portrait',
1695
+ },
1696
+ });
1697
+ }
1698
+
1699
+ /**
1700
+ * Creates an A3-sized section (29.7cm x 42cm)
1701
+ */
1702
+ static createA3(): Section {
1703
+ return new Section({
1704
+ pageSize: {
1705
+ width: PAGE_SIZES.A3.width,
1706
+ height: PAGE_SIZES.A3.height,
1707
+ orientation: 'portrait',
1708
+ },
1709
+ });
1710
+ }
1711
+
1523
1712
  /**
1524
1713
  * Creates a landscape section
1525
- * @param pageSize Page size (default: Letter)
1714
+ *
1715
+ * @param pageSize - Page size name (default: 'letter')
1716
+ * @returns Section with swapped width/height and landscape orientation
1717
+ *
1718
+ * @example
1719
+ * ```typescript
1720
+ * const landscape = Section.createLandscape('a4');
1721
+ * const legalLandscape = Section.createLandscape('legal');
1722
+ * ```
1526
1723
  */
1527
- static createLandscape(pageSize: 'letter' | 'a4' = 'letter'): Section {
1528
- const size = pageSize === 'a4' ? PAGE_SIZES.A4 : PAGE_SIZES.LETTER;
1724
+ static createLandscape(
1725
+ pageSize: 'letter' | 'a4' | 'legal' | 'tabloid' | 'a3' = 'letter'
1726
+ ): Section {
1727
+ const sizeMap: Record<string, { width: number; height: number }> = {
1728
+ letter: PAGE_SIZES.LETTER,
1729
+ a4: PAGE_SIZES.A4,
1730
+ legal: PAGE_SIZES.LEGAL,
1731
+ tabloid: PAGE_SIZES.TABLOID,
1732
+ a3: PAGE_SIZES.A3,
1733
+ };
1734
+ const size = sizeMap[pageSize] ?? PAGE_SIZES.LETTER;
1529
1735
  return new Section({
1530
1736
  pageSize: {
1531
1737
  width: size.height, // Swap for landscape
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
12
- import { inchesToEmus, pointsToHalfPoints } from '../utils/units';
12
+ import { pointsToHalfPoints } from '../utils/units';
13
13
  import { RunFormatting } from './Run';
14
14
  import {
15
15
  ImagePosition,