Skip to content

Commit 2c59f52

Browse files
committed
refactor(button): ensure the button works in SSR
1 parent 603b57f commit 2c59f52

File tree

3 files changed

+44
-26
lines changed

3 files changed

+44
-26
lines changed

projects/igniteui-angular/src/lib/core/styles/components/button/_button-theme.scss

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@
6161
$variant
6262
);
6363

64-
$button-transition: color var(--_ig-init-transition, #{$time}) ease-in-out,
65-
background-color var(--_ig-init-transition, #{$time}) ease-in-out,
66-
border-color var(--_ig-init-transition, #{$time}) ease-in-out,
67-
box-shadow var(--_ig-init-transition, #{$time}) ease-in-out;
64+
$button-transition: color var(--_init-transition, #{$time}) ease-in-out,
65+
background-color var(--_init-transition, #{$time}) ease-in-out,
66+
border-color var(--_init-transition, #{$time}) ease-in-out,
67+
box-shadow var(--_init-transition, #{$time}) ease-in-out;
6868

6969
$button-disabled-shadow: none;
7070

projects/igniteui-angular/src/lib/core/styles/components/icon-button/_icon-button-theme.scss

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@
7474
overflow: hidden;
7575
white-space: nowrap;
7676
transition:
77-
box-shadow var(--_ig-init-transition, .2s) ease-in,
78-
background var(--_ig-init-transition, .15s) ease-out;
79-
transition-delay: var(--_ig-init-transition, .05s);
77+
box-shadow var(--_init-transition, .2s) ease-in,
78+
background var(--_init-transition, .15s) ease-out;
79+
transition-delay: var(--_init-transition, .05s);
8080
min-width: unset;
8181
min-height: unset;
8282
font-size: rem(24px, 24px);
@@ -98,8 +98,8 @@
9898

9999
@if $variant == 'fluent' {
100100
transition:
101-
color var(--_ig-init-transition, .15s) ease-out,
102-
background var(--_ig-init-transition, .15s) ease-out;
101+
color var(--_init-transition, .15s) ease-out,
102+
background var(--_init-transition, .15s) ease-out;
103103

104104
&::after {
105105
position: absolute;
@@ -114,17 +114,17 @@
114114

115115
@if $variant == 'bootstrap' {
116116
transition:
117-
box-shadow var(--_ig-init-transition, .15s) ease-out,
118-
color var(--_ig-init-transition, .15s) ease-out,
119-
background var(--_ig-init-transition, .15s) ease-out;
117+
box-shadow var(--_init-transition, .15s) ease-out,
118+
color var(--_init-transition, .15s) ease-out,
119+
background var(--_init-transition, .15s) ease-out;
120120
}
121121

122122
@if $variant == 'indigo' {
123123
transition:
124-
color var(--_ig-init-transition, .15s) ease-in-out,
125-
box-shadow var(--_ig-init-transition, .15s) ease-in-out,
126-
background var(--_ig-init-transition, .15s) ease-in-out,
127-
border-color var(--_ig-init-transition, .15s) ease-in-out;
124+
color var(--_init-transition, .15s) ease-in-out,
125+
box-shadow var(--_init-transition, .15s) ease-in-out,
126+
background var(--_init-transition, .15s) ease-in-out,
127+
border-color var(--_init-transition, .15s) ease-in-out;
128128
}
129129
}
130130

projects/igniteui-angular/src/lib/directives/button/button-base.ts

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
import {
2-
Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, booleanAttribute, AfterViewInit,
2+
Directive,
3+
ElementRef,
4+
EventEmitter,
5+
HostBinding,
6+
HostListener,
7+
Input,
8+
Output,
9+
booleanAttribute,
10+
inject,
11+
afterRenderEffect,
312
} from '@angular/core';
13+
import { PlatformUtil } from '../../core/utils';
414

515
export const IgxBaseButtonType = {
616
Flat: 'flat',
717
Contained: 'contained',
818
Outlined: 'outlined'
919
} as const;
1020

21+
1122
@Directive()
12-
export abstract class IgxButtonBaseDirective implements AfterViewInit {
23+
export abstract class IgxButtonBaseDirective {
24+
private _platformUtil = inject(PlatformUtil);
25+
private _elementRef = inject(ElementRef);
26+
1327
/**
1428
* Emitted when the button is clicked.
1529
*/
@@ -87,7 +101,18 @@ export abstract class IgxButtonBaseDirective implements AfterViewInit {
87101
// In browser, set via native API for immediate effect (no-op on server).
88102
// In SSR there is no paint, so there’s no visual rendering or transitions to suppress.
89103
// Fix style flickering https://github.com/IgniteUI/igniteui-angular/issues/14759
90-
this.element.nativeElement.style.setProperty('--_ig-init-transition', '0s');
104+
if (this._platformUtil.isBrowser) {
105+
afterRenderEffect({
106+
write: () => {
107+
this.element.nativeElement.style.setProperty('--_init-transition', '0s');
108+
},
109+
read: () => {
110+
requestAnimationFrame(() => {
111+
this.element.nativeElement.style.removeProperty('--_init-transition');
112+
});
113+
}
114+
});
115+
}
91116
}
92117

93118
/**
@@ -107,11 +132,4 @@ export abstract class IgxButtonBaseDirective implements AfterViewInit {
107132
public get nativeElement() {
108133
return this.element.nativeElement;
109134
}
110-
111-
public ngAfterViewInit() {
112-
// Remove after the first frame to re-enable transitions
113-
requestAnimationFrame(() => {
114-
this.element.nativeElement.style.removeProperty('--_ig-init-transition');
115-
});
116-
}
117135
}

0 commit comments

Comments
 (0)