Skip to content

Commit

Permalink
Introduce experimental grid support (#567)
Browse files Browse the repository at this point in the history
* feat(grid): add experimental grid option

* fix: verify conditional imports and fix incorrect resolution
  • Loading branch information
joshblack authored and tw15egan committed Feb 15, 2018
1 parent cbc5670 commit 91db595
Show file tree
Hide file tree
Showing 11 changed files with 3,480 additions and 356 deletions.
121 changes: 13 additions & 108 deletions src/globals/grid/_grid.scss
Original file line number Diff line number Diff line change
@@ -1,111 +1,16 @@
@import '../scss/vars';

// map functions
@function breakpoint($breakpoint) {
@if map-has-key($grid-breakpoints, $breakpoint) {
@return map-get($grid-breakpoints, $breakpoint);
} @else {
@warn 'breakpoint: could not find #{$breakpoint} in $grid-breakpoints map. Please make sure it is defined';
}
}

@function gutter($breakpoint) {
@if map-has-key($gutter-breakpoints, $breakpoint) {
@return map-get($gutter-breakpoints, $breakpoint);
} @else {
@warn 'gutter: could not find #{$breakpoint} in $gutter-breakpoints map. Please make sure it is defined';
}
}

@function grid-gutter($breakpoint) {
@if map-has-key($grid-gutter-breakpoints, $breakpoint) {
@return map-get($grid-gutter-breakpoints, $breakpoint);
} @else {
@warn 'grid-gutter: could not find #{$breakpoint} in $grid-breakpoints map. Please make sure it is defined';
}
}

$max-width: 1600px;
$columns: 12;

$grid-breakpoints: (sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1600px);
$gutter-breakpoints: (xs: 5px, sm: 10px);
$grid-gutter-breakpoints: (xs: 3%, sm: 5%);

.#{$prefix}--grid {
margin-left: grid-gutter('xs');
margin-right: grid-gutter('xs');
padding-left: gutter('xs');
padding-right: gutter('xs');

@media (min-width: breakpoint('sm')) {
margin-left: grid-gutter('sm');
margin-right: grid-gutter('sm');
padding-left: gutter('sm');
padding-right: gutter('sm');
}

&.max {
max-width: $max-width;
}
}

.#{$prefix}--row {
display: flex;
flex-wrap: wrap;
margin: 0 gutter('xs') * -1;

@media (min-width: breakpoint('sm')) {
margin: 0 gutter('sm') * -1;
}
}

[class*='#{$prefix}--col'] {
position: relative;
width: 100%;
min-height: 1px;
padding: 0 gutter('xs');

@media (min-width: breakpoint('sm')) {
padding: 0 gutter('sm');
}
}

@for $i from 1 through $columns {
.#{$prefix}--col-xs-#{$i} {
flex-basis: (100% * $i / $columns);
}
}

@each $breakpoint in map-keys($grid-breakpoints) {
@media (min-width: breakpoint($breakpoint)) {
.#{$prefix}--col-#{$breakpoint}-auto {
flex: 0 0 auto;
width: auto;
}

@for $i from 1 through $columns {
.#{$prefix}--col-#{$breakpoint}-#{$i} {
flex-basis: (100% * $i / $columns);
}
@import '../scss/import-once';
@import './classic/classic';
@import './experimental/experimental';
@import './experimental/fallback';

@include exports('grid') {
@if global-variable-exists('css--use-experimental-grid') == true and $css--use-experimental-grid == true {
@if global-variable-exists('css--use-experimental-grid-fallback') == true and $css--use-experimental-grid-fallback == true {
@include grid-experimental-fallback;
} @else {
@include grid-experimental;
}
} @else {
@include grid;
}
}

// deprecated
$gutter-size: 10px;

@mixin column-size($col-num) {
flex-basis: (100% * $col-num / $columns);
max-width: (100% * $col-num / $columns);
}

.#{$prefix}--col-xs,
.#{$prefix}--col-sm,
.#{$prefix}--col-md,
.#{$prefix}--col-lg {
flex-basis: 0;
flex: 1;
flex-grow: 1;
max-width: 100%;
}
113 changes: 113 additions & 0 deletions src/globals/grid/classic/_classic.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
@import '../../scss/vars';

$max-width: 1600px;
$columns: 12;

$grid-breakpoints: (sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1600px);
$gutter-breakpoints: (xs: 5px, sm: 10px);
$grid-gutter-breakpoints: (xs: 3%, sm: 5%);

@mixin grid {
.#{$prefix}--grid {
margin-left: grid-gutter('xs');
margin-right: grid-gutter('xs');
padding-left: gutter('xs');
padding-right: gutter('xs');

@media (min-width: breakpoint('sm')) {
margin-left: grid-gutter('sm');
margin-right: grid-gutter('sm');
padding-left: gutter('sm');
padding-right: gutter('sm');
}

&.max {
max-width: $max-width;
}
}

.#{$prefix}--row {
display: flex;
flex-wrap: wrap;
margin: 0 gutter('xs') * -1;

@media (min-width: breakpoint('sm')) {
margin: 0 gutter('sm') * -1;
}
}

[class*='#{$prefix}--col'] {
position: relative;
width: 100%;
min-height: 1px;
padding: 0 gutter('xs');

@media (min-width: breakpoint('sm')) {
padding: 0 gutter('sm');
}
}

@for $i from 1 through $columns {
.#{$prefix}--col-xs-#{$i} {
flex-basis: (100% * $i / $columns);
}
}

@each $breakpoint in map-keys($grid-breakpoints) {
@media (min-width: breakpoint($breakpoint)) {
.#{$prefix}--col-#{$breakpoint}-auto {
flex: 0 0 auto;
width: auto;
}

@for $i from 1 through $columns {
.#{$prefix}--col-#{$breakpoint}-#{$i} {
flex-basis: (100% * $i / $columns);
}
}
}
}

// deprecated
$gutter-size: 10px;

.#{$prefix}--col-xs,
.#{$prefix}--col-sm,
.#{$prefix}--col-md,
.#{$prefix}--col-lg {
flex-basis: 0;
flex: 1;
flex-grow: 1;
max-width: 100%;
}
}

// map functions
@function breakpoint($breakpoint) {
@if map-has-key($grid-breakpoints, $breakpoint) {
@return map-get($grid-breakpoints, $breakpoint);
} @else {
@warn 'breakpoint: could not find #{$breakpoint} in $grid-breakpoints map. Please make sure it is defined';
}
}

@function gutter($breakpoint) {
@if map-has-key($gutter-breakpoints, $breakpoint) {
@return map-get($gutter-breakpoints, $breakpoint);
} @else {
@warn 'gutter: could not find #{$breakpoint} in $gutter-breakpoints map. Please make sure it is defined';
}
}

@function grid-gutter($breakpoint) {
@if map-has-key($grid-gutter-breakpoints, $breakpoint) {
@return map-get($grid-gutter-breakpoints, $breakpoint);
} @else {
@warn 'grid-gutter: could not find #{$breakpoint} in $grid-breakpoints map. Please make sure it is defined';
}
}

@mixin column-size($col-num) {
flex-basis: (100% * $col-num / $columns);
max-width: (100% * $col-num / $columns);
}
103 changes: 103 additions & 0 deletions src/globals/grid/experimental/_experimental.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
@import 'functions';
@import 'mixins';
@import 'variables';

@mixin grid-experimental {
body {
font-size: map-get($grid-values, 'rem') * 1px;
margin: 0;
}

.#{$prefix}-container {
box-sizing: border-box;
margin-left: auto;
margin-right: auto;
max-width: #{map-get($last, breakpoint)}rem;
width: 100vw;
@if $includeFlexFallback {
overflow-x: hidden;
}
}

@if $includeFlexFallback {
@supports (display: grid) {
.#{$prefix}-container {
overflow-x: initial;
}
}
}

.#{$prefix}-container--left {
margin-left: 0;
}

.#{$prefix}-container--right {
margin-right: 0;
}

.#{$prefix}-grid {
align-items: flex-start;
box-sizing: border-box;
@if $includeFlexFallback {
display: flex;
}
display: grid;
flex-wrap: wrap;
position: relative;

> * {
box-sizing: border-box;
height: 100%;

:last-child,
:last-child > :last-child,
:last-child > :last-child > :last-child {
margin-bottom: 0;
}
}
}

[class*='#{$prefix}-padding'] {
box-sizing: border-box;
}

@if $includeFlexFallback {
.#{$prefix}-grid > * {
width: 100%;
}

@supports (display: grid) {
.#{$prefix}-grid {
align-items: unset;
}

.#{$prefix}-grid > * {
width: initial;
}
}
}

@each $name, $breakpoint in $allBreakpoints {
@include gridBreakpointWrapper($breakpoint, $first) {
@if $includeFlexFallback {
@include gridLegacyZeros($breakpoint, $allBreakpoints, $name);
@include gridLegacyColumns($breakpoint, $first, $last, $name, $allBreakpoints);
@if isSameBreakpoint($breakpoint, $last) == false {
@include gridLegacyHeights($name, $rows, $rowHeight);
}
}

@if (map-has-key($allBreakpoints, $name)) {
@include gridMargin($breakpoint, $last);
@include gridPadding($breakpoint);
@include gridLegacyWrapper($includeFlexFallback) {
@include gridColumns($breakpoint, $first, $last) {
display: grid;
grid-auto-rows: minmax($rowHeight * 1rem, min-content);
}
@include gridVariables($breakpoint, $first, $rows, $rowHeight);
}
}
}
}
}
28 changes: 28 additions & 0 deletions src/globals/grid/experimental/_fallback.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
$includeFlexFallback: true;
@import 'experimental';

@mixin grid-experimental-fallback {
@include grid-experimental;

@supports (display: grid) {
.#{$prefix}-grid > * {
display: initial;
min-width: initial;
max-width: initial;
width: initial;

&.#{$prefix}-grid {
display: grid;
}
}

[class*='#{$prefix}-grid__height-'] {
height: unset;
max-height: unset;
}
}

.#{$prefix}-grid > script {
display: none;
}
}
Loading

0 comments on commit 91db595

Please sign in to comment.