From 85b8d00c824580fc858766ca4039fd91d1a271ce Mon Sep 17 00:00:00 2001 From: Tyler-pollick Date: Thu, 1 Sep 2022 18:02:49 -0600 Subject: [PATCH] fix: Change stack implementation from grid to flex-box (#441) --- .../Resources/TokamakStyles.swift | 10 +++++----- Sources/TokamakStaticHTML/Shapes/Path.swift | 4 ++++ .../Views/Layout/HStack.swift | 6 +++--- .../Views/Layout/VStack.swift | 2 +- .../RenderingTests/VisualTests.swift | 2 +- .../VisualTests/testMaterial.1.png | Bin 8097 -> 8395 bytes .../HTMLTests/testDoubleTitle.1.html | 14 +++++++------- .../HTMLTests/testDoubleTitleModifier.1.html | 10 +++++----- .../HTMLTests/testFontStacks.1.html | 10 +++++----- .../HTMLTests/testFontStacks.2.html | 12 ++++++------ .../HTMLTests/testHTMLSanitizer.1.html | 10 +++++----- .../HTMLTests/testHTMLSanitizer.2.html | 10 +++++----- .../HTMLTests/testMetaAll.1.html | 12 ++++++------ .../HTMLTests/testMetaCharset.1.html | 12 ++++++------ .../HTMLTests/testMetaCharsetModifier.1.html | 10 +++++----- .../HTMLTests/testOptional.1.html | 14 ++++++++------ .../HTMLTests/testPaddingFusion.1.html | 12 +++++++----- .../HTMLTests/testPaddingFusion.2.html | 12 +++++++----- .../testPreferencePropagation.1.html | 16 ++++++++-------- .../__Snapshots__/HTMLTests/testTitle.1.html | 12 ++++++------ .../HTMLTests/testTitleModifier.1.html | 10 +++++----- 21 files changed, 105 insertions(+), 95 deletions(-) diff --git a/Sources/TokamakStaticHTML/Resources/TokamakStyles.swift b/Sources/TokamakStaticHTML/Resources/TokamakStyles.swift index 8aedb441a..e3a51654e 100644 --- a/Sources/TokamakStaticHTML/Resources/TokamakStyles.swift +++ b/Sources/TokamakStaticHTML/Resources/TokamakStyles.swift @@ -16,15 +16,15 @@ import TokamakCore public let tokamakStyles = """ ._tokamak-stack { - display: grid; + display: flex; } ._tokamak-hstack { - grid-auto-flow: column; - column-gap: var(--tokamak-stack-gap, \(Int(defaultStackSpacing))px); + flex-direction: row; + gap: var(--tokamak-stack-gap, \(Int(defaultStackSpacing))px); } ._tokamak-vstack { - grid-auto-flow: row; - row-gap: var(--tokamak-stack-gap, \(Int(defaultStackSpacing))px); + flex-direction: column; + gap: var(--tokamak-stack-gap, \(Int(defaultStackSpacing))px); } ._tokamak-scrollview-hideindicators { scrollbar-color: transparent; diff --git a/Sources/TokamakStaticHTML/Shapes/Path.swift b/Sources/TokamakStaticHTML/Shapes/Path.swift index 1938f5d94..9f22d4a1b 100644 --- a/Sources/TokamakStaticHTML/Shapes/Path.swift +++ b/Sources/TokamakStaticHTML/Shapes/Path.swift @@ -147,10 +147,14 @@ extension Path: _HTMLPrimitive { """ width: 100%; height: 100%; + min-width: 0; + min-height: 0; """ : """ width: \(max(0, size.width)); height: \(max(0, size.height)); + min-width: 0; + min-height: 0; """ } diff --git a/Sources/TokamakStaticHTML/Views/Layout/HStack.swift b/Sources/TokamakStaticHTML/Views/Layout/HStack.swift index e44ec8b8a..30e1d4deb 100644 --- a/Sources/TokamakStaticHTML/Views/Layout/HStack.swift +++ b/Sources/TokamakStaticHTML/Views/Layout/HStack.swift @@ -18,11 +18,11 @@ extension VerticalAlignment { var cssValue: String { switch self { case .top: - return "start" + return "flex-start" case .center: return "center" case .bottom: - return "end" + return "flex-end" default: return "center" } @@ -38,7 +38,7 @@ extension HStack: _HTMLPrimitive, SpacerContainer { return AnyView(HTML("div", [ "style": """ - align-items: \(alignment.cssValue); + justify-content: \(alignment.cssValue); \(hasSpacer ? "width: 100%;" : "") \(fillCrossAxis ? "height: 100%;" : "") \(spacing != defaultStackSpacing ? "--tokamak-stack-gap: \(spacing)px;" : "") diff --git a/Sources/TokamakStaticHTML/Views/Layout/VStack.swift b/Sources/TokamakStaticHTML/Views/Layout/VStack.swift index 354047954..d1bd9b50f 100644 --- a/Sources/TokamakStaticHTML/Views/Layout/VStack.swift +++ b/Sources/TokamakStaticHTML/Views/Layout/VStack.swift @@ -38,7 +38,7 @@ extension VStack: _HTMLPrimitive, SpacerContainer { return AnyView(HTML("div", [ "style": """ - justify-items: \(alignment.cssValue); + align-items: \(alignment.cssValue); \(hasSpacer ? "height: 100%;" : "") \(fillCrossAxis ? "width: 100%;" : "") \(spacing != defaultStackSpacing ? "--tokamak-stack-gap: \(spacing)px;" : "") diff --git a/Tests/TokamakStaticHTMLTests/RenderingTests/VisualTests.swift b/Tests/TokamakStaticHTMLTests/RenderingTests/VisualTests.swift index dc41b8f06..f380b7fff 100644 --- a/Tests/TokamakStaticHTMLTests/RenderingTests/VisualTests.swift +++ b/Tests/TokamakStaticHTMLTests/RenderingTests/VisualTests.swift @@ -147,7 +147,7 @@ final class VisualRenderingTests: XCTestCase { Color.clear .background(Material.ultraThick) } - }, + }.frame(width: 100, height: 100), as: .image(size: .init(width: 100, height: 100)), timeout: defaultSnapshotTimeout ) diff --git a/Tests/TokamakStaticHTMLTests/RenderingTests/__Snapshots__/VisualTests/testMaterial.1.png b/Tests/TokamakStaticHTMLTests/RenderingTests/__Snapshots__/VisualTests/testMaterial.1.png index bcba5e93991d53870088c1018b4cd4392e1a3566..ae51de12d8703594e326ea273d799ba7dbc5be0e 100644 GIT binary patch delta 8339 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 ofAq3qo8(zcTokamak 2