diff --git a/docs/_data/breakpoints.yml b/docs/_data/breakpoints.yml new file mode 100644 index 0000000000..3c8cfe293c --- /dev/null +++ b/docs/_data/breakpoints.yml @@ -0,0 +1,29 @@ +- breakpoint: xs + abbr: "" + name: Extra small + min-width: 0px + container: "" + +- breakpoint: sm + abbr: -sm + name: Small + min-width: 576px + container: 540px + +- breakpoint: md + abbr: -md + name: Medium + min-width: 768px + container: 720px + +- breakpoint: lg + abbr: -lg + name: Large + min-width: 992px + container: 960px + +- breakpoint: xl + abbr: -xl + name: Extra large + min-width: 1200px + container: 1140px diff --git a/docs/_data/nav.yml b/docs/_data/nav.yml index 6723352f40..256e1bb9d7 100644 --- a/docs/_data/nav.yml +++ b/docs/_data/nav.yml @@ -56,6 +56,7 @@ - title: Clearfix - title: Close icon - title: Colors + - title: Flexbox - title: Display property - title: Image replacement - title: Invisible content diff --git a/docs/utilities/flexbox.md b/docs/utilities/flexbox.md new file mode 100644 index 0000000000..324bfa2f05 --- /dev/null +++ b/docs/utilities/flexbox.md @@ -0,0 +1,196 @@ +--- +layout: docs +title: Flexbox +group: utilities +--- + +Quickly manage the layout, alignment, and sizing of grid columns, navigation, components, and more with a full suite of responsive flexbox utilities. For more complex implementations, custom CSS may be necessary. + +## Contents + +* Will be replaced with the ToC, excluding the "Contents" header +{:toc} + +## Enable flex behaviors + +Apply `display` utilities to create a flexbox container and transform **direct children elements** into flex items. Flex containers and items are able to be modified further with additional flex properties. Choose from the following options. + +| Class | property: value; | Description | +| --- | --- | --- | +| `.d-flex` | `display: flex;` | Creates a block-level element using the flexbox model. | +| `.d-inline-flex` | `display: inline-flex;` | Creates an inline-level element using the flexbox model. | + +{% example html %} +
I'm a flexbox container!
+{% endexample %} + +{% example html %} +
I'm an inline flexbox container!
+{% endexample %} + +Responsive variations also exist for `.d-flex` and `.d-inline-flex`. + + + + + + + + + + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + +
ClassDescription
+ .d{{ bp.abbr }}-flex + + Sets display: flex; on viewports {{ bp.min-width }} wide and up +
+ .d{{ bp.abbr }}-inline-flex + + Sets display: inline-flex; on viewports {{ bp.min-width }} wide and up +
+ +## Direction + +Set the direction of flex items in a flex container with direction utilities. In most cases you can omit the horizontal class here as the browser default is `row`. However, you may encounter situations where you needed to explicitly set this value (like responsive layouts). + +Use `.flex-row` to set a horizontal direction. + +{% example html %} +
+
Flex item
+
Flex item
+
Flex item
+
+{% endexample %} + +Use `.flex-column` to set a vertical direction. + +{% example html %} +
+
Flex item
+
Flex item
+
Flex item
+
+{% endexample %} + +Responsive variations also exist for `.flex-row` and `.flex-column`. + + + + + + + + + + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + +
ClassDescription
+ .flex{{ bp.abbr }}-row + + Sets flex-direction: row; on viewports {{ bp.min-width }} wide and up +
+ .flex{{ bp.abbr }}-column + + Sets flex-direction: column; on viewports {{ bp.min-width }} wide and up +
+ +## Wrap + +Change how flex items wrap in a flex container. Choose from no wrapping at all (the browser default) with `.flex-nowrap`, or enable wrapping with `.flex-wrap`. + +{% example html %} +
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
+{% endexample %} + +{% example html %} +
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
Flex item
+
+{% endexample %} + +Responsive variations also exist for `.flex-nowrap` and `.flex-wrap`. + + + + + + + + + + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + {% for bp in site.data.breakpoints %} + + + + + {% endfor %} + +
ClassDescription
+ .flex{{ bp.abbr }}-nowrap + + Sets flex-wrap: nowrap; on viewports {{ bp.min-width }} wide and up +
+ .flex{{ bp.abbr }}-wrap + + Sets flex-wrap: wrap; on viewports {{ bp.min-width }} wide and up +
diff --git a/scss/utilities/_flex.scss b/scss/utilities/_flex.scss index 4d13e9f8c5..c9783c2c8a 100644 --- a/scss/utilities/_flex.scss +++ b/scss/utilities/_flex.scss @@ -27,5 +27,47 @@ .flex-items#{$infix}-right { justify-content: flex-end; } .flex-items#{$infix}-around { justify-content: space-around; } .flex-items#{$infix}-between { justify-content: space-between; } + + // + // New flex utils to replace and extend the ones above + // + + .flex#{$infix}-fill { flex: 1 1 auto; } + .flex#{$infix}-justify { flex: 1 1 100%; } + + .flex#{$infix}-row { flex-direction: row !important; } + .flex#{$infix}-column { flex-direction: column !important; } + + .flex#{$infix}-wrap { flex-wrap: wrap !important; } + .flex#{$infix}-nowrap { flex-wrap: nowrap !important; } + + .justify-content#{$infix}-start { justify-content: flex-start !important; } + .justify-content#{$infix}-end { justify-content: flex-end !important; } + .justify-content#{$infix}-center { justify-content: center !important; } + .justify-content#{$infix}-between { justify-content: space-between !important; } + .justify-content#{$infix}-around { justify-content: space-around !important; } + + .align-items#{$infix}-start { align-items: flex-start !important; } + .align-items#{$infix}-end { align-items: flex-end !important; } + .align-items#{$infix}-center { align-items: center !important; } + .align-items#{$infix}-baseline { align-items: baseline !important; } + .align-items#{$infix}-stretch { align-items: stretch !important; } + + .align-content#{$infix}-start { align-content: flex-start !important; } + .align-content#{$infix}-end { align-content: flex-end !important; } + .align-content#{$infix}-center { align-content: center !important; } + .align-content#{$infix}-between { align-content: space-between !important; } + .align-content#{$infix}-around { align-content: space-around !important; } + .align-content#{$infix}-stretch { align-content: stretch !important; } + + // Item + .flex#{$infix}-auto { flex: 1 1 auto !important; } + + .align-self#{$infix}-auto { align-self: auto !important; } + .align-self#{$infix}-start { align-self: flex-start !important; } + .align-self#{$infix}-end { align-self: flex-end !important; } + .align-self#{$infix}-center { align-self: center !important; } + .align-self#{$infix}-baseline { align-self: baseline !important; } + .align-self#{$infix}-stretch { align-self: stretch !important; } } }