Skip to content

Commit 9626862

Browse files
committed
feat(components/button): loader icon
1 parent 37ef94a commit 9626862

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

packages/components/src/button/button.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type ButtonContent = {
1717

1818
disabled?: boolean;
1919
loading?: boolean;
20+
loader?: IconContent;
2021
icon?: IconContent;
2122
trailingIcon?: IconContent;
2223

@@ -38,7 +39,7 @@ export class GecutButtonDirective extends GecutDirective {
3839
}
3940

4041
private static baseStyleClass =
41-
'relative rounded-full h-10 px-6 cursor-pointer focus-ring disabled:cursor-default disabled:pointer-events-none [&[loading]]:cursor-default [&[loading]]:pointer-events-none';
42+
'relative group rounded-full h-10 px-6 cursor-pointer focus-ring disabled:cursor-default disabled:pointer-events-none [&[loading]]:cursor-default [&[loading]]:pointer-events-none';
4243
private static uiTypeStylesClasses = {
4344
elevated:
4445
'text-primary bg-surfaceContainerLow elevation-1 hover:elevation-2 hover:stateHover-primary focus:elevation-1 active:stateActive-primary disabled:opacity-60',
@@ -95,13 +96,19 @@ export class GecutButtonDirective extends GecutDirective {
9596
}
9697
protected static renderContent(content: ButtonContent): unknown {
9798
return html`
98-
<div class="absolute inset-0 flex justify-center items-center ${content.loading ? 'opacity-100' : 'opacity-0'}">
99-
${icon({
100-
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="12" r="0" fill="currentColor"><animate id="svgSpinnersPulse20" fill="freeze" attributeName="r" begin="0;svgSpinnersPulse21.begin+0.6s" calcMode="spline" dur="1.2s" keySplines=".52,.6,.25,.99" values="0;11"/><animate fill="freeze" attributeName="opacity" begin="0;svgSpinnersPulse21.begin+0.6s" calcMode="spline" dur="1.2s" keySplines=".52,.6,.25,.99" values="1;0"/></circle><circle cx="12" cy="12" r="0" fill="currentColor"><animate id="svgSpinnersPulse21" fill="freeze" attributeName="r" begin="svgSpinnersPulse20.begin+0.6s" calcMode="spline" dur="1.2s" keySplines=".52,.6,.25,.99" values="0;11"/><animate fill="freeze" attributeName="opacity" begin="svgSpinnersPulse20.begin+0.6s" calcMode="spline" dur="1.2s" keySplines=".52,.6,.25,.99" values="1;0"/></circle></svg>',
101-
})}
99+
<div
100+
class="absolute inset-0 flex justify-center items-center transition-opacity duration-300 opacity-0 group-[[loading]]:opacity-100"
101+
>
102+
${icon(
103+
content.loader ?? {
104+
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g stroke="currentColor"><circle cx="12" cy="12" r="9.5" fill="none" stroke-linecap="round" stroke-width="2.5"><animate attributeName="stroke-dasharray" calcMode="spline" dur="1.5s" keySplines="0.42,0,0.58,1;0.42,0,0.58,1;0.42,0,0.58,1" keyTimes="0;0.475;0.95;1" repeatCount="indefinite" values="0 150;42 150;42 150;42 150"/><animate attributeName="stroke-dashoffset" calcMode="spline" dur="1.5s" keySplines="0.42,0,0.58,1;0.42,0,0.58,1;0.42,0,0.58,1" keyTimes="0;0.475;0.95;1" repeatCount="indefinite" values="0;-16;-59;-59"/></circle><animateTransform attributeName="transform" dur="2s" repeatCount="indefinite" type="rotate" values="0 12 12;360 12 12"/></g></svg>',
105+
},
106+
)}
102107
</div>
103108
104-
<div class="flex items-center justify-center gap-2 ${content.loading ? 'opacity-0' : 'opacity-100'}">
109+
<div
110+
class="flex items-center justify-center gap-2 transition-opacity duration-300 opacity-100 group-[[loading]]:opacity-0"
111+
>
105112
${when(content.icon?.svg, () => icon({svg: content.icon?.svg as string}))}
106113
107114
<span class="text-labelLarge">${content.label}</span>

0 commit comments

Comments
 (0)