about summary refs log tree commit diff stats
path: root/src/css/layout.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-30 20:43:41 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-30 20:56:48 +0100
commit77acb5d5953fb585cd0ce5724ddad3190fbf46b6 (patch)
treedea3355168b04e9bed60dbbe6ea9d7d3ede4d222 /src/css/layout.nim
parentfa8fe9ed2b350a48422fe223a17b6218fe752b32 (diff)
downloadchawan-77acb5d5953fb585cd0ce5724ddad3190fbf46b6.tar.gz
layout: fix absolute sizing order with floats
Also removed the redundant pushPositioned/popPositioned calls in
popPositioned.
Diffstat (limited to 'src/css/layout.nim')
-rw-r--r--src/css/layout.nim12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/css/layout.nim b/src/css/layout.nim
index 1629e457..0e0edb88 100644
--- a/src/css/layout.nim
+++ b/src/css/layout.nim
@@ -1293,7 +1293,6 @@ proc popPositioned(lctx: LayoutContext; size: Size) =
   let item = lctx.positioned.pop()
   for it in item.queue:
     let child = it.child
-    lctx.pushPositioned()
     var positioned: RelativeRect
     var size = size
     #TODO this is very ugly.
@@ -1325,7 +1324,6 @@ proc popPositioned(lctx: LayoutContext; size: Size) =
         sizes.margin.bottom
     else:
       child.state.offset.y += sizes.margin.top
-    lctx.popPositioned(child.state.size)
 
 proc queueAbsolute(lctx: LayoutContext; box: BlockBox; offset: Offset) =
   case box.computed{"position"}
@@ -1557,7 +1555,15 @@ proc layoutFlow(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes;
   # Reset parentBps to the previous node.
   bctx.parentBps = fstate.prevParentBps
   if box.computed{"position"} != PositionStatic:
-    bctx.lctx.popPositioned(box.state.size)
+    var size = box.state.size
+    if bctx.parentBps == nil:
+      # We have a bit of an ordering problem here: layoutRootBlock
+      # computes our final height, but we already want to pop the
+      # positioned box here.
+      # I'll just replicate what layoutRootBlock is doing until I find a
+      # better solution...
+      size.h = max(size.h, bctx.maxFloatHeight)
+    bctx.lctx.popPositioned(size)
 
 proc layoutListItem(bctx: var BlockContext; box: BlockBox;
     sizes: ResolvedSizes) =