Browse Source

Added: Line, Reimplemented: Column, Row and Decoration

Marcin Ziąbek 4 years ago
parent
commit
f8057a840c
49 changed files with 1182 additions and 579 deletions
  1. 3 3
      QuestPDF.Examples/ChartExamples.cs
  2. 36 0
      QuestPDF.Examples/ColumnExamples.cs
  3. 5 5
      QuestPDF.Examples/ComplexLayoutBenchmark.cs
  4. 2 2
      QuestPDF.Examples/ContinousPage.cs
  5. 2 2
      QuestPDF.Examples/DebuggingTesting.cs
  6. 4 4
      QuestPDF.Examples/DefaultTextStyleExample.cs
  7. 4 4
      QuestPDF.Examples/DefaultTextStyleExamples.cs
  8. 6 6
      QuestPDF.Examples/DifferentHeaderOnFirstPageExample.cs
  9. 44 44
      QuestPDF.Examples/ElementExamples.cs
  10. 3 3
      QuestPDF.Examples/EnsureSpaceExample.cs
  11. 4 4
      QuestPDF.Examples/FrameExample.cs
  12. 5 5
      QuestPDF.Examples/ImageExamples.cs
  13. 50 0
      QuestPDF.Examples/LineExamples.cs
  14. 1 1
      QuestPDF.Examples/LoremPicsumExample.cs
  15. 6 6
      QuestPDF.Examples/Padding.cs
  16. 20 21
      QuestPDF.Examples/RowExamples.cs
  17. 2 2
      QuestPDF.Examples/ScaleToFitExamples.cs
  18. 2 2
      QuestPDF.Examples/ShowOnceExample.cs
  19. 3 3
      QuestPDF.Examples/SkipOnceExample.cs
  20. 27 27
      QuestPDF.Examples/TextBenchmark.cs
  21. 1 1
      QuestPDF.Examples/TextExamples.cs
  22. 21 21
      QuestPDF.ReportSample/Layouts/DifferentHeadersTemplate.cs
  23. 9 9
      QuestPDF.ReportSample/Layouts/PhotoTemplate.cs
  24. 10 10
      QuestPDF.ReportSample/Layouts/SectionTemplate.cs
  25. 16 16
      QuestPDF.ReportSample/Layouts/StandardReport.cs
  26. 7 7
      QuestPDF.ReportSample/Layouts/TableOfContentsTemplate.cs
  27. 1 1
      QuestPDF.ReportSample/Tests.cs
  28. 54 54
      QuestPDF.UnitTests/GridTests.cs
  29. 15 15
      QuestPDF.UnitTests/RowTests.cs
  30. 27 27
      QuestPDF.UnitTests/StackTests.cs
  31. 3 3
      QuestPDF/Drawing/DocumentContainer.cs
  32. 118 0
      QuestPDF/Elements/Column.cs
  33. 65 61
      QuestPDF/Elements/Decoration.cs
  34. 101 0
      QuestPDF/Elements/DecorationOld.cs
  35. 6 6
      QuestPDF/Elements/Grid.cs
  36. 45 0
      QuestPDF/Elements/Line.cs
  37. 0 25
      QuestPDF/Elements/PreventPaging.cs
  38. 98 116
      QuestPDF/Elements/Row.cs
  39. 179 0
      QuestPDF/Elements/RowOld.cs
  40. 5 3
      QuestPDF/Elements/Stack.cs
  41. 47 0
      QuestPDF/Fluent/ColumnExtensions.cs
  42. 1 1
      QuestPDF/Fluent/DecorationExtensions.cs
  43. 1 6
      QuestPDF/Fluent/ElementExtensions.cs
  44. 36 0
      QuestPDF/Fluent/LineExtensions.cs
  45. 33 10
      QuestPDF/Fluent/RowExtensions.cs
  46. 44 0
      QuestPDF/Fluent/RowOldExtensions.cs
  47. 0 33
      QuestPDF/Fluent/StackExtensions.cs
  48. 3 3
      QuestPDF/Fluent/TextExtensions.cs
  49. 7 7
      QuestPDF/Resources/Description.md

+ 3 - 3
QuestPDF.Examples/ChartExamples.cs

@@ -52,14 +52,14 @@ namespace QuestPDF.Examples
                     container
                         .Background(Colors.White)
                         .Padding(25)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack
+                            column
                                 .Item()
                                 .PaddingBottom(10)
                                 .Text("Chart example", TextStyle.Default.Size(20).SemiBold().Color(Colors.Blue.Medium));
                             
-                            stack
+                            column
                                 .Item()
                                 .Border(1)
                                 .ExtendHorizontal()

+ 36 - 0
QuestPDF.Examples/ColumnExamples.cs

@@ -0,0 +1,36 @@
+using NUnit.Framework;
+using QuestPDF.Examples.Engine;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Examples
+{
+    public class ColumnExamples
+    {
+        [Test]
+        public void Column()
+        {
+            RenderingTest
+                .Create()
+                .PageSize(PageSizes.A4)
+                .ShowResults()
+                .ProducePdf()
+                .Render(container =>
+                {
+                    container.Column(column =>
+                    {
+                        column.Item().Element(Block);
+
+                        static void Block(IContainer container)
+                        {
+                            container
+                                .Width(100)
+                                .Height(100)
+                                .Background(Placeholders.BackgroundColor());
+                        }
+                    });
+                });
+        }
+    }
+}

+ 5 - 5
QuestPDF.Examples/ComplexLayoutBenchmark.cs

@@ -36,8 +36,8 @@ namespace QuestPDF.Examples
                     .BorderColor(Colors.Black)
                     .Row(row =>
                     {
-                        row.RelativeColumn().Element(x => GenerateStructure(x, level));
-                        row.RelativeColumn().Element(x => GenerateStructure(x, level));
+                        row.RelativeItem().Element(x => GenerateStructure(x, level));
+                        row.RelativeItem().Element(x => GenerateStructure(x, level));
                     });
             }
             else
@@ -45,10 +45,10 @@ namespace QuestPDF.Examples
                 container
                     .Border(level / 4f)
                     .BorderColor(Colors.Black)
-                    .Stack(stack =>
+                    .Column(column =>
                     {
-                        stack.Item().Element(x => GenerateStructure(x, level));
-                        stack.Item().Element(x => GenerateStructure(x, level));
+                        column.Item().Element(x => GenerateStructure(x, level));
+                        column.Item().Element(x => GenerateStructure(x, level));
                     });
             }
         }

+ 2 - 2
QuestPDF.Examples/ContinousPage.cs

@@ -22,10 +22,10 @@ namespace QuestPDF.Examples
                 
                 page.Header().Text("Header");
                 
-                page.Content().PaddingVertical(10).Border(1).Padding(10).Stack(stack =>
+                page.Content().PaddingVertical(10).Border(1).Padding(10).Column(column =>
                 {
                     foreach (var index in Enumerable.Range(1, 100))
-                        stack.Item().Text($"Line {index}", TextStyle.Default.Color(Placeholders.Color()));
+                        column.Item().Text($"Line {index}", TextStyle.Default.Color(Placeholders.Color()));
                 });
                 
                 page.Footer().Text("Footer");

+ 2 - 2
QuestPDF.Examples/DebuggingTesting.cs

@@ -9,7 +9,7 @@ namespace QuestPDF.Examples
     public class DebuggingTesting
     {
         [Test]
-        public void Stack()
+        public void column()
         {
             Assert.Throws<DocumentLayoutException>(() =>
             {
@@ -23,7 +23,7 @@ namespace QuestPDF.Examples
                             .Width(100)
                             .Background(Colors.Grey.Lighten3)
                             .DebugPointer("Example debug pointer")
-                            .Stack(x =>
+                            .Column(x =>
                             {
                                 x.Item().Text("Test");
                                 x.Item().Width(150);

+ 4 - 4
QuestPDF.Examples/DefaultTextStyleExample.cs

@@ -13,7 +13,7 @@ namespace QuestPDF.Examples
         {
             RenderingTest
                 .Create()
-                .ProduceImages()
+                .ProducePdf()
                 .ShowResults()
                 .RenderDocument(container =>
                 {
@@ -26,11 +26,11 @@ namespace QuestPDF.Examples
                         page.Size(PageSizes.A4);
                         page.Background(Colors.White);
         
-                        page.Content().Stack(stack =>
+                        page.Content().Column(column =>
                         {
-                            stack.Item().Text(Placeholders.Sentence());
+                            column.Item().Text(Placeholders.Sentence());
                         
-                            stack.Item().Text(text =>
+                            column.Item().Text(text =>
                             {
                                 // text in this block is additionally semibold
                                 text.DefaultTextStyle(TextStyle.Default.SemiBold());

+ 4 - 4
QuestPDF.Examples/DefaultTextStyleExamples.cs

@@ -24,12 +24,12 @@ namespace QuestPDF.Examples
                     container
                         .Padding(10)
                         .DefaultTextStyle(TextStyle.Default.Bold().Underline())
-                        .Stack(stack =>
+                        .Column(column =>
                         { 
-                            stack.Item().Text("Default style applies to all children", TextStyle.Default);
-                            stack.Item().Text("You can override certain styles", TextStyle.Default.Underline(false).Color(Colors.Green.Darken2));
+                            column.Item().Text("Default style applies to all children", TextStyle.Default);
+                            column.Item().Text("You can override certain styles", TextStyle.Default.Underline(false).Color(Colors.Green.Darken2));
                             
-                            stack.Item().PaddingTop(10).Border(1).Grid(grid =>
+                            column.Item().PaddingTop(10).Border(1).Grid(grid =>
                             {
                                 grid.Columns(4);
 

+ 6 - 6
QuestPDF.Examples/DifferentHeaderOnFirstPageExample.cs

@@ -26,18 +26,18 @@ namespace QuestPDF.Examples
                         page.Margin(30);
                         page.Background(Colors.White);
                         
-                        page.Header().Stack(stack =>
+                        page.Header().Column(column =>
                         {
-                            stack.Item().ShowOnce().Background(Colors.Blue.Lighten2).Height(60);
-                            stack.Item().SkipOnce().Background(Colors.Green.Lighten2).Height(40);
+                            column.Item().ShowOnce().Background(Colors.Blue.Lighten2).Height(60);
+                            column.Item().SkipOnce().Background(Colors.Green.Lighten2).Height(40);
                         });
                         
-                        page.Content().PaddingVertical(10).Stack(stack =>
+                        page.Content().PaddingVertical(10).Column(column =>
                         {
-                            stack.Spacing(10);
+                            column.Spacing(10);
 
                             foreach (var _ in Enumerable.Range(0, 13))
-                                stack.Item().Background(Colors.Grey.Lighten2).Height(40);
+                                column.Item().Background(Colors.Grey.Lighten2).Height(40);
                         });
                         
                         page.Footer().AlignCenter().Text(text =>

+ 44 - 44
QuestPDF.Examples/ElementExamples.cs

@@ -66,27 +66,27 @@ namespace QuestPDF.Examples
                     container
                         .Background("#FFF")
                         .Padding(20)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack.Item()
+                            column.Item()
                                 .PaddingBottom(10)
                                 .AlignCenter()
                                 .Text("This Row element is 700pt wide");
 
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.ConstantColumn(100)
+                                row.ConstantItem(100)
                                     .Background(Colors.Grey.Lighten1)
                                     .Padding(10)
                                     .ExtendVertical()
                                     .Text("This column is 100 pt wide");
 
-                                row.RelativeColumn()
+                                row.RelativeItem()
                                     .Background(Colors.Grey.Lighten2)
                                     .Padding(10)
                                     .Text("This column takes 1/3 of the available space (200pt)");
 
-                                row.RelativeColumn(2)
+                                row.RelativeItem(2)
                                     .Background(Colors.Grey.Lighten3)
                                     .Padding(10)
                                     .Text("This column takes 2/3 of the available space (400pt)");
@@ -109,15 +109,15 @@ namespace QuestPDF.Examples
                         .Row(row =>
                         {
                             row.Spacing(20);
-                            row.RelativeColumn(2).Border(1).Background(Colors.Grey.Lighten1);
-                            row.RelativeColumn(3).Border(1).Background(Colors.Grey.Lighten2);
-                            row.RelativeColumn(4).Border(1).Background(Colors.Grey.Lighten3);
+                            row.RelativeItem(2).Border(1).Background(Colors.Grey.Lighten1);
+                            row.RelativeItem(3).Border(1).Background(Colors.Grey.Lighten2);
+                            row.RelativeItem(4).Border(1).Background(Colors.Grey.Lighten3);
                         });
                 });
         }
     
         [Test]
-        public void Stack()
+        public void column()
         {
             RenderingTest
                 .Create()
@@ -127,13 +127,13 @@ namespace QuestPDF.Examples
                     container
                         .Background("#FFF")
                         .Padding(15)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack.Spacing(15);
+                            column.Spacing(15);
                     
-                            stack.Item().Background(Colors.Grey.Medium).Height(50);
-                            stack.Item().Background(Colors.Grey.Lighten1).Height(100);
-                            stack.Item().Background(Colors.Grey.Lighten2).Height(150);
+                            column.Item().Background(Colors.Grey.Medium).Height(50);
+                            column.Item().Background(Colors.Grey.Lighten1).Height(100);
+                            column.Item().Background(Colors.Grey.Lighten2).Height(150);
                         });
                 });
         }
@@ -267,12 +267,12 @@ namespace QuestPDF.Examples
                             layers
                                 .PrimaryLayer()
                                 .Padding(25)
-                                .Stack(stack =>
+                                .Column(column =>
                                 {
-                                    stack.Spacing(5);
+                                    column.Spacing(5);
                             
                                     foreach (var _ in Enumerable.Range(0, 7))
-                                        stack.Item().Text(Placeholders.Sentence());
+                                        column.Item().Text(Placeholders.Sentence());
                                 });
                         
                             // layer above the main content    
@@ -304,16 +304,16 @@ namespace QuestPDF.Examples
         //                 {
         //                     page.Header().PageNumber("Page {pdf:currentPage}");
         //             
-        //                     page.Content().Height(300).Stack(content =>
+        //                     page.Content().Height(300).column(content =>
         //                     {
         //                         content.Item().Height(200).Background(Colors.Grey.Lighten2);
         //                 
-        //                         content.Item().EnsureSpace(100).Stack(stack =>
+        //                         content.Item().EnsureSpace(100).column(column =>
         //                         {
-        //                             stack.Spacing(10);
+        //                             column.Spacing(10);
         //                     
         //                             foreach (var _ in Enumerable.Range(0, 4))
-        //                                 stack.Item().Height(50).Background(Colors.Green.Lighten1);
+        //                                 column.Item().Height(50).Background(Colors.Green.Lighten1);
         //                         }); 
         //                     });
         //                 });
@@ -378,7 +378,7 @@ namespace QuestPDF.Examples
                         .Row(row =>
                         {
                             foreach (var color in colors)
-                                row.RelativeColumn().Background(color);
+                                row.RelativeItem().Background(color);
                         });
                 });
         }
@@ -437,10 +437,10 @@ namespace QuestPDF.Examples
                         {
                             layers.Layer().Text("Something else");
                     
-                            layers.PrimaryLayer().Stack(stack =>
+                            layers.PrimaryLayer().Column(column =>
                             {
-                                stack.Item().PaddingTop(20).Text("Text 1");
-                                stack.Item().PaddingTop(40).Text("Text 2");
+                                column.Item().PaddingTop(20).Text("Text 1");
+                                column.Item().PaddingTop(40).Text("Text 2");
                             });
                     
                             layers.Layer().Canvas((canvas, size) =>
@@ -507,7 +507,7 @@ namespace QuestPDF.Examples
     
                             decoration
                                 .Content()
-                                .Stack(stack =>
+                                .Column(column =>
                                 {
                                     var scales = new[] { 0.8f, 0.9f, 1.1f, 1.2f };
 
@@ -519,7 +519,7 @@ namespace QuestPDF.Examples
 
                                         var fontStyle = TextStyle.Default.Size(16);
                 
-                                        stack
+                                        column
                                             .Item()
                                             .Border(1)
                                             .Background(fontColor)
@@ -708,14 +708,14 @@ namespace QuestPDF.Examples
                         .Border(2)
                         .Row(row =>
                         {
-                            row.ConstantColumn(25)
+                            row.ConstantItem(25)
                                 .Border(1)
                                 .RotateLeft()
                                 .AlignCenter()
                                 .AlignMiddle()
                                 .Text("Sample text");
                             
-                            row.RelativeColumn().Border(1).Padding(5).Text(Placeholders.Paragraph());
+                            row.RelativeItem().Border(1).Padding(5).Text(Placeholders.Paragraph());
                         });
                 });
         }
@@ -731,11 +731,11 @@ namespace QuestPDF.Examples
                     container
                         .Padding(25)
                         .PaddingLeft(75)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack.Item().Width(300).Height(150).Background(Colors.Blue.Lighten4);
+                            column.Item().Width(300).Height(150).Background(Colors.Blue.Lighten4);
                             
-                            stack
+                            column
                                 .Item()
                                 
                                 // creates an infinite space for its child
@@ -751,7 +751,7 @@ namespace QuestPDF.Examples
                                 
                                 .Background(Colors.Blue.Darken1);
                             
-                            stack.Item().Width(300).Height(150).Background(Colors.Blue.Lighten3);
+                            column.Item().Width(300).Height(150).Background(Colors.Blue.Lighten3);
                         });
                 });
         }
@@ -766,13 +766,13 @@ namespace QuestPDF.Examples
                 {
                     container
                         .Padding(25)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.RelativeColumn().LabelCell("Label 1");
+                                row.RelativeItem().LabelCell("Label 1");
                                 
-                                row.RelativeColumn(3).Grid(grid =>
+                                row.RelativeItem(3).Grid(grid =>
                                 {
                                     grid.Columns(3);
                                     
@@ -784,11 +784,11 @@ namespace QuestPDF.Examples
                                 });
                             });
                             
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.RelativeColumn().ValueCell().Text("Value 1");
+                                row.RelativeItem().ValueCell().Text("Value 1");
                                 
-                                row.RelativeColumn(3).Grid(grid =>
+                                row.RelativeItem(3).Grid(grid =>
                                 {
                                     grid.Columns(3);
                                     
@@ -800,10 +800,10 @@ namespace QuestPDF.Examples
                                 });
                             });
                             
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.RelativeColumn().LabelCell("Label 6");
-                                row.RelativeColumn().ValueCell().Text("Value 6");
+                                row.RelativeItem().LabelCell("Label 6");
+                                row.RelativeItem().ValueCell().Text("Value 6");
                             });
                         });
                 });

+ 3 - 3
QuestPDF.Examples/EnsureSpaceExample.cs

@@ -25,15 +25,15 @@ namespace QuestPDF.Examples
                         
                         page.Header().Text("With ensure space", TextStyle.Default.SemiBold());
                         
-                        page.Content().Stack(stack =>
+                        page.Content().Column(column =>
                         {
-                            stack
+                            column
                                 .Item()
                                 .ExtendHorizontal()
                                 .Height(75)
                                 .Background(Colors.Grey.Lighten2);
                             
-                            stack
+                            column
                                 .Item()
                                 .EnsureSpace(100)
                                 .Text(Placeholders.LoremIpsum());

+ 4 - 4
QuestPDF.Examples/FrameExample.cs

@@ -36,14 +36,14 @@ namespace QuestPDF.Examples
                     container
                         .Background("#FFF")
                         .Padding(25)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
                             for(var i = 1; i <= 4; i++)
                             {
-                                stack.Item().Row(row =>
+                                column.Item().Row(row =>
                                 {
-                                    row.RelativeColumn(2).LabelCell(Placeholders.Label());
-                                    row.RelativeColumn(3).ValueCell().Text(Placeholders.Paragraph());
+                                    row.RelativeItem(2).LabelCell(Placeholders.Label());
+                                    row.RelativeItem(3).ValueCell().Text(Placeholders.Paragraph());
                                 });
                             }
                         });

+ 5 - 5
QuestPDF.Examples/ImageExamples.cs

@@ -19,17 +19,17 @@ namespace QuestPDF.Examples
                 .ShowResults()
                 .Render(page =>
                 {
-                    page.Padding(25).Stack(stack =>
+                    page.Padding(25).Column(column =>
                     {
-                        stack.Spacing(25);
+                        column.Spacing(25);
                         
-                        stack.Item().Image("logo.png");
+                        column.Item().Image("logo.png");
 
                         var binaryData = File.ReadAllBytes("logo.png");
-                        stack.Item().Image(binaryData);
+                        column.Item().Image(binaryData);
                         
                         using var stream = new FileStream("logo.png", FileMode.Open);
-                        stack.Item().Image(stream);
+                        column.Item().Image(stream);
                     });
                 });
         }

+ 50 - 0
QuestPDF.Examples/LineExamples.cs

@@ -0,0 +1,50 @@
+using System.IO;
+using NUnit.Framework;
+using QuestPDF.Examples.Engine;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+
+namespace QuestPDF.Examples
+{
+    public class LineExamples
+    {
+        [Test]
+        public void LineHorizontal()
+        {
+            RenderingTest
+                .Create()
+                .PageSize(PageSizes.A5)
+                .ProducePdf()
+                .ShowResults()
+                .Render(container => 
+                {
+                    container.Padding(25).Column(column =>
+                    {
+                        column.Item().Text("Above text");
+                        column.Item().PaddingVertical(10).LineHorizontal(1).LineColor(Colors.Blue.Accent1);
+                        column.Item().Text("Below text");
+                    });
+                });
+        }
+        
+        [Test]
+        public void LineVertical()
+        {
+            RenderingTest
+                .Create()
+                .PageSize(PageSizes.A5)
+                .ProducePdf()
+                .ShowResults()
+                .Render(container => 
+                {
+                    container.Padding(25).Row(row =>
+                    {
+                        row.Spacing(25);
+                        // row.AutoItem().Text("Above text");
+                        // row.AutoItem().LineVertical(1).LineColor(Colors.Blue.Accent1);
+                        // row.AutoItem().Text("Below text");
+                    });
+                });
+        }
+    }
+}

+ 1 - 1
QuestPDF.Examples/LoremPicsumExample.cs

@@ -43,7 +43,7 @@ namespace QuestPDF.Examples
                     container
                         .Background("#FFF")
                         .Padding(25)
-                        .Stack(column =>
+                        .Column(column =>
                         {
                             column.Spacing(10);
 

+ 6 - 6
QuestPDF.Examples/Padding.cs

@@ -63,7 +63,7 @@ namespace QuestPDF.Examples
                 .Render(container =>
                 {
                     container
-                        .Stack(column =>
+                        .Column(column =>
                         {
                             column
                                 .Item()
@@ -113,14 +113,14 @@ namespace QuestPDF.Examples
                 .Render(container =>
                 {
                     container
-                        .Stack(column =>
+                        .Column(column =>
                         {
                             column
                                 .Item()
                                 .Height(150)
                                 .Row(row =>
                                 {
-                                    row.RelativeColumn()
+                                    row.RelativeItem()
                                         .Extend()
                                         .Background("FFF")
 
@@ -128,7 +128,7 @@ namespace QuestPDF.Examples
                                         .Width(50)
                                         .Background("444");
                             
-                                    row.RelativeColumn()
+                                    row.RelativeItem()
                                         .Extend()
                                         .Background("BBB")
 
@@ -142,7 +142,7 @@ namespace QuestPDF.Examples
                                 .Height(150)
                                 .Row(row =>
                                 {
-                                    row.RelativeColumn()
+                                    row.RelativeItem()
                                         .Extend()
                                         .Background("BBB")
 
@@ -150,7 +150,7 @@ namespace QuestPDF.Examples
                                         .Width(50)
                                         .Background("444");
                             
-                                    row.RelativeColumn()
+                                    row.RelativeItem()
                                         .Extend()
                                         .Background("BBB")
 

+ 20 - 21
QuestPDF.Examples/RowExamples.cs

@@ -9,7 +9,7 @@ namespace QuestPDF.Examples
     public class RowExamples
     {
         [Test]
-        public void ColumnTypes()
+        public void ItemTypes()
         {
             RenderingTest
                 .Create()
@@ -22,25 +22,24 @@ namespace QuestPDF.Examples
                         .Padding(25)
                         .MinimalBox()
                         .Border(1)
-                        .Stack(stack =>
+                        .Column(column =>
                         {
-                            stack.Item().LabelCell("Total width: 600px");
+                            column.Item().LabelCell("Total width: 600px");
                             
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.ConstantColumn(150).ValueCell("150px");
-                                row.ConstantColumn(100).ValueCell("100px");
-                                row.RelativeColumn(4).ValueCell("200px");
-                                row.RelativeColumn(3).ValueCell("150px");
+                                row.ConstantItem(150).ValueCell("150px");
+                                row.ConstantItem(100).ValueCell("100px");
+                                row.RelativeItem(4).ValueCell("200px");
+                                row.RelativeItem(3).ValueCell("150px");
                             });
                             
-                            stack.Item().Row(row =>
+                            column.Item().Row(row =>
                             {
-                                row.ConstantColumn(100).ValueCell("100px");
-                                row.ConstantColumn(50).ValueCell("50px");
-                                row.Column(constantWidth: 100, relativeWidth: 4).ValueCell("350px");
-                                row.RelativeColumn(2).ValueCell("100px");
-                                row.RelativeColumn(1).ValueCell("50px");
+                                row.ConstantItem(100).ValueCell("100px");
+                                row.ConstantItem(50).ValueCell("50px");
+                                row.RelativeItem(2).ValueCell("100px");
+                                row.RelativeItem(1).ValueCell("50px");
                             });
                         });
                 });
@@ -63,17 +62,17 @@ namespace QuestPDF.Examples
                         .Padding(25)
                         .Row(row =>
                         {
-                            row.RelativeColumn().Stack(stack =>
+                            row.RelativeItem().Column(column =>
                             {
-                                stack.Item().ShowOnce().Element(CreateBox).Text("X");
-                                stack.Item().Element(CreateBox).Text("1");
-                                stack.Item().Element(CreateBox).Text("2");
+                                column.Item().ShowOnce().Element(CreateBox).Text("X");
+                                column.Item().Element(CreateBox).Text("1");
+                                column.Item().Element(CreateBox).Text("2");
                             });
                                 
-                            row.RelativeColumn().Stack(stack =>
+                            row.RelativeItem().Column(column =>
                             {
-                                stack.Item().Element(CreateBox).Text("1");
-                                stack.Item().Element(CreateBox).Text("2");
+                                column.Item().Element(CreateBox).Text("1");
+                                column.Item().Element(CreateBox).Text("2");
                             });
                         });
                 });

+ 2 - 2
QuestPDF.Examples/ScaleToFitExamples.cs

@@ -19,13 +19,13 @@ namespace QuestPDF.Examples
                 .ShowResults()
                 .Render(container =>
                 {
-                    container.Padding(25).Stack(stack =>
+                    container.Padding(25).Column(column =>
                     {
                         var text = Placeholders.Paragraph();
 
                         foreach (var i in Enumerable.Range(0, 16))
                         {
-                            stack
+                            column
                                 .Item()
                                 .MinimalBox()
                                 .Border(1)

+ 2 - 2
QuestPDF.Examples/ShowOnceExample.cs

@@ -27,14 +27,14 @@ namespace QuestPDF.Examples
                         
                         page.Content().PaddingVertical(5).Row(row =>
                         {
-                            row.RelativeColumn()
+                            row.RelativeItem()
                                 .Background(Colors.Grey.Lighten2)
                                 .Border(1)
                                 .Padding(5)
                                 .ShowOnce()
                                 .Text(Placeholders.Label());
                             
-                            row.RelativeColumn(2)
+                            row.RelativeItem(2)
                                 .Border(1)
                                 .Padding(5)
                                 .Text(Placeholders.Paragraph());

+ 3 - 3
QuestPDF.Examples/SkipOnceExample.cs

@@ -23,10 +23,10 @@ namespace QuestPDF.Examples
                         page.Size(PageSizes.A7.Landscape());
                         page.Background(Colors.White);
         
-                        page.Header().Stack(stack =>
+                        page.Header().Column(column =>
                         {
-                            stack.Item().ShowOnce().Text("This header is visible on the first page.");
-                            stack.Item().SkipOnce().Text("This header is visible on the second page and all following.");
+                            column.Item().ShowOnce().Text("This header is visible on the first page.");
+                            column.Item().SkipOnce().Text("This header is visible on the second page and all following.");
                         });
                         
                         page.Content()

+ 27 - 27
QuestPDF.Examples/TextBenchmark.cs

@@ -117,16 +117,16 @@ namespace QuestPDF.Examples
                     {
                         decoration
                             .Content()
-                            .Stack(stack =>
+                            .Column(column =>
                             {
-                                stack.Item().Element(Title);
-                                stack.Item().PageBreak();
-                                stack.Item().Element(TableOfContents);
-                                stack.Item().PageBreak();
+                                column.Item().Element(Title);
+                                column.Item().PageBreak();
+                                column.Item().Element(TableOfContents);
+                                column.Item().PageBreak();
 
-                                Chapters(stack);
+                                Chapters(column);
 
-                                stack.Item().Element(Acknowledgements);
+                                column.Item().Element(Acknowledgements);
                             });
 
                         decoration.Footer().Element(Footer);
@@ -139,61 +139,61 @@ namespace QuestPDF.Examples
                     .Extend()
                     .PaddingBottom(200)
                     .AlignBottom()
-                    .Stack(stack =>
+                    .Column(column =>
                     {
-                        stack.Item().Text("Quo Vadis", TextStyle.Default.Size(72).Bold().Color(Colors.Blue.Darken2));
-                        stack.Item().Text("Henryk Sienkiewicz", TextStyle.Default.Size(24).Color(Colors.Grey.Darken2));
+                        column.Item().Text("Quo Vadis", TextStyle.Default.Size(72).Bold().Color(Colors.Blue.Darken2));
+                        column.Item().Text("Henryk Sienkiewicz", TextStyle.Default.Size(24).Color(Colors.Grey.Darken2));
                     });
             }
 
             void TableOfContents(IContainer container)
             {
-                container.Stack(stack =>
+                container.Column(column =>
                 {
-                    SectionTitle(stack, "Spis treści");
+                    SectionTitle(column, "Spis treści");
                     
                     foreach (var chapter in chapters)
                     {
-                        stack.Item().InternalLink(chapter.Title).Row(row =>
+                        column.Item().InternalLink(chapter.Title).Row(row =>
                         {
-                            row.RelativeColumn().Text(chapter.Title, normalStyle);
-                            row.ConstantColumn(100).AlignRight().Text(text => text.PageNumberOfLocation(chapter.Title, normalStyle));
+                            row.RelativeItem().Text(chapter.Title, normalStyle);
+                            row.ConstantItem(100).AlignRight().Text(text => text.PageNumberOfLocation(chapter.Title, normalStyle));
                         });
                     }
                 });
             }
 
-            void Chapters(StackDescriptor stack)
+            void Chapters(ColumnDescriptor column)
             {
                 foreach (var chapter in chapters)
                 {
-                    stack.Item().Element(container => Chapter(container, chapter.Title, chapter.Content));
+                    column.Item().Element(container => Chapter(container, chapter.Title, chapter.Content));
                 }
             }
             
             void Chapter(IContainer container, string title, string content)
             {
-                container.Stack(stack =>
+                container.Column(column =>
                 {
-                    SectionTitle(stack, title);
+                    SectionTitle(column, title);
   
-                    stack.Item().Text(text =>
+                    column.Item().Text(text =>
                     {
                         text.ParagraphSpacing(5);
                         text.Span(content, normalStyle);
                     });
                     
-                    stack.Item().PageBreak();
+                    column.Item().PageBreak();
                 });
             }
 
             void Acknowledgements(IContainer container)
             {
-                container.Stack(stack =>
+                container.Column(column =>
                 {
-                    SectionTitle(stack, "Podziękowania");
+                    SectionTitle(column, "Podziękowania");
                     
-                    stack.Item().Text(text =>
+                    column.Item().Text(text =>
                     {
                         text.DefaultTextStyle(normalStyle);
                         
@@ -204,10 +204,10 @@ namespace QuestPDF.Examples
                 });
             }
 
-            void SectionTitle(StackDescriptor stack, string text)
+            void SectionTitle(ColumnDescriptor column, string text)
             {
-                stack.Item().Location(text).Text(text, subtitleStyle);
-                stack.Item().PaddingTop(10).PaddingBottom(50).BorderBottom(1).BorderColor(Colors.Grey.Lighten2).ExtendHorizontal();
+                column.Item().Location(text).Text(text, subtitleStyle);
+                column.Item().PaddingTop(10).PaddingBottom(50).BorderBottom(1).BorderColor(Colors.Grey.Lighten2).ExtendHorizontal();
             }
             
             void Footer(IContainer container)

+ 1 - 1
QuestPDF.Examples/TextExamples.cs

@@ -126,7 +126,7 @@ namespace QuestPDF.Examples
         }
         
         [Test]
-        public void TextStack()
+        public void Textcolumn()
         {
             RenderingTest
                 .Create()

+ 21 - 21
QuestPDF.ReportSample/Layouts/DifferentHeadersTemplate.cs

@@ -26,58 +26,58 @@ namespace QuestPDF.ReportSample.Layouts
 
         private void ComposeHeader(IContainer container)
         {
-            container.Background(Colors.Grey.Lighten3).Border(1).Stack(stack =>
+            container.Background(Colors.Grey.Lighten3).Border(1).Column(column =>
             {
-                stack.Item().ShowOnce().Padding(5).AlignMiddle().Row(row =>
+                column.Item().ShowOnce().Padding(5).AlignMiddle().Row(row =>
                 {
-                    row.RelativeColumn(2).AlignMiddle().Text("PRIMARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
-                    row.RelativeColumn(1).AlignRight().MinimalBox().AlignMiddle().Background(Colors.Blue.Darken2).Padding(30);
+                    row.RelativeItem(2).AlignMiddle().Text("PRIMARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
+                    row.RelativeItem(1).AlignRight().MinimalBox().AlignMiddle().Background(Colors.Blue.Darken2).Padding(30);
                 });
-                stack.Item().SkipOnce().Padding(5).Row(row =>
+                column.Item().SkipOnce().Padding(5).Row(row =>
                 {
-                    row.RelativeColumn(2).Text("SECONDARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
-                    row.RelativeColumn(1).AlignRight().MinimalBox().Background(Colors.Blue.Lighten4).Padding(15);
+                    row.RelativeItem(2).Text("SECONDARY HEADER", TextStyle.Default.Color(Colors.Grey.Darken3).Size(30).Bold());
+                    row.RelativeItem(1).AlignRight().MinimalBox().Background(Colors.Blue.Lighten4).Padding(15);
                 });
             });
         }
 
         private void ComposeContent(IContainer container)
         {
-            container.Stack(stack =>
+            container.Column(column =>
             {
-                stack.Item().PaddingVertical(80).Text("First");
-                stack.Item().PageBreak();
-                stack.Item().PaddingVertical(80).Text("Second");
-                stack.Item().PageBreak();
-                stack.Item().PaddingVertical(80).Text("Third");
-                stack.Item().PageBreak();
+                column.Item().PaddingVertical(80).Text("First");
+                column.Item().PageBreak();
+                column.Item().PaddingVertical(80).Text("Second");
+                column.Item().PageBreak();
+                column.Item().PaddingVertical(80).Text("Third");
+                column.Item().PageBreak();
             });
         }
 
         private void ComposeFooter(IContainer container)
         {
-            container.Background(Colors.Grey.Lighten3).Stack(stack =>
+            container.Background(Colors.Grey.Lighten3).Column(column =>
             {
-                stack.Item().ShowOnce().Background(Colors.Grey.Lighten3).Row(row =>
+                column.Item().ShowOnce().Background(Colors.Grey.Lighten3).Row(row =>
                 {
-                    row.RelativeColumn().Text(x =>
+                    row.RelativeItem().Text(x =>
                     {
                         x.CurrentPageNumber();
                         x.Span(" / ");
                         x.TotalPages();
                     });
-                    row.RelativeColumn().AlignRight().Text("Footer for header");
+                    row.RelativeItem().AlignRight().Text("Footer for header");
                 });
 
-                stack.Item().SkipOnce().Background(Colors.Grey.Lighten3).Row(row =>
+                column.Item().SkipOnce().Background(Colors.Grey.Lighten3).Row(row =>
                 {
-                    row.RelativeColumn().Text(x =>
+                    row.RelativeItem().Text(x =>
                     {
                         x.CurrentPageNumber();
                         x.Span(" / ");
                         x.TotalPages();
                     });
-                    row.RelativeColumn().AlignRight().Text("Footer for every page except header");
+                    row.RelativeItem().AlignRight().Text("Footer for every page except header");
                 });
             });
         }

+ 9 - 9
QuestPDF.ReportSample/Layouts/PhotoTemplate.cs

@@ -17,11 +17,11 @@ namespace QuestPDF.ReportSample.Layouts
         {
             container
                 .ShowEntire()
-                .Stack(stack =>
+                .Column(column =>
                 {
-                    stack.Spacing(5);
-                    stack.Item().Element(PhotoWithMaps);
-                    stack.Item().Element(PhotoDetails);
+                    column.Spacing(5);
+                    column.Item().Element(PhotoWithMaps);
+                    column.Item().Element(PhotoDetails);
                 });
         }
         
@@ -30,14 +30,14 @@ namespace QuestPDF.ReportSample.Layouts
             container
                 .Row(row =>
                 {
-                    row.RelativeColumn(2).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
+                    row.RelativeItem(2).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
 
-                    row.RelativeColumn().PaddingLeft(5).Stack(stack =>
+                    row.RelativeItem().PaddingLeft(5).Column(column =>
                     {
-                        stack.Spacing(7f);
+                        column.Spacing(7f);
                         
-                        stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
-                        stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
+                        column.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
+                        column.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
                     });
                 });
         }

+ 10 - 10
QuestPDF.ReportSample/Layouts/SectionTemplate.cs

@@ -25,21 +25,21 @@ namespace QuestPDF.ReportSample.Layouts
                         .PaddingBottom(5)
                         .Text(Model.Title, Typography.Headline);
 
-                    decoration.Content().Border(0.75f).BorderColor(Colors.Grey.Medium).Stack(stack =>
+                    decoration.Content().Border(0.75f).BorderColor(Colors.Grey.Medium).Column(column =>
                     {
                         foreach (var part in Model.Parts)
                         {
-                            stack.Item().EnsureSpace(25).Row(row =>
+                            column.Item().EnsureSpace(25).Row(row =>
                             {
-                                row.ConstantColumn(150).LabelCell().Text(part.Label);
-                                var frame = row.RelativeColumn().ValueCell();
+                                row.ConstantItem(150).LabelCell().Text(part.Label);
+                                var frame = row.RelativeItem().ValueCell();
                             
                                 if (part is ReportSectionText text)
                                     frame.ShowEntire().Text(text.Text);
-                        
+                                
                                 if (part is ReportSectionMap map)
                                     frame.Element(x => MapElement(x, map));
-                        
+                                
                                 if (part is ReportSectionPhotos photos)
                                     frame.Element(x => PhotosElement(x, photos));
                             });
@@ -56,12 +56,12 @@ namespace QuestPDF.ReportSample.Layouts
                 return;
             }
 
-            container.ShowEntire().Stack(stack =>
+            container.ShowEntire().Column(column =>
             {
-                stack.Spacing(5);
+                column.Spacing(5);
                 
-                stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
-                stack.Item().Text(model.Location.Format());
+                column.Item().MaxWidth(250).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
+                column.Item().Text(model.Location.Format());
             });
         }
         

+ 16 - 16
QuestPDF.ReportSample/Layouts/StandardReport.cs

@@ -48,19 +48,19 @@ namespace QuestPDF.ReportSample.Layouts
 
         private void ComposeHeader(IContainer container)
         {
-            container.Stack(stack =>
+            container.Column(column =>
             {
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
                     row.Spacing(50);
                     
-                    row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
-                    row.ConstantColumn(90).ExternalLink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
+                    row.RelativeItem().PaddingTop(-10).Text(Model.Title, Typography.Title);
+                    row.ConstantItem(90).ExternalLink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
                 });
 
-                stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
+                column.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
                 
-                stack.Item().ShowOnce().Grid(grid =>
+                column.Item().ShowOnce().Grid(grid =>
                 {
                     grid.Columns(2);
                     grid.Spacing(5);
@@ -79,22 +79,22 @@ namespace QuestPDF.ReportSample.Layouts
 
         void ComposeContent(IContainer container)
         {
-            container.PaddingVertical(20).Stack(stack =>
+            container.PaddingVertical(20).Column(column =>
             {
-                stack.Spacing(20);
-
-                stack.Item().Component(new TableOfContentsTemplate(Model.Sections));
+                column.Spacing(20);
+                
+                column.Item().Component(new TableOfContentsTemplate(Model.Sections));
                 
-                stack.Item().PageBreak();
+                column.Item().PageBreak();
                 
                 foreach (var section in Model.Sections)
-                    stack.Item().Location(section.Title).Component(new SectionTemplate(section));
-
-                stack.Item().PageBreak();
-                stack.Item().Location("Photos");
+                    column.Item().Location(section.Title).Component(new SectionTemplate(section));
+                
+                column.Item().PageBreak();
+                column.Item().Location("Photos");
                 
                 foreach (var photo in Model.Photos)
-                    stack.Item().Component(new PhotoTemplate(photo));
+                    column.Item().Component(new PhotoTemplate(photo));
             });
         }
     }

+ 7 - 7
QuestPDF.ReportSample/Layouts/TableOfContentsTemplate.cs

@@ -23,14 +23,14 @@ namespace QuestPDF.ReportSample.Layouts
                         .PaddingBottom(5)
                         .Text("Table of contents", Typography.Headline);
 
-                    decoration.Content().Stack(stack =>
+                    decoration.Content().Column(column =>
                     {
-                        stack.Spacing(5);
+                        column.Spacing(5);
                         
                         for (var i = 0; i < Sections.Count; i++)
-                            stack.Item().Element(c => DrawLink(c, i+1, Sections[i].Title));
+                            column.Item().Element(c => DrawLink(c, i+1, Sections[i].Title));
 
-                        stack.Item().Element(c => DrawLink(c, Sections.Count+1, "Photos"));
+                        column.Item().Element(c => DrawLink(c, Sections.Count+1, "Photos"));
                     });
                 });
         }
@@ -41,9 +41,9 @@ namespace QuestPDF.ReportSample.Layouts
                 .InternalLink(locationName)
                 .Row(row =>
                 {
-                    row.ConstantColumn(25).Text($"{number}.");
-                    row.RelativeColumn().Text(locationName);
-                    row.ConstantColumn(150).AlignRight().Text(text => text.PageNumberOfLocation(locationName));
+                    row.ConstantItem(25).Text($"{number}.");
+                    row.RelativeItem().Text(locationName);
+                    row.ConstantItem(150).AlignRight().Text(text => text.PageNumberOfLocation(locationName));
                 });
         }
     }

+ 1 - 1
QuestPDF.ReportSample/Tests.cs

@@ -24,7 +24,7 @@ namespace QuestPDF.ReportSample
         [Test] 
         public void GenerateAndShowPdf()
         {
-            ImagePlaceholder.Solid = true;
+            //ImagePlaceholder.Solid = true;
         
             var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
             Report.GeneratePdf(path);

+ 54 - 54
QuestPDF.UnitTests/GridTests.cs

@@ -39,26 +39,26 @@ namespace QuestPDF.UnitTests
             // assert
             var expected = new Container();
             
-            expected.Stack(stack =>
+            expected.Column(column =>
             {
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(6).Element(childA);
-                    row.RelativeColumn(4).Element(childB);
-                    row.RelativeColumn(2);
+                    row.RelativeItem(6).Element(childA);
+                    row.RelativeItem(4).Element(childB);
+                    row.RelativeItem(2);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(4).Element(childC);
-                    row.RelativeColumn(2).Element(childD);
-                    row.RelativeColumn(6);
+                    row.RelativeItem(4).Element(childC);
+                    row.RelativeItem(2).Element(childD);
+                    row.RelativeItem(6);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(8).Element(childE);
-                    row.RelativeColumn(4);
+                    row.RelativeItem(8).Element(childE);
+                    row.RelativeItem(4);
                 });
             });
             
@@ -93,29 +93,29 @@ namespace QuestPDF.UnitTests
             // assert
             var expected = new Container();
             
-            expected.Stack(stack =>
+            expected.Column(column =>
             {
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(1);
-                    row.RelativeColumn(6).Element(childA);
-                    row.RelativeColumn(4).Element(childB);
-                    row.RelativeColumn(1);
+                    row.RelativeItem(1);
+                    row.RelativeItem(6).Element(childA);
+                    row.RelativeItem(4).Element(childB);
+                    row.RelativeItem(1);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(3);
-                    row.RelativeColumn(4).Element(childC);
-                    row.RelativeColumn(2).Element(childD);
-                    row.RelativeColumn(3);
+                    row.RelativeItem(3);
+                    row.RelativeItem(4).Element(childC);
+                    row.RelativeItem(2).Element(childD);
+                    row.RelativeItem(3);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(2);
-                    row.RelativeColumn(8).Element(childE);
-                    row.RelativeColumn(2);
+                    row.RelativeItem(2);
+                    row.RelativeItem(8).Element(childE);
+                    row.RelativeItem(2);
                 });
             });
 
@@ -150,26 +150,26 @@ namespace QuestPDF.UnitTests
             // assert
             var expected = new Container();
             
-            expected.Stack(stack =>
+            expected.Column(column =>
             {
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(2);
-                    row.RelativeColumn(6).Element(childA);
-                    row.RelativeColumn(4).Element(childB);
+                    row.RelativeItem(2);
+                    row.RelativeItem(6).Element(childA);
+                    row.RelativeItem(4).Element(childB);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(6);
-                    row.RelativeColumn(4).Element(childC);
-                    row.RelativeColumn(2).Element(childD);
+                    row.RelativeItem(6);
+                    row.RelativeItem(4).Element(childC);
+                    row.RelativeItem(2).Element(childD);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
-                    row.RelativeColumn(4);
-                    row.RelativeColumn(8).Element(childE);
+                    row.RelativeItem(4);
+                    row.RelativeItem(8).Element(childE);
                 });
             });
             
@@ -210,36 +210,36 @@ namespace QuestPDF.UnitTests
             // assert
             var expected = new Container();
             
-            expected.Stack(stack =>
+            expected.Column(column =>
             {
-                stack.Spacing(20);
+                column.Spacing(20);
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
                     row.Spacing(30);
                     
-                    row.RelativeColumn(3);
-                    row.RelativeColumn(5).Element(childA);
-                    row.RelativeColumn(5).Element(childB);
-                    row.RelativeColumn(3);
+                    row.RelativeItem(3);
+                    row.RelativeItem(5).Element(childA);
+                    row.RelativeItem(5).Element(childB);
+                    row.RelativeItem(3);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
                     row.Spacing(30);
                     
-                    row.RelativeColumn(3);
-                    row.RelativeColumn(10).Element(childC);
-                    row.RelativeColumn(3);
+                    row.RelativeItem(3);
+                    row.RelativeItem(10).Element(childC);
+                    row.RelativeItem(3);
                 });
                 
-                stack.Item().Row(row =>
+                column.Item().Row(row =>
                 {
                     row.Spacing(30);
                     
-                    row.RelativeColumn(2);
-                    row.RelativeColumn(12).Element(childD);
-                    row.RelativeColumn(2);
+                    row.RelativeItem(2);
+                    row.RelativeItem(12).Element(childD);
+                    row.RelativeItem(2);
                 });
             });
             

+ 15 - 15
QuestPDF.UnitTests/RowTests.cs

@@ -132,11 +132,11 @@ namespace QuestPDF.UnitTests
             {
                 row.Spacing(spacing);
                 
-                row.ConstantColumn(150).Element(childA);
-                row.ConstantColumn(250).Element(childB);
-                row.RelativeColumn(1).Element(childC);
-                row.RelativeColumn(2).Element(childD);
-                row.RelativeColumn(3).Element(childE);
+                row.ConstantItem(150).Element(childA);
+                row.ConstantItem(250).Element(childB);
+                row.RelativeItem(1).Element(childC);
+                row.RelativeItem(2).Element(childD);
+                row.RelativeItem(3).Element(childE);
             });
             
             // assert
@@ -146,11 +146,11 @@ namespace QuestPDF.UnitTests
             {
                 row.Spacing(spacing);
                 
-                row.ConstantColumn(150).Element(childA);
-                row.ConstantColumn(250).Element(childB);
-                row.ConstantColumn(100).Element(childC);
-                row.ConstantColumn(200).Element(childD);
-                row.ConstantColumn(300).Element(childE);
+                row.ConstantItem(150).Element(childA);
+                row.ConstantItem(250).Element(childB);
+                row.ConstantItem(100).Element(childC);
+                row.ConstantItem(200).Element(childD);
+                row.ConstantItem(300).Element(childE);
             });
             
             TestPlan.CompareOperations(value, expected, availableSpace);
@@ -176,11 +176,11 @@ namespace QuestPDF.UnitTests
             {
                 row.Spacing(spacing);
                 
-                row.ConstantColumn(150).Element(childA);
-                row.ConstantColumn(200).Element(childB);
-                row.ConstantColumn(250).Element(childC);
-                row.RelativeColumn(2).Element(childD);
-                row.RelativeColumn(3).Element(childE);
+                row.ConstantItem(150).Element(childA);
+                row.ConstantItem(200).Element(childB);
+                row.ConstantItem(250).Element(childC);
+                row.RelativeItem(2).Element(childD);
+                row.RelativeItem(3).Element(childE);
             });
             
             // assert

+ 27 - 27
QuestPDF.UnitTests/StackTests.cs

@@ -8,7 +8,7 @@ using QuestPDF.UnitTests.TestEngine;
 namespace QuestPDF.UnitTests
 {
     [TestFixture]
-    public class StackTests
+    public class columnTests
     {
         #region Measure
 
@@ -16,7 +16,7 @@ namespace QuestPDF.UnitTests
         public void Measure_ReturnsWrap_WhenFirstChildWraps()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -30,7 +30,7 @@ namespace QuestPDF.UnitTests
         public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -44,7 +44,7 @@ namespace QuestPDF.UnitTests
         public void Measure_ReturnsPartialRender_WhenSecondChildWraps()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -59,7 +59,7 @@ namespace QuestPDF.UnitTests
         public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -74,7 +74,7 @@ namespace QuestPDF.UnitTests
         public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -89,7 +89,7 @@ namespace QuestPDF.UnitTests
         public void Measure_UsesEmpty_WhenFirstChildIsRendered()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second"),
@@ -109,7 +109,7 @@ namespace QuestPDF.UnitTests
         public void Draw_WhenFirstChildWraps()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -123,7 +123,7 @@ namespace QuestPDF.UnitTests
         public void Draw_WhenFirstChildPartiallyRenders()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -138,7 +138,7 @@ namespace QuestPDF.UnitTests
         public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -154,7 +154,7 @@ namespace QuestPDF.UnitTests
         public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -173,7 +173,7 @@ namespace QuestPDF.UnitTests
         public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second")
@@ -192,7 +192,7 @@ namespace QuestPDF.UnitTests
         public void Draw_UsesEmpty_WhenFirstChildIsRendered()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second"),
@@ -204,7 +204,7 @@ namespace QuestPDF.UnitTests
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectCanvasTranslate(0, 0)
-                .CheckState<BinaryStack>(x => x.IsFirstRendered)
+                .CheckState<Binarycolumn>(x => x.IsFirstRendered)
                 .CheckDrawResult();
         }
         
@@ -212,7 +212,7 @@ namespace QuestPDF.UnitTests
         public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders()
         {
             TestPlan
-                .For(x => new BinaryStack
+                .For(x => new Binarycolumn
                 {
                     First = x.CreateChild("first"),
                     Second = x.CreateChild("second"),
@@ -225,7 +225,7 @@ namespace QuestPDF.UnitTests
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectCanvasTranslate(0, 0)
                 .CheckDrawResult()
-                .CheckState<BinaryStack>(x => !x.IsFirstRendered);
+                .CheckState<Binarycolumn>(x => !x.IsFirstRendered);
         }
         
         #endregion
@@ -247,15 +247,15 @@ namespace QuestPDF.UnitTests
             // act
             var structure = new Container();
             
-            structure.Stack(stack =>
+            structure.Column(column =>
             {
-                stack.Spacing(spacing);
+                column.Spacing(spacing);
                 
-                stack.Item().Element(childA);
-                stack.Item().Element(childB);
-                stack.Item().Element(childC);
-                stack.Item().Element(childD);
-                stack.Item().Element(childE);
+                column.Item().Element(childA);
+                column.Item().Element(childB);
+                column.Item().Element(childC);
+                column.Item().Element(childD);
+                column.Item().Element(childE);
             });
             
             // assert
@@ -263,9 +263,9 @@ namespace QuestPDF.UnitTests
             {
                 Bottom = -spacing,
 
-                Child = new BinaryStack
+                Child = new Binarycolumn
                 {
-                    First = new BinaryStack
+                    First = new Binarycolumn
                     {
                         First = new Padding
                         {
@@ -278,14 +278,14 @@ namespace QuestPDF.UnitTests
                             Child = childB
                         }
                     },
-                    Second = new BinaryStack
+                    Second = new Binarycolumn
                     {
                         First = new Padding
                         {
                             Bottom = spacing,
                             Child = childC
                         },
-                        Second = new BinaryStack
+                        Second = new Binarycolumn
                         {
                             First = new Padding
                             {

+ 3 - 3
QuestPDF/Drawing/DocumentContainer.cs

@@ -16,13 +16,13 @@ namespace QuestPDF.Drawing
             var container = new Container();
             
             container
-                .Stack(stack =>
+                .Column(column =>
                 {
                     Pages
                         .SelectMany(x => new List<Action>()
                         {
-                            () => stack.Item().PageBreak(),
-                            () => stack.Item().Component(x)
+                            () => column.Item().PageBreak(),
+                            () => column.Item().Component(x)
                         })
                         .Skip(1)
                         .ToList()

+ 118 - 0
QuestPDF/Elements/Column.cs

@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    internal class ColumnItem : Container
+    {
+        public bool IsRendered { get; set; }
+    }
+    
+    internal class ColumnItemRenderingCommand
+    {
+        public ColumnItem ColumnItem { get; set; }
+        public SpacePlan Measurement { get; set; }
+        public Size Size { get; set; }
+        public Position Offset { get; set; }
+    }
+    
+    internal class Column : Element, ICacheable, IStateResettable
+    {
+        internal List<ColumnItem> Items { get; } = new();
+        internal float Spacing { get; set; }
+
+        public void ResetState()
+        {
+            Items.ForEach(x => x.IsRendered = false);
+        }
+        
+        internal override IEnumerable<Element?> GetChildren()
+        {
+            return Items;
+        }
+        
+        internal override void CreateProxy(Func<Element?, Element?> create)
+        {
+            Items.ForEach(x => x.Child = create(x.Child));
+        }
+
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            var renderingCommands = PlanLayout(availableSpace);
+
+            if (!renderingCommands.Any())
+                return SpacePlan.Wrap();
+
+            var width = renderingCommands.Max(x => x.Size.Width);
+            var height = renderingCommands.Last().Offset.Y + renderingCommands.Last().Size.Height;
+            var size = new Size(width, height);
+            
+            if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
+                return SpacePlan.Wrap();
+            
+            var totalRenderedItems = Items.Count(x => x.IsRendered) + renderingCommands.Count(x => x.Measurement.Type == SpacePlanType.FullRender);
+            var willBeFullyRendered = totalRenderedItems == Items.Count;
+
+            return willBeFullyRendered
+                ? SpacePlan.FullRender(size)
+                : SpacePlan.PartialRender(size);
+        }
+
+        internal override void Draw(Size availableSpace)
+        {
+            var renderingCommands = PlanLayout(availableSpace);
+
+            foreach (var command in renderingCommands)
+            {
+                if (command.Measurement.Type == SpacePlanType.FullRender)
+                    command.ColumnItem.IsRendered = true;
+
+                Canvas.Translate(command.Offset);
+                command.ColumnItem.Draw(command.Size);
+                Canvas.Translate(command.Offset.Reverse());
+            }
+            
+            if (Items.All(x => x.IsRendered))
+                ResetState();
+        }
+
+        private ICollection<ColumnItemRenderingCommand> PlanLayout(Size availableSpace)
+        {
+            var topOffset = 0f;
+            var commands = new List<ColumnItemRenderingCommand>();
+
+            foreach (var item in Items)
+            {
+                if (item.IsRendered)
+                    continue;
+
+                var itemSpace = new Size(availableSpace.Width, availableSpace.Height - topOffset);
+                var measurement = item.Measure(itemSpace);
+                
+                if (measurement.Type == SpacePlanType.Wrap)
+                    break;
+
+                commands.Add(new ColumnItemRenderingCommand
+                {
+                    ColumnItem = item,
+                    Size = measurement,
+                    Measurement = measurement,
+                    Offset = new Position(0, topOffset)
+                });
+                
+                if (measurement.Type == SpacePlanType.PartialRender)
+                    break;
+                
+                topOffset += measurement.Height + Spacing;
+            }
+
+            var targetWidth = commands.Select(x => x.Size.Width).DefaultIfEmpty(0).Max();
+            commands.ForEach(x => x.Size = new Size(targetWidth, x.Size.Height));
+            
+            return commands;
+        }
+    }
+}

+ 65 - 61
QuestPDF/Elements/Decoration.cs

@@ -1,98 +1,102 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using QuestPDF.Drawing;
 using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Elements
 {
-    internal enum DecorationType
+    internal class DecorationItemRenderingCommand
     {
-        Prepend,
-        Append
+        public Element Element { get; set; }
+        public SpacePlan Measurement { get; set; }
+        public Size Size { get; set; }
+        public Position Offset { get; set; }
     }
     
-    internal class BinaryDecoration : Element, ICacheable
+    internal class Decoration : Element, ICacheable
     {
-        public Element DecorationElement { get; set; } = Empty.Instance;
-        public Element ContentElement { get; set; } = Empty.Instance;
-        public DecorationType Type { get; set; }
+        internal Element Header { get; set; } = new Empty();
+        internal Element Content { get; set; } = new Empty();
+        internal Element Footer { get; set; } = new Empty();
 
         internal override IEnumerable<Element?> GetChildren()
         {
-            yield return DecorationElement;
-            yield return ContentElement;
+            yield return Header;
+            yield return Content;
+            yield return Footer;
         }
-
-        internal override void CreateProxy(Func<Element, Element> create)
+        
+        internal override void CreateProxy(Func<Element?, Element?> create)
         {
-            DecorationElement = create(DecorationElement);
-            ContentElement = create(ContentElement);
+            Header = create(Header);
+            Content = create(Content);
+            Footer = create(Footer);
         }
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            var decorationMeasure = DecorationElement.Measure(availableSpace);
-            
-            if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
-                return SpacePlan.Wrap();
+            var renderingCommands = PlanLayout(availableSpace);
 
-            var decorationSize = decorationMeasure;
-            var contentMeasure = ContentElement.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height));
-            
-            if (contentMeasure.Type == SpacePlanType.Wrap)
+            if (renderingCommands.Any(x => x.Measurement.Type == SpacePlanType.Wrap))
                 return SpacePlan.Wrap();
 
-            var contentSize = contentMeasure;
-            var resultSize = new Size(availableSpace.Width, decorationSize.Height + contentSize.Height);
-            
-            if (contentSize.Type == SpacePlanType.PartialRender)
-                return SpacePlan.PartialRender(resultSize);
+            var width = renderingCommands.Max(x => x.Size.Width);
+            var height = renderingCommands.Sum(x => x.Size.Height);
+            var size = new Size(width, height);
             
-            if (contentSize.Type == SpacePlanType.FullRender)
-                return SpacePlan.FullRender(resultSize);
+            if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
+                return SpacePlan.Wrap();
             
-            throw new NotSupportedException();
+            var willBeFullyRendered = renderingCommands.All(x => x.Measurement.Type == SpacePlanType.FullRender);
+
+            return willBeFullyRendered
+                ? SpacePlan.FullRender(size)
+                : SpacePlan.PartialRender(size);
         }
 
         internal override void Draw(Size availableSpace)
         {
-            var decorationSize = DecorationElement.Measure(availableSpace);
-            var contentSize = new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height);
-
-            var translateHeight = Type == DecorationType.Prepend ? decorationSize.Height : contentSize.Height;
-            Action drawDecoration = () => DecorationElement?.Draw(new Size(availableSpace.Width, decorationSize.Height));
-            Action drawContent = () => ContentElement?.Draw(new Size (availableSpace.Width, contentSize.Height));
-
-            var first = Type == DecorationType.Prepend ? drawDecoration : drawContent;
-            var second = Type == DecorationType.Prepend ? drawContent : drawDecoration;
-
-            first();
-            Canvas.Translate(new Position(0, translateHeight));
-            second();
-            Canvas.Translate(new Position(0, -translateHeight));
+            foreach (var command in PlanLayout(availableSpace))
+            {
+                Canvas.Translate(command.Offset);
+                command.Element.Draw(command.Size);
+                Canvas.Translate(command.Offset.Reverse());
+            }
         }
-    }
-    
-    internal class Decoration : IComponent
-    {
-        public Element Header { get; set; } = Empty.Instance;
-        public Element Content { get; set; } = Empty.Instance;
-        public Element Footer { get; set; } = Empty.Instance;
 
-        public void Compose(IContainer container)
+        private IEnumerable<DecorationItemRenderingCommand> PlanLayout(Size availableSpace)
         {
-            container.Element(new BinaryDecoration
+            var headerMeasurement = Header.Measure(availableSpace);
+            var footerMeasurement = Footer.Measure(availableSpace);
+            
+            var contentSpace = new Size(availableSpace.Width, availableSpace.Height - headerMeasurement.Height - footerMeasurement.Height);
+            var contentMeasurement = Content.Measure(contentSpace);
+
+            yield return new DecorationItemRenderingCommand
+            {
+                Element = Header,
+                Measurement = headerMeasurement,
+                Size = new Size(availableSpace.Width, headerMeasurement.Height),
+                Offset = Position.Zero
+            };
+            
+            yield return new DecorationItemRenderingCommand
+            {
+                Element = Content,
+                Measurement = contentMeasurement,
+                Size = new Size(availableSpace.Width, contentMeasurement.Height),
+                Offset = new Position(0, headerMeasurement.Height)
+            };
+
+            yield return new DecorationItemRenderingCommand
             {
-                Type = DecorationType.Prepend,
-                DecorationElement = Header,
-                ContentElement = new BinaryDecoration
-                {
-                    Type = DecorationType.Append,
-                    ContentElement = Content,
-                    DecorationElement = Footer
-                }
-            });
+                Element = Footer,
+                Measurement = footerMeasurement,
+                Size = new Size(availableSpace.Width, footerMeasurement.Height),
+                Offset = new Position(0, headerMeasurement.Height + contentMeasurement.Height)
+            };
         }
     }
 }

+ 101 - 0
QuestPDF/Elements/DecorationOld.cs

@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using QuestPDF.Drawing;
+using QuestPDF.Fluent;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    // TODO: remove
+    internal enum DecorationType
+    {
+        Prepend,
+        Append
+    }
+    
+    // TODO: remove
+    internal class BinaryDecoration : Element, ICacheable
+    {
+        public Element DecorationElement { get; set; } = Empty.Instance;
+        public Element ContentElement { get; set; } = Empty.Instance;
+        public DecorationType Type { get; set; }
+
+        internal override IEnumerable<Element?> GetChildren()
+        {
+            yield return DecorationElement;
+            yield return ContentElement;
+        }
+
+        internal override void CreateProxy(Func<Element, Element> create)
+        {
+            DecorationElement = create(DecorationElement);
+            ContentElement = create(ContentElement);
+        }
+
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            var decorationMeasure = DecorationElement.Measure(availableSpace);
+            
+            if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
+                return SpacePlan.Wrap();
+
+            var decorationSize = decorationMeasure;
+            var contentMeasure = ContentElement.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height));
+            
+            if (contentMeasure.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
+
+            var contentSize = contentMeasure;
+            var resultSize = new Size(availableSpace.Width, decorationSize.Height + contentSize.Height);
+            
+            if (contentSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(resultSize);
+            
+            if (contentSize.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(resultSize);
+            
+            throw new NotSupportedException();
+        }
+
+        internal override void Draw(Size availableSpace)
+        {
+            var decorationSize = DecorationElement.Measure(availableSpace);
+            var contentSize = new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height);
+
+            var translateHeight = Type == DecorationType.Prepend ? decorationSize.Height : contentSize.Height;
+            Action drawDecoration = () => DecorationElement?.Draw(new Size(availableSpace.Width, decorationSize.Height));
+            Action drawContent = () => ContentElement?.Draw(new Size (availableSpace.Width, contentSize.Height));
+
+            var first = Type == DecorationType.Prepend ? drawDecoration : drawContent;
+            var second = Type == DecorationType.Prepend ? drawContent : drawDecoration;
+
+            first();
+            Canvas.Translate(new Position(0, translateHeight));
+            second();
+            Canvas.Translate(new Position(0, -translateHeight));
+        }
+    }
+    
+    // TODO: remove
+    internal class DecorationOld : IComponent
+    {
+        public Element Header { get; set; } = Empty.Instance;
+        public Element Content { get; set; } = Empty.Instance;
+        public Element Footer { get; set; } = Empty.Instance;
+
+        public void Compose(IContainer container)
+        {
+            container.Element(new BinaryDecoration
+            {
+                Type = DecorationType.Prepend,
+                DecorationElement = Header,
+                ContentElement = new BinaryDecoration
+                {
+                    Type = DecorationType.Append,
+                    ContentElement = Content,
+                    DecorationElement = Footer
+                }
+            });
+        }
+    }
+}

+ 6 - 6
QuestPDF/Elements/Grid.cs

@@ -27,12 +27,12 @@ namespace QuestPDF.Elements
         {
             ChildrenQueue = new Queue<GridElement>(Children);
             
-            container.Stack(stack =>
+            container.Column(column =>
             {
-                stack.Spacing(VerticalSpacing);
+                column.Spacing(VerticalSpacing);
                 
                 while (ChildrenQueue.Any())
-                    stack.Item().Row(BuildRow);
+                    column.Item().Row(BuildRow);
             });
         }
         
@@ -65,12 +65,12 @@ namespace QuestPDF.Elements
                 emptySpace /= 2;
             
             if (hasEmptySpace && Alignment != HorizontalAlignment.Left)
-                row.RelativeColumn(emptySpace);
+                row.RelativeItem(emptySpace);
                 
-            elements.ForEach(x => row.RelativeColumn(x.Columns).Element(x.Child));
+            elements.ForEach(x => row.RelativeItem(x.Columns).Element(x.Child));
 
             if (hasEmptySpace && Alignment != HorizontalAlignment.Right)
-                row.RelativeColumn(emptySpace);
+                row.RelativeItem(emptySpace);
         }
     }
 }

+ 45 - 0
QuestPDF/Elements/Line.cs

@@ -0,0 +1,45 @@
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    public interface ILine
+    {
+        
+    }
+    
+    internal enum LineType
+    {
+        Vertical,
+        Horizontal
+    }
+    
+    internal class Line : Element, ILine, ICacheable
+    {
+        public LineType Type { get; set; }
+        public string Color { get; set; }
+        public float Size { get; set; }
+        
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            return Type switch
+            {
+                LineType.Vertical when availableSpace.Width >= Size => SpacePlan.FullRender(Size, 0),
+                LineType.Horizontal when availableSpace.Height >= Size => SpacePlan.FullRender(0, Size),
+                _ => SpacePlan.Wrap()
+            };
+        }
+
+        internal override void Draw(Size availableSpace)
+        {
+            if (Type == LineType.Vertical)
+            {
+                Canvas.DrawRectangle(new Position(-Size/2, 0), new Size(Size, availableSpace.Height), Color);
+            }
+            else if (Type == LineType.Horizontal)
+            {
+                Canvas.DrawRectangle(new Position(0, -Size/2), new Size(availableSpace.Width, Size), Color);
+            }
+        }
+    }
+}

+ 0 - 25
QuestPDF/Elements/PreventPaging.cs

@@ -1,25 +0,0 @@
-using System;
-using QuestPDF.Drawing;
-using QuestPDF.Infrastructure;
-
-namespace QuestPDF.Elements
-{
-    internal class PreventPaging : ContainerElement
-    {
-        internal override SpacePlan Measure(Size availableSpace)
-        {
-            if (Child == null)
-                return SpacePlan.FullRender(Size.Zero);
-
-            var measurement = Child.Measure(availableSpace);
-
-            return measurement.Type switch
-            {
-                SpacePlanType.Wrap => SpacePlan.FullRender(Size.Zero),
-                SpacePlanType.PartialRender => SpacePlan.FullRender(measurement),
-                SpacePlanType.FullRender => measurement,
-                _ => throw new ArgumentOutOfRangeException()
-            };
-        }
-    }
-}

+ 98 - 116
QuestPDF/Elements/Row.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using QuestPDF.Drawing;
@@ -6,171 +7,152 @@ using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Elements
 {
-    internal class RowElement : Constrained
+    internal enum RowItemType
     {
-        public float ConstantSize { get; }
-        public float RelativeSize { get; }
-
-        public RowElement(float constantSize, float relativeSize)
-        {
-            ConstantSize = constantSize;
-            RelativeSize = relativeSize;
-        }
+        Auto,
+        Constant,
+        Relative
+    }
+    
+    internal class RowItem : Container
+    {
+        public bool IsRendered { get; set; }
+        public float Width { get; set; }
         
-        public void SetWidth(float width)
-        {
-            MinWidth = width;
-            MaxWidth = width;
-        }
+        public RowItemType Type { get; set; }
+        public float Size { get; set; }
+    }
+
+    internal class RowItemRenderingCommand
+    {
+        public RowItem RowItem { get; set; }
+        public SpacePlan Measurement { get; set; }
+        public Size Size { get; set; }
+        public Position Offset { get; set; }
     }
     
-    internal class BinaryRow : Element, ICacheable, IStateResettable
+    internal class Row : Element, ICacheable, IStateResettable
     {
-        internal Element Left { get; set; }
-        internal Element Right { get; set; }
+        internal List<RowItem> Items { get; } = new();
+        internal float Spacing { get; set; }
 
-        private bool IsLeftRendered { get; set; } 
-        private bool IsRightRendered { get; set; } 
-        
         public void ResetState()
         {
-            IsLeftRendered = false;
-            IsRightRendered = false;
+            Items.ForEach(x => x.IsRendered = false);
         }
         
         internal override IEnumerable<Element?> GetChildren()
         {
-            yield return Left;
-            yield return Right;
+            return Items;
         }
         
         internal override void CreateProxy(Func<Element?, Element?> create)
         {
-            Left = create(Left);
-            Right = create(Right);
+            Items.ForEach(x => x.Child = create(x.Child));
         }
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
-            
-            if (leftMeasurement.Type == SpacePlanType.Wrap)
+            UpdateItemsWidth(availableSpace.Width);
+            var renderingCommands = PlanLayout(availableSpace);
+
+            if (renderingCommands.Any(x => !x.RowItem.IsRendered && x.Measurement.Type == SpacePlanType.Wrap))
                 return SpacePlan.Wrap();
 
-            if (leftMeasurement.Type == SpacePlanType.FullRender)
-                IsLeftRendered = true;
-            
-            var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
+            var width = renderingCommands.Last().Offset.X + renderingCommands.Last().Size.Width;
+            var height = renderingCommands.Max(x => x.Size.Height);
+            var size = new Size(width, height);
 
-            if (rightMeasurement.Type == SpacePlanType.Wrap)
+            if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
                 return SpacePlan.Wrap();
             
-            if (leftMeasurement.Type == SpacePlanType.FullRender)
-                IsRightRendered = true;
-            
-            var totalWidth = leftMeasurement.Width + rightMeasurement.Width;
-            var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height);
+            if (renderingCommands.Any(x => !x.RowItem.IsRendered && x.Measurement.Type == SpacePlanType.PartialRender))
+                return SpacePlan.PartialRender(size);
 
-            var targetSize = new Size(totalWidth, totalHeight);
-
-            if ((!IsLeftRendered && leftMeasurement.Type == SpacePlanType.PartialRender) || 
-                (!IsRightRendered && rightMeasurement.Type == SpacePlanType.PartialRender))
-                return SpacePlan.PartialRender(targetSize);
-
-            return SpacePlan.FullRender(targetSize);
+            return SpacePlan.FullRender(size);
         }
 
         internal override void Draw(Size availableSpace)
         {
-            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
-            var leftWidth = leftMeasurement.Width;
-            
-            Left.Draw(new Size(leftWidth, availableSpace.Height));
+            UpdateItemsWidth(availableSpace.Width);
+            var renderingCommands = PlanLayout(availableSpace);
+
+            foreach (var command in renderingCommands)
+            {
+                if (command.Measurement.Type == SpacePlanType.FullRender)
+                    command.RowItem.IsRendered = true;
+                
+                if (command.Measurement.Type == SpacePlanType.Wrap)
+                    continue;
+
+                Canvas.Translate(command.Offset);
+                command.RowItem.Draw(command.Size);
+                Canvas.Translate(command.Offset.Reverse());
+            }
             
-            Canvas.Translate(new Position(leftWidth, 0));
-            Right.Draw(new Size(availableSpace.Width - leftWidth, availableSpace.Height));
-            Canvas.Translate(new Position(-leftWidth, 0));
+            if (Items.All(x => x.IsRendered))
+                ResetState();
         }
-    }
-    
-    internal class Row : Element
-    {
-        public float Spacing { get; set; } = 0;
-        
-        public ICollection<RowElement> Items { get; internal set; } = new List<RowElement>();
-        private Element? RootElement { get; set; }
 
-        internal override IEnumerable<Element?> GetChildren()
+        private void UpdateItemsWidth(float availableWidth)
         {
-            if (RootElement == null)
-                ComposeTree();
+            HandleItemsWithAutoWidth();
+            
+            var constantWidth = Items.Where(x => x.Type == RowItemType.Constant).Sum(x => x.Size);
+            var relativeWidth = Items.Where(x => x.Type == RowItemType.Relative).Sum(x => x.Size);
+            var spacingWidth = (Items.Count - 1) * Spacing;
 
-            yield return RootElement;
-        }
+            foreach (var item in Items.Where(x => x.Type == RowItemType.Constant))
+                item.Width = item.Size;
+            
+            if (relativeWidth <= 0)
+                return;
 
-        internal override SpacePlan Measure(Size availableSpace)
-        {
-            UpdateElementsWidth(availableSpace.Width);
-            return RootElement.Measure(availableSpace);
-        }
+            var widthPerRelativeUnit = (availableWidth - constantWidth - spacingWidth) / relativeWidth;
 
-        internal override void Draw(Size availableSpace)
-        {
-            UpdateElementsWidth(availableSpace.Width);
-            RootElement.Draw(availableSpace);
-        }
-        
-        #region structure
-        
-        private void ComposeTree()
-        {
-            Items = AddSpacing(Items, Spacing);
-            
-            var elements = Items.Cast<Element>().ToArray();
-            RootElement = BuildTree(elements);
+            foreach (var item in Items.Where(x => x.Type == RowItemType.Relative))
+                item.Width = item.Size * widthPerRelativeUnit;
         }
 
-        private void UpdateElementsWidth(float availableWidth)
+        private void HandleItemsWithAutoWidth()
         {
-            var constantWidth = Items.Sum(x => x.ConstantSize);
-            var relativeWidth = Items.Sum(x => x.RelativeSize);
-
-            var widthPerRelativeUnit = (relativeWidth > 0) ? (availableWidth - constantWidth) / relativeWidth : 0;
-            
-            foreach (var row in Items)
+            foreach (var rowItem in Items.Where(x => x.Type == RowItemType.Auto))
             {
-                row.SetWidth(row.ConstantSize + row.RelativeSize * widthPerRelativeUnit);
+                rowItem.Size = rowItem.Measure(Size.Max).Width;
+                rowItem.Type = RowItemType.Constant;
             }
         }
-        
-        private static ICollection<RowElement> AddSpacing(ICollection<RowElement> elements, float spacing)
-        {
-            if (spacing < Size.Epsilon)
-                return elements;
-            
-            return elements
-                .SelectMany(x => new[] { new RowElement(spacing, 0), x })
-                .Skip(1)
-                .ToList();
-        }
 
-        private static Element BuildTree(Span<Element> elements)
+        private ICollection<RowItemRenderingCommand> PlanLayout(Size availableSpace)
         {
-            if (elements.IsEmpty)
-                return Empty.Instance;
+            var leftOffset = 0f;
+            var renderingCommands = new List<RowItemRenderingCommand>();
 
-            if (elements.Length == 1)
-                return elements[0];
+            foreach (var item in Items)
+            {
+                var itemSpace = new Size(item.Width, availableSpace.Height);
+                
+                var command = new RowItemRenderingCommand
+                {
+                    RowItem = item,
+                    Size = itemSpace,
+                    Measurement = item.Measure(itemSpace),
+                    Offset = new Position(leftOffset, 0)
+                };
+                
+                renderingCommands.Add(command);
+                leftOffset += item.Width + Spacing;
+            }
 
-            var half = elements.Length / 2;
+            var rowHeight = renderingCommands.Where(x => !x.RowItem.IsRendered).Max(x => x.Measurement.Height);
             
-            return new BinaryRow
+            renderingCommands.ForEach(command =>
             {
-                Left = BuildTree(elements.Slice(0, half)),
-                Right = BuildTree(elements.Slice(half))
-            };
+                command.Size = new Size(command.Size.Width, rowHeight);
+                command.Measurement = command.RowItem.Measure(command.Size);
+            });
+ 
+            return renderingCommands;
         }
-        
-        #endregion
     }
 }

+ 179 - 0
QuestPDF/Elements/RowOld.cs

@@ -0,0 +1,179 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Elements
+{
+    // TODO: remove
+    internal class RowOldElement : Constrained
+    {
+        public float ConstantSize { get; }
+        public float RelativeSize { get; }
+
+        public RowOldElement(float constantSize, float relativeSize)
+        {
+            ConstantSize = constantSize;
+            RelativeSize = relativeSize;
+        }
+        
+        public void SetWidth(float width)
+        {
+            MinWidth = width;
+            MaxWidth = width;
+        }
+    }
+    
+    // TODO: remove
+    internal class BinaryRow : Element, ICacheable, IStateResettable
+    {
+        internal Element Left { get; set; }
+        internal Element Right { get; set; }
+
+        private bool IsLeftRendered { get; set; } 
+        private bool IsRightRendered { get; set; } 
+        
+        public void ResetState()
+        {
+            IsLeftRendered = false;
+            IsRightRendered = false;
+        }
+        
+        internal override IEnumerable<Element?> GetChildren()
+        {
+            yield return Left;
+            yield return Right;
+        }
+        
+        internal override void CreateProxy(Func<Element?, Element?> create)
+        {
+            Left = create(Left);
+            Right = create(Right);
+        }
+
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
+            
+            if (leftMeasurement.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
+
+            if (leftMeasurement.Type == SpacePlanType.FullRender)
+                IsLeftRendered = true;
+            
+            var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
+
+            if (rightMeasurement.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
+            
+            if (leftMeasurement.Type == SpacePlanType.FullRender)
+                IsRightRendered = true;
+            
+            var totalWidth = leftMeasurement.Width + rightMeasurement.Width;
+            var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height);
+
+            var targetSize = new Size(totalWidth, totalHeight);
+
+            if ((!IsLeftRendered && leftMeasurement.Type == SpacePlanType.PartialRender) || 
+                (!IsRightRendered && rightMeasurement.Type == SpacePlanType.PartialRender))
+                return SpacePlan.PartialRender(targetSize);
+
+            return SpacePlan.FullRender(targetSize);
+        }
+
+        internal override void Draw(Size availableSpace)
+        {
+            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
+            var leftWidth = leftMeasurement.Width;
+            
+            Left.Draw(new Size(leftWidth, availableSpace.Height));
+            
+            Canvas.Translate(new Position(leftWidth, 0));
+            Right.Draw(new Size(availableSpace.Width - leftWidth, availableSpace.Height));
+            Canvas.Translate(new Position(-leftWidth, 0));
+        }
+    }
+    
+    // TODO: remove
+    internal class RowOld : Element
+    {
+        public float Spacing { get; set; } = 0;
+        
+        public ICollection<RowOldElement> Items { get; internal set; } = new List<RowOldElement>();
+        private Element? RootElement { get; set; }
+
+        internal override IEnumerable<Element?> GetChildren()
+        {
+            if (RootElement == null)
+                ComposeTree();
+
+            yield return RootElement;
+        }
+
+        internal override SpacePlan Measure(Size availableSpace)
+        {
+            UpdateElementsWidth(availableSpace.Width);
+            return RootElement.Measure(availableSpace);
+        }
+
+        internal override void Draw(Size availableSpace)
+        {
+            UpdateElementsWidth(availableSpace.Width);
+            RootElement.Draw(availableSpace);
+        }
+        
+        #region structure
+        
+        private void ComposeTree()
+        {
+            Items = AddSpacing(Items, Spacing);
+            
+            var elements = Items.Cast<Element>().ToArray();
+            RootElement = BuildTree(elements);
+        }
+
+        private void UpdateElementsWidth(float availableWidth)
+        {
+            var constantWidth = Items.Sum(x => x.ConstantSize);
+            var relativeWidth = Items.Sum(x => x.RelativeSize);
+
+            var widthPerRelativeUnit = (relativeWidth > 0) ? (availableWidth - constantWidth) / relativeWidth : 0;
+            
+            foreach (var row in Items)
+            {
+                row.SetWidth(row.ConstantSize + row.RelativeSize * widthPerRelativeUnit);
+            }
+        }
+        
+        private static ICollection<RowOldElement> AddSpacing(ICollection<RowOldElement> elements, float spacing)
+        {
+            if (spacing < Size.Epsilon)
+                return elements;
+            
+            return elements
+                .SelectMany(x => new[] { new RowOldElement(spacing, 0), x })
+                .Skip(1)
+                .ToList();
+        }
+
+        private static Element BuildTree(Span<Element> elements)
+        {
+            if (elements.IsEmpty)
+                return Empty.Instance;
+
+            if (elements.Length == 1)
+                return elements[0];
+
+            var half = elements.Length / 2;
+            
+            return new BinaryRow
+            {
+                Left = BuildTree(elements.Slice(0, half)),
+                Right = BuildTree(elements.Slice(half))
+            };
+        }
+        
+        #endregion
+    }
+}

+ 5 - 3
QuestPDF/Elements/Stack.cs

@@ -9,7 +9,8 @@ using IContainer = QuestPDF.Infrastructure.IContainer;
 
 namespace QuestPDF.Elements
 {
-    internal class BinaryStack : Element, IStateResettable, ICacheable
+    // TODO: remove
+    internal class Binarycolumn : Element, IStateResettable, ICacheable
     {
         internal Element First { get; set; } = Empty.Instance;
         internal Element Second { get; set; } = Empty.Instance;
@@ -93,7 +94,8 @@ namespace QuestPDF.Elements
         }
     }
     
-    internal class Stack : IComponent
+    // TODO: remove
+    internal class column : IComponent
     {
         public ICollection<Element> Items { get; } = new List<Element>();
         public float Spacing { get; set; } = 0;
@@ -133,7 +135,7 @@ namespace QuestPDF.Elements
 
             var half = elements.Length / 2;
                 
-            return new BinaryStack
+            return new Binarycolumn
             {
                 First = BuildTree(elements.Slice(0, half)),
                 Second = BuildTree(elements.Slice(half))

+ 47 - 0
QuestPDF/Fluent/ColumnExtensions.cs

@@ -0,0 +1,47 @@
+using System;
+using QuestPDF.Elements;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Fluent
+{
+    public class ColumnDescriptor
+    {
+        //internal column Column { get; } = new();
+        internal Column Column { get; } = new();
+
+        public void Spacing(float value)
+        {
+            Column.Spacing = value;
+        }
+        
+        public IContainer Item()
+        {
+            var container = new Container();
+            
+            Column.Items.Add(new ColumnItem()
+            {
+                Child = container
+            });
+            
+            return container;
+        }
+    }
+    
+    public static class ColumnExtensions
+    {
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the Column method.")]
+        public static void Stack(this IContainer element, Action<ColumnDescriptor> handler)
+        {
+            element.Column(handler);
+        }
+        
+        public static void Column(this IContainer element, Action<ColumnDescriptor> handler)
+        {
+            var descriptor = new ColumnDescriptor();
+            handler(descriptor);
+            element.Element(descriptor.Column);
+            //element.Component(descriptor.Column);
+        }
+    }
+}

+ 1 - 1
QuestPDF/Fluent/DecorationExtensions.cs

@@ -52,7 +52,7 @@ namespace QuestPDF.Fluent
             var descriptor = new DecorationDescriptor();
             handler(descriptor);
             
-            element.Component(descriptor.Decoration);
+            element.Element(descriptor.Decoration);
         }
     }
 }

+ 1 - 6
QuestPDF/Fluent/ElementExtensions.cs

@@ -160,12 +160,7 @@ namespace QuestPDF.Fluent
                 TextStyle = textStyle
             });
         }
-        
-        public static IContainer PreventPaging(this IContainer element)
-        {
-            return element.Element(new PreventPaging());
-        }
-        
+
         public static IContainer ScaleToFit(this IContainer element)
         {
             return element.Element(new ScaleToFit());

+ 36 - 0
QuestPDF/Fluent/LineExtensions.cs

@@ -0,0 +1,36 @@
+using System;
+using QuestPDF.Elements;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Fluent
+{
+    public static class LineExtensions
+    {
+        private static ILine Line(this IContainer element, LineType type, float size)
+        {
+            var line = new Line
+            {
+                Size = size,
+                Type = type
+            };
+
+            element.Element(line);
+            return line;
+        }
+        
+        public static ILine LineVertical(this IContainer element, float size)
+        {
+            return element.Line(LineType.Vertical, size);
+        }
+        
+        public static ILine LineHorizontal(this IContainer element, float size)
+        {
+            return element.Line(LineType.Horizontal, size);
+        }
+        
+        public static void LineColor(this ILine descriptor, string value)
+        {
+            (descriptor as Line).Color = value;
+        }
+    }
+}

+ 33 - 10
QuestPDF/Fluent/RowExtensions.cs

@@ -6,29 +6,52 @@ namespace QuestPDF.Fluent
 {
     public class RowDescriptor
     {
-        internal Row Row { get; } = new Row();
+        internal Row Row { get; } = new();
 
         public void Spacing(float value)
         {
             Row.Spacing = value;
         }
+
+        private IContainer Item(RowItemType type, float size = 0)
+        {
+            var element = new RowItem
+            {
+                Type = type,
+                Size = size
+            };
+            
+            Row.Items.Add(element);
+            return element;
+        }
         
-        public IContainer ConstantColumn(float width)
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the RelativeItem method.")]
+        public IContainer RelativeColumn(float size = 1)
         {
-            return Column(constantWidth: width);
+            return Item(RowItemType.Relative, size);
         }
         
-        public IContainer RelativeColumn(float width = 1)
+        // TODO: deprecated Box method in QuestPDF 2022.2
+        [Obsolete("This element has been renamed. Please use the ConstantItem method.")]
+        public IContainer ConstantColumn(float size)
         {
-            return Column(relativeWidth: width);
+            return Item(RowItemType.Constant, size);
+        }
+
+        public IContainer RelativeItem(float size = 1)
+        {
+            return Item(RowItemType.Relative, size);
         }
         
-        public IContainer Column(float constantWidth = 0, float relativeWidth = 0)
+        public IContainer ConstantItem(float size)
         {
-            var element = new RowElement(constantWidth, relativeWidth);
-            
-            Row.Items.Add(element);
-            return element;
+            return Item(RowItemType.Constant, size);
+        }
+
+        public IContainer AutoItem()
+        {
+            return Item(RowItemType.Auto);
         }
     }
     

+ 44 - 0
QuestPDF/Fluent/RowOldExtensions.cs

@@ -0,0 +1,44 @@
+// using System;
+// using QuestPDF.Elements;
+// using QuestPDF.Infrastructure;
+//
+// namespace QuestPDF.Fluent
+// {
+//     public class RowDescriptor
+//     {
+//         internal RowOld Row { get; } = new RowOld();
+//
+//         public void Spacing(float value)
+//         {
+//             Row.Spacing = value;
+//         }
+//         
+//         public IContainer ConstantItem(float width)
+//         {
+//             return Column(constantWidth: width);
+//         }
+//         
+//         public IContainer RelativeItem(float width = 1)
+//         {
+//             return Column(relativeWidth: width);
+//         }
+//         
+//         public IContainer Column(float constantWidth = 0, float relativeWidth = 0)
+//         {
+//             var element = new RowOldElement(constantWidth, relativeWidth);
+//             
+//             Row.Items.Add(element);
+//             return element;
+//         }
+//     }
+//     
+//     public static class RowExtensions
+//     {
+//         public static void Row(this IContainer element, Action<RowDescriptor> handler)
+//         {
+//             var descriptor = new RowDescriptor();
+//             handler(descriptor);
+//             element.Element(descriptor.Row);
+//         }
+//     }
+// }

+ 0 - 33
QuestPDF/Fluent/StackExtensions.cs

@@ -1,33 +0,0 @@
-using System;
-using QuestPDF.Elements;
-using QuestPDF.Infrastructure;
-
-namespace QuestPDF.Fluent
-{
-    public class StackDescriptor
-    {
-        internal Stack Stack { get; } = new Stack();
-
-        public void Spacing(float value)
-        {
-            Stack.Spacing = value;
-        }
-        
-        public IContainer Item()
-        {
-            var container = new Container();
-            Stack.Items.Add(container);
-            return container;
-        }
-    }
-    
-    public static class StackExtensions
-    {
-        public static void Stack(this IContainer element, Action<StackDescriptor> handler)
-        {
-            var descriptor = new StackDescriptor();
-            handler(descriptor);
-            element.Component(descriptor.Stack);
-        }
-    }
-}

+ 3 - 3
QuestPDF/Fluent/TextExtensions.cs

@@ -174,12 +174,12 @@ namespace QuestPDF.Fluent
         {
             TextBlocks.ToList().ForEach(x => x.Alignment = Alignment);
 
-            container.DefaultTextStyle(DefaultStyle).Stack(stack =>
+            container.DefaultTextStyle(DefaultStyle).Column(column =>
             {
-                stack.Spacing(Spacing);
+                column.Spacing(Spacing);
 
                 foreach (var textBlock in TextBlocks)
-                    stack.Item().Element(textBlock);
+                    column.Item().Element(textBlock);
             });
         }
     }

+ 7 - 7
QuestPDF/Resources/Description.md

@@ -71,15 +71,15 @@ void ComposeHeader(IContainer container)
     container.Row(row =>
     {
         {
-            stack.Item().Text($"Invoice #{Model.InvoiceNumber}", titleStyle);
+            column.Item().Text($"Invoice #{Model.InvoiceNumber}", titleStyle);
 
-            stack.Item().Text(text =>
+            column.Item().Text(text =>
             {
                 text.Span("Issue date: ", TextStyle.Default.SemiBold());
                 text.Span($"{Model.IssueDate:d}");
             });
 
-            stack.Item().Text(text =>
+            column.Item().Text(text =>
             {
                 text.Span("Due date: ", TextStyle.Default.SemiBold());
                 text.Span($"{Model.DueDate:d}");
@@ -97,7 +97,7 @@ Implementation of **the content area** that contains seller and customer details
 ```csharp
 void ComposeContent(IContainer container)
 {
-    container.PaddingVertical(40).Stack(column => 
+    container.PaddingVertical(40).column(column => 
     {
         column.Spacing(20);
         
@@ -147,7 +147,7 @@ void ComposeTable(IContainer container)
         // content
         decoration
             .Content()
-            .Stack(column =>
+            .column(column =>
             {
                 foreach (var item in Model.Items)
                 {
@@ -174,7 +174,7 @@ void ComposeTable(IContainer container)
 ```csharp
 void ComposeComments(IContainer container)
 {
-    container.ShowEntire().Background(Colors.Grey.Lighten3).Padding(10).Stack(message => 
+    container.ShowEntire().Background(Colors.Grey.Lighten3).Padding(10).column(message => 
     {
         message.Spacing(5);
         message.Item().Text("Comments", TextStyle.Default.Size(14).SemiBold());
@@ -200,7 +200,7 @@ public class AddressComponent : IComponent
     
     public void Compose(IContainer container)
     {
-        container.ShowEntire().Stack(column =>
+        container.ShowEntire().column(column =>
         {
             column.Spacing(5);