import {
booleanAttribute,
ChangeDetectionStrategy,
Component,
input,
ViewEncapsulation,
} from "@angular/core";
import { SdRipple } from "../../core/ripple/sd-ripple";
@Component({
selector: "sd-button",
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
standalone: true,
imports: [SdRipple],
template: `
`,
styles: [
/* language=SCSS */ `
@use "sass:map";
@use "../../../scss/commons/variables";
@use "../../../scss/commons/mixins";
sd-button {
> button {
@include mixins.form-control-base();
user-select: none;
padding: var(--gap-sm) var(--gap-lg);
width: 100%;
background: var(--control-color);
border-color: var(--border-color-default);
border-radius: var(--border-radius-default);
font-weight: bold;
text-align: center;
cursor: pointer;
transition: 0.1s linear;
transition-property: border, background;
&:hover {
background: var(--theme-gray-lightest);
}
&:disabled {
background: var(--control-color);
border-color: var(--theme-gray-lighter);
color: var(--text-trans-lighter);
cursor: default;
}
}
&[data-sd-inset="true"] > button {
border-radius: 0;
border: none;
color: var(--theme-primary-default);
&:hover {
color: var(--theme-primary-darker);
}
&:disabled {
background: var(--control-color);
border-color: var(--theme-gray-lighter);
color: var(--text-trans-default);
cursor: default;
}
}
@each $key, $val in map.get(variables.$vars, theme) {
&[data-sd-theme="#{$key}"] > button {
background: var(--theme-#{$key}-default);
border-color: var(--theme-#{$key}-default);
color: var(--text-trans-rev-default);
&:hover {
background: var(--theme-#{$key}-dark);
border-color: var(--theme-#{$key}-dark);
color: var(--text-trans-rev-default);
}
&:disabled {
background: var(--theme-gray-lighter);
border-color: var(--theme-gray-lighter);
color: var(--text-trans-lighter);
cursor: default;
}
}
}
&[data-sd-theme="link"] > button {
border-color: transparent;
background: transparent;
color: var(--theme-primary-default);
&:hover {
color: var(--theme-primary-darker);
}
&:disabled {
border-color: transparent;
color: var(--text-trans-lighter);
}
}
@each $key, $val in map.get(variables.$vars, theme) {
&[data-sd-theme="link-#{$key}"] > button {
border-color: transparent;
background: transparent;
color: var(--theme-#{$key}-default);
&:hover {
background: var(--trans-lighter);
color: var(--theme-#{$key}-darker);
}
&:disabled {
border-color: transparent;
color: var(--text-trans-lighter);
}
}
}
&[data-sd-theme="link-rev"] > button {
border-color: transparent;
background: transparent;
color: var(--text-trans-rev-default);
&:hover {
color: var(--text-trans-rev-dark);
}
&:disabled {
border-color: transparent;
color: var(--text-trans-rev-darker);
}
}
&[data-sd-inline="true"] > button {
display: inline-block;
width: auto;
vertical-align: top;
}
&[data-sd-size="sm"] > button {
padding: var(--gap-xs) var(--gap-default);
}
&[data-sd-size="lg"] > button {
padding: var(--gap-default) var(--gap-xl);
}
&[data-sd-disabled="true"] {
&:active {
pointer-events: none;
}
}
}
`,
],
host: {
"[attr.data-sd-theme]": "theme()",
"[attr.data-sd-inline]": "inline()",
"[attr.data-sd-size]": "size()",
"[attr.data-sd-inset]": "inset()",
"[attr.data-sd-disabled]": "disabled()",
},
})
export class SdButton {
type = input<"button" | "submit">("button");
theme = input<
| "primary"
| "secondary"
| "info"
| "success"
| "warning"
| "danger"
| "gray"
| "blue-gray"
| "link"
| "link-primary"
| "link-secondary"
| "link-info"
| "link-success"
| "link-warning"
| "link-danger"
| "link-gray"
| "link-blue-gray"
| "link-rev"
>();
inline = input(false, { transform: booleanAttribute });
inset = input(false, { transform: booleanAttribute });
size = input<"sm" | "lg">();
disabled = input(false, { transform: booleanAttribute });
buttonStyle = input();
buttonClass = input();
}