blob: 947840f1306988c044ca229d930a61701811900b [file] [log] [blame]
/**
* @module skottie-button-sk
* @description <h2><code>skottie-button-sk</code></h2>
*
* <p>
* A skottie button.
* </p>
*
*
* @attr content - A string, with no markup, that is to be used as the text for
* the text.
*
* @prop content This mirrors the text attribute.
*
* @attr type - A string of type ButtonType that styles the button.
*
* @prop type This mirrors the type attribute.
*
* @attr classes - An array of classes to add to the button element.
*
* @prop classes This mirrors the classes attribute.
*
* @attr disabled - A boolean to set the button as disabled.
*
* @prop disabled This mirrors the disabled attribute.
*
*/
import { define } from '../../../elements-sk/modules/define';
import { html, TemplateResult } from 'lit-html';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
type ButtonType = 'filled' | 'outline' | 'plain';
type ContentType = TemplateResult | string;
const classesMap: Record<ButtonType, string> = {
filled: 'base__filled',
outline: 'base__outline',
plain: 'base__plain',
};
export class SkottieButtonSk extends ElementSk {
private _type: ButtonType = 'filled';
private _isDisabled: boolean = true;
private _content: ContentType = '';
protected classes: string[] = [];
private _id: string = '';
private static template = (ele: SkottieButtonSk) => html`
<button
class=${ele.buildButtonClass()}
id=${ele._id}
?disabled=${ele._isDisabled}
@click=${ele.onClick}
>
${ele._content}
</button>
`;
constructor() {
super(SkottieButtonSk.template);
}
set content(val: ContentType) {
this._content = val;
this._render();
}
buildButtonClass(): string {
const classes = ['base', classesMap[this._type]].concat(this.classes);
return classes.join(' ');
}
connectedCallback(): void {
super.connectedCallback();
this._type = (this.getAttribute('type') as ButtonType) || 'filled';
this._isDisabled = this.hasAttribute('disabled');
if (this.getAttribute('id')) {
this._id = this.getAttribute('id') || '';
this.setAttribute('id', '');
}
this._render();
}
disconnectedCallback(): void {
super.disconnectedCallback();
}
onClick(ev: Event): void {
ev.preventDefault();
this.dispatchEvent(
new CustomEvent('select', {
bubbles: true,
})
);
}
set type(value: ButtonType) {
this._type = value;
this._render();
}
}
define('skottie-button-sk', SkottieButtonSk);