@trimble-oss/moduswebcomponents
Version:
Modus Web Components is a modern, accessible UI library built with Stencil JS that provides reusable web components following Trimble's Modus design system. This updated version focuses on improved flexibility, enhanced theming options, comprehensive cust
114 lines (109 loc) • 8.94 kB
JavaScript
import { p as proxyCustomElement, H, e as createEvent, h, c as Host } from './p-BMvVSi6Y.js';
import { i as inheritAriaAttributes } from './p-COxr4v9W.js';
import { d as defineCustomElement$1 } from './p-C8YB6DYg.js';
const convertPropsToClasses = ({ bordered, disabled, selected, focused, size, }) => {
let classes = '';
if (bordered) {
classes = `${classes} modus-wc-menu-item-bordered`;
}
if (disabled) {
classes = `${classes} modus-wc-menu-item-disabled`;
}
if (selected) {
classes = `${classes} modus-wc-menu-item-selected`;
}
if (focused) {
classes = `${classes} modus-wc-menu-item-focused`;
}
if (size) {
classes = `${classes} modus-wc-menu-item-${size}`;
}
return classes.trim();
};
const modusWcMenuItemCss = "modus-wc-menu-item .modus-wc-menu-item button{display:flex;width:100%}modus-wc-menu-item .modus-wc-menu-item button .modus-wc-menu-item-content{display:flex;width:100%}modus-wc-menu-item .modus-wc-menu-item button .modus-wc-menu-item-content [slot=start-icon]{padding-inline-end:var(--modus-wc-spacing-lg)}modus-wc-menu-item .modus-wc-menu-item button .modus-wc-menu-item-content .modus-wc-menu-item-labels{padding-inline-end:var(--modus-wc-spacing-md)}modus-wc-menu-item .modus-wc-menu-item button .modus-wc-menu-item-content .modus-wc-menu-item-sublabel{font-size:var(--modus-wc-font-size-sm)}modus-wc-menu-item .modus-wc-menu-item button .modus-wc-menu-item-content .modus-wc-menu-item-selected-icon{margin-left:auto}modus-wc-menu-item .modus-wc-menu-item button:where(.modus-wc-menu li:not(.modus-wc-menu-title,.modus-wc-disabled)>:not(ul,details,.modus-wc-menu-title)):not(summary,.modus-wc-active,.modus-wc-btn):focus{border-radius:inherit;color:var(--modus-wc-color-primary-content)}modus-wc-menu-item .modus-wc-menu-item button:where(.modus-wc-menu li:not(.modus-wc-menu-title,.modus-wc-disabled .modus-wc-menu-item-selected)>:not(ul,details,.modus-wc-menu-title)):not(summary,.modus-wc-active,.modus-wc-btn):focus{color:var(--modus-wc-color-primary)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-bordered{border-bottom:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-base-100);border-radius:0;border-top:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-base-100)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-selected{background-color:var(--modus-wc-color-primary);border-radius:inherit;color:var(--modus-wc-color-primary-content)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-disabled{color:var(--modus-wc-color-gray-2)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-disabled button{pointer-events:none}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-sm button{font-size:var(--modus-wc-font-size-sm)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-sm button .modus-wc-menu-item-sublabel{font-size:var(--modus-wc-font-size-xs)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-md button{font-size:var(--modus-wc-font-size-md)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-md button .modus-wc-menu-item-sublabel{font-size:var(--modus-wc-font-size-sm)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-lg button{font-size:var(--modus-wc-font-size-lg)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-lg button .modus-wc-menu-item-sublabel{font-size:var(--modus-wc-font-size-md)}modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-selected>button:focus{color:var(--modus-wc-color-base-content)}[data-theme=modus-classic-light] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-disabled{color:var(--modus-wc-color-gray-2)}[data-theme=modus-classic-light] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-selected{background-color:var(--modus-wc-color-blue-pale);color:var(--modus-wc-color-gray-10)}[data-theme=modus-classic-light] modus-wc-menu-item .modus-wc-menu-item:hover{background-color:var(--modus-wc-color-gray-0)}[data-theme=modus-classic-light] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-focused{background-color:var(--modus-wc-color-gray-0)}[data-theme=modus-classic-light] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-bordered{border-bottom:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-gray-9);border-top:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-gray-9)}[data-theme=modus-classic-dark] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-disabled{color:var(--modus-wc-color-gray-6)}[data-theme=modus-classic-dark] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-selected{background-color:rgba(1, 154, 235, 0.3019607843);background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-white)}[data-theme=modus-classic-dark] modus-wc-menu-item .modus-wc-menu-item:hover{background-color:var(--modus-wc-color-gray-8)}[data-theme=modus-classic-dark] modus-wc-menu-item .modus-wc-menu-item.modus-wc-menu-item-focused{background-color:var(--modus-wc-color-gray-8)}";
const ModusWcMenuItem = /*@__PURE__*/ proxyCustomElement(class ModusWcMenuItem extends H {
constructor() {
super();
this.__registerHost();
this.itemSelect = createEvent(this, "itemSelect");
this.inheritedAttributes = {};
/** Custom CSS class to apply to the li element. */
this.customClass = '';
/** The text rendered in the menu item. */
this.label = '';
/** The size of the menu item. */
this.size = 'md';
/** The unique identifying value of the menu item. */
this.value = '';
this.handleItemSelect = () => {
this.itemSelect.emit({ value: this.value });
};
}
componentWillLoad() {
this.inheritedAttributes = inheritAriaAttributes(this.el);
}
getClasses() {
const classList = ['modus-wc-menu-item'];
const propClasses = convertPropsToClasses({
bordered: this.bordered,
disabled: this.disabled,
selected: this.selected,
focused: this.focused,
size: this.size,
});
// The order CSS classes are added matters to CSS specificity
if (propClasses)
classList.push(propClasses);
if (this.customClass)
classList.push(this.customClass);
return classList.join(' ');
}
getIconSize() {
switch (this.size) {
case 'sm':
return 'xs';
case 'md':
return 'sm';
case 'lg':
return 'md';
// istanbul ignore next (unreachable code)
default:
return 'sm';
}
}
render() {
return (h(Host, { key: 'fd719f2305c5110988bbd90a779bfa66d7323e4a' }, h("li", Object.assign({ key: 'be5c04c09a01bf280dd64741838c70bf45f2bd21', "aria-current": this.selected, "aria-disabled": this.disabled, class: this.getClasses(), role: "menuitem" }, this.inheritedAttributes), h("button", { key: '4835f6eb563f33dc6002455e59b24896d198dea1', disabled: this.disabled, onClick: this.handleItemSelect, type: "button" }, h("div", { key: '5f623d94f11bd93dd767e0a91eff68c44e7217bf', class: "modus-wc-menu-item-content" }, h("slot", { key: 'ab0bc22f29b5a78e10abef45a457b2101ceb501a', name: "start-icon" }), h("div", { key: '5a7e8e354f9ad4ca0b7e2f511b1183b458d1a7aa', class: "modus-wc-menu-item-labels" }, h("div", { key: '841d492cd5b76ffd7bafe82775fae7d3b7c55ce2' }, this.label), this.subLabel && (h("div", { key: 'f562ff5113884e0941f3acdc4620842ec4fca3a0', class: "modus-wc-menu-item-sublabel" }, this.subLabel))), this.selected && (h("div", { key: 'e895a43b61059cd52df441c537ae4fd3c582daad', class: "modus-wc-menu-item-selected-icon" }, h("modus-wc-icon", { key: 'ec073d37b00c479ada6c7bd0a6a7fe9199d5b9ac', decorative: true, name: "check", size: this.getIconSize() }))))))));
}
get el() { return this; }
static get style() { return modusWcMenuItemCss; }
}, [4, "modus-wc-menu-item", {
"bordered": [4],
"customClass": [1, "custom-class"],
"disabled": [4],
"label": [1],
"startIcon": [1, "start-icon"],
"selected": [4],
"focused": [4],
"size": [1],
"subLabel": [1, "sub-label"],
"value": [1]
}]);
function defineCustomElement() {
if (typeof customElements === "undefined") {
return;
}
const components = ["modus-wc-menu-item", "modus-wc-icon"];
components.forEach(tagName => { switch (tagName) {
case "modus-wc-menu-item":
if (!customElements.get(tagName)) {
customElements.define(tagName, ModusWcMenuItem);
}
break;
case "modus-wc-icon":
if (!customElements.get(tagName)) {
defineCustomElement$1();
}
break;
} });
}
export { ModusWcMenuItem as M, defineCustomElement as d };