mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-05 08:01:20 +08:00
72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
/* eslint-disable import/no-extraneous-dependencies */
|
|
import globalThis from 'global';
|
|
import { html, LitElement } from 'lit';
|
|
|
|
const { CustomEvent, customElements } = globalThis;
|
|
|
|
/**
|
|
* @attr {string} label - Label of the button
|
|
* @attr {string} size - Size of the button, can be "small", "medium" or "large"; default is "medium".
|
|
* @attr {string} backgroundColor - Color of the button's background
|
|
*
|
|
* @cssprop [--sb-primary-color=#1ea7fd] - Controls the color of bar
|
|
*
|
|
* @prop {boolean} primary - Set button in primary mode
|
|
*
|
|
* @event {CustomEvent} sb-button:click - Custom event send when the button is clicked
|
|
*
|
|
* @summary This is a simple Storybook Button
|
|
*
|
|
* @tag sb-button
|
|
*/
|
|
export class SbButton extends LitElement {
|
|
// Currently TS decorators are not reflected so we have to use static `properties` function
|
|
// https://github.com/Polymer/lit-html/issues/1476
|
|
static get properties() {
|
|
return {
|
|
label: { type: String, reflect: true },
|
|
primary: { type: Boolean },
|
|
size: { type: String },
|
|
backgroundColor: { type: String, attribute: 'background-color' },
|
|
};
|
|
}
|
|
|
|
constructor() {
|
|
super();
|
|
this.primary = undefined;
|
|
this.backgroundColor = undefined;
|
|
this.size = 'medium';
|
|
this.label = '';
|
|
}
|
|
|
|
onClick() {
|
|
const options = {
|
|
bubbles: true,
|
|
composed: true,
|
|
};
|
|
this.dispatchEvent(new CustomEvent('sb-button:click', options));
|
|
}
|
|
|
|
render() {
|
|
const mode = this.primary ? 'storybook-button--primary' : 'storybook-button--secondary';
|
|
|
|
return html`
|
|
<button
|
|
type="button"
|
|
class=${['storybook-button', `storybook-button--${this.size ?? 'medium'}`, mode].join(' ')}
|
|
@click="${this.onClick}"
|
|
>
|
|
${this.label}
|
|
</button>
|
|
`;
|
|
}
|
|
|
|
// render into the light dom so we can test this
|
|
createRenderRoot() {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
export const ButtonTag = 'sb-button';
|
|
customElements.define(ButtonTag, SbButton);
|