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.BBAKUU3L.js
2024-01-30 10:59:28 -05:00

396 lines
12 KiB
JavaScript

import {
drawer_styles_default
} from "./chunk.YTM7ZJIT.js";
import {
Modal
} from "./chunk.JEBKOPXW.js";
import {
lockBodyScrolling,
unlockBodyScrolling
} from "./chunk.RK73WSZS.js";
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 {
o
} from "./chunk.2URMUHDY.js";
import {
HasSlotController
} from "./chunk.NYIIDP5N.js";
import {
e
} from "./chunk.UZVKBFXH.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/internal/string.ts
function uppercaseFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
// src/components/drawer/drawer.component.ts
var SlDrawer = class extends ShoelaceElement {
constructor() {
super(...arguments);
this.hasSlotController = new HasSlotController(this, "footer");
this.localize = new LocalizeController(this);
this.modal = new Modal(this);
this.open = false;
this.label = "";
this.placement = "end";
this.contained = false;
this.noHeader = false;
this.handleDocumentKeyDown = (event) => {
if (this.contained) {
return;
}
if (event.key === "Escape" && this.modal.isActive() && this.open) {
event.stopImmediatePropagation();
this.requestClose("keyboard");
}
};
}
firstUpdated() {
this.drawer.hidden = !this.open;
if (this.open) {
this.addOpenListeners();
if (!this.contained) {
this.modal.activate();
lockBodyScrolling(this);
}
}
}
disconnectedCallback() {
var _a;
super.disconnectedCallback();
unlockBodyScrolling(this);
(_a = this.closeWatcher) == null ? void 0 : _a.destroy();
}
requestClose(source) {
const slRequestClose = this.emit("sl-request-close", {
cancelable: true,
detail: { source }
});
if (slRequestClose.defaultPrevented) {
const animation = getAnimation(this, "drawer.denyClose", { dir: this.localize.dir() });
animateTo(this.panel, animation.keyframes, animation.options);
return;
}
this.hide();
}
addOpenListeners() {
var _a;
if ("CloseWatcher" in window) {
(_a = this.closeWatcher) == null ? void 0 : _a.destroy();
if (!this.contained) {
this.closeWatcher = new CloseWatcher();
this.closeWatcher.onclose = () => this.requestClose("keyboard");
}
} else {
document.addEventListener("keydown", this.handleDocumentKeyDown);
}
}
removeOpenListeners() {
var _a;
document.removeEventListener("keydown", this.handleDocumentKeyDown);
(_a = this.closeWatcher) == null ? void 0 : _a.destroy();
}
async handleOpenChange() {
if (this.open) {
this.emit("sl-show");
this.addOpenListeners();
this.originalTrigger = document.activeElement;
if (!this.contained) {
this.modal.activate();
lockBodyScrolling(this);
}
const autoFocusTarget = this.querySelector("[autofocus]");
if (autoFocusTarget) {
autoFocusTarget.removeAttribute("autofocus");
}
await Promise.all([stopAnimations(this.drawer), stopAnimations(this.overlay)]);
this.drawer.hidden = false;
requestAnimationFrame(() => {
const slInitialFocus = this.emit("sl-initial-focus", { cancelable: true });
if (!slInitialFocus.defaultPrevented) {
if (autoFocusTarget) {
autoFocusTarget.focus({ preventScroll: true });
} else {
this.panel.focus({ preventScroll: true });
}
}
if (autoFocusTarget) {
autoFocusTarget.setAttribute("autofocus", "");
}
});
const panelAnimation = getAnimation(this, `drawer.show${uppercaseFirstLetter(this.placement)}`, {
dir: this.localize.dir()
});
const overlayAnimation = getAnimation(this, "drawer.overlay.show", { dir: this.localize.dir() });
await Promise.all([
animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),
animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)
]);
this.emit("sl-after-show");
} else {
this.emit("sl-hide");
this.removeOpenListeners();
if (!this.contained) {
this.modal.deactivate();
unlockBodyScrolling(this);
}
await Promise.all([stopAnimations(this.drawer), stopAnimations(this.overlay)]);
const panelAnimation = getAnimation(this, `drawer.hide${uppercaseFirstLetter(this.placement)}`, {
dir: this.localize.dir()
});
const overlayAnimation = getAnimation(this, "drawer.overlay.hide", { dir: this.localize.dir() });
await Promise.all([
animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {
this.overlay.hidden = true;
}),
animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {
this.panel.hidden = true;
})
]);
this.drawer.hidden = true;
this.overlay.hidden = false;
this.panel.hidden = false;
const trigger = this.originalTrigger;
if (typeof (trigger == null ? void 0 : trigger.focus) === "function") {
setTimeout(() => trigger.focus());
}
this.emit("sl-after-hide");
}
}
handleNoModalChange() {
if (this.open && !this.contained) {
this.modal.activate();
lockBodyScrolling(this);
}
if (this.open && this.contained) {
this.modal.deactivate();
unlockBodyScrolling(this);
}
}
/** Shows the drawer. */
async show() {
if (this.open) {
return void 0;
}
this.open = true;
return waitForEvent(this, "sl-after-show");
}
/** Hides the drawer */
async hide() {
if (!this.open) {
return void 0;
}
this.open = false;
return waitForEvent(this, "sl-after-hide");
}
render() {
return x`
<div
part="base"
class=${e({
drawer: true,
"drawer--open": this.open,
"drawer--top": this.placement === "top",
"drawer--end": this.placement === "end",
"drawer--bottom": this.placement === "bottom",
"drawer--start": this.placement === "start",
"drawer--contained": this.contained,
"drawer--fixed": !this.contained,
"drawer--rtl": this.localize.dir() === "rtl",
"drawer--has-footer": this.hasSlotController.test("footer")
})}
>
<div part="overlay" class="drawer__overlay" @click=${() => this.requestClose("overlay")} tabindex="-1"></div>
<div
part="panel"
class="drawer__panel"
role="dialog"
aria-modal="true"
aria-hidden=${this.open ? "false" : "true"}
aria-label=${o(this.noHeader ? this.label : void 0)}
aria-labelledby=${o(!this.noHeader ? "title" : void 0)}
tabindex="0"
>
${!this.noHeader ? x`
<header part="header" class="drawer__header">
<h2 part="title" class="drawer__title" id="title">
<!-- If there's no label, use an invisible character to prevent the header from collapsing -->
<slot name="label"> ${this.label.length > 0 ? this.label : String.fromCharCode(65279)} </slot>
</h2>
<div part="header-actions" class="drawer__header-actions">
<slot name="header-actions"></slot>
<sl-icon-button
part="close-button"
exportparts="base:close-button__base"
class="drawer__close"
name="x-lg"
label=${this.localize.term("close")}
library="system"
@click=${() => this.requestClose("close-button")}
></sl-icon-button>
</div>
</header>
` : ""}
<slot part="body" class="drawer__body"></slot>
<footer part="footer" class="drawer__footer">
<slot name="footer"></slot>
</footer>
</div>
</div>
`;
}
};
SlDrawer.styles = drawer_styles_default;
SlDrawer.dependencies = { "sl-icon-button": SlIconButton };
__decorateClass([
e2(".drawer")
], SlDrawer.prototype, "drawer", 2);
__decorateClass([
e2(".drawer__panel")
], SlDrawer.prototype, "panel", 2);
__decorateClass([
e2(".drawer__overlay")
], SlDrawer.prototype, "overlay", 2);
__decorateClass([
n({ type: Boolean, reflect: true })
], SlDrawer.prototype, "open", 2);
__decorateClass([
n({ reflect: true })
], SlDrawer.prototype, "label", 2);
__decorateClass([
n({ reflect: true })
], SlDrawer.prototype, "placement", 2);
__decorateClass([
n({ type: Boolean, reflect: true })
], SlDrawer.prototype, "contained", 2);
__decorateClass([
n({ attribute: "no-header", type: Boolean, reflect: true })
], SlDrawer.prototype, "noHeader", 2);
__decorateClass([
watch("open", { waitUntilFirstUpdate: true })
], SlDrawer.prototype, "handleOpenChange", 1);
__decorateClass([
watch("contained", { waitUntilFirstUpdate: true })
], SlDrawer.prototype, "handleNoModalChange", 1);
setDefaultAnimation("drawer.showTop", {
keyframes: [
{ opacity: 0, translate: "0 -100%" },
{ opacity: 1, translate: "0 0" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.hideTop", {
keyframes: [
{ opacity: 1, translate: "0 0" },
{ opacity: 0, translate: "0 -100%" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.showEnd", {
keyframes: [
{ opacity: 0, translate: "100%" },
{ opacity: 1, translate: "0" }
],
rtlKeyframes: [
{ opacity: 0, translate: "-100%" },
{ opacity: 1, translate: "0" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.hideEnd", {
keyframes: [
{ opacity: 1, translate: "0" },
{ opacity: 0, translate: "100%" }
],
rtlKeyframes: [
{ opacity: 1, translate: "0" },
{ opacity: 0, translate: "-100%" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.showBottom", {
keyframes: [
{ opacity: 0, translate: "0 100%" },
{ opacity: 1, translate: "0 0" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.hideBottom", {
keyframes: [
{ opacity: 1, translate: "0 0" },
{ opacity: 0, translate: "0 100%" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.showStart", {
keyframes: [
{ opacity: 0, translate: "-100%" },
{ opacity: 1, translate: "0" }
],
rtlKeyframes: [
{ opacity: 0, translate: "100%" },
{ opacity: 1, translate: "0" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.hideStart", {
keyframes: [
{ opacity: 1, translate: "0" },
{ opacity: 0, translate: "-100%" }
],
rtlKeyframes: [
{ opacity: 1, translate: "0" },
{ opacity: 0, translate: "100%" }
],
options: { duration: 250, easing: "ease" }
});
setDefaultAnimation("drawer.denyClose", {
keyframes: [{ scale: 1 }, { scale: 1.01 }, { scale: 1 }],
options: { duration: 250 }
});
setDefaultAnimation("drawer.overlay.show", {
keyframes: [{ opacity: 0 }, { opacity: 1 }],
options: { duration: 250 }
});
setDefaultAnimation("drawer.overlay.hide", {
keyframes: [{ opacity: 1 }, { opacity: 0 }],
options: { duration: 250 }
});
export {
SlDrawer
};