Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/bootstrap.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Otto <markdotto@gmail.com>2020-11-02 22:36:51 +0300
committerXhmikosR <xhmikosr@gmail.com>2020-11-06 15:49:41 +0300
commit6a3761254050222d80eda2926ad6b6946a8787aa (patch)
treefc913f312cb14b9a048a4928ecc9aaa8e0b8b593
parentf20335b6c1427e35aecf9a28b29629d83ec3f364 (diff)
Add dedicated accordion component based on Collapse JS
-rw-r--r--.bundlewatch.config.json2
-rw-r--r--scss/_accordion.scss124
-rw-r--r--scss/_card.scss27
-rw-r--r--scss/_variables.scss27
-rw-r--r--scss/bootstrap.scss1
-rw-r--r--site/content/docs/5.0/components/accordion.md106
-rw-r--r--site/content/docs/5.0/components/alerts.md3
-rw-r--r--site/content/docs/5.0/components/collapse.md52
-rw-r--r--site/data/sidebar.yml1
9 files changed, 260 insertions, 83 deletions
diff --git a/.bundlewatch.config.json b/.bundlewatch.config.json
index dd21b6d2f7..3833ae9a6c 100644
--- a/.bundlewatch.config.json
+++ b/.bundlewatch.config.json
@@ -30,7 +30,7 @@
},
{
"path": "./dist/css/bootstrap.min.css",
- "maxSize": "21.5 kB"
+ "maxSize": "21.75 kB"
},
{
"path": "./dist/js/bootstrap.bundle.js",
diff --git a/scss/_accordion.scss b/scss/_accordion.scss
new file mode 100644
index 0000000000..53715274a7
--- /dev/null
+++ b/scss/_accordion.scss
@@ -0,0 +1,124 @@
+//
+// Base styles
+//
+
+.accordion-button {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: $accordion-button-padding-y $accordion-button-padding-x;
+ @include font-size($font-size-base);
+ color: $accordion-button-color;
+ background-color: $accordion-button-bg;
+ border: solid $accordion-border-color;
+ border-width: $accordion-border-width $accordion-border-width 0;
+ @include border-radius(0);
+ overflow-anchor: none;
+
+ &:not(.collapsed) {
+ color: $accordion-button-active-color;
+ background-color: $accordion-button-active-bg;
+
+ &::after {
+ background-image: escape-svg($accordion-button-active-icon);
+ transform: $accordion-icon-transform;
+ }
+ }
+
+ // Accordion icon
+ &::after {
+ flex-shrink: 0;
+ width: $accordion-icon-width;
+ height: $accordion-icon-width;
+ margin-left: auto;
+ content: "";
+ background-image: escape-svg($accordion-button-icon);
+ background-repeat: no-repeat;
+ background-size: $accordion-icon-width;
+ transform-origin: center center;
+ @include transition($accordion-icon-transition);
+ }
+
+ &:focus {
+ position: relative;
+ outline: 0;
+ box-shadow: $btn-focus-box-shadow;
+ }
+}
+
+.accordion-header {
+ margin-bottom: 0;
+}
+
+.accordion-item {
+ @include border-radius($accordion-border-radius);
+
+ &:last-of-type {
+ .accordion-button {
+ border-bottom-width: $accordion-border-width;
+
+ // Only set a border-radius on the last item if the accordion is collapsed
+ &.collapsed {
+ @include border-bottom-radius($accordion-border-radius);
+ }
+ }
+
+ .accordion-body {
+ border-width: 0 $accordion-border-width $accordion-border-width;
+ @include border-bottom-radius($accordion-border-radius);
+ }
+ }
+
+ &:first-of-type {
+ .accordion-button {
+ @include border-top-radius($accordion-border-radius);
+ }
+ }
+}
+
+.accordion-body {
+ padding: $accordion-body-padding-y $accordion-body-padding-x;
+ border: solid $accordion-border-color;
+ border-width: $accordion-border-width $accordion-border-width 0;
+}
+
+
+// Flush accordion items
+//
+// Remove borders and border-radius to keep accordion items edge-to-edge.
+
+.accordion-flush {
+ .accordion-button {
+ border-right: 0;
+ border-left: 0;
+ @include border-radius(0);
+ }
+
+ .accordion-body {
+ border-width: 0;
+ }
+
+ .accordion-item {
+ border-right-width: 0;
+ border-left-width: 0;
+ @include border-radius(0);
+
+ &:first-of-type {
+ .accordion-button {
+ border-top-width: 0;
+ @include border-top-radius(0);
+ }
+ }
+
+ &:last-of-type {
+ .accordion-button {
+ border-bottom-width: 0;
+ @include border-bottom-radius(0);
+ }
+
+ .accordion-body {
+ border-width: 0;
+ }
+ }
+ }
+}
diff --git a/scss/_card.scss b/scss/_card.scss
index a526ec143c..9b0f4969a6 100644
--- a/scss/_card.scss
+++ b/scss/_card.scss
@@ -213,30 +213,3 @@
}
}
}
-
-
-//
-// Accordion
-//
-
-.accordion {
- overflow-anchor: none;
-
- > .card {
- overflow: hidden;
-
- &:not(:last-of-type) {
- border-bottom: 0;
- @include border-bottom-radius(0);
- }
-
- &:not(:first-of-type) {
- @include border-top-radius(0);
- }
-
- > .card-header {
- @include border-radius(0);
- margin-bottom: -$card-border-width;
- }
- }
-}
diff --git a/scss/_variables.scss b/scss/_variables.scss
index 781ec79a42..6c5a070f26 100644
--- a/scss/_variables.scss
+++ b/scss/_variables.scss
@@ -1014,6 +1014,33 @@ $card-img-overlay-padding: $spacer !default;
$card-group-margin: $grid-gutter-width / 2 !default;
+// Accordion
+$accordion-padding-y: 1rem !default;
+$accordion-padding-x: 1.25rem !default;
+$accordion-color: $body-color !default;
+$accordion-bg: transparent !default;
+$accordion-border-width: $border-width !default;
+$accordion-border-color: rgba($black, .125) !default;
+$accordion-border-radius: $border-radius !default;
+
+$accordion-body-padding-y: $accordion-padding-y !default;
+$accordion-body-padding-x: $accordion-padding-x !default;
+
+$accordion-button-padding-y: $accordion-padding-y !default;
+$accordion-button-padding-x: $accordion-padding-x !default;
+$accordion-button-color: $accordion-color !default;
+$accordion-button-bg: $accordion-bg !default;
+$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;
+$accordion-button-active-color: $primary !default;
+
+$accordion-icon-width: 1.25rem !default;
+$accordion-icon-color: $accordion-color !default;
+$accordion-icon-active-color: $accordion-button-active-color !default;
+$accordion-icon-transition: transform .2s ease-in-out !default;
+$accordion-icon-transform: rotate(180deg) !default;
+
+$accordion-button-icon: url("data:image/svg+xml,<svg viewBox='0 0 16 16' fill='#{$accordion-icon-color}' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>") !default;
+$accordion-button-active-icon: url("data:image/svg+xml,<svg viewBox='0 0 16 16' fill='#{$accordion-icon-active-color}' xmlns='http://www.w3.org/2000/svg'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>") !default;
// Tooltips
diff --git a/scss/bootstrap.scss b/scss/bootstrap.scss
index c65caab6de..27514484c1 100644
--- a/scss/bootstrap.scss
+++ b/scss/bootstrap.scss
@@ -28,6 +28,7 @@
@import "nav";
@import "navbar";
@import "card";
+@import "accordion";
@import "breadcrumb";
@import "pagination";
@import "badge";
diff --git a/site/content/docs/5.0/components/accordion.md b/site/content/docs/5.0/components/accordion.md
new file mode 100644
index 0000000000..9844cf868c
--- /dev/null
+++ b/site/content/docs/5.0/components/accordion.md
@@ -0,0 +1,106 @@
+---
+layout: docs
+title: Accordion
+description: Build vertically collapsing accordions in combination with our Collapse JavaScript plugin.
+group: components
+aliases:
+ - "/components/"
+ - "/docs/5.0/components/"
+toc: true
+---
+
+## How it works
+
+The accordion uses [collapse]({{< docsref "/components/collapse" >}}) internally to make it collapsible. To render an accordion that's expanded, add the `.open` class on the `.accordion`.
+
+{{< callout info >}}
+{{< partial "callout-info-prefersreducedmotion.md" >}}
+{{< /callout >}}
+
+## Example
+
+Click the accordions below to expand/collapse the accordion content.
+
+{{< example >}}
+<div class="accordion" id="accordionExample">
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="headingOne">
+ <button class="accordion-button" type="button" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
+ Accordion Item #1
+ </button>
+ </h2>
+ <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordionExample">
+ <div class="accordion-body">
+ <strong>This is the first item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
+ </div>
+ </div>
+ </div>
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="headingTwo">
+ <button class="accordion-button collapsed" type="button" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
+ Accordion Item #2
+ </button>
+ </h2>
+ <div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionExample">
+ <div class="accordion-body">
+ <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
+ </div>
+ </div>
+ </div>
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="headingThree">
+ <button class="accordion-button collapsed" type="button" data-toggle="collapse" data-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
+ Accordion Item #3
+ </button>
+ </h2>
+ <div id="collapseThree" class="collapse" aria-labelledby="headingThree" data-parent="#accordionExample">
+ <div class="accordion-body">
+ <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
+ </div>
+ </div>
+ </div>
+</div>
+{{< /example >}}
+
+### Flush
+
+Add `.accordion-flush` to remove the default `background-color`, some borders, and some rounded corners to render accordions edge-to-edge with their parent container.
+
+{{< example class="bg-light" >}}
+<div class="accordion accordion-flush" id="accordionFlushExample">
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="flush-headingOne">
+ <button class="accordion-button collapsed" type="button" data-toggle="collapse" data-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne">
+ Accordion Item #1
+ </button>
+ </h2>
+ <div id="flush-collapseOne" class="collapse" aria-labelledby="flush-headingOne" data-parent="#accordionFlushExample">
+ <div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div>
+ </div>
+ </div>
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="flush-headingTwo">
+ <button class="accordion-button collapsed" type="button" data-toggle="collapse" data-target="#flush-collapseTwo" aria-expanded="false" aria-controls="flush-collapseTwo">
+ Accordion Item #2
+ </button>
+ </h2>
+ <div id="flush-collapseTwo" class="collapse" aria-labelledby="flush-headingTwo" data-parent="#accordionFlushExample">
+ <div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div>
+ </div>
+ </div>
+ <div class="accordion-item">
+ <h2 class="accordion-header" id="flush-headingThree">
+ <button class="accordion-button collapsed" type="button" data-toggle="collapse" data-target="#flush-collapseThree" aria-expanded="false" aria-controls="flush-collapseThree">
+ Accordion Item #3
+ </button>
+ </h2>
+ <div id="flush-collapseThree" class="collapse" aria-labelledby="flush-headingThree" data-parent="#accordionFlushExample">
+ <div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div>
+ </div>
+ </div>
+</div>
+{{< /example >}}
+
+## Accessibility
+
+Please read the [collapse accessibility section]({{< docsref "/components/collapse#accessibility" >}}) for more information.
diff --git a/site/content/docs/5.0/components/alerts.md b/site/content/docs/5.0/components/alerts.md
index 3eecceea28..5c68a3d4c9 100644
--- a/site/content/docs/5.0/components/alerts.md
+++ b/site/content/docs/5.0/components/alerts.md
@@ -3,9 +3,6 @@ layout: docs
title: Alerts
description: Provide contextual feedback messages for typical user actions with the handful of available and flexible alert messages.
group: components
-aliases:
- - "/components/"
- - "/docs/5.0/components/"
toc: true
---
diff --git a/site/content/docs/5.0/components/collapse.md b/site/content/docs/5.0/components/collapse.md
index c460f6b9a4..076c172894 100644
--- a/site/content/docs/5.0/components/collapse.md
+++ b/site/content/docs/5.0/components/collapse.md
@@ -69,58 +69,6 @@ Multiple `<button>` or `<a>` can show and hide an element if they each reference
</div>
{{< /example >}}
-## Accordion example
-
-Using the [card]({{< docsref "/components/card" >}}) component, you can extend the default collapse behavior to create an accordion. To properly achieve the accordion style, be sure to use `.accordion` as a wrapper.
-
-{{< example >}}
-<div class="accordion" id="accordionExample">
- <div class="card">
- <div class="card-header p-0" id="headingOne">
- <h2 class="mb-0">
- <button class="btn btn-light btn-block text-left p-3 rounded-0" type="button" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
- Collapsible Group Item #1
- </button>
- </h2>
- </div>
-
- <div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordionExample">
- <div class="card-body">
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
- </div>
- </div>
- </div>
- <div class="card">
- <div class="card-header p-0" id="headingTwo">
- <h2 class="mb-0">
- <button class="btn btn-light btn-block text-left collapsed p-3 rounded-0" type="button" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
- Collapsible Group Item #2
- </button>
- </h2>
- </div>
- <div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionExample">
- <div class="card-body">
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
- </div>
- </div>
- </div>
- <div class="card">
- <div class="card-header p-0" id="headingThree">
- <h2 class="mb-0">
- <button class="btn btn-light btn-block text-left collapsed p-3 rounded-0" type="button" data-toggle="collapse" data-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
- Collapsible Group Item #3
- </button>
- </h2>
- </div>
- <div id="collapseThree" class="collapse" aria-labelledby="headingThree" data-parent="#accordionExample">
- <div class="card-body">
- Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
- </div>
- </div>
- </div>
-</div>
-{{< /example >}}
-
## Accessibility
Be sure to add `aria-expanded` to the control element. This attribute explicitly conveys the current state of the collapsible element tied to the control to screen readers and similar assistive technologies. If the collapsible element is closed by default, the attribute on the control element should have a value of `aria-expanded="false"`. If you've set the collapsible element to be open by default using the `show` class, set `aria-expanded="true"` on the control instead. The plugin will automatically toggle this attribute on the control based on whether or not the collapsible element has been opened or closed (via JavaScript, or because the user triggered another control element also tied to the same collapsible element). If the control element's HTML element is not a button (e.g., an `<a>` or `<div>`), the attribute `role="button"` should be added to the element.
diff --git a/site/data/sidebar.yml b/site/data/sidebar.yml
index 7ee35db95b..a12db2550d 100644
--- a/site/data/sidebar.yml
+++ b/site/data/sidebar.yml
@@ -53,6 +53,7 @@
- title: Components
pages:
+ - title: Accordion
- title: Alerts
- title: Badge
- title: Breadcrumb