shoelace/src/components/tag/tag.ts

92 wiersze
2.4 KiB
TypeScript
Czysty Zwykły widok Historia

import { html, LitElement } from 'lit';
2021-05-27 21:00:43 +00:00
import { customElement, property } from 'lit/decorators.js';
2021-09-29 12:40:26 +00:00
import { classMap } from 'lit/directives/class-map.js';
import '~/components/icon-button/icon-button';
import { emit } from '~/internal/event';
2021-07-10 00:45:44 +00:00
import styles from './tag.styles';
2021-07-12 14:36:06 +00:00
2021-02-26 14:09:13 +00:00
/**
* @since 2.0
* @status stable
*
* @dependency sl-icon-button
*
2021-06-25 20:25:46 +00:00
* @slot - The tag's content.
2021-02-26 14:09:13 +00:00
*
2021-10-07 13:52:23 +00:00
* @event sl-remove - Emitted when the remove button is activated.
*
2021-06-25 20:25:46 +00:00
* @csspart base - The component's base wrapper.
* @csspart content - The tag content.
2021-10-07 13:52:23 +00:00
* @csspart remove-button - The remove button.
2021-02-26 14:09:13 +00:00
*/
2021-03-18 13:04:23 +00:00
@customElement('sl-tag')
2021-03-09 00:14:32 +00:00
export default class SlTag extends LitElement {
2021-07-10 00:45:44 +00:00
static styles = styles;
2021-02-26 14:09:13 +00:00
2021-12-13 22:38:40 +00:00
/** The tag's variant. */
@property({ reflect: true }) variant: 'primary' | 'success' | 'neutral' | 'warning' | 'danger' | 'text' = 'neutral';
2021-02-26 14:09:13 +00:00
/** The tag's size. */
2021-03-06 17:01:39 +00:00
@property({ reflect: true }) size: 'small' | 'medium' | 'large' = 'medium';
2021-02-26 14:09:13 +00:00
/** Draws a pill-style tag with rounded edges. */
2021-07-01 00:04:46 +00:00
@property({ type: Boolean, reflect: true }) pill = false;
2021-02-26 14:09:13 +00:00
2021-10-07 13:52:23 +00:00
/** Makes the tag removable. */
@property({ type: Boolean }) removable = false;
2021-03-06 17:01:39 +00:00
2021-10-07 13:52:23 +00:00
handleRemoveClick() {
emit(this, 'sl-remove');
2021-02-26 14:09:13 +00:00
}
render() {
return html`
<span
part="base"
class=${classMap({
tag: true,
// Types
2021-12-13 22:38:40 +00:00
'tag--primary': this.variant === 'primary',
'tag--success': this.variant === 'success',
'tag--neutral': this.variant === 'neutral',
'tag--warning': this.variant === 'warning',
'tag--danger': this.variant === 'danger',
'tag--text': this.variant === 'text',
2021-02-26 14:09:13 +00:00
// Sizes
'tag--small': this.size === 'small',
'tag--medium': this.size === 'medium',
'tag--large': this.size === 'large',
2022-01-01 01:39:16 +00:00
// Modifiers
2021-02-26 14:09:13 +00:00
'tag--pill': this.pill,
2021-10-07 13:52:23 +00:00
'tag--removable': this.removable
2021-02-26 14:09:13 +00:00
})}
>
<span part="content" class="tag__content">
2021-03-06 17:01:39 +00:00
<slot></slot>
2021-02-26 14:09:13 +00:00
</span>
2021-10-07 13:52:23 +00:00
${this.removable
2021-02-26 14:09:13 +00:00
? html`
<sl-icon-button
2021-10-07 13:52:23 +00:00
exportparts="base:remove-button"
2021-02-26 14:09:13 +00:00
name="x"
library="system"
2021-10-07 13:52:23 +00:00
class="tag__remove"
@click=${this.handleRemoveClick}
2021-03-06 17:01:39 +00:00
></sl-icon-button>
2021-02-26 14:09:13 +00:00
`
: ''}
</span>
`;
}
}
2021-03-12 14:09:08 +00:00
declare global {
interface HTMLElementTagNameMap {
'sl-tag': SlTag;
}
}