about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/css/csstree.nim2
-rw-r--r--src/css/cssvalues.nim10
-rw-r--r--src/css/layout.nim14
3 files changed, 20 insertions, 6 deletions
diff --git a/src/css/csstree.nim b/src/css/csstree.nim
index 79872920..6c2b78de 100644
--- a/src/css/csstree.nim
+++ b/src/css/csstree.nim
@@ -238,7 +238,7 @@ proc getParent(frame: var TreeFrame; computed: CSSValues; display: CSSDisplay):
     var seq[StyledNode] =
   let parentDisplay = frame.computed{"display"}
   case parentDisplay
-  of DisplayInnerFlex:
+  of DisplayInnerFlex, DisplayInnerGrid:
     if display in DisplayOuterInline:
       if frame.anonComputed == nil:
         frame.anonComputed = frame.inheritFor(DisplayBlock)
diff --git a/src/css/cssvalues.nim b/src/css/cssvalues.nim
index 468b3298..8762e864 100644
--- a/src/css/cssvalues.nim
+++ b/src/css/cssvalues.nim
@@ -193,6 +193,8 @@ type
     DisplayFlowRoot = "flow-root"
     DisplayFlex = "flex"
     DisplayInlineFlex = "inline-flex"
+    DisplayGrid = "grid"
+    DisplayInlineGrid = "inline-grid"
     # internal, for layout
     DisplayTableWrapper = ""
 
@@ -556,10 +558,11 @@ const OverflowScrollLike* = {OverflowScroll, OverflowAuto, OverflowOverlay}
 const OverflowHiddenLike* = {OverflowHidden, OverflowClip}
 const FlexReverse* = {FlexDirectionRowReverse, FlexDirectionColumnReverse}
 const DisplayInlineBlockLike* = {
-  DisplayInlineTable, DisplayInlineBlock, DisplayInlineFlex
+  DisplayInlineTable, DisplayInlineBlock, DisplayInlineFlex, DisplayInlineGrid
 }
 const DisplayOuterInline* = DisplayInlineBlockLike + {DisplayInline}
 const DisplayInnerFlex* = {DisplayFlex, DisplayInlineFlex}
+const DisplayInnerGrid* = {DisplayGrid, DisplayInlineGrid}
 const RowGroupBox* = {
   # Note: caption is not included here
   DisplayTableRowGroup, DisplayTableHeaderGroup, DisplayTableFooterGroup
@@ -751,8 +754,7 @@ func inherited*(t: CSSPropertyType): bool =
 func blockify*(display: CSSDisplay): CSSDisplay =
   case display
   of DisplayBlock, DisplayTable, DisplayListItem, DisplayNone, DisplayFlowRoot,
-      DisplayFlex, DisplayTableWrapper:
-     #TODO grid
+      DisplayFlex, DisplayTableWrapper, DisplayGrid:
     return display
   of DisplayInline, DisplayInlineBlock, DisplayTableRow,
       DisplayTableRowGroup, DisplayTableColumn,
@@ -763,6 +765,8 @@ func blockify*(display: CSSDisplay): CSSDisplay =
     return DisplayTable
   of DisplayInlineFlex:
     return DisplayFlex
+  of DisplayInlineGrid:
+    return DisplayGrid
 
 func bfcify*(overflow: CSSOverflow): CSSOverflow =
   if overflow == OverflowVisible:
diff --git a/src/css/layout.nim b/src/css/layout.nim
index ff31f2e7..b28aecc8 100644
--- a/src/css/layout.nim
+++ b/src/css/layout.nim
@@ -105,10 +105,13 @@ func isDefinite(sc: SizeConstraint): bool =
 # Note: this does not include display types that cannot appear as block
 # children.
 func establishesBFC(computed: CSSValues): bool =
+  const DisplayWithBFC = {
+    DisplayFlowRoot, DisplayTable, DisplayFlex, DisplayGrid
+  }
   return computed{"float"} != FloatNone or
-    computed{"display"} in {DisplayFlowRoot, DisplayTable, DisplayFlex} or
+    computed{"display"} in DisplayWithBFC or
     computed{"overflow-x"} notin {OverflowVisible, OverflowClip}
-    #TODO contain, grid, multicol, column-span
+    #TODO contain, multicol, column-span
 
 func canpx(l: CSSLength; sc: SizeConstraint): bool =
   return l.u != clAuto and (l.u != clPerc or sc.t == scStretch)
@@ -370,6 +373,7 @@ type
 # Forward declarations
 proc layoutTable(bctx: BlockContext; box: BlockBox; sizes: ResolvedSizes)
 proc layoutFlex(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes)
+proc layoutGrid(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes)
 proc layoutRootBlock(lctx: LayoutContext; box: BlockBox; offset: Offset;
   sizes: ResolvedSizes)
 proc layout(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes;
@@ -2624,6 +2628,8 @@ proc layout(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes;
     bctx.layoutTable(box, sizes)
   of DisplayInnerFlex:
     bctx.layoutFlex(box, sizes)
+  of DisplayInnerGrid:
+    bctx.layoutGrid(box, sizes)
   else:
     assert false
 
@@ -2871,6 +2877,10 @@ proc layoutFlex(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) =
   if box.computed{"position"} != PositionStatic:
     lctx.popPositioned(box, box.state.size)
 
+proc layoutGrid(bctx: var BlockContext; box: BlockBox; sizes: ResolvedSizes) =
+  #TODO implement grid
+  bctx.layoutFlow(box, sizes, canClear = false)
+
 # Inner layout for boxes that establish a new block formatting context.
 proc layoutRootBlock(lctx: LayoutContext; box: BlockBox; offset: Offset;
     sizes: ResolvedSizes) =