Skip to content

Commit af31e36

Browse files
dr-itzkfenner
authored andcommitted
fix(navbar-vertical): prevent initial animation
1 parent 51c1f25 commit af31e36

4 files changed

Lines changed: 37 additions & 13 deletions

File tree

projects/element-ng/navbar-vertical-next/si-navbar-vertical-next.component.scss

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ $vertical-nav-transition-duration: all-variables.$element-default-transition-dur
77

88
:host {
99
display: block;
10-
transition: padding-inline-start $vertical-nav-transition-duration;
1110
--si-layout-header-first-element-offset: 40px;
1211

1312
// This prevents applying the wrong padding-inline-start before the visible class is applied. This would trigger the animation
1413
&.ready:not(.visible) {
1514
padding-inline-start: 0 !important; // stylelint-disable-line declaration-no-important
1615
}
16+
17+
// only animate after initial state is set
18+
&.ready {
19+
transition: padding-inline-start $vertical-nav-transition-duration;
20+
}
1721
}
1822

1923
nav {
@@ -28,7 +32,7 @@ nav {
2832
inset-block-end: 0;
2933
inset-inline-start: 0;
3034
inline-size: 0;
31-
transition: inline-size all-variables.element-transition-duration(0.5s) ease;
35+
transition: inline-size $vertical-nav-transition-duration ease;
3236

3337
:host(.nav-collapsed) & {
3438
z-index: all-variables.$zindex-vertical-nav-collapsed;
@@ -52,9 +56,9 @@ nav {
5256
border-end-end-radius: all-variables.$border-radius;
5357

5458
transition:
55-
inline-size all-variables.element-transition-duration(0.5s) ease,
56-
background-color all-variables.element-transition-duration(0.5s) ease,
57-
box-shadow all-variables.element-transition-duration(0.5s) ease;
59+
inline-size $vertical-nav-transition-duration ease,
60+
background-color $vertical-nav-transition-duration ease,
61+
box-shadow $vertical-nav-transition-duration ease;
5862

5963
:host(:not(.nav-collapsed)) & {
6064
inline-size: $vertical-nav-width;

projects/element-ng/navbar-vertical-next/si-navbar-vertical-next.component.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
*/
55
import { BreakpointObserver } from '@angular/cdk/layout';
66
import {
7+
afterNextRender,
78
booleanAttribute,
89
ChangeDetectionStrategy,
910
Component,
1011
inject,
12+
Injector,
1113
input,
1214
model,
1315
OnChanges,
@@ -43,7 +45,8 @@ interface UIState {
4345
class: 'si-layout-inner ready',
4446
'[class.nav-collapsed]': 'collapsed()',
4547
'[class.nav-text-only]': 'textOnly()',
46-
'[class.visible]': 'visible()'
48+
'[class.visible]': 'visible()',
49+
'[class.ready]': 'ready()'
4750
}
4851
})
4952
export class SiNavbarVerticalNextComponent implements OnChanges, OnInit {
@@ -123,7 +126,9 @@ export class SiNavbarVerticalNextComponent implements OnChanges, OnInit {
123126
);
124127
private uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });
125128
private breakpointObserver = inject(BreakpointObserver);
129+
private injector = inject(Injector);
126130

131+
protected readonly ready = signal(false);
127132
protected readonly smallScreen = signal(false);
128133

129134
/**
@@ -164,7 +169,10 @@ export class SiNavbarVerticalNextComponent implements OnChanges, OnInit {
164169
this.uiStateExpandedItems.set(uiState.expandedItems);
165170
}
166171
}
172+
afterNextRender(() => this.ready.set(true), { injector: this.injector });
167173
});
174+
} else {
175+
this.ready.set(true);
168176
}
169177
}
170178

projects/element-ng/navbar-vertical/si-navbar-vertical.component.scss

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ $vertical-nav-transition-duration: all-variables.$element-default-transition-dur
77

88
:host {
99
display: block;
10-
transition: padding-inline-start $vertical-nav-transition-duration;
1110
--si-layout-header-first-element-offset: 40px;
1211

1312
// This prevents applying the wrong padding-inline-start before the visible class is applied. This would trigger the animation
1413
&.ready:not(.visible) {
1514
padding-inline-start: 0 !important; // stylelint-disable-line declaration-no-important
1615
}
16+
17+
// only animate after initial state is set
18+
&.ready {
19+
transition: padding-inline-start $vertical-nav-transition-duration;
20+
}
1721
}
1822

1923
nav {
@@ -28,7 +32,7 @@ nav {
2832
inset-block-end: 0;
2933
inset-inline-start: 0;
3034
inline-size: 0;
31-
transition: inline-size all-variables.element-transition-duration(0.5s) ease;
35+
transition: inline-size $vertical-nav-transition-duration ease;
3236

3337
:host(.nav-collapsed) & {
3438
z-index: all-variables.$zindex-vertical-nav-collapsed;
@@ -64,9 +68,9 @@ nav {
6468
border-end-end-radius: all-variables.$border-radius;
6569

6670
transition:
67-
inline-size all-variables.element-transition-duration(0.5s) ease,
68-
background-color all-variables.element-transition-duration(0.5s) ease,
69-
box-shadow all-variables.element-transition-duration(0.5s) ease;
71+
inline-size $vertical-nav-transition-duration ease,
72+
background-color $vertical-nav-transition-duration ease,
73+
box-shadow $vertical-nav-transition-duration ease;
7074

7175
:host(:not(.nav-collapsed)) & {
7276
inline-size: $vertical-nav-width;

projects/element-ng/navbar-vertical/si-navbar-vertical.component.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import { BreakpointObserver } from '@angular/cdk/layout';
66
import { NgTemplateOutlet } from '@angular/common';
77
import {
8+
afterNextRender,
89
booleanAttribute,
910
Component,
1011
computed,
1112
Directive,
1213
inject,
14+
Injector,
1315
input,
1416
model,
1517
OnChanges,
@@ -79,10 +81,11 @@ export class SiNavbarVerticalItemGuardDirective {
7981
styleUrl: './si-navbar-vertical.component.scss',
8082
providers: [{ provide: SI_NAVBAR_VERTICAL, useExisting: SiNavbarVerticalComponent }],
8183
host: {
82-
class: 'si-layout-inner ready',
84+
class: 'si-layout-inner',
8385
'[class.nav-collapsed]': 'collapsed()',
8486
'[class.nav-text-only]': 'textOnly()',
85-
'[class.visible]': 'visible()'
87+
'[class.visible]': 'visible()',
88+
'[class.ready]': 'ready()'
8689
}
8790
})
8891
export class SiNavbarVerticalComponent implements OnChanges, OnInit {
@@ -209,6 +212,7 @@ export class SiNavbarVerticalComponent implements OnChanges, OnInit {
209212
protected readonly activatedRoute = inject(ActivatedRoute, { optional: true });
210213
private uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });
211214
private breakpointObserver = inject(BreakpointObserver);
215+
private injector = inject(Injector);
212216
private readonly navbarItems = viewChildren(SiNavbarVerticalItemComponent);
213217
private readonly navbarItemsLegacy = viewChildren(SiNavbarVerticalItemLegacyComponent);
214218
private readonly itemsToComponents = computed(
@@ -221,6 +225,7 @@ export class SiNavbarVerticalComponent implements OnChanges, OnInit {
221225
)
222226
);
223227

228+
protected readonly ready = signal(false);
224229
protected readonly smallScreen = signal(false);
225230
protected readonly uiStateExpandedItems = signal<Record<string, boolean>>({});
226231

@@ -252,7 +257,10 @@ export class SiNavbarVerticalComponent implements OnChanges, OnInit {
252257
this.collapsed.set(this.smallScreen() ? this.collapsed() : this.preferCollapse);
253258
this.uiStateExpandedItems.set(uiState.expandedItems);
254259
}
260+
afterNextRender(() => this.ready.set(true), { injector: this.injector });
255261
});
262+
} else {
263+
this.ready.set(true);
256264
}
257265
}
258266

0 commit comments

Comments
 (0)