From ff424860b77c59e0919ce29a3f8d5e2a0627832f Mon Sep 17 00:00:00 2001
From: Martin Leblanc <m26lebla@uwaterloo.ca>
Date: Tue, 31 May 2022 15:45:08 -0400
Subject: [PATCH] ISTWCMS-5593: inital import of uw layouts and grid

---
 src/patterns/01-core/mixins/_index.scss       |   1 +
 src/patterns/01-core/mixins/_uw-mixins.scss   | 361 ++++++++++++++++++
 src/patterns/01-core/props/_layout.scss       |   8 +-
 src/patterns/01-core/props/_media.scss        |  14 +-
 src/patterns/02-base/colors/colors.twig       |  11 -
 src/patterns/03-layouts/grid/_grid.scss       |  42 ++
 src/patterns/03-layouts/grid/grid.twig        |   5 +
 src/patterns/03-layouts/grid/grid.yml         |   9 +
 src/patterns/03-layouts/grid/grid~2col.yml    |   9 +
 src/patterns/03-layouts/grid/grid~3col.yml    |   9 +
 src/patterns/03-layouts/grid/grid~4col.yml    |   9 +
 src/patterns/03-layouts/grid/grid~6col.yml    |   9 +
 .../03-layouts/layout/_layout-base.scss       |  27 ++
 src/patterns/03-layouts/layout/_layout.scss   | 117 ++++++
 src/patterns/03-layouts/layout/_layout.twig   |  70 ++++
 .../layout/layout--1-col/_layout--1-col.scss  |   8 +
 .../layout/layout--1-col/layout--1-col.twig   |  21 +
 .../layout/layout--1-col/layout--1-col.yml    |   4 +
 .../layout/layout--2-col/_layout--2-col.scss  |  37 ++
 .../layout/layout--2-col/layout--2-col.twig   |  21 +
 .../layout/layout--2-col/layout--2-col.yml    |  10 +
 .../layout/layout--3-col/_layout--3-col.scss  |  64 ++++
 .../layout/layout--3-col/layout--3-col.twig   |  21 +
 .../layout/layout--3-col/layout--3-col.yml    |  19 +
 .../layout/layout--4-col/_layout--4-col.scss  |  90 +++++
 .../layout/layout--4-col/layout--4-col.twig   |  21 +
 .../layout/layout--4-col/layout--4-col.yml    |  19 +
 .../layout/layout--5-col/_layout--5-col.scss  |  79 ++++
 .../layout/layout--5-col/layout--5-col.twig   |  21 +
 .../layout/layout--5-col/layout--5-col.yml    |  22 ++
 .../_layout--inverted-l-left.scss             |  59 +++
 .../layout--inverted-l-left.twig              |  23 ++
 .../layout--inverted-l-left.yml               |  10 +
 .../_layout--inverted-l-right.scss            |  62 +++
 .../layout--inverted-l-right.twig             |  23 ++
 .../layout--inverted-l-right.yml              |  10 +
 src/patterns/03-layouts/layout/layout.yml     |   0
 src/patterns/03-layouts/region/region.scss    |  10 +
 src/patterns/03-layouts/region/region.twig    |  15 +
 src/patterns/03-layouts/region/region.yml     |   4 +
 src/patterns/global.scss                      |   3 +
 41 files changed, 1356 insertions(+), 21 deletions(-)
 create mode 100644 src/patterns/01-core/mixins/_uw-mixins.scss
 create mode 100644 src/patterns/03-layouts/grid/_grid.scss
 create mode 100644 src/patterns/03-layouts/grid/grid.twig
 create mode 100644 src/patterns/03-layouts/grid/grid.yml
 create mode 100644 src/patterns/03-layouts/grid/grid~2col.yml
 create mode 100644 src/patterns/03-layouts/grid/grid~3col.yml
 create mode 100644 src/patterns/03-layouts/grid/grid~4col.yml
 create mode 100644 src/patterns/03-layouts/grid/grid~6col.yml
 create mode 100644 src/patterns/03-layouts/layout/_layout-base.scss
 create mode 100644 src/patterns/03-layouts/layout/_layout.scss
 create mode 100644 src/patterns/03-layouts/layout/_layout.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--1-col/_layout--1-col.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--1-col/layout--1-col.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--1-col/layout--1-col.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--2-col/_layout--2-col.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--2-col/layout--2-col.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--2-col/layout--2-col.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--3-col/_layout--3-col.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--3-col/layout--3-col.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--3-col/layout--3-col.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--4-col/_layout--4-col.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--4-col/layout--4-col.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--4-col/layout--4-col.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--5-col/_layout--5-col.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--5-col/layout--5-col.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--5-col/layout--5-col.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-left/_layout--inverted-l-left.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.yml
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-right/_layout--inverted-l-right.scss
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.twig
 create mode 100644 src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.yml
 create mode 100644 src/patterns/03-layouts/layout/layout.yml
 create mode 100644 src/patterns/03-layouts/region/region.scss
 create mode 100644 src/patterns/03-layouts/region/region.twig
 create mode 100644 src/patterns/03-layouts/region/region.yml

diff --git a/src/patterns/01-core/mixins/_index.scss b/src/patterns/01-core/mixins/_index.scss
index b297b2a0..dcac9a9f 100644
--- a/src/patterns/01-core/mixins/_index.scss
+++ b/src/patterns/01-core/mixins/_index.scss
@@ -6,3 +6,4 @@
 @forward 'list';
 @forward 'svg-background';
 @forward 'svg-icon';
+@forward 'uw-mixins';
diff --git a/src/patterns/01-core/mixins/_uw-mixins.scss b/src/patterns/01-core/mixins/_uw-mixins.scss
new file mode 100644
index 00000000..0fe17871
--- /dev/null
+++ b/src/patterns/01-core/mixins/_uw-mixins.scss
@@ -0,0 +1,361 @@
+$test-color-1: var(--teal-3);
+$test-color-2: var(--pink-3);
+$test-color-3: var(--blue-3);
+$test-color-4: var(--violet-3);
+$test-color-5: var(--indigo-3);
+$test-color-6: var(--red-3);
+$test-color-7: var(--red-8);
+$test-color-8: var(--orange-8);
+$test-color-9: var(--orange-5);
+$test-color-10: var(--yellow-2);
+$test-color-11: var(--green-2);
+$test-color-12: var(--green-5);
+
+@mixin uw-no-breakout {
+  overflow-wrap: break-word;
+  -ms-word-break: break-all;
+  word-break: break-all;
+  word-break: break-word;
+  word-wrap: break-word;
+}
+
+@mixin uw-contained-width($value:$max-width) {
+  margin-left: auto;
+  margin-right: auto;
+  max-width: $value;
+  padding: 0 var(--size-1);
+
+  @include xl{
+    padding-left: 0;
+    padding-right: 0;
+
+  }
+}
+@mixin uw-full-width {
+  max-width: 100%;
+  padding: 0;
+  width: 100%;
+}
+@mixin uw-full-width-padding {
+  max-width: 100%;
+  padding: 0 var(--size-1);
+  width: 100%;
+}
+@mixin uw-full-width-margin {
+  left: 50%;
+  margin-left: -50vw;
+  margin-right: -50vw;
+  max-width: 100vw;
+  padding: 0;
+  position: relative;
+  right: 50%;
+  width: 100vw;
+}
+@mixin uw-full-width-reset {
+  left: inherit;
+  margin-left: -1rem;
+  margin-right: -2rem;
+  max-width: inherit;
+  padding: inherit;
+  position: relative;
+  right:  inherit;
+  width: inherit;
+}
+@mixin uw-contained-width-reset() {
+  margin-left:inherit;
+  margin-right: inherit;
+  max-width: inherit;
+  padding: inherit;
+  @media(min-width: $screen-xl) {
+    padding-left:inherit;
+    padding-right:inherit;
+  }
+}
+// Flexbox display
+@mixin flexbox {
+  display: flex;
+}
+
+// Inline flex display
+@mixin inline-flex {
+  display: inline-flex;
+}
+
+// The 'flex' shorthand
+// - applies to: flex items
+// <positive-number>, initial, auto, or none
+@mixin flex($fg: 1, $fs: 0, $fb: auto) {
+  // Set a variable to be used by box-flex properties
+  $fg-boxflex: $fg;
+  // Box-Flex only supports a flex-grow value so lets grab the
+  // first item in the list and just return that.
+  @if type-of($fg) == 'list' {
+    $fg-boxflex: nth($fg, 1);
+  }
+
+  -webkit-box: $fg-boxflex;
+  -moz-box: $fg-boxflex;
+  -webkit-flex: $fg $fs $fb;
+  -ms-flex: $fg $fs $fb;
+  flex: $fg $fs $fb;
+}
+
+// Flex Flow Direction
+// - applies to: flex containers
+// row (default) | row-reverse | column | column-reverse
+@mixin flex-direction($direction: row) {
+  @if $direction == row-reverse {
+    -webkit-box-direction: reverse;
+    -moz-box-direction: reverse;
+    -webkit-box-orient: horizontal;
+    -moz-box-orient: horizontal;
+  } @else if $direction == column {
+    -webkit-box-direction: normal;
+    -moz-box-direction: normal;
+    -webkit-box-orient: vertical;
+    -moz-box-orient: vertical;
+  } @else if $direction == column-reverse {
+    -webkit-box-direction: reverse;
+    -moz-box-direction: reverse;
+    -webkit-box-orient: vertical;
+    -moz-box-orient: vertical;
+  } @else {
+    -webkit-box-direction: normal;
+    -moz-box-direction: normal;
+    -webkit-box-orient: horizontal;
+    -moz-box-orient: horizontal;
+  }
+  -ms-flex-direction: $direction;
+  -webkit-flex-direction: $direction;
+  flex-direction: $direction;
+}
+
+// Flex Line Wrapping
+// - applies to: flex containers
+// nowrap | wrap | wrap-reverse
+@mixin flex-wrap($value: nowrap) {
+  // No Webkit/FF Box fallback.
+  -webkit-flex-wrap: $value;
+  @if $value == nowrap {
+    -ms-flex-wrap: inherit;
+  } @else {
+    -ms-flex-wrap: $value;
+  }
+  flex-wrap: $value;
+}
+
+// Flex Direction and Wrap
+// - applies to: flex containers
+// <flex-direction> || <flex-wrap>
+@mixin flex-flow($values: (row nowrap)) {
+  // No Webkit/FF Box fallback.
+  -webkit-flex-flow: $values;
+  -ms-flex-flow: $values;
+  flex-flow: $values;
+}
+
+// Display Order
+// - applies to: flex items
+// <integer>
+@mixin order($int: 0) {
+  -webkit-box-ordinal-group: $int + 1;
+  -moz-box-ordinal-group: $int + 1;
+  -ms-flex-order: $int;
+  -webkit-order: $int;
+
+  order: $int;
+}
+
+// Flex grow factor
+// - applies to: flex items
+// <number>
+@mixin flex-grow($int: 1) {
+  -webkit-box-flex: $int;
+  -moz-box-flex: $int;
+  -ms-flex: $int;
+  -webkit-flex-grow: $int;
+
+  flex-grow: $int;
+}
+
+// Flex shrink
+// - applies to: flex item shrink factor
+// <number>
+@mixin flex-shrink($int: 0) {
+
+  -ms-flex: $int;
+  -webkit-flex-shrink: $int;
+  -moz-flex-shrink: $int;
+  flex-shrink: $int;
+}
+
+// Flex basis
+// - the initial main size of the flex item
+// - applies to: flex itemsnitial main size of the flex item
+// <width>
+@mixin flex-basis($value: auto) {
+  -webkit-flex-basis: $value;
+  flex-basis: $value;
+}
+
+// Axis Alignment
+// - applies to: flex containers
+// flex-start | flex-end | center | space-between | space-around
+@mixin justify-content($value: flex-start) {
+  @if $value == flex-start {
+    -webkit-box-pack: start;
+    -moz-box-pack: start;
+    -ms-flex-pack: start;
+  } @else if $value == flex-end {
+    -webkit-box-pack: end;
+    -moz-box-pack: end;
+    -ms-flex-pack: end;
+  } @else if $value == space-between {
+    -webkit-box-pack: justify;
+    -moz-box-pack: justify;
+    -ms-flex-pack: justify;
+  } @else if $value == space-around {
+    -ms-flex-pack: distribute;
+  } @else {
+    -webkit-box-pack: $value;
+    -moz-box-pack: $value;
+    -ms-flex-pack: $value;
+  }
+  -webkit-justify-content: $value;
+  justify-content: $value;
+}
+
+// Packing Flex Lines
+// - applies to: multi-line flex containers
+// flex-start | flex-end | center | space-between | space-around | stretch
+@mixin align-content($value: stretch) {
+  // No Webkit Box Fallback.
+  -webkit-align-content: $value;
+  @if $value == flex-start {
+    -ms-flex-line-pack: start;
+  } @else if $value == flex-end {
+    -ms-flex-line-pack: end;
+  } @else {
+    -ms-flex-line-pack: $value;
+  }
+  align-content: $value;
+}
+
+// Cross-axis Alignment
+// - applies to: flex containers
+// flex-start | flex-end | center | baseline | stretch
+@mixin align-items($value: stretch) {
+  @if $value == flex-start {
+    -webkit-box-align: start;
+    -moz-box-align: start;
+    -ms-flex-align: start;
+  } @else if $value == flex-end {
+    -webkit-box-align: end;
+    -moz-box-align: end;
+    -ms-flex-align: end;
+  } @else {
+    -webkit-box-align: $value;
+    -moz-box-align: $value;
+    -ms-flex-align: $value;
+  }
+  -webkit-align-items: $value;
+  align-items: $value;
+}
+
+// Cross-axis Alignment
+// - applies to: flex items
+// auto | flex-start | flex-end | center | baseline | stretch
+@mixin align-self($value: auto) {
+  // No Webkit Box Fallback.
+  -webkit-align-self: $value;
+  @if $value == flex-start {
+    -ms-flex-item-align: start;
+  } @else if $value == flex-end {
+    -ms-flex-item-align: end;
+  } @else {
+    -ms-flex-item-align: $value;
+  }
+  align-self: $value;
+}
+
+
+
+// Display of elements in gridded style.
+@mixin uw-flex-grid($value: flexbox){
+  @if $value == inline-flex {
+    @include inline-flex();
+    @include flex-flow(row wrap);
+    gap: var(--grid-gap);
+  }@else if $value == term{
+    @include flexbox();
+    @include flex-wrap(wrap);
+    gap: var(--grid-gap);
+  }@else if $value == card{
+    @include flexbox();
+    @include flex-direction(column);
+  }@else if $value == masonry{
+    @include flexbox();
+    @include flex-flow(row wrap);
+  }@else{
+    @include flexbox();
+    @include flex-flow(row wrap);
+    gap: var(--grid-gap);
+  }
+}
+// Display of grid item.
+@mixin uw-flex-grid-item(){
+  @include flex();
+  @include align-items(flex-start);
+  width: 100%;
+  @media(min-width: $screen-md) {
+    @include flex(1 1 auto);
+    @include flex-grow(1);
+    width: 45%;
+    .uw-contained-width--narrow &,
+    .layout--uw-inverted-l-right &,
+    .layout--uw-inverted-l-left &,
+    .layout--uw-2-col &,
+    .layout--uw-3-col &,
+    .layout--uw-4-col &{
+      width: 100% !important;
+    }
+  }
+  @media(min-width: $screen-lg) {
+    width: 30%;
+    .uw-contained-width--wide &{
+      width: 45% !important;
+    }
+  }
+}
+
+// Display of list item.
+@mixin uw-flex-term-item(){
+  align-self: flex-start;
+  width: 100%;
+  @media(min-width: $screen-md) {
+    @include flex(1 1 auto);
+    @include flex-grow(1);
+    width: 45%;
+  }
+  @media(min-width: $screen-lg) {
+    //width: 30%;
+  }
+
+}
+
+// Display of elements in list style.
+@mixin uw-flex-list(){
+  //
+}
+// Display of list item.
+@mixin uw-flex-list-item(){
+}
+
+// Display of mosiac item.
+@mixin uw-flex-masonry-item(){
+}
+
+// Display of gallery item.
+@mixin uw-flex-gallery-item(){
+
+}
diff --git a/src/patterns/01-core/props/_layout.scss b/src/patterns/01-core/props/_layout.scss
index a11e1ebd..d3c0ae36 100644
--- a/src/patterns/01-core/props/_layout.scss
+++ b/src/patterns/01-core/props/_layout.scss
@@ -1,6 +1,6 @@
 :where(html) {
-  --layout-gutter: var(--size-6);
-  --layout-max-width: 90rem; // 1440px
-  --grid-gutter: var(--size-10);
-  --grid-gap: var(--size-2);
+  --layout-gutter: var(--size-4);
+  --layout-max-width: 75rem;
+  --grid-gutter: var(--size-4);
+  --grid-gap: var(--size-4);
 }
diff --git a/src/patterns/01-core/props/_media.scss b/src/patterns/01-core/props/_media.scss
index e7767ee0..ae3a18d9 100644
--- a/src/patterns/01-core/props/_media.scss
+++ b/src/patterns/01-core/props/_media.scss
@@ -1,8 +1,10 @@
 // Media Query Ranges
 $screen-xxs: 240px;
-$screen-xs: 360px;
-$screen-sm: 480px;
-$screen-md: 768px;
-$screen-lg: 1024px;
-$screen-xl: 1440px;
-$screen-xxl: 1920px;
+$screen-xs: 30rem;
+$screen-sm: 40.06rem;
+$screen-md: 48.06rem;
+$screen-lg: 63.1875rem;
+$screen-xl: 75rem;
+$screen-xxl: 102.5rem;
+$screen-onek: 120rem;
+$screen-twok: 159.93rem;
diff --git a/src/patterns/02-base/colors/colors.twig b/src/patterns/02-base/colors/colors.twig
index 4a359483..d7743570 100644
--- a/src/patterns/02-base/colors/colors.twig
+++ b/src/patterns/02-base/colors/colors.twig
@@ -21,14 +21,3 @@
     </div>
   {% endfor %}
 </section>
-
-{#{% for title, list in colors %}#}
-{#  <h3>{{ title|capitalize }}</h3>#}
-{#  <div class="pl-swatch__group">#}
-{#    {% for color, hex in list %}#}
-{#      <div class="pl-swatch" style="background-color: {{ hex }}">#}
-{#        <div class="pl-swatch__meta">{{ color }}<br>{{ hex }}</div>#}
-{#      </div>#}
-{#    {% endfor %}#}
-{#  </div>#}
-{#{% endfor %}#}
diff --git a/src/patterns/03-layouts/grid/_grid.scss b/src/patterns/03-layouts/grid/_grid.scss
new file mode 100644
index 00000000..573a45d3
--- /dev/null
+++ b/src/patterns/03-layouts/grid/_grid.scss
@@ -0,0 +1,42 @@
+// @file
+// Styles for Grid layout.
+
+@use '../../01-core' as *;
+
+.l-grid {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-auto-flow: row;
+}
+
+.l-grid--2col {
+  @media(min-width: $screen-sm) {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+}
+
+.l-grid--3col {
+  @media(min-width: $screen-sm) {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+}
+
+.l-grid--4col {
+  @media(min-width: 600px) and (max-width: 800px) {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+
+  @media(min-width: 801px) {
+    grid-template-columns: repeat(4, minmax(0, 1fr));
+  }
+}
+
+.l-grid--6col {
+  @media(min-width: 600px) and (max-width: 999px) {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+
+  @media(min-width: 1000px) {
+    grid-template-columns: repeat(6, minmax(0, 1fr));
+  }
+}
diff --git a/src/patterns/03-layouts/grid/grid.twig b/src/patterns/03-layouts/grid/grid.twig
new file mode 100644
index 00000000..682fd39b
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid.twig
@@ -0,0 +1,5 @@
+<div class="l-grid {{ modifier }}">
+  {% block content %}
+    {{ grid_content }}
+  {% endblock %}
+</div>
diff --git a/src/patterns/03-layouts/grid/grid.yml b/src/patterns/03-layouts/grid/grid.yml
new file mode 100644
index 00000000..2dcdeaa8
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid.yml
@@ -0,0 +1,9 @@
+---
+modifier: ''
+grid_content: |-
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
diff --git a/src/patterns/03-layouts/grid/grid~2col.yml b/src/patterns/03-layouts/grid/grid~2col.yml
new file mode 100644
index 00000000..bac033fa
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid~2col.yml
@@ -0,0 +1,9 @@
+---
+modifier: 'l-grid--2col'
+grid_content: |-
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
diff --git a/src/patterns/03-layouts/grid/grid~3col.yml b/src/patterns/03-layouts/grid/grid~3col.yml
new file mode 100644
index 00000000..caeb3409
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid~3col.yml
@@ -0,0 +1,9 @@
+---
+modifier: 'l-grid--3col'
+grid_content: |-
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
diff --git a/src/patterns/03-layouts/grid/grid~4col.yml b/src/patterns/03-layouts/grid/grid~4col.yml
new file mode 100644
index 00000000..0f7afd8a
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid~4col.yml
@@ -0,0 +1,9 @@
+---
+modifier: 'l-grid--4col'
+grid_content: |-
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
diff --git a/src/patterns/03-layouts/grid/grid~6col.yml b/src/patterns/03-layouts/grid/grid~6col.yml
new file mode 100644
index 00000000..eef86ea0
--- /dev/null
+++ b/src/patterns/03-layouts/grid/grid~6col.yml
@@ -0,0 +1,9 @@
+---
+modifier: 'l-grid--6col'
+grid_content: |-
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
+  <p style="border: var(--border-size-1) dashed var(--gray-3); color: var(--gray-6); padding: 1rem; max-inline-size: 100%; margin: 0;">Grid item</p>
diff --git a/src/patterns/03-layouts/layout/_layout-base.scss b/src/patterns/03-layouts/layout/_layout-base.scss
new file mode 100644
index 00000000..6427793b
--- /dev/null
+++ b/src/patterns/03-layouts/layout/_layout-base.scss
@@ -0,0 +1,27 @@
+@use '../../01-core' as *;
+@use '../../03-layouts/layout/layout--1-col/layout--1-col' as *;
+@use '../../03-layouts/layout/layout--2-col/layout--2-col' as *;
+@use '../../03-layouts/layout/layout--3-col/layout--3-col' as *;
+@use '../../03-layouts/layout/layout--4-col/layout--4-col' as *;
+@use '../../03-layouts/layout/layout--5-col/layout--5-col' as *;
+@use '../../03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left' as *;
+@use '../../03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right' as *;
+.layout__region {
+  .layout-builder &{
+    //outline: 2px dashed #2f91da;
+    outline: 2px dashed var(--blue-6);
+  }
+  .pl & {
+    //outline: 2px dashed #2f91da;
+    outline: 2px dashed var(--blue-6);
+    padding: 1.5rem;
+    text-align: center;
+    .pl-labels{
+      text-align: center;
+    }
+  }
+}
+
+.pl-layout-h2 {
+  @include layout-constrain;
+}
diff --git a/src/patterns/03-layouts/layout/_layout.scss b/src/patterns/03-layouts/layout/_layout.scss
new file mode 100644
index 00000000..6700c059
--- /dev/null
+++ b/src/patterns/03-layouts/layout/_layout.scss
@@ -0,0 +1,117 @@
+@use '../../01-core' as *;
+
+.layout {
+  @include layout-constrain;
+
+  .uw-node__with-image .card__node & {
+    padding: var(--size-1);
+    @media(min-width: $screen-xxl) {
+      padding: var(--size-1) 0;
+    }
+  }
+  &.uw-contained-width {
+    @include layout-constrain;
+    padding: var(--size-1);
+    @media(min-width: $screen-xxl) {
+      padding: var(--size-1) 0;
+    }
+
+    &--narrow {
+      /* Match the width of WCMS2's narrow: 496px */
+      max-width: 31rem;
+    }
+
+    &--wide {
+      /* Match the width of WCMS2's wide: 753px */
+      max-width: 47.0625rem;
+    }
+  }
+
+  &.uw-full-width {
+    @include uw-full-width-padding;
+    overflow: hidden;
+    .uw-caption{
+      > p{
+        padding-left: var(--size-2);
+      }
+    }
+    .uw-section-has-full-width.uw-node__with-sidebar &{
+      padding: 0  var(--size-1) !important;
+    }
+    .dashboards-container &{
+      @include uw-full-width;
+      margin-bottom: var(--grid-gap);
+      overflow: visible; /* otherwise, dropdowns truncate at the border. */
+    }
+    .layout-builder &{
+      padding: var(--size-2);
+    }
+    .layout-builder__region {
+      padding: var(--size-2);
+    }
+    &.layout--uw-1-col{
+      .block-inline-blockuw-cbl-banner-images,
+      .block-inline-blockuw-cbl-image,
+      .block-uw-cbl-image,
+      .block-inline-blockuw-cbl-remote-video,
+      .block-inline-blockuw-cbl-image-gallery{
+        @include uw-full-width-margin;
+        .layout-builder &{
+          @include uw-full-width-reset;
+          margin-left: 0;
+          margin-right: 0;
+        }
+        h2{
+          margin-left: var(--size-2);
+        }
+        .uw-section-has-full-width.uw-node__with-sidebar &{
+          @include uw-full-width-reset;
+        }
+      }
+      .block-inline-blockuw-cbl-google-maps{
+        @include layout-constrain;
+        @media(min-width: $screen-md) {
+          @include uw-full-width-margin;
+        }
+        .layout-builder &{
+          @include uw-full-width-reset;
+          margin-left: 0;
+          margin-right: 0;
+        }
+        .uw-section-has-full-width.uw-node__with-sidebar &{
+          @include uw-full-width-reset;
+        }
+        h2{
+          margin-left: var(--size-2);
+        }
+      }
+    }
+  }
+  // When wrapped with class to identify sidebar
+  .uw-node__with-sidebar & {
+    margin: inherit;
+    @media(min-width: $screen-md) {
+      @include layout-constrain;
+    }
+    &.uw-contained-width {
+      @include layout-constrain;
+      margin: inherit;
+      padding: var(--size-1);
+      @media(min-width: $screen-xxl) {
+        padding: var(--size-1) 0;
+      }
+      &--narrow {
+        /* Match the width of WCMS2's narrow: 496px */
+        margin: inherit;
+      }
+      &--wide {
+        /* Match the width of WCMS2's wide: 753px */
+        margin: inherit;
+      }
+    }
+  }
+}
+
+.uw-section-has-full-width .layout.layout--uw-1-col{
+  overflow: hidden;
+}
diff --git a/src/patterns/03-layouts/layout/_layout.twig b/src/patterns/03-layouts/layout/_layout.twig
new file mode 100644
index 00000000..fa8f0035
--- /dev/null
+++ b/src/patterns/03-layouts/layout/_layout.twig
@@ -0,0 +1,70 @@
+{% set section_names = {
+  1: 'first',
+  2: 'second',
+  3: 'third',
+  4: 'fourth',
+  5: 'fifth',
+} %}
+
+{% set section_classes = '' %}
+<section
+  {% if pattern_lab %}
+    class="{{ classes }}"
+  {% else %}
+    {{ attributes.addClass(classes) }}
+  {% endif %}
+>
+
+  {% for i in 1..num_of_blocks %}
+
+    {% set section_name = section_names[loop.index] %}
+
+    {% if inverted_l_left or inverted_l_right %}
+      {% if loop.index == 1 %}
+        <div class="uw-inverted-l--left-side">
+      {% endif %}
+
+      {% if inverted_l_left and loop.index == 2 %}
+          <div class="uw-inverted-l--right-side">
+      {% endif %}
+
+      {% if inverted_l_right and loop.index == 4 %}
+        <div class="uw-inverted-l--right-side">
+      {% endif %}
+
+    {% endif %}
+
+    <div
+      {% if pattern_lab %}
+        {% set region_classes = 'layout__region ' ~ 'layout__region--' ~ section_name %}
+        class="{{ region_classes }}"
+      {% else %}
+        {{ region_attributes[section_name].addClass('layout__region', 'layout__region--' ~ section_name) }}
+      {% endif %}
+    >
+
+      {% if pattern_lab %}
+        {{ section_name }} column
+      {% else %}
+        {{ content[section_name] }}
+      {% endif %}
+    </div>
+
+    {% if inverted_l_left or inverted_l_right %}
+      {% if inverted_l_left %}
+        {% if loop.index == 1 or loop.index == 4 %}
+          </div>
+        {% endif %}
+      {% endif %}
+
+      {% if inverted_l_right %}
+        {% if loop.index == 3 or loop.index == 4 %}
+          </div>
+        {% endif %}
+      {% endif %}
+
+    {% endif %}
+
+  {% endfor %}
+
+</section>
diff --git a/src/patterns/03-layouts/layout/layout--1-col/_layout--1-col.scss b/src/patterns/03-layouts/layout/layout--1-col/_layout--1-col.scss
new file mode 100644
index 00000000..0fc4b51a
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--1-col/_layout--1-col.scss
@@ -0,0 +1,8 @@
+.layout--uw-1-col {
+  display: var(--grid-gap);
+  grid-template-columns: 100%;
+}
+
+.layout--uw-1-col .layout__region--first {
+  grid-column: 1 / 2;
+}
diff --git a/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.twig b/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.twig
new file mode 100644
index 00000000..838de14d
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.twig
@@ -0,0 +1,21 @@
+{% set num_of_blocks = 1 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.yml b/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.yml
new file mode 100644
index 00000000..cd9e3ba2
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--1-col/layout--1-col.yml
@@ -0,0 +1,4 @@
+column_classes:
+  -
+    name: 'Full (100%)'
+    classes: 'layout layout--uw-1-col'
diff --git a/src/patterns/03-layouts/layout/layout--2-col/_layout--2-col.scss b/src/patterns/03-layouts/layout/layout--2-col/_layout--2-col.scss
new file mode 100644
index 00000000..532358ab
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--2-col/_layout--2-col.scss
@@ -0,0 +1,37 @@
+@use '../../../01-core' as *;
+
+.layout--uw-2-col {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-template-columns: 100%;
+  &.larger-left {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 2fr) 1fr;
+    }
+  }
+  &.larger-right {
+    @media(min-width: $screen-md){
+      grid-template-columns: 1fr minmax(0, 2fr);
+    }
+  }
+  &.even-split {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: repeat(2, 1fr);
+    }
+  }
+  .layout__region{
+    &--first {
+      grid-column: 1 / 2;
+      grid-row: 1 / 2;
+    }
+    &--second {
+      grid-column: 1 / 2;
+      grid-row: 2/ 3;
+      @media(min-width: $screen-md) {
+        grid-column: 2 / 3;
+        grid-row: 1 / 2;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.twig b/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.twig
new file mode 100644
index 00000000..708ac519
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.twig
@@ -0,0 +1,21 @@
+{% set num_of_blocks = 2 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.yml b/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.yml
new file mode 100644
index 00000000..e02d378e
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--2-col/layout--2-col.yml
@@ -0,0 +1,10 @@
+column_classes:
+  -
+    name: 'Even Split (50%, 50%)'
+    classes: 'layout layout--uw-2-col even-split'
+  -
+    name: 'Larger Right (33%, 67%)'
+    classes: 'layout layout--uw-2-col larger-right'
+  -
+    name: 'Larger Left (67%, 33%)'
+    classes: 'layout layout--uw-2-col larger-left'
diff --git a/src/patterns/03-layouts/layout/layout--3-col/_layout--3-col.scss b/src/patterns/03-layouts/layout/layout--3-col/_layout--3-col.scss
new file mode 100644
index 00000000..b4a83382
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--3-col/_layout--3-col.scss
@@ -0,0 +1,64 @@
+@use '../../../01-core' as *;
+
+.layout--uw-3-col {
+  display: grid;
+  gap: var(--grid-gap);
+  &.even-split {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr)  minmax(0, 1fr)  minmax(0, 1fr);
+    }
+  }
+  &.larger-left {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 2fr)  minmax(0, 1fr)  minmax(0, 1fr);
+    }
+  }
+  &.larger-middle {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-right {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr)  minmax(0, 1fr) minmax(0, 2fr);
+    }
+  }
+  &.legacy-38-38-24 {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 24%;
+    }
+  }
+  &.legacy-24-38-38 {
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: 24% minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  .layout__region{
+    &--first {
+      grid-column: 1 / 2;
+      grid-row: 1 / 2;
+    }
+    &--second {
+      grid-column: 1 / 2;
+      grid-row: 2 / 3;
+      @media(min-width: $screen-md) {
+        grid-column: 2 / 3;
+        grid-row: 1 / 2;
+      }
+    }
+    &--third {
+      grid-column: 1 / 2;
+      grid-row: 3 / 4;
+      @media(min-width: $screen-md) {
+        grid-column: 3 / 4;
+        grid-row: 1 / 2;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.twig b/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.twig
new file mode 100644
index 00000000..94919c41
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.twig
@@ -0,0 +1,21 @@
+{% set num_of_blocks = 3 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.yml b/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.yml
new file mode 100644
index 00000000..97f3844a
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--3-col/layout--3-col.yml
@@ -0,0 +1,19 @@
+column_classes:
+  -
+    name: 'Even Split (33%, 34%, 33%)'
+    classes: 'layout layout--uw-3-col even-split'
+  -
+    name: 'Larger Left (50%, 25%, 25%)'
+    classes: 'layout layout--uw-3-col larger-left'
+  -
+    name: 'Larger Middle (25%, 50%, 25%)'
+    classes: 'layout layout--uw-3-col larger-middle'
+  -
+    name: 'Larger Right (25%, 25%, 50%)'
+    classes: 'layout layout--uw-3-col larger-right'
+  -
+    name: 'Legacy (38%, 38%, 24%)'
+    classes: 'layout layout--uw-3-col legacy-38-38-24'
+  -
+    name: 'Legacy (24%, 38%, 38%)'
+    classes: 'layout layout--uw-3-col legacy-24-38-38'
diff --git a/src/patterns/03-layouts/layout/layout--4-col/_layout--4-col.scss b/src/patterns/03-layouts/layout/layout--4-col/_layout--4-col.scss
new file mode 100644
index 00000000..171efeb6
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--4-col/_layout--4-col.scss
@@ -0,0 +1,90 @@
+@use '../../../01-core' as *;
+.layout--uw-4-col {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-template-columns: 100%;
+  &.even-split {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-left {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 3fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-second {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-third {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-right {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 3fr);
+    }
+  }
+  &.legacy-23-27-27-23 {
+    @media(min-width: $screen-sm) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.1fr) minmax(0, 1.1fr) minmax(0, 0.8fr);
+    }
+  }
+  .layout__region{
+
+    &--first {
+      grid-column: 1 / 2;
+      grid-row: 1 / 2;
+    }
+    &--second {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-sm) {
+        grid-column: 2 / 3;
+      }
+      @media(min-width: $screen-lg) {
+        grid-column: 2 / 3;
+      }
+    }
+    &--third {
+      @media(min-width: $screen-sm) {
+        grid-column: 1 / 2;
+      }
+      @media(min-width: $screen-lg) {
+        grid-column: 3 / 4;
+        grid-row: 1 / 2;
+      }
+    }
+    &--fourth {
+      @media(min-width: $screen-sm) {
+        grid-column: 2 / 3;
+        grid-row: 2 / 3;
+      }
+      @media(min-width: $screen-lg) {
+        grid-column: 4 / 5;
+        grid-row: 1 / 2;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.twig b/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.twig
new file mode 100644
index 00000000..9c2a605b
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.twig
@@ -0,0 +1,21 @@
+{% set num_of_blocks = 4 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.yml b/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.yml
new file mode 100644
index 00000000..e33650c3
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--4-col/layout--4-col.yml
@@ -0,0 +1,19 @@
+column_classes:
+  -
+    name: 'Even Split (25% 25% 25% 25%)'
+    classes: 'layout layout--uw-4-col even-split'
+  -
+    name: 'Larger Left (50%, 16.67%, 16.67%, 16.67%)'
+    classes: 'layout layout--uw-4-col larger-left'
+  -
+    name: 'Larger Second (16.67%, 50%, 16.67%, 16.67%)'
+    classes: 'layout layout--uw-4-col larger-second'
+  -
+    name: 'Larger Third (16.67%, 16.67%, 50%, 16.67%)'
+    classes: 'layout layout--uw-4-col larger-third'
+  -
+    name: 'Larger Right (16.67%, 16.67%, 16.67%, 50%)'
+    classes: 'layout layout--uw-4-col larger-right'
+  -
+    name: 'Legacy (23%, 27%, 27%, 23%)'
+    classes: 'layout layout--uw-4-col legacy-23-27-27-23'
diff --git a/src/patterns/03-layouts/layout/layout--5-col/_layout--5-col.scss b/src/patterns/03-layouts/layout/layout--5-col/_layout--5-col.scss
new file mode 100644
index 00000000..5964fb87
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--5-col/_layout--5-col.scss
@@ -0,0 +1,79 @@
+@use '../../../01-core' as *;
+.layout--uw-5-col {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-template-columns: 100%;
+  &.even-split {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-left {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 3fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-second {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-third {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-fourth {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 3fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-right {
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 3fr);
+    }
+  }
+  &.legacy-23-19-19-19-20 {
+    @media(min-width: $screen-md) {
+      grid-template-columns: 23% minmax(0, 1fr)   minmax(0, 1fr)  minmax(0, 1fr)   20%;
+    }
+  }
+  .layout__region{
+    &--first {
+      grid-column: 1 / 2;
+      grid-row: 1 / 2;
+    }
+    &--second {
+      grid-column: 1 / 2;
+      grid-row: 2 / 3;
+      @media(min-width: $screen-md) {
+        grid-column: 2 / 3;
+        grid-row: 1 / 2;
+      }
+    }
+    &--third {
+      grid-column: 1 / 2;
+      grid-row: 3 / 4;
+      @media(min-width: $screen-md) {
+        grid-column: 3 / 4;
+        grid-row: 1 / 2;
+      }
+    }
+    &--fourth {
+      grid-column: 1 / 2;
+      grid-row: 4 / 5;
+      @media(min-width: $screen-md) {
+        grid-column: 4 / 5;
+        grid-row: 1 / 2;
+      }
+    }
+    &--fifth {
+      grid-column: 1 / 2;
+      grid-row: 5 / 6;
+      @media(min-width: $screen-md) {
+        grid-column: 5 / 6;
+        grid-row: 1 / 2;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.twig b/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.twig
new file mode 100644
index 00000000..8d531886
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.twig
@@ -0,0 +1,21 @@
+{% set num_of_blocks = 5 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.yml b/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.yml
new file mode 100644
index 00000000..d23eaf92
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--5-col/layout--5-col.yml
@@ -0,0 +1,22 @@
+column_classes:
+  -
+    name: 'Even Split (20%, 20%, 20%, 20%, 20%)'
+    classes: 'layout layout--uw-5-col even-split'
+  -
+    name: 'Larger Left (40%, 15%, 15%, 15%, 15%)'
+    classes: 'layout layout--uw-5-col larger-left'
+  -
+    name: 'Larger Second (15%, 40%, 15%, 15%, 15%)'
+    classes: 'layout layout--uw-5-col larger-second'
+  -
+    name: 'Larger Third (15%, 15%, 40%, 15%, 15%)'
+    classes: 'layout layout--uw-5-col larger-third'
+  -
+    name: 'Larger Fourth (15%, 15%, 15%, 40%, 15%)'
+    classes: 'layout layout--uw-5-col larger-fourth'
+  -
+    name: 'Larger Right (15%, 15%, 15%, 15%, 40%)'
+    classes: 'layout layout--uw-5-col larger-right'
+  -
+    name: 'Legacy (23%, 19%, 19%, 19%, 20%)'
+    classes: 'layout layout--uw-5-col legacy-23-19-19-19-20'
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-left/_layout--inverted-l-left.scss b/src/patterns/03-layouts/layout/layout--inverted-l-left/_layout--inverted-l-left.scss
new file mode 100644
index 00000000..2a86b770
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-left/_layout--inverted-l-left.scss
@@ -0,0 +1,59 @@
+@use '../../../01-core' as *;
+.layout--uw-inverted-l-left {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-template-columns: 100%;
+  &.even-split {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-left {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-right {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
+    }
+  }
+  .uw-inverted-l--left-side {
+    grid-column: 1 / 2;
+    grid-row: 1 / 2;
+  }
+  .uw-inverted-l--right-side {
+    display: grid;
+    gap: var(--grid-gap);
+    grid-column: 1 / 2;
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+    @media(min-width: $screen-lg) {
+      grid-column: 2 / 3;
+    }
+  }
+  .layout__region{
+    &--first{
+      //
+    }
+    &--second {
+      @media(min-width: $screen-md) {
+        grid-column: 1 / 2;
+      }
+    }
+    &--third {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-md) {
+        grid-column: 2 / 3;
+      }
+    }
+    &--fourth {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-md) {
+        grid-column: 1 / 3;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.twig b/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.twig
new file mode 100644
index 00000000..0ce52523
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.twig
@@ -0,0 +1,23 @@
+{% set num_of_blocks = 4 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+      inverted_l_left: 1,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+    inverted_l_left: 1,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.yml b/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.yml
new file mode 100644
index 00000000..d8f8296a
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-left/layout--inverted-l-left.yml
@@ -0,0 +1,10 @@
+column_classes:
+  -
+    name: 'Even Split (50%, 50%)'
+    classes: 'layout layout--uw-inverted-l-left even-split'
+  -
+    name: 'Larger Left (33%, 67%)'
+    classes: 'layout layout--uw-inverted-l-left larger-left'
+  -
+    name: 'Larger Right (67%, 33%)'
+    classes: 'layout layout--uw-inverted-l-left larger-right'
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-right/_layout--inverted-l-right.scss b/src/patterns/03-layouts/layout/layout--inverted-l-right/_layout--inverted-l-right.scss
new file mode 100644
index 00000000..c8fb4229
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-right/_layout--inverted-l-right.scss
@@ -0,0 +1,62 @@
+@use '../../../01-core' as *;
+.layout--uw-inverted-l-right {
+  display: grid;
+  gap: var(--grid-gap);
+  grid-template-columns: 100%;
+  &.even-split {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
+    }
+  }
+  &.larger-left {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
+    }
+  }
+  &.larger-right {
+    @media(min-width: $screen-lg) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
+    }
+  }
+  .uw-inverted-l--left-side {
+    display: grid;
+    gap: var(--grid-gap);
+    grid-column: 1 / 2;
+    grid-row: 1 / 2;
+    grid-template-columns: 100%;
+    @media(min-width: $screen-md) {
+      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+    }
+  }
+  .uw-inverted-l--right-side {
+    grid-column: 1 / 2;
+    grid-row: 2 / 3;
+    @media(min-width: $screen-lg) {
+      grid-column: 2 / 3;
+      grid-row: 1 / 2;
+    }
+  }
+  .layout__region{
+    &--first {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-md) {
+        grid-column: 1 / 2;
+        grid-row: 1 / 2;
+      }
+    }
+    &--second {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-md) {
+        grid-column: 2 / 3;
+        grid-row: 1 / 2;
+      }
+    }
+    &--third {
+      grid-column: 1 / 2;
+      @media(min-width: $screen-md) {
+        grid-column: 1 / 3;
+        grid-row: 2 / 3;
+      }
+    }
+  }
+}
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.twig b/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.twig
new file mode 100644
index 00000000..e869a26b
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.twig
@@ -0,0 +1,23 @@
+{% set num_of_blocks = 4 %}
+
+{% if pattern_lab %}
+
+  {% for column_class in column_classes %}
+    <h2 class="pl-layout-h2">{{ column_class.name }}</h2>
+
+    {% include '@layouts/layout/_layout.twig' with {
+      classes: column_class.classes,
+      num_of_blocks: num_of_blocks,
+      inverted_l_right: 1,
+    } %}
+  {% endfor %}
+
+{% else %}
+
+  {% include '@layouts/layout/_layout.twig' with {
+    classes: classes,
+    num_of_blocks: num_of_blocks,
+    inverted_l_right: 1,
+  } %}
+
+{% endif %}
\ No newline at end of file
diff --git a/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.yml b/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.yml
new file mode 100644
index 00000000..6df994da
--- /dev/null
+++ b/src/patterns/03-layouts/layout/layout--inverted-l-right/layout--inverted-l-right.yml
@@ -0,0 +1,10 @@
+column_classes:
+  -
+    name: 'Even Split (50%, 50%)'
+    classes: 'layout layout--uw-inverted-l-right even-split'
+  -
+    name: 'Larger Left (67%, 33%)'
+    classes: 'layout layout--uw-inverted-l-right larger-left'
+  -
+    name: 'Larger Right (33%, 67%)'
+    classes: 'layout layout--uw-inverted-l-right larger-right'
diff --git a/src/patterns/03-layouts/layout/layout.yml b/src/patterns/03-layouts/layout/layout.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/src/patterns/03-layouts/region/region.scss b/src/patterns/03-layouts/region/region.scss
new file mode 100644
index 00000000..ee15e652
--- /dev/null
+++ b/src/patterns/03-layouts/region/region.scss
@@ -0,0 +1,10 @@
+// @file
+// Styles for generic Region layout.
+
+.l-region {
+  .pl &{
+    outline: 1px dashed var(--gray-4);
+    padding: 1.5rem;
+    text-align: center;
+  }
+}
diff --git a/src/patterns/03-layouts/region/region.twig b/src/patterns/03-layouts/region/region.twig
new file mode 100644
index 00000000..5ba6da56
--- /dev/null
+++ b/src/patterns/03-layouts/region/region.twig
@@ -0,0 +1,15 @@
+{{ attach_library('ohana/region')}}
+
+<section class="l-{{ region_name ?: 'region' }}">
+  {% if constrain %}
+    <div class="l-constrain {{ constrain }}">
+  {% endif %}
+
+      {% block content %}
+        Region Content
+      {% endblock %}
+
+  {% if constrain %}
+    </div>
+  {% endif %}
+</section>
diff --git a/src/patterns/03-layouts/region/region.yml b/src/patterns/03-layouts/region/region.yml
new file mode 100644
index 00000000..efacb5c8
--- /dev/null
+++ b/src/patterns/03-layouts/region/region.yml
@@ -0,0 +1,4 @@
+---
+region_name: ''
+constrain: ''
+content: ''
diff --git a/src/patterns/global.scss b/src/patterns/global.scss
index 05b97748..78f14f32 100644
--- a/src/patterns/global.scss
+++ b/src/patterns/global.scss
@@ -5,3 +5,6 @@
 @use '01-core/props' as *;
 @use '01-core/utilities' as *;
 @use '01-core/elements' as *;
+@use '03-layouts/grid/grid' as *;
+@use '03-layouts/layout/layout-base' as *;
+@use '03-layouts/layout/layout' as *;
-- 
GitLab