type AlertButtonStyle = 'default' | 'contrast' | 'neutral' | 'info' | 'warning' | 'danger' | 'success' const getColorsForNormalVariant = (style: AlertButtonStyle) => { switch (style) { case 'default': return 'bg-default text-text' case 'contrast': return 'bg-default text-contrast' case 'neutral': return 'bg-default text-neutral' case 'info': return 'bg-default text-info' case 'warning': return 'bg-default text-warning' case 'danger': return 'bg-default text-danger' case 'success': return 'bg-default text-success' } } const getColorsForPrimaryVariant = (style: AlertButtonStyle) => { switch (style) { case 'default': return 'bg-default text-foreground' case 'contrast': return 'bg-contrast text-text' case 'neutral': return 'bg-neutral text-neutral-contrast' case 'info': return 'bg-info text-info-contrast' case 'warning': return 'bg-warning text-warning-contrast' case 'danger': return 'bg-danger text-danger-contrast' case 'success': return 'bg-success text-success-contrast' } } type AlertButton = { text: string style: AlertButtonStyle action: () => void primary?: boolean } export class SKAlert { private title?: string private text: string private buttons: AlertButton[] private element!: HTMLDivElement private onElement!: HTMLElement constructor({ title, text, buttons }: { title?: string; text: string; buttons?: AlertButton[] }) { this.title = title this.text = text this.buttons = buttons || [] } buttonsString() { const genButton = function (buttonDesc: AlertButton, index: number) { return ` ` } const buttonString = this.buttons .map(function (buttonDesc, index) { return genButton(buttonDesc, index) }) .join('') const str = `
${buttonString}
` return str } templateString() { let buttonsTemplate: string let panelStyle: string if (this.buttons) { buttonsTemplate = `
${this.buttonsString()}
` panelStyle = '' } else { buttonsTemplate = '' panelStyle = 'style="padding-bottom: 8px"' } const titleTemplate = this.title ? `
${this.title}
` : '' const messageTemplate = this.text ? `

${this.text}

` : '' const template = `
${titleTemplate}
${messageTemplate}
${buttonsTemplate}
` return template } dismiss() { this.onElement.removeChild(this.element) } primaryButton() { let primary = this.buttons.find((button) => button.primary === true) if (!primary) { primary = this.buttons[this.buttons.length - 1] } return primary } present(onElement?: HTMLElement) { if (!onElement) { onElement = document.body } this.onElement = onElement this.element = document.createElement('div') this.element.className = 'sn-component' this.element.innerHTML = this.templateString().trim() onElement.appendChild(this.element) if (this.buttons && this.buttons.length) { this.buttons.forEach((buttonDesc, index) => { const buttonElem = this.element.querySelector(`#button-${index}`) as HTMLButtonElement buttonElem.onclick = () => { buttonDesc.action && buttonDesc.action() this.dismiss() } if (index === 0) { buttonElem.focus() } }) } const closeButton = this.element.querySelector('#close-button') if (closeButton) { closeButton.onclick = () => { this.dismiss() } } } }