about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/layout.nim30
-rw-r--r--test/layout/position-absolute-margin-padding-subtracted-from-available-space.color.expected2
-rw-r--r--test/layout/position-absolute-margin-padding-subtracted-from-available-space.html6
3 files changed, 20 insertions, 18 deletions
diff --git a/src/css/layout.nim b/src/css/layout.nim
index 531f8a19..76b2378c 100644
--- a/src/css/layout.nim
+++ b/src/css/layout.nim
@@ -1009,39 +1009,38 @@ func resolveBounds(lctx: LayoutContext; space: AvailableSpace; padding: Size;
 const CvalSizeMap = [dtHorizontal: cptWidth, dtVertical: cptHeight]
 
 proc resolveAbsoluteWidth(sizes: var ResolvedSizes; size: Size;
-    positioned: RelativeRect; computed: CSSValues;
-    lctx: LayoutContext) =
-  let padding = sizes.padding[dtHorizontal].sum()
+    positioned: RelativeRect; computed: CSSValues; lctx: LayoutContext) =
+  let paddingSum = sizes.padding[dtHorizontal].sum()
   if computed{"width"}.u == clAuto:
     let u = max(size.w - positioned[dtHorizontal].sum(), 0)
+    let marginSum = sizes.margin[dtHorizontal].sum()
     if computed{"left"}.u != clAuto and computed{"right"}.u != clAuto:
       # Both left and right are known, so we can calculate the width.
-      # Well, but subtract padding first.
-      sizes.space.w = stretch(u - padding)
+      # Well, but subtract padding and margin first.
+      sizes.space.w = stretch(u - paddingSum - marginSum)
     else:
       # Return shrink to fit and solve for left/right.
-      # Well, but subtract padding first.
-      sizes.space.w = fitContent(u - padding)
+      # Well, but subtract padding and margin first.
+      sizes.space.w = fitContent(u - paddingSum - marginSum)
   else:
-    let sizepx = computed{"width"}.spx(stretch(size.w), computed, padding)
+    let sizepx = computed{"width"}.spx(stretch(size.w), computed, paddingSum)
     sizes.space.w = stretch(sizepx)
 
 proc resolveAbsoluteHeight(sizes: var ResolvedSizes; size: Size;
-    positioned: RelativeRect; computed: CSSValues;
-    lctx: LayoutContext) =
+    positioned: RelativeRect; computed: CSSValues; lctx: LayoutContext) =
   if computed{"height"}.u == clAuto:
     let u = max(size.w - positioned[dtVertical].sum(), 0)
     if computed{"top"}.u != clAuto and computed{"bottom"}.u != clAuto:
       # Both top and bottom are known, so we can calculate the height.
-      # Well, but subtract padding first.
-      sizes.space.h = stretch(u - sizes.padding[dtVertical].sum())
+      # Well, but subtract padding and margin first.
+      sizes.space.h = stretch(u - sizes.padding[dtVertical].sum() -
+        sizes.margin[dtVertical].sum())
     else:
       # The height is based on the content.
       sizes.space.h = maxContent()
   else:
-    let padding = sizes.padding[dtVertical].sum()
     let sizepx = computed{"height"}.spx(stretch(size.h), computed,
-      padding)
+      sizes.padding[dtVertical].sum())
     sizes.space.h = stretch(sizepx)
 
 # Calculate and resolve available width & height for absolutely positioned
@@ -1056,9 +1055,6 @@ proc resolveAbsoluteSizes(lctx: LayoutContext; size: Size;
   )
   sizes.resolveAbsoluteWidth(size, positioned, computed, lctx)
   sizes.resolveAbsoluteHeight(size, positioned, computed, lctx)
-  # Subtract margins.
-  for dim, it in sizes.space.mpairs:
-    it.u = max(it.u - sizes.margin[dim].sum(), 0)
   return sizes
 
 # Calculate and resolve available width & height for floating boxes.
diff --git a/test/layout/position-absolute-margin-padding-subtracted-from-available-space.color.expected b/test/layout/position-absolute-margin-padding-subtracted-from-available-space.color.expected
index 9500e73f..a5266913 100644
--- a/test/layout/position-absolute-margin-padding-subtracted-from-available-space.color.expected
+++ b/test/layout/position-absolute-margin-padding-subtracted-from-available-space.color.expected
@@ -38,4 +38,4 @@
      test 
      test 
           
-
+                                      test
diff --git a/test/layout/position-absolute-margin-padding-subtracted-from-available-space.html b/test/layout/position-absolute-margin-padding-subtracted-from-available-space.html
index 35a256df..6d22c42d 100644
--- a/test/layout/position-absolute-margin-padding-subtracted-from-available-space.html
+++ b/test/layout/position-absolute-margin-padding-subtracted-from-available-space.html
@@ -40,3 +40,9 @@ test test test test
 test test test test
 </div>
 </div>
+<div style="position: absolute; left: 50%; width: 60ch; margin-left: -30ch">
+<div style="position: relative; left: 50%; margin-left: -30ch; width: 60ch; text-align: center">
+
+test
+</div>
+</div>