Skip to content

Commit 868ed1a

Browse files
committed
feat(components): enable shadow DOM for the post-megadropdown
1 parent 3d64a9e commit 868ed1a

File tree

21 files changed

+299
-242
lines changed

21 files changed

+299
-242
lines changed

packages/components-angular/projects/consumer-app/src/app/app.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@
8080
<!-- Level 1 with megadropdown -->
8181
@for (dropdown of megadropdowns; track dropdown.id) {
8282
<li>
83-
<post-megadropdown-trigger [for]="dropdown.id">{{
84-
dropdown.trigger
85-
}}</post-megadropdown-trigger>
83+
<post-megadropdown-trigger [for]="dropdown.id">
84+
<button>{{ dropdown.trigger }}</button>
85+
</post-megadropdown-trigger>
8686
<post-megadropdown [id]="dropdown.id" labelClose="Close" labelBack="Back">
8787
<a class="megadropdown-overview-link" [href]="dropdown.overviewLink"
8888
>Overview {{ dropdown.trigger }}</a

packages/components/cypress/e2e/header.cy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ describe('header', () => {
124124
cy.get('post-megadropdown#letters a[href="/kl"]').first().as('lettersSecondLink');
125125
cy.get('post-megadropdown#packages a[href="/sch"]').first().as('packagesLink');
126126

127-
cy.get('post-megadropdown-trigger button').first().as('lettersTrigger');
128-
cy.get('post-megadropdown-trigger button').eq(1).as('packagesTrigger');
127+
cy.get('post-megadropdown-trigger button:not([inert])').first().as('lettersTrigger');
128+
cy.get('post-megadropdown-trigger button:not([inert])').eq(1).as('packagesTrigger');
129129

130130
// Activate first link
131131
cy.get('@lettersFirstLink').then($link => $link.attr('aria-current', 'page'));

packages/components/cypress/e2e/mainnavigation.cy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ describe('mainnavigation', { baseUrl: null, includeShadowDom: true }, () => {
4242
cy.get('post-mainnavigation[data-hydrated]').as('mainnavigation');
4343

4444
cy.get('@mainnavigation')
45-
.find(':is(a,button):not(post-megadropdown *)')
45+
.find(':is(a,button):not([inert], post-megadropdown *)')
4646
.should('have.length', 20)
4747
.as('navigationItems');
4848

packages/components/cypress/fixtures/post-mainnavigation-overflow.test.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@
6969
<post-mainnavigation slot="main-nav" caption="Haupt">
7070
<ul>
7171
<li>
72-
<post-megadropdown-trigger for="item-1">Item 1</post-megadropdown-trigger>
72+
<post-megadropdown-trigger for="item-1">
73+
<button>Item 1</button>
74+
</post-megadropdown-trigger>
7375
<post-megadropdown id="item-1" label-close="Schliessen" label-back="Back">
7476
<a class="megadropdown-overview-link" href="/briefe">Übersicht Briefe</a>
7577
<post-list>
@@ -122,7 +124,9 @@
122124
<li><a href="/item-19">Item 19</a></li>
123125

124126
<li>
125-
<post-megadropdown-trigger for="item-20">Item 20</post-megadropdown-trigger>
127+
<post-megadropdown-trigger for="item-20">
128+
<button>Item 20</button>
129+
</post-megadropdown-trigger>
126130
<post-megadropdown id="item-20" label-close="Schliessen" label-back="Back">
127131
<a class="megadropdown-overview-link" href="/pakete">Übersicht Pakete</a>
128132
<post-list>

packages/components/cypress/fixtures/post-mainnavigation.test.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@
7474

7575
<!-- Level 1 with megadropdown -->
7676
<li>
77-
<post-megadropdown-trigger for="briefe">Briefe</post-megadropdown-trigger>
77+
<post-megadropdown-trigger for="briefe">
78+
<button>Briefe</button>
79+
</post-megadropdown-trigger>
7880
<post-megadropdown id="briefe" label-close="Schliessen" label-back="Back">
7981
<a class="megadropdown-overview-link" href="/briefe">Übersicht Briefe</a>
8082
<post-list>
@@ -94,7 +96,9 @@
9496
</post-megadropdown>
9597
</li>
9698
<li>
97-
<post-megadropdown-trigger for="pakete">Pakete</post-megadropdown-trigger>
99+
<post-megadropdown-trigger for="pakete">
100+
<button>Pakete</button>
101+
</post-megadropdown-trigger>
98102
<post-megadropdown id="pakete" label-close="Schliessen" label-back="Back">
99103
<a class="megadropdown-overview-link" href="/pakete">Übersicht Pakete</a>
100104
<post-list>

packages/components/src/components/post-icon/readme.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ some content
2828
- [post-breadcrumbs](../post-breadcrumbs)
2929
- [post-card-control](../post-card-control)
3030
- [post-closebutton](../post-closebutton)
31-
- [post-language-menu](../post-language-menu)
3231
- [post-mainnavigation](../post-mainnavigation)
3332
- [post-megadropdown](../post-megadropdown)
34-
- [post-megadropdown-trigger](../post-megadropdown-trigger)
3533
- [post-pagination](../post-pagination)
3634
- [post-rating](../post-rating)
3735

@@ -44,10 +42,8 @@ graph TD;
4442
post-breadcrumbs --> post-icon
4543
post-card-control --> post-icon
4644
post-closebutton --> post-icon
47-
post-language-menu --> post-icon
4845
post-mainnavigation --> post-icon
4946
post-megadropdown --> post-icon
50-
post-megadropdown-trigger --> post-icon
5147
post-pagination --> post-icon
5248
post-rating --> post-icon
5349
style post-icon fill:#f9f,stroke:#333,stroke-width:4px

packages/components/src/components/post-language-menu/post-language-menu.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,13 @@ export class PostLanguageMenu {
132132
{this.activeLang}
133133
<span class="visually-hidden">{this.caption}</span>
134134
<span class="visually-hidden">{this.description}</span>
135-
<post-icon aria-hidden="true" name="chevrondown"></post-icon>
136135
</button>
137136
</post-menu-trigger>
138-
<post-menu id={this.menuId} class="post-language-menu-dropdown-container" label={this.caption}>
137+
<post-menu
138+
id={this.menuId}
139+
class="post-language-menu-dropdown-container"
140+
label={this.caption}
141+
>
139142
<slot></slot>
140143
</post-menu>
141144
</Host>

packages/components/src/components/post-language-menu/readme.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@
1717
### Depends on
1818

1919
- [post-menu-trigger](../post-menu-trigger)
20-
- [post-icon](../post-icon)
2120
- [post-menu](../post-menu)
2221

2322
### Graph
2423
```mermaid
2524
graph TD;
2625
post-language-menu --> post-menu-trigger
27-
post-language-menu --> post-icon
2826
post-language-menu --> post-menu
2927
post-menu --> post-popovercontainer
3028
style post-language-menu fill:#f9f,stroke:#333,stroke-width:4px

packages/components/src/components/post-mainnavigation/post-mainnavigation.tsx

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ export class PostMainnavigation {
4848
this.validateCaption();
4949

5050
setTimeout(() => {
51-
this.fixLayoutShift();
5251
this.checkScrollability();
5352
});
5453

@@ -92,28 +91,13 @@ export class PostMainnavigation {
9291
),
9392
);
9493

95-
this.fixLayoutShift();
9694
this.checkScrollability();
9795
}
9896

9997
private get navigationItems(): HTMLElement[] {
10098
return Array.from(this.host.querySelectorAll(':is(a, button):not(post-megadropdown *)'));
10199
}
102100

103-
/**
104-
* Hack to fix the layout shift due to bold text on active elements
105-
*/
106-
private fixLayoutShift() {
107-
this.navigationItems
108-
.filter(item => !item.matches(':has(.shown-when-inactive)'))
109-
.forEach(item => {
110-
item.innerHTML = `
111-
<span class="shown-when-inactive" aria-hidden="true">${item.innerHTML}</span>
112-
${item.innerHTML}
113-
`;
114-
});
115-
}
116-
117101
/**
118102
* Returns whether scrolling is enabled in either the left or right direction.
119103
*/
Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
@use '@swisspost/design-system-styles/mixins/media';
2-
@use '@swisspost/design-system-styles/components/header/mixins' as header-mx;
32

4-
post-megadropdown-trigger {
5-
width: 100%;
3+
:host {
64
position: relative;
5+
display: inline-block;
6+
}
7+
8+
// On desktop, we need an inert button to stabilize layout.
9+
// This prevents layout shifts caused by the real button toggling between normal and bold font-weights.
10+
@include media.only(desktop) {
11+
// The inert button provides size to the host but stays invisible.
12+
::slotted(button[inert]) {
13+
visibility: hidden !important;
14+
}
715

8-
button {
9-
@include header-mx.nav-item-rotating-chevron;
16+
// The interactive button is positioned on top of the inert one and adopts the same height and width.
17+
::slotted(button:not([inert], :only-child)) {
18+
position: absolute !important;
19+
inset: 0 !important;
20+
}
21+
}
1022

11-
@include media.max(desktop) {
12-
post-icon {
13-
transform: rotate(-90deg);
14-
}
15-
}
23+
// On mobile, the font-weight does not change so the inert button is unnecessary.
24+
@include media.max(desktop) {
25+
::slotted(button[inert]) {
26+
display: none !important;
1627
}
1728
}

0 commit comments

Comments
 (0)