194 lines
5.5 KiB
JavaScript
194 lines
5.5 KiB
JavaScript
import {
|
|
menu_item_styles_default
|
|
} from "./chunk.M33MBZ7O.js";
|
|
import {
|
|
SubmenuController
|
|
} from "./chunk.OHV2QGLG.js";
|
|
import {
|
|
SlPopup
|
|
} from "./chunk.SJLA5ROP.js";
|
|
import {
|
|
SlSpinner
|
|
} from "./chunk.TEPHFVM5.js";
|
|
import {
|
|
LocalizeController
|
|
} from "./chunk.NH3SRVOC.js";
|
|
import {
|
|
HasSlotController,
|
|
getTextContent
|
|
} from "./chunk.NYIIDP5N.js";
|
|
import {
|
|
e
|
|
} from "./chunk.UZVKBFXH.js";
|
|
import {
|
|
SlIcon
|
|
} from "./chunk.UZYAV5H6.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/menu-item/menu-item.component.ts
|
|
var SlMenuItem = class extends ShoelaceElement {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.type = "normal";
|
|
this.checked = false;
|
|
this.value = "";
|
|
this.loading = false;
|
|
this.disabled = false;
|
|
this.localize = new LocalizeController(this);
|
|
this.hasSlotController = new HasSlotController(this, "submenu");
|
|
this.submenuController = new SubmenuController(this, this.hasSlotController, this.localize);
|
|
this.handleHostClick = (event) => {
|
|
if (this.disabled) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
};
|
|
this.handleMouseOver = (event) => {
|
|
this.focus();
|
|
event.stopPropagation();
|
|
};
|
|
}
|
|
connectedCallback() {
|
|
super.connectedCallback();
|
|
this.addEventListener("click", this.handleHostClick);
|
|
this.addEventListener("mouseover", this.handleMouseOver);
|
|
}
|
|
disconnectedCallback() {
|
|
super.disconnectedCallback();
|
|
this.removeEventListener("click", this.handleHostClick);
|
|
this.removeEventListener("mouseover", this.handleMouseOver);
|
|
}
|
|
handleDefaultSlotChange() {
|
|
const textLabel = this.getTextLabel();
|
|
if (typeof this.cachedTextLabel === "undefined") {
|
|
this.cachedTextLabel = textLabel;
|
|
return;
|
|
}
|
|
if (textLabel !== this.cachedTextLabel) {
|
|
this.cachedTextLabel = textLabel;
|
|
this.emit("slotchange", { bubbles: true, composed: false, cancelable: false });
|
|
}
|
|
}
|
|
handleCheckedChange() {
|
|
if (this.checked && this.type !== "checkbox") {
|
|
this.checked = false;
|
|
console.error('The checked attribute can only be used on menu items with type="checkbox"', this);
|
|
return;
|
|
}
|
|
if (this.type === "checkbox") {
|
|
this.setAttribute("aria-checked", this.checked ? "true" : "false");
|
|
} else {
|
|
this.removeAttribute("aria-checked");
|
|
}
|
|
}
|
|
handleDisabledChange() {
|
|
this.setAttribute("aria-disabled", this.disabled ? "true" : "false");
|
|
}
|
|
handleTypeChange() {
|
|
if (this.type === "checkbox") {
|
|
this.setAttribute("role", "menuitemcheckbox");
|
|
this.setAttribute("aria-checked", this.checked ? "true" : "false");
|
|
} else {
|
|
this.setAttribute("role", "menuitem");
|
|
this.removeAttribute("aria-checked");
|
|
}
|
|
}
|
|
/** Returns a text label based on the contents of the menu item's default slot. */
|
|
getTextLabel() {
|
|
return getTextContent(this.defaultSlot);
|
|
}
|
|
isSubmenu() {
|
|
return this.hasSlotController.test("submenu");
|
|
}
|
|
render() {
|
|
const isRtl = this.localize.dir() === "rtl";
|
|
const isSubmenuExpanded = this.submenuController.isExpanded();
|
|
return x`
|
|
<div
|
|
id="anchor"
|
|
part="base"
|
|
class=${e({
|
|
"menu-item": true,
|
|
"menu-item--rtl": isRtl,
|
|
"menu-item--checked": this.checked,
|
|
"menu-item--disabled": this.disabled,
|
|
"menu-item--loading": this.loading,
|
|
"menu-item--has-submenu": this.isSubmenu(),
|
|
"menu-item--submenu-expanded": isSubmenuExpanded
|
|
})}
|
|
?aria-haspopup="${this.isSubmenu()}"
|
|
?aria-expanded="${isSubmenuExpanded ? true : false}"
|
|
>
|
|
<span part="checked-icon" class="menu-item__check">
|
|
<sl-icon name="check" library="system" aria-hidden="true"></sl-icon>
|
|
</span>
|
|
|
|
<slot name="prefix" part="prefix" class="menu-item__prefix"></slot>
|
|
|
|
<slot part="label" class="menu-item__label" @slotchange=${this.handleDefaultSlotChange}></slot>
|
|
|
|
<slot name="suffix" part="suffix" class="menu-item__suffix"></slot>
|
|
|
|
<span part="submenu-icon" class="menu-item__chevron">
|
|
<sl-icon name=${isRtl ? "chevron-left" : "chevron-right"} library="system" aria-hidden="true"></sl-icon>
|
|
</span>
|
|
|
|
${this.submenuController.renderSubmenu()}
|
|
${this.loading ? x` <sl-spinner part="spinner" exportparts="base:spinner__base"></sl-spinner> ` : ""}
|
|
</div>
|
|
`;
|
|
}
|
|
};
|
|
SlMenuItem.styles = menu_item_styles_default;
|
|
SlMenuItem.dependencies = {
|
|
"sl-icon": SlIcon,
|
|
"sl-popup": SlPopup,
|
|
"sl-spinner": SlSpinner
|
|
};
|
|
__decorateClass([
|
|
e2("slot:not([name])")
|
|
], SlMenuItem.prototype, "defaultSlot", 2);
|
|
__decorateClass([
|
|
e2(".menu-item")
|
|
], SlMenuItem.prototype, "menuItem", 2);
|
|
__decorateClass([
|
|
n()
|
|
], SlMenuItem.prototype, "type", 2);
|
|
__decorateClass([
|
|
n({ type: Boolean, reflect: true })
|
|
], SlMenuItem.prototype, "checked", 2);
|
|
__decorateClass([
|
|
n()
|
|
], SlMenuItem.prototype, "value", 2);
|
|
__decorateClass([
|
|
n({ type: Boolean, reflect: true })
|
|
], SlMenuItem.prototype, "loading", 2);
|
|
__decorateClass([
|
|
n({ type: Boolean, reflect: true })
|
|
], SlMenuItem.prototype, "disabled", 2);
|
|
__decorateClass([
|
|
watch("checked")
|
|
], SlMenuItem.prototype, "handleCheckedChange", 1);
|
|
__decorateClass([
|
|
watch("disabled")
|
|
], SlMenuItem.prototype, "handleDisabledChange", 1);
|
|
__decorateClass([
|
|
watch("type")
|
|
], SlMenuItem.prototype, "handleTypeChange", 1);
|
|
|
|
export {
|
|
SlMenuItem
|
|
};
|