import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Input, Output } from "@angular/core"; import { SdInputValidate } from "@simplysm/sd-angular"; @Component({ selector: "sdm-switch", changeDetection: ChangeDetectionStrategy.OnPush, template: `
`, styles: [/* language=SCSS */ ` @import "../../../sd-angular/scss/_variables-scss-arr.scss"; :host { display: block; padding: var(--gap-sm) 0; border: 1px solid transparent; > div { height: var(--line-height); width: calc(var(--line-height) * 2 - var(--gap-xs)); padding: calc(var(--gap-xs) / 2); border-radius: calc(var(--line-height) / 2); text-align: left; background: var(--theme-color-grey-lighter); > div { display: inline-block; width: calc(var(--line-height) - var(--gap-xs)); height: calc(var(--line-height) - var(--gap-xs)); border-radius: 100%; background: white; transition: transform var(--mobile-animation-duration); } } &[sd-on=true] { > div { background: var(--theme-color-success-default); > div { transform: translateX(100%); } } } &[sd-inline=true] { display: inline-block; } &[sd-inset=true] { border: none; } &[sd-size=sm] { padding: var(--gap-sm) 0; } &[sd-size=lg] { font-size: var(--font-size-lg); padding: var(--gap-default) 0; } @each $theme in $arr-theme-color { &[sd-theme=#{$theme}] { &[sd-on=true] { > div { background: var(--theme-color-#{$theme}-default); } } } } &[sd-disabled=true] { > div { opacity: .5; > div { background: var(--theme-color-grey-default); } } } } `] }) export class SdmSwitchControl { @Input() @SdInputValidate({ type: Boolean, notnull: true }) @HostBinding("attr.sd-on") public value = false; @Output() public readonly valueChange = new EventEmitter(); @Input() @SdInputValidate(Boolean) @HostBinding("attr.sd-disabled") public disabled?: boolean; @Input() @SdInputValidate({ type: [Boolean, String], includes: [true, false, "text"] }) @HostBinding("attr.sd-inline") public inline?: boolean | "text"; @Input() @SdInputValidate(Boolean) @HostBinding("attr.sd-inset") public inset?: boolean; @Input() @SdInputValidate({ type: String, includes: ["sm", "lg"] }) @HostBinding("attr.sd-size") public size?: "sm" | "lg"; @Input() @SdInputValidate({ type: String, includes: ["primary", "secondary", "info", "warning", "danger"] }) @HostBinding("attr.sd-theme") public theme?: "primary" | "secondary" | "info" | "warning" | "danger"; @HostBinding("attr.tabindex") public tabindex = 0; @HostListener("click", ["$event"]) public onClick(): void { if (this.disabled) return; if (this.valueChange.observed) { this.valueChange.emit(!this.value); } else { this.value = !this.value; } } @HostListener("keydown", ["$event"]) public onKeydown(event: KeyboardEvent): void { if (this.disabled) return; if (event.key === " ") { if (this.valueChange.observed) { this.valueChange.emit(!this.value); } else { this.value = !this.value; } } } }