Skip to content

Commit c6eaf58

Browse files
authored
v6: More component tweaks (accordion, spinner, badge, button) (#42676)
1 parent 9b3eeb7 commit c6eaf58

7 files changed

Lines changed: 136 additions & 188 deletions

File tree

scss/_accordion.scss

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
@use "mixins/focus-ring" as *;
55
@use "mixins/tokens" as *;
66

7+
// stylelint-disable custom-property-no-missing-var-function
78
$accordion-tokens: () !default;
89

910
// scss-docs-start accordion-tokens
@@ -31,6 +32,7 @@ $accordion-tokens: defaults(
3132
$accordion-tokens
3233
);
3334
// scss-docs-end accordion-tokens
35+
// stylelint-enable custom-property-no-missing-var-function
3436

3537
@layer components {
3638
.accordion {
@@ -76,6 +78,7 @@ $accordion-tokens: defaults(
7678
}
7779

7880
.accordion-item {
81+
position: relative;
7982
color: var(--accordion-color);
8083
background-color: var(--accordion-bg);
8184
border: var(--accordion-border-width) solid var(--accordion-border-color);
@@ -99,7 +102,8 @@ $accordion-tokens: defaults(
99102
}
100103

101104
&:not(:first-of-type) {
102-
border-block-start: 0;
105+
// border-block-start: 0;
106+
margin-top: calc(-1 * var(--accordion-border-width));
103107
}
104108

105109
// Only set a border-radius on the last item if the accordion is collapsed
@@ -117,8 +121,9 @@ $accordion-tokens: defaults(
117121

118122
// Open state - details[open] applies these styles
119123
&[open] {
120-
124+
z-index: 2;
121125
border-color: var(--theme-border, var(--accordion-border-color));
126+
122127
&::details-content {
123128
block-size: auto;
124129
}
@@ -142,6 +147,21 @@ $accordion-tokens: defaults(
142147

143148
.accordion-body {
144149
padding: var(--accordion-body-padding-y, var(--accordion-padding-y)) var(--accordion-body-padding-x, var(--accordion-padding-x));
150+
font-size: var(--accordion-font-size, var(--font-size-base));
151+
}
152+
153+
154+
// Small accordion
155+
//
156+
// Tighten up padding, border-radius, and font size for a more compact accordion.
157+
158+
.accordion-sm {
159+
// scss-docs-start accordion-sm-css-vars
160+
--accordion-padding-x: .875rem;
161+
--accordion-padding-y: .625rem;
162+
--accordion-border-radius: var(--radius-5);
163+
--accordion-font-size: var(--font-size-sm);
164+
// scss-docs-end accordion-sm-css-vars
145165
}
146166

147167

scss/_badge.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ $badge-tokens: () !default;
99
// scss-docs-start badge-tokens
1010
$badge-tokens: defaults(
1111
(
12+
--badge-gap: .375em,
1213
--badge-padding-x: .625em,
1314
--badge-padding-y: .25em,
1415
--badge-font-size: clamp(12px, .75em, .75em),
@@ -45,6 +46,7 @@ $badge-variants: (
4546
@include tokens($badge-tokens);
4647

4748
display: inline-flex;
49+
gap: var(--badge-gap);
4850
align-items: center;
4951
justify-content: center;
5052
min-height: 1.375rem;
@@ -59,7 +61,6 @@ $badge-variants: (
5961
background-color: var(--theme-bg, var(--badge-bg));
6062
border: var(--badge-border-width) solid var(--badge-border-color);
6163
@include border-radius(var(--badge-border-radius));
62-
// @include gradient-bg();
6364

6465
// Empty badges collapse automatically
6566
&:empty {

scss/_spinner.scss

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ $spinner-border-tokens: () !default;
99
// stylelint-disable-next-line scss/dollar-variable-default
1010
$spinner-border-tokens: defaults(
1111
(
12-
--spinner-width: 2rem,
13-
--spinner-height: 2rem,
14-
--spinner-vertical-align: -.125em,
15-
--spinner-border-width: .25em,
16-
--spinner-animation-speed: .75s,
12+
--spinner-width: 1em,
13+
--spinner-height: 1em,
14+
--spinner-border-width: .125em,
15+
--spinner-animation-speed: 1s,
16+
--spinner-animation-timing-function: linear,
1717
--spinner-animation-name: spinner-border,
1818
),
1919
$spinner-border-tokens
@@ -26,10 +26,10 @@ $spinner-grow-tokens: () !default;
2626
// stylelint-disable-next-line scss/dollar-variable-default
2727
$spinner-grow-tokens: defaults(
2828
(
29-
--spinner-width: 2rem,
30-
--spinner-height: 2rem,
31-
--spinner-vertical-align: -.125em,
32-
--spinner-animation-speed: .75s,
29+
--spinner-width: 1em,
30+
--spinner-height: 1em,
31+
--spinner-animation-speed: 1s,
32+
--spinner-animation-timing-function: ease-in-out,
3333
--spinner-animation-name: spinner-grow,
3434
),
3535
$spinner-grow-tokens
@@ -43,17 +43,16 @@ $spinner-grow-tokens: defaults(
4343
//
4444

4545
@layer components {
46-
// TODO: refactor this to assume flex parent and remove `vertical-align`
46+
// Assumes a flex parent
4747
.spinner-grow,
4848
.spinner-border {
49-
display: inline-block;
49+
display: inline-flex;
5050
flex-shrink: 0;
5151
width: var(--spinner-width);
5252
height: var(--spinner-height);
53-
vertical-align: var(--spinner-vertical-align);
5453
// stylelint-disable-next-line property-disallowed-list
5554
border-radius: 50%;
56-
animation: var(--spinner-animation-speed) linear infinite var(--spinner-animation-name);
55+
animation: var(--spinner-animation-speed) var(--spinner-animation-timing-function) infinite var(--spinner-animation-name);
5756
}
5857

5958
// scss-docs-start spinner-border-keyframes
@@ -69,11 +68,10 @@ $spinner-grow-tokens: defaults(
6968
border-inline-end-color: transparent;
7069
}
7170

72-
.spinner-border-sm {
71+
.spinner-sm {
7372
// scss-docs-start spinner-border-sm-css-vars
74-
--spinner-width: 1rem;
75-
--spinner-height: 1rem;
76-
--spinner-border-width: .2em;
73+
--spinner-width: .75em;
74+
--spinner-height: .75em;
7775
// scss-docs-end spinner-border-sm-css-vars
7876
}
7977

@@ -100,11 +98,9 @@ $spinner-grow-tokens: defaults(
10098
opacity: 0;
10199
}
102100

103-
.spinner-grow-sm {
104-
// scss-docs-start spinner-grow-sm-css-vars
105-
--spinner-width: 1rem;
106-
--spinner-height: 1rem;
107-
// scss-docs-end spinner-grow-sm-css-vars
101+
// Generic class for rotating custom spinners
102+
.spinner-rotate {
103+
animation: 1s linear infinite spinner-border;
108104
}
109105

110106
@if $enable-reduced-motion {

scss/buttons/_button.scss

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ $button-styled-tokens: defaults(
7272
--btn-border-hover-mix-amount: 12.5%,
7373
--btn-border-active-mix-amount: 20%,
7474
--btn-shadow: "0 1px 2px rgb(0 0 0 / 15%), inset 0 1px 0 rgb(255 255 255 / 10%)",
75-
--btn-active-shadow: inset 0 2px 4px rgb(0 0 0 / .15) ,
75+
--btn-active-shadow: inset 0 2px 4px rgb(0 0 0 / .15),
7676
),
7777
$button-styled-tokens
7878
);
@@ -177,12 +177,11 @@ $btn-variant-selectors: (string.unquote(".btn"), string.unquote(".btn-link"), st
177177
@include tokens($button-tokens);
178178

179179
display: inline-flex;
180-
gap: var(--btn-gap, .25rem);
180+
gap: var(--btn-gap, .375rem);
181181
align-items: center;
182182
justify-content: center;
183183
min-height: var(--btn-min-height);
184184
padding: var(--btn-padding-y) var(--btn-padding-x);
185-
// font-family: var(--btn-font-family);
186185
font-size: var(--btn-font-size);
187186
font-weight: var(--btn-font-weight);
188187
line-height: var(--btn-line-height);

site/src/content/docs/components/accordion.mdx

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,51 @@ Use the contextual `.theme-{color}` classes to apply a semantic theme color to o
8181
<strong>This is the third item’s accordion body.</strong> This exclusive accordion behavior is built into the browser—no Bootstrap JavaScript required. Just use matching <code>name</code> attributes on your <code>&lt;details&gt;</code> elements.
8282
</div>
8383
</details>
84+
</div>`} customMarkup={`<div class="accordion theme-primary"><!--[!code highlight]-->
85+
<!-- Accordion items here -->
86+
</div>`} />
87+
88+
## Small
89+
90+
Add `.accordion-sm` to the `.accordion` for a more compact accordion with tighter padding, a smaller border radius, and a smaller font size.
91+
92+
<Example code={`<div class="accordion accordion-sm">
93+
<details class="accordion-item" name="accordionSmall" open>
94+
<summary class="accordion-header">
95+
Accordion Item #1
96+
<svg class="accordion-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="m2 5 6 6 6-6"/></svg>
97+
</summary>
98+
<div class="accordion-body">
99+
<strong>This is the first item’s accordion body.</strong> The <code>.accordion-sm</code> class tightens up the padding, border radius, and font size for a more compact presentation.
100+
</div>
101+
</details>
102+
<details class="accordion-item" name="accordionSmall">
103+
<summary class="accordion-header">
104+
Accordion Item #2
105+
<svg class="accordion-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="m2 5 6 6 6-6"/></svg>
106+
</summary>
107+
<div class="accordion-body">
108+
<strong>This is the second item’s accordion body.</strong> Everything is driven by CSS custom properties, so you can fine-tune the compact sizing to taste.
109+
</div>
110+
</details>
111+
<details class="accordion-item" name="accordionSmall">
112+
<summary class="accordion-header">
113+
Accordion Item #3
114+
<svg class="accordion-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="m2 5 6 6 6-6"/></svg>
115+
</summary>
116+
<div class="accordion-body">
117+
<strong>This is the third item’s accordion body.</strong> Combine <code>.accordion-sm</code> with other variants like <code>.accordion-flush</code> as needed.
118+
</div>
119+
</details>
120+
</div>`} customMarkup={`<div class="accordion accordion-sm"><!--[!code highlight]-->
121+
<!-- Accordion items here -->
84122
</div>`} />
85123

86124
## Flush
87125

88126
Add `.accordion-flush` to remove some borders and rounded corners to render accordions edge-to-edge with their parent container.
89127

90-
<Example class="bg-body-secondary" code={`<div class="accordion accordion-flush">
128+
<Example class="bg-1" code={`<div class="accordion accordion-flush">
91129
<details class="accordion-item" name="accordionFlushExample">
92130
<summary class="accordion-header">
93131
Accordion Item #1
@@ -109,6 +147,8 @@ Add `.accordion-flush` to remove some borders and rounded corners to render acco
109147
</summary>
110148
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item’s accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>
111149
</details>
150+
</div>`} customMarkup={`<div class="accordion accordion-flush"><!--[!code highlight]-->
151+
<!-- Accordion items here -->
112152
</div>`} />
113153

114154
## Always open
@@ -143,6 +183,11 @@ Omit the `name` attribute on each `<details>` element to allow multiple accordio
143183
<strong>This is the third item’s accordion body.</strong> Each item is completely independent—open or close them in any combination you like.
144184
</div>
145185
</details>
186+
</div>`} customMarkup={`<div class="accordion">
187+
<details class="accordion-item" open><!--[!code highlight]-->
188+
<!-- No name attribute, so items open independently -->
189+
</details>
190+
<!-- More accordion items here -->
146191
</div>`} />
147192

148193
## Nested

0 commit comments

Comments
 (0)