Skip to content

Commit

Permalink
feat(react): add Grid components (#4894)
Browse files Browse the repository at this point in the history
* feat(grid): add hiding columns with width 0

Adds functionality requested in (#2435) with more convenient syntax

* docs(grid): add example of hiding columns

* docs(grid): fix incorrect `bleed` info and typos

* docs(grid): add link to live demo website

Change requested here in (#2803)

* feat(grid): implement functional React component

* chore(grid): add generated files

* fix(docs): storybook support load CSF & add sort

* docs(Grid): update valid props

additionally:
- fix oneOf not using array
- label default props as undefined
- convert col width from str -> num
- add range func

* docs(Grid): add initial story & style margins

* docs(Grid): clean up doc styles & knob controls

* docs(Grid): add color knobs, pass thru params

* docs(Grid): fix minor fullwidth disp bug

* test(Grid): add smoke tests for root el

* test(Grid): add basic row and col tests

* test(Grid): fix wrappers & update index snapshot

* feat(Grid): use layout's breakpoints

* chore(Grid): port all tests, add 'as' prop

* docs(Grid): include stories from #3892

* feat(Grid): support obj syntax & rm offset props

* fix(Grid): add missing @carbon/layout pkg

* feat(Grid): rm `noGutter` prop for later PR

* chore(Grid): revert storybook to 5.2.1

* chore(Grid): convert to recommended syntax

* chore(Grid): inline array gen helper

* fix(Grid): update incorrect prop types

* chore(Grid): update import format

* Revert sass.md

* Revert _mixins.scss

* Revert App.js

* refactor(grid): split out files and update Column

* refactor(grid): update test suite for grid components

* docs(grid): update story for grid

* fix(react): update entrypoint with grid components

* fix(grid): convert story offset to prop obj

* fix(react): update with missing prop values

* chore(project): sync offline mirror

Co-authored-by: Josh Black <[email protected]>
  • Loading branch information
zachhardesty7 and joshblack authored Jan 29, 2020
1 parent d46f153 commit 354baa8
Show file tree
Hide file tree
Showing 30 changed files with 1,926 additions and 9 deletions.
Binary file not shown.
Binary file added .yarn/offline-mirror/@storybook-addons-5.3.0.tgz
Binary file not shown.
Binary file added .yarn/offline-mirror/@storybook-api-5.3.0.tgz
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added .yarn/offline-mirror/@storybook-router-5.3.0.tgz
Binary file not shown.
Binary file added .yarn/offline-mirror/@storybook-theming-5.3.0.tgz
Binary file not shown.
Binary file added .yarn/offline-mirror/schema-utils-2.6.1.tgz
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,339 @@
//
// Copyright IBM Corp. 2018, 2018
//
// This source code is licensed under the Apache-2.0 license found in the
// LICENSE file in the root directory of this source tree.
//

// Helpers for defining columns, rows, and containers are heavily inspired by,
// and often derived from, bootstrap:
// https://github.com/twbs/bootstrap/blob/v4-dev/scss/mixins/_grid.scss

@import '../vendor/@carbon/layout/breakpoint';
@import 'prefix';

// -----------------------------------------------------------------------------
// Columns
// -----------------------------------------------------------------------------

/// Used to initialize the default properties for a column class, most notably
/// for setting width and default gutters when a column's breakpoint has not been
/// hit yet.
/// @param {Number} $gutter [$carbon--grid-gutter] - The gutter for the grid system
/// @param {Number} $collapsed-gutter [$carbon--grid-gutter--condensed] - The condensed mode gutter
/// @access private
/// @group @carbon/grid
@mixin carbon--make-col-ready(
$gutter: $carbon--grid-gutter,
$condensed-gutter: $carbon--grid-gutter--condensed
) {
// Prevent columns from becoming too narrow when at smaller grid tiers by
// always setting `width: 100%;`. This works because we use `flex` values
// later on to override this initial width.
width: 100%;
padding-right: ($gutter / 2);
padding-left: ($gutter / 2);

// For our condensed use-case, our gutters collapse to 2px solid, 1px on each
// side.
.#{$prefix}--row--condensed &,
.#{$prefix}--grid--condensed & {
padding-right: ($condensed-gutter / 2);
padding-left: ($condensed-gutter / 2);
}
}

/// Define the width of the column for a given span and column count.
/// A width of 0 will hide the column entirely.
/// @param {Number} $span - The number of columns covered
/// @param {Number} $columns - The total number of columns available
/// @access private
/// @group @carbon/grid
@mixin carbon--make-col($span, $columns) {
@if $span == 0 {
display: none;
} @else {
// Explicitly include `display: block` to override
display: block;
flex: 0 0 percentage($span / $columns);
// Add a `max-width` to ensure content within each column does not blow out
// the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
// do not appear to require this.
max-width: percentage($span / $columns);
}
}

/// Create a column offset for a given span and column count.
/// @param {Number} $span - The number of columns the offset should cover
/// @param {Number} $columns - The total number of columns available
/// @access private
/// @group @carbon/grid
@mixin carbon--make-col-offset($span, $columns) {
$offset: $span / $columns;
@if $offset == 0 {
margin-left: 0;
} @else {
margin-left: percentage($offset);
}
}

/// Output the CSS required for all the columns in a given grid system.
/// @param {Map} $breakpoints [$carbon--grid-breakpoints] - The breakpoints in the grid system
/// @param {Number} $gutter [$carbon--grid-gutter] - The gutter for the grid system
/// @access private
/// @group @carbon/grid
@mixin carbon--make-grid-columns(
$breakpoints: $carbon--grid-breakpoints,
$gutter: $carbon--grid-gutter
) {
.#{$prefix}--col {
@include carbon--make-col-ready();
}

@each $breakpoint in map-keys($breakpoints) {
$infix: carbon--breakpoint-infix($breakpoint);
$columns: map-get(map-get($breakpoints, $breakpoint), columns);

// Allow columns to stretch full width below their breakpoints
@for $i from 0 through $columns {
.#{$prefix}--col#{$infix}-#{$i} {
@include carbon--make-col-ready();
}
}

.#{$prefix}--col#{$infix},
.#{$prefix}--col#{$infix}--auto {
@include carbon--make-col-ready();
}

@include carbon--breakpoint($breakpoint, $breakpoints) {
// Provide basic `.col-{bp}` classes for equal-width flexbox columns
.#{$prefix}--col,
.#{$prefix}--col#{$infix} {
flex-basis: 0;
flex-grow: 1;
max-width: 100%;
}

.#{$prefix}--col--auto,
.#{$prefix}--col#{$infix}--auto {
flex: 1 0 0%;
width: auto;
// Reset earlier grid tiers
max-width: 100%;
}

@for $i from 0 through $columns {
.#{$prefix}--col#{$infix}-#{$i} {
@include carbon--make-col($i, $columns);
}
}

@for $i from 0 through ($columns - 1) {
@if not($infix == '') {
.#{$prefix}--offset#{$infix}-#{$i} {
@include carbon--make-col-offset($i, $columns);
}
}
}
}
}
}

// -----------------------------------------------------------------------------
// Rows
// -----------------------------------------------------------------------------

/// Define the properties for a selector assigned to a row in the grid system.
/// @param {Number} $gutter [$carbon--grid-gutter] - The gutter in the grid system
/// @access private
/// @group @carbon/grid
@mixin carbon--make-row($gutter: $carbon--grid-gutter) {
display: flex;
flex-wrap: wrap;
margin-right: -1 * $gutter / 2;
margin-left: -1 * $gutter / 2;
}

// -----------------------------------------------------------------------------
// No gutter
// -----------------------------------------------------------------------------

/// Add `no-gutter` and `no-gutter--{left,right}` classes to the output CSS. These
/// classes are useful for dropping the gutter in fluid situations.
/// @access private
/// @group @carbon/grid
@mixin carbon--no-gutter {
.#{$prefix}--no-gutter,
.#{$prefix}--row.#{$prefix}--no-gutter [class*='#{$prefix}--col'] {
padding-left: 0;
padding-right: 0;
}

.#{$prefix}--no-gutter--left,
.#{$prefix}--row.#{$prefix}--no-gutter--left [class*='#{$prefix}--col'] {
padding-left: 0;
}

.#{$prefix}--no-gutter--right,
.#{$prefix}--row.#{$prefix}--no-gutter--right [class*='#{$prefix}--col'] {
padding-right: 0;
}
}

// -----------------------------------------------------------------------------
// Hang
// -----------------------------------------------------------------------------

/// Add `hang--left` and `hang--right` classes for a given gutter. These classes are
/// used alongside `no-gutter--left` and `no-gutter--right` to "hang" type.
/// @param {Number} $gutter [$carbon--grid-gutter] - The gutter in the grid system
/// @access private
/// @group @carbon/grid
@mixin carbon--hang($gutter: $carbon--grid-gutter) {
.#{$prefix}--hang--left {
padding-left: ($gutter / 2);
}

.#{$prefix}--hang--right {
padding-right: ($gutter / 2);
}
}

// -----------------------------------------------------------------------------
// Aspect ratio
// -----------------------------------------------------------------------------

/// The aspect ratios that are used to generate corresponding aspect ratio
/// classes in code
/// @type List
/// @access public
/// @group @carbon/grid
$carbon--aspect-ratios: ((16, 9), (2, 1), (4, 3), (1, 1), (1, 2));

/// Output the CSS classes for generating aspect ratio classes
/// @param {List} $aspect-ratios [$carbon--aspect-ratios] - A list of aspect ratios to generate
/// @access private
/// @group @carbon/grid
@mixin carbon--aspect-ratio($aspect-ratios: $carbon--aspect-ratios) {
.#{$prefix}--aspect-ratio {
height: 0;
position: relative;
}

.#{$prefix}--aspect-ratio--object {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 100;
}

@each $ratio in $aspect-ratios {
$width: nth($ratio, 1);
$height: nth($ratio, 2);

.#{$prefix}--aspect-ratio--#{$width}x#{$height} {
padding-bottom: percentage($height / $width);
}
}
}

// -----------------------------------------------------------------------------
// Grid
// -----------------------------------------------------------------------------

/// Create the container for a grid. Will cause full-bleed for the grid unless
/// max-width properties are added with `make-container-max-widths`
/// @param {Map} $breakpoints [$carbon--grid-breakpoints] - A map of breakpoints where the key is the name
/// @access private
/// @group @carbon/grid
@mixin carbon--make-container($breakpoints: $carbon--grid-breakpoints) {
margin-right: auto;
margin-left: auto;

@include carbon--set-largest-breakpoint();

@each $name, $value in $breakpoints {
$prev-breakpoint: map-get($breakpoints, carbon--breakpoint-prev($name));
$margin: map-get($value, margin);

@if $prev-breakpoint {
$prev-margin: map-get($prev-breakpoint, margin);
@if $prev-margin != $margin {
@include carbon--breakpoint($name) {
padding-left: #{($carbon--grid-gutter / 2) + $margin};
padding-right: #{($carbon--grid-gutter / 2) + $margin};
}
}
} @else {
@include carbon--breakpoint($name) {
padding-left: #{($carbon--grid-gutter / 2) + $margin};
padding-right: #{($carbon--grid-gutter / 2) + $margin};
}
}
}
}

/// Get the last breakpoint width and set max-width to its value
/// @param {Map} $breakpoints [$carbon--grid-breakpoints] - A map of breakpoints where the key is the name
/// @access private
/// @group @carbon/grid
@mixin carbon--set-largest-breakpoint($breakpoints: $carbon--grid-breakpoints) {
$largest-breakpoint: last-map-item($breakpoints);

max-width: map-get($largest-breakpoint, 'width');
}

/// Add in the max-widths for each breakpoint to the container
/// @param {Map} $breakpoints [$carbon--grid-breakpoints] - A map of breakpoints where the key is the name
/// @access private
/// @group @carbon/grid
@mixin carbon--make-container-max-widths(
$breakpoints: $carbon--grid-breakpoints
) {
@each $name, $value in $breakpoints {
@include carbon--breakpoint($name) {
max-width: map-get($value, width);
}
}
}

/// Generate the CSS for a grid for the given breakpoints and gutters
/// @param {Map} $breakpoints [$carbon--grid-breakpoints] - The default breakpoints
/// @param {Number} $grid-gutter [$carbon--grid-gutter] - The default gutters
/// @param {Number} $condensed-gutter [$carbon--grid-gutter--condensed] - The condensed mode gutter
/// @access public
/// @group @carbon/grid
@mixin carbon--grid(
$breakpoints: $carbon--grid-breakpoints,
$grid-gutter: $carbon--grid-gutter,
$condensed-gutter: $carbon--grid-gutter--condensed
) {
.#{$prefix}--grid {
@include carbon--make-container($breakpoints);
}

@include carbon--largest-breakpoint($breakpoints) {
.#{$prefix}--grid--full-width {
max-width: 100%;
}
}

.#{$prefix}--row {
@include carbon--make-row();
}

.#{$prefix}--grid--condensed [class*='#{$prefix}--col'] {
padding-top: $condensed-gutter / 2;
padding-bottom: $condensed-gutter / 2;
}

@include carbon--make-grid-columns($breakpoints, $grid-gutter);
@include carbon--no-gutter();
@include carbon--hang($grid-gutter);
@include carbon--aspect-ratio();
}
Loading

0 comments on commit 354baa8

Please sign in to comment.