Archived
Template
1
Fork 0
This repository has been archived on 2024-09-04. You can view files and clone it, but cannot push or open issues or pull requests.
Contour/public/@shoelace-style/shoelace/cdn/chunks/chunk.57JYVWPO.js

220 lines
5.8 KiB
JavaScript
Raw Normal View History

2024-01-30 10:59:28 -05:00
import {
SlIconButton
} from "./chunk.Y77CZW56.js";
import {
getAnimation,
setDefaultAnimation
} from "./chunk.RCZVQXWP.js";
import {
waitForEvent
} from "./chunk.B4BZKR24.js";
import {
animateTo,
stopAnimations
} from "./chunk.S7GYYU7Z.js";
import {
LocalizeController
} from "./chunk.NH3SRVOC.js";
import {
HasSlotController
} from "./chunk.NYIIDP5N.js";
import {
e
} from "./chunk.UZVKBFXH.js";
import {
alert_styles_default
} from "./chunk.23G5LPSS.js";
import {
watch
} from "./chunk.FA5RT4K4.js";
import {
ShoelaceElement,
e as e2,
n
} from "./chunk.SEXBCYCU.js";
import {
x
} from "./chunk.CXZZ2LVK.js";
import {
__decorateClass
} from "./chunk.KIILAQWQ.js";
// src/components/alert/alert.component.ts
var toastStack = Object.assign(document.createElement("div"), { className: "sl-toast-stack" });
var SlAlert = class extends ShoelaceElement {
constructor() {
super(...arguments);
this.hasSlotController = new HasSlotController(this, "icon", "suffix");
this.localize = new LocalizeController(this);
this.open = false;
this.closable = false;
this.variant = "primary";
this.duration = Infinity;
}
firstUpdated() {
this.base.hidden = !this.open;
}
restartAutoHide() {
clearTimeout(this.autoHideTimeout);
if (this.open && this.duration < Infinity) {
this.autoHideTimeout = window.setTimeout(() => this.hide(), this.duration);
}
}
handleCloseClick() {
this.hide();
}
handleMouseMove() {
this.restartAutoHide();
}
async handleOpenChange() {
if (this.open) {
this.emit("sl-show");
if (this.duration < Infinity) {
this.restartAutoHide();
}
await stopAnimations(this.base);
this.base.hidden = false;
const { keyframes, options } = getAnimation(this, "alert.show", { dir: this.localize.dir() });
await animateTo(this.base, keyframes, options);
this.emit("sl-after-show");
} else {
this.emit("sl-hide");
clearTimeout(this.autoHideTimeout);
await stopAnimations(this.base);
const { keyframes, options } = getAnimation(this, "alert.hide", { dir: this.localize.dir() });
await animateTo(this.base, keyframes, options);
this.base.hidden = true;
this.emit("sl-after-hide");
}
}
handleDurationChange() {
this.restartAutoHide();
}
/** Shows the alert. */
async show() {
if (this.open) {
return void 0;
}
this.open = true;
return waitForEvent(this, "sl-after-show");
}
/** Hides the alert */
async hide() {
if (!this.open) {
return void 0;
}
this.open = false;
return waitForEvent(this, "sl-after-hide");
}
/**
* Displays the alert as a toast notification. This will move the alert out of its position in the DOM and, when
* dismissed, it will be removed from the DOM completely. By storing a reference to the alert, you can reuse it by
* calling this method again. The returned promise will resolve after the alert is hidden.
*/
async toast() {
return new Promise((resolve) => {
if (toastStack.parentElement === null) {
document.body.append(toastStack);
}
toastStack.appendChild(this);
requestAnimationFrame(() => {
this.clientWidth;
this.show();
});
this.addEventListener(
"sl-after-hide",
() => {
toastStack.removeChild(this);
resolve();
if (toastStack.querySelector("sl-alert") === null) {
toastStack.remove();
}
},
{ once: true }
);
});
}
render() {
return x`
<div
part="base"
class=${e({
alert: true,
"alert--open": this.open,
"alert--closable": this.closable,
"alert--has-icon": this.hasSlotController.test("icon"),
"alert--primary": this.variant === "primary",
"alert--success": this.variant === "success",
"alert--neutral": this.variant === "neutral",
"alert--warning": this.variant === "warning",
"alert--danger": this.variant === "danger"
})}
role="alert"
aria-hidden=${this.open ? "false" : "true"}
@mousemove=${this.handleMouseMove}
>
<div part="icon" class="alert__icon">
<slot name="icon"></slot>
</div>
<div part="message" class="alert__message" aria-live="polite">
<slot></slot>
</div>
${this.closable ? x`
<sl-icon-button
part="close-button"
exportparts="base:close-button__base"
class="alert__close-button"
name="x-lg"
library="system"
label=${this.localize.term("close")}
@click=${this.handleCloseClick}
></sl-icon-button>
` : ""}
</div>
`;
}
};
SlAlert.styles = alert_styles_default;
SlAlert.dependencies = { "sl-icon-button": SlIconButton };
__decorateClass([
e2('[part~="base"]')
], SlAlert.prototype, "base", 2);
__decorateClass([
n({ type: Boolean, reflect: true })
], SlAlert.prototype, "open", 2);
__decorateClass([
n({ type: Boolean, reflect: true })
], SlAlert.prototype, "closable", 2);
__decorateClass([
n({ reflect: true })
], SlAlert.prototype, "variant", 2);
__decorateClass([
n({ type: Number })
], SlAlert.prototype, "duration", 2);
__decorateClass([
watch("open", { waitUntilFirstUpdate: true })
], SlAlert.prototype, "handleOpenChange", 1);
__decorateClass([
watch("duration")
], SlAlert.prototype, "handleDurationChange", 1);
setDefaultAnimation("alert.show", {
keyframes: [
{ opacity: 0, scale: 0.8 },
{ opacity: 1, scale: 1 }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("alert.hide", {
keyframes: [
{ opacity: 1, scale: 1 },
{ opacity: 0, scale: 0.8 }
],
options: { duration: 250, easing: "ease" }
});
export {
SlAlert
};