Skip to content

Commit ddf9139

Browse files
fix(breadcrumb): overflowmenu focus styles (#18772)
* fix(breadcrumb): overflowmenu focus styles * fix(underline): revert * fix(hover): remove outline wc
1 parent 87b7c23 commit ddf9139

File tree

5 files changed

+149
-34
lines changed

5 files changed

+149
-34
lines changed

packages/styles/scss/components/breadcrumb/_breadcrumb.scss

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@
5757
}
5858
}
5959

60+
.#{$prefix}--breadcrumb-item .#{$prefix}--link:active,
61+
.#{$prefix}--breadcrumb-item .#{$prefix}--link:visited:active:hover {
62+
color: $text-primary;
63+
}
64+
6065
.#{$prefix}--breadcrumb-item::after {
6166
color: $text-primary;
6267
content: '/';
@@ -96,20 +101,40 @@
96101
.#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu {
97102
position: relative;
98103
block-size: convert.to-rem(18px);
99-
inline-size: convert.to-rem(20px);
104+
inline-size: $spacing-05;
100105

101106
&:focus {
107+
border: none;
108+
box-shadow: none;
102109
outline: 1px solid $focus;
110+
outline-offset: 0;
103111
}
104112

105113
&:hover {
106114
background: transparent;
115+
116+
&::after {
117+
background: $link-primary-hover;
118+
}
119+
}
120+
121+
&:active {
122+
&::after {
123+
background: $text-primary;
124+
}
125+
}
126+
127+
&:focus,
128+
&:hover {
129+
&::after {
130+
opacity: 1;
131+
}
107132
}
108133

109134
// Used to mimic link underline
110135
&::after {
111136
position: absolute;
112-
background: $link-primary-hover;
137+
background: $focus;
113138
block-size: 1px;
114139
content: '';
115140
inline-size: convert.to-rem(12px);
@@ -123,16 +148,6 @@
123148
}
124149
}
125150

126-
.#{$prefix}--breadcrumb--sm
127-
.#{$prefix}--breadcrumb-item
128-
.#{$prefix}--overflow-menu {
129-
inline-size: $spacing-05;
130-
}
131-
132-
.#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu:hover::after {
133-
opacity: 1;
134-
}
135-
136151
.#{$prefix}--breadcrumb-item
137152
.#{$prefix}--overflow-menu.#{$prefix}--overflow-menu--open {
138153
background: transparent;
@@ -153,6 +168,12 @@
153168
fill: $link-primary-hover;
154169
}
155170

171+
.#{$prefix}--breadcrumb-item
172+
.#{$prefix}--overflow-menu:active
173+
.#{$prefix}--overflow-menu__icon {
174+
fill: $text-primary;
175+
}
176+
156177
.#{$prefix}--breadcrumb-menu-options:focus {
157178
outline: none;
158179
}
@@ -176,17 +197,28 @@
176197
inset-inline-start: initial;
177198
}
178199

200+
.#{$prefix}--breadcrumb
201+
.#{$prefix}--overflow-menu.#{$prefix}--btn--icon-only {
202+
min-block-size: 1.125rem;
203+
padding-inline: 0;
204+
}
205+
206+
.#{$prefix}--breadcrumb--sm
207+
.#{$prefix}--breadcrumb-item
208+
.#{$prefix}--overflow-menu {
209+
block-size: $spacing-05;
210+
inline-size: $spacing-05;
211+
min-block-size: $spacing-05;
212+
.#{$prefix}--overflow-menu__icon {
213+
transform: translateY(3px);
214+
}
215+
}
216+
179217
// Skeleton State
180218
.#{$prefix}--breadcrumb.#{$prefix}--skeleton .#{$prefix}--link {
181219
@include skeleton;
182220

183221
block-size: 1rem;
184222
inline-size: convert.to-rem(100px);
185223
}
186-
187-
.#{$prefix}--breadcrumb
188-
.#{$prefix}--overflow-menu.#{$prefix}--btn--icon-only {
189-
min-block-size: 1.125rem;
190-
padding-inline: 0;
191-
}
192224
}

packages/web-components/src/components/breadcrumb/breadcrumb-item.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,29 @@ import { carbonElement as customElement } from '../../globals/decorators/carbon-
1919
*/
2020
@customElement(`${prefix}-breadcrumb-item`)
2121
class CDSBreadcrumbItem extends LitElement {
22+
/**
23+
* Handles `slotchange` event.
24+
*/
25+
private _handleSlotChange({ target }: Event) {
26+
if (this.getAttribute('size')) {
27+
const items = (target as HTMLSlotElement)
28+
.assignedNodes()
29+
.filter(
30+
(node) =>
31+
node.nodeType === Node.ELEMENT_NODE &&
32+
(node as Element).tagName.toLowerCase() ===
33+
`${prefix}-overflow-menu`
34+
);
35+
36+
items.forEach((item) => {
37+
(item as HTMLElement).setAttribute(
38+
'breadcrumb-size',
39+
this.getAttribute('size')!
40+
);
41+
});
42+
}
43+
}
44+
2245
connectedCallback() {
2346
if (!this.hasAttribute('role')) {
2447
this.setAttribute('role', 'listitem');
@@ -27,7 +50,7 @@ class CDSBreadcrumbItem extends LitElement {
2750
}
2851

2952
render() {
30-
return html` <slot></slot> `;
53+
return html` <slot @slotchange=${this._handleSlotChange}></slot> `;
3154
}
3255

3356
static styles = styles;

packages/web-components/src/components/breadcrumb/breadcrumb.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,13 @@ $css--plex: true !default;
108108
:host(#{$prefix}-breadcrumb-link) {
109109
outline: none;
110110

111+
.#{$prefix}--link:visited,
111112
.#{$prefix}--link {
112113
font: inherit;
114+
115+
&:active {
116+
color: $text-primary;
117+
}
113118
}
114119

115120
// Re-define the ruleset so this wins over `.#{$prefix}--link:visited`, etc.

packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export const BreadcrumbWithOverflowMenu = {
106106
<cds-breadcrumb-link href="/#">Breadcrumb 2</cds-breadcrumb-link>
107107
</cds-breadcrumb-item>
108108
<cds-breadcrumb-item>
109-
<cds-overflow-menu breadcrumb>
109+
<cds-overflow-menu breadcrumb align="bottom">
110110
${OverflowMenuHorizontal16({
111111
class: `${prefix}--overflow-menu__icon`,
112112
slot: 'icon',

packages/web-components/src/components/overflow-menu/overflow-menu.scss

Lines changed: 69 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -124,33 +124,88 @@ $css--plex: true !default;
124124
@extend .#{$prefix}--overflow-menu--divider;
125125
}
126126

127+
// breadcrumb
127128
:host(#{$prefix}-overflow-menu[breadcrumb]) {
128129
background: none;
129-
block-size: 1.125rem;
130+
block-size: convert.to-rem(18px);
130131
box-shadow: none;
131-
inline-size: 1.25rem;
132+
inline-size: $spacing-05;
132133
min-block-size: 1.125rem;
133134

134135
#{$prefix}-tooltip button {
135136
position: relative;
136-
block-size: 1.125rem;
137-
inline-size: 1.25rem;
137+
block-size: convert.to-rem(18px);
138+
inline-size: $spacing-05;
138139
min-block-size: 1.125rem;
139-
padding-inline: 0;
140-
}
141140

142-
:hover,
143-
:active,
144-
:focus {
145-
box-sizing: border-box;
146-
background: none;
147-
box-shadow: none;
141+
&:hover,
142+
&:active,
143+
&:focus {
144+
box-sizing: border-box;
145+
background: none;
146+
box-shadow: none;
147+
outline-offset: 0;
148+
149+
&::after {
150+
opacity: 1;
151+
}
152+
}
153+
154+
&:active,
155+
&:focus {
156+
outline: 1px solid $focus;
157+
}
158+
159+
&:hover {
160+
&::after {
161+
background: $link-primary-hover;
162+
}
163+
}
164+
165+
&:active {
166+
&::after {
167+
background: $text-primary;
168+
}
169+
}
170+
171+
&::after {
172+
position: absolute;
173+
background: $focus;
174+
block-size: 1px;
175+
content: '';
176+
inline-size: convert.to-rem(12px);
177+
inset-block-end: 2px;
178+
opacity: 0;
179+
transition: opacity $duration-fast-01 motion(standard, productive);
180+
181+
@media screen and (prefers-reduced-motion: reduce) {
182+
transition: none;
183+
}
184+
}
148185
}
149186
}
150187

151-
:host(#{$prefix}-overflow-menu[breadcrumb]) {
188+
:host(#{$prefix}-overflow-menu[breadcrumb]) ::slotted([slot='icon']) {
189+
fill: $link-primary;
190+
transform: translateY(4px);
191+
}
192+
193+
:host(#{$prefix}-overflow-menu[breadcrumb]:hover) ::slotted([slot='icon']) {
194+
fill: $link-primary-hover;
195+
}
196+
197+
:host(#{$prefix}-overflow-menu[breadcrumb]:active) ::slotted([slot='icon']) {
198+
fill: $text-primary;
199+
}
200+
201+
:host(#{$prefix}-overflow-menu[breadcrumb][breadcrumb-size='sm']) {
202+
#{$prefix}-tooltip button {
203+
block-size: $spacing-05;
204+
min-block-size: $spacing-05;
205+
}
206+
152207
::slotted([slot='icon']) {
153-
transform: translateY(4px);
208+
transform: translateY(3px);
154209
}
155210
}
156211

0 commit comments

Comments
 (0)