11import { LitElement , html , css , nothing } from 'lit' ;
22import { customElement , property } from 'lit/decorators.js' ;
33
4+ interface ShowOptions {
5+ /** The duration the toast is displayed for, in milliseconds. */
6+ duration ?: number ;
7+
8+ /** The color of the button. */
9+ color ?: string ;
10+ }
11+
412/**
513 * @class Toast
614 *
@@ -13,7 +21,9 @@ import { customElement, property } from 'lit/decorators.js';
1321@customElement ( 'wc-toast' )
1422export class Toast extends LitElement {
1523 @property ( { type : Boolean } ) visible : boolean = false ;
24+ @property ( { type : Number } ) duration : number = 3000 ;
1625 @property ( { type : String } ) color ?: string ;
26+ #timer: number | null = null ;
1727
1828 render ( ) {
1929 return html `
@@ -23,34 +33,88 @@ export class Toast extends LitElement {
2333 ` ;
2434 }
2535
36+ show ( message : string , opts = { } as ShowOptions ) {
37+ this . visible = true ;
38+ this . textContent = message ;
39+ this . color = opts . color || 'primary' ;
40+
41+ // Cancel any existing timer
42+ if ( this . #timer) {
43+ clearTimeout ( this . #timer) ;
44+ }
45+ // Set a new timer
46+ this . #timer = setTimeout ( ( ) => {
47+ this . visible = false ;
48+ this . #timer = null ;
49+ } , opts . duration || this . duration ) ;
50+ }
51+
2652 static get styles ( ) {
2753 return css `
2854 : host {
2955 position: fixed;
3056 z- index: 1000;
3157 right: 0;
3258 botto m: 0;
33-
34- margin: var(- - to ast- margin);
35- background- color : var(- - to ast- background- color );
36- text- color : var(- - to ast- text- color );
3759 }
3860
3961 : host div {
62+ dis play: inline-flex;
63+ margin: var(- - to ast- margin);
64+ padding: var(- - to ast- padding);
65+ bor der: var(- - to ast- bor der);
66+ bor der- radius: var(- - to ast- bor der- radius);
4067 transition: vis ibility 0.2s, opacity 0.2s ease- in- out;
68+ cursor : pointer;
69+ user- select: none;
4170
4271 & .visible {
43- display : block;
4472 visibility : visible;
4573 opacity : 1 ;
4674 }
4775
4876 & : not (.visible ) {
49- display : none;
5077 visibility : hidden;
5178 opacity : 0 ;
5279 }
5380 }
81+
82+ div.color-primary {
83+ background-color : var (--primary-color );
84+ color : var (--primary-opp-color );
85+ }
86+ div .color-secondary {
87+ background-color : var (--secondary-color );
88+ color : var (--secondary-opp-color );
89+ }
90+ div .color-light {
91+ background-color : var (--light-color );
92+ color : var (--light-opp-color );
93+ }
94+ div .color-dark {
95+ background-color : var (--dark-color );
96+ color : var (--dark-opp-color );
97+ }
98+ div .color-white {
99+ background-color : var (--white-color );
100+ color : var (--white-opp-color );
101+ }
102+ div .color-black {
103+ background-color : var (--black-color );
104+ color : var (--black-opp-color );
105+ }
106+ div .color-success {
107+ background-color : var (--success-color );
108+ color : var (--success-opp-color );
109+ }
110+ div .color-warning {
111+ background-color : var (--warning-color );
112+ color : var (--warning-opp-color );
113+ }
114+ div .color-error {
115+ background-color : var (--error-color );
116+ color : var (--error-opp-color );
117+ }
54118 ` ;
55119 }
56120
0 commit comments