diff options
-rw-r--r-- | src/css/cssvalues.nim | 4 | ||||
-rw-r--r-- | src/css/layout.nim | 18 | ||||
-rw-r--r-- | src/css/render.nim | 10 | ||||
-rw-r--r-- | test/layout/position-sticky-establishes-absolute-container.expected | 2 | ||||
-rw-r--r-- | test/layout/position-sticky-establishes-absolute-container.html | 8 |
5 files changed, 23 insertions, 19 deletions
diff --git a/src/css/cssvalues.nim b/src/css/cssvalues.nim index 350567ed..9126bafb 100644 --- a/src/css/cssvalues.nim +++ b/src/css/cssvalues.nim @@ -476,10 +476,6 @@ const InheritedProperties = { cptVisibility, cptTextTransform } -const PositionStaticLike* = { - PositionStatic, PositionSticky -} - const OverflowScrollLike* = {OverflowScroll, OverflowAuto, OverflowOverlay} const OverflowHiddenLike* = {OverflowHidden, OverflowClip} diff --git a/src/css/layout.nim b/src/css/layout.nim index fdf3a21a..2cbf5190 100644 --- a/src/css/layout.nim +++ b/src/css/layout.nim @@ -1385,7 +1385,7 @@ proc positionFloats(bctx: var BlockContext) = bctx.unpositionedFloats.setLen(0) proc layoutInline(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: bctx.lctx.pushPositioned() let bfcOffset = if bctx.parentBps != nil: bctx.parentBps.offset + box.state.offset @@ -1440,7 +1440,7 @@ proc layoutInline(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = box.state.size += paddingSum box.state.baseline = ictx.state.baseline box.state.firstBaseline = ictx.state.firstBaseline - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: bctx.lctx.popPositioned(box.state.size) # canClear signals if the box should clear in its inner (flow) layout. @@ -1676,8 +1676,7 @@ proc layoutInline(ictx: var InlineContext; box: InlineBox) = ) ictx.lbstate.size.w += padding.start var state = InlineState(box: box) - if stSplitStart in box.splitType and - computed{"position"} notin PositionStaticLike: + if stSplitStart in box.splitType and computed{"position"} != PositionStatic: lctx.pushPositioned() case box.t of ibtNewline: @@ -1702,8 +1701,7 @@ proc layoutInline(ictx: var InlineContext; box: InlineBox) = if not ictx.textFragmentSeen: ictx.textFragmentSeen = true ictx.lastTextFragment = box - if stSplitEnd in box.splitType and - computed{"position"} notin PositionStaticLike: + if stSplitEnd in box.splitType and computed{"position"} != PositionStatic: # This is UB in CSS 2.1, I can't find a newer spec about it, # and Gecko can't even layout it consistently (???) # @@ -2380,7 +2378,7 @@ proc flushMain(fctx: var FlexContext; mctx: var FlexMainContext; proc layoutFlex(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = assert box.inline == nil let lctx = bctx.lctx - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: lctx.pushPositioned() let flexDir = box.computed{"flex-direction"} let dim = if flexDir in FlexRow: dtHorizontal else: dtVertical @@ -2445,7 +2443,7 @@ proc layoutFlex(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = box.applyIntr(sizes, fctx.intr) for child in fctx.relativeChildren: lctx.positionRelative(box, child) - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: lctx.popPositioned(box.state.size) # Inner layout for boxes that establish a new block formatting context. @@ -2741,7 +2739,7 @@ proc initReLayout(state: var BlockState; bctx: var BlockContext; proc layoutBlock(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = let lctx = bctx.lctx - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: lctx.pushPositioned() var state = BlockState( offset: sizes.padding.topLeft, @@ -2780,7 +2778,7 @@ proc layoutBlock(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) = bctx.marginTarget = nil # Reset parentBps to the previous node. bctx.parentBps = state.prevParentBps - if box.computed{"position"} notin PositionStaticLike: + if box.computed{"position"} != PositionStatic: lctx.popPositioned(box.state.size) # 1st pass: build tree diff --git a/src/css/render.nim b/src/css/render.nim index d0dabafa..6f3ac944 100644 --- a/src/css/render.nim +++ b/src/css/render.nim @@ -361,7 +361,7 @@ proc renderInlineBox(grid: var FlexibleGrid; state: var RenderState; bgcolor0.rgb.cellColor()) let startOffset = offset + box.state.startOffset box.render.offset = startOffset - if position notin PositionStaticLike and stSplitStart in box.splitType: + if position != PositionStatic and stSplitStart in box.splitType: state.absolutePos.add(startOffset) if box.t == ibtParent: for child in box.children: @@ -404,7 +404,7 @@ proc renderInlineBox(grid: var FlexibleGrid; state: var RenderState; height: atom.size.h.toInt, bmp: atom.bmp )) - if position notin PositionStaticLike and stSplitEnd in box.splitType: + if position != PositionStatic and stSplitEnd in box.splitType: discard state.absolutePos.pop() proc renderBlockBox(grid: var FlexibleGrid; state: var RenderState; @@ -412,7 +412,7 @@ proc renderBlockBox(grid: var FlexibleGrid; state: var RenderState; let position = box.computed{"position"} #TODO handle negative z-index let zindex = box.computed{"z-index"} - if position notin PositionStaticLike and not pass2 and zindex >= 0: + if position != PositionStatic and not pass2 and zindex >= 0: state.nstack.add(StackItem( box: box, offset: offset, @@ -429,7 +429,7 @@ proc renderBlockBox(grid: var FlexibleGrid; state: var RenderState; offset.y = state.absolutePos[^1].y offset += box.state.offset box.render.offset = offset - if position notin PositionStaticLike: + if position != PositionStatic: state.absolutePos.add(offset) let overflowX = box.computed{"overflow-x"} let overflowY = box.computed{"overflow-y"} @@ -482,7 +482,7 @@ proc renderBlockBox(grid: var FlexibleGrid; state: var RenderState; grid.renderBlockBox(state, child, offset) if hasClipBox: discard state.clipBoxes.pop() - if position notin PositionStaticLike: + if position != PositionStatic: discard state.absolutePos.pop() proc renderDocument*(grid: var FlexibleGrid; bgcolor: var CellColor; diff --git a/test/layout/position-sticky-establishes-absolute-container.expected b/test/layout/position-sticky-establishes-absolute-container.expected new file mode 100644 index 00000000..33c1f19e --- /dev/null +++ b/test/layout/position-sticky-establishes-absolute-container.expected @@ -0,0 +1,2 @@ +test +absolute diff --git a/test/layout/position-sticky-establishes-absolute-container.html b/test/layout/position-sticky-establishes-absolute-container.html new file mode 100644 index 00000000..4725a883 --- /dev/null +++ b/test/layout/position-sticky-establishes-absolute-container.html @@ -0,0 +1,8 @@ +<div> +test +</div> +<div style="position: sticky"> +<div style="position: absolute; top: 0"> +absolute +</div> +</div> |