UNPKG

@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

261 lines (250 loc) 22 kB
import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-D5XAQERj.js'; import { i as inheritAriaAttributes, a as inheritAttributes } from './utils-kl4W0gOo.js'; import { C as CloseSolidIcon } from './close-solid.icon-Bzpm7Hts.js'; import { S as SearchSolidIcon } from './search-solid.icon-DVWRIUR2.js'; const convertPropsToClasses$2 = ({ bordered, orientation, size, }) => { let classes = ''; if (bordered) { classes = `${classes} modus-wc-menu--bordered`; } if (orientation === 'horizontal') { classes = `${classes} modus-wc-menu-horizontal`; } if (size) { classes = `${classes} modus-wc-menu-${size}`; } return classes.trim(); }; const modusWcMenuCss = "modus-wc-menu .modus-wc-menu{border-radius:var(--modus-wc-border-radius-md);list-style:none;margin:0;padding:0;padding-inline-start:0}modus-wc-menu .modus-wc-menu.modus-wc-menu--bordered{border:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-gray-0)}[data-theme=modus-classic-light] modus-wc-menu .modus-wc-menu,[data-theme=modus-modern-light] modus-wc-menu .modus-wc-menu{background-color:var(--modus-wc-color-white);border-color:var(--modus-wc-color-gray-0)}[data-theme=modus-classic-dark] modus-wc-menu .modus-wc-menu,[data-theme=modus-modern-dark] modus-wc-menu .modus-wc-menu{background-color:var(--modus-wc-color-black);border-color:var(--modus-wc-color-gray-8)}"; const ModusWcMenu = class { constructor(hostRef) { registerInstance(this, hostRef); this.menuFocusout = createEvent(this, "menuFocusout"); this.inheritedAttributes = {}; /** Custom CSS class to apply to the ul element. */ this.customClass = ''; /** The orientation of the menu. */ this.orientation = 'vertical'; /** The size of the menu. */ this.size = 'md'; this.handleFocusout = (e) => { // Check if the new focus target is still within this menu if (!this.el.contains(e.relatedTarget)) { // Focus has left the menu entirely this.menuFocusout.emit(e); } }; this.getMenuRole = () => this.orientation === 'horizontal' ? 'menubar' : 'menu'; } componentWillLoad() { if (!this.el.ariaLabel) { this.el.ariaLabel = 'Menu'; } this.inheritedAttributes = inheritAriaAttributes(this.el); } getClasses() { const classList = ['modus-wc-menu modus-wc-w-full']; const propClasses = convertPropsToClasses$2({ bordered: this.bordered, orientation: this.orientation, 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(' '); } render() { return (h(Host, { key: 'a966dcdb4ee793f76ed1b4d768a10feac67b4348' }, h("ul", Object.assign({ key: '10ea9a00e23bf2e1123ba2ceef274f4bf5ad0bee', "aria-orientation": this.orientation, class: this.getClasses(), onFocusout: this.handleFocusout, role: this.getMenuRole() }, this.inheritedAttributes), h("slot", { key: 'cae15f842402b499d55d4ba4933ac242a35369a4' })))); } get el() { return getElement(this); } }; ModusWcMenu.style = modusWcMenuCss; const convertPropsToClasses$1 = ({ 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 = class { constructor(hostRef) { registerInstance(this, hostRef); 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$1({ 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 getElement(this); } }; ModusWcMenuItem.style = modusWcMenuItemCss; const convertPropsToClasses = ({ bordered, disabled, feedback, readOnly, size, }) => { let classes = ''; if (bordered) { classes = `${classes} modus-wc-input-bordered`; } if (disabled) { classes = `${classes} modus-wc-input-disabled`; } if (feedback) { classes = `${classes} modus-wc-input--${feedback.level}`; } if (readOnly) { classes = `${classes} modus-wc-text-input--readonly`; } if (size) { classes = `${classes} modus-wc-input-${size}`; } return classes.trim(); }; const modusWcTextInputCss = ".modus-wc-input--error{border-color:var(--modus-wc-color-error) !important}.modus-wc-input--info{border-color:var(--modus-wc-color-info) !important}.modus-wc-input--success{border-color:var(--modus-wc-color-success) !important}.modus-wc-input--warning{border-color:var(--modus-wc-color-warning) !important}modus-wc-text-input .modus-wc-input-label{padding-bottom:var(--modus-wc-spacing-sm)}modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-sm .modus-wc-text-input-icon{height:var(--modus-wc-line-height-sm);width:var(--modus-wc-line-height-sm)}modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-md .modus-wc-text-input-icon{height:var(--modus-wc-line-height-md);width:var(--modus-wc-line-height-md)}modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-lg .modus-wc-text-input-icon{height:var(--modus-wc-line-height-lg);width:var(--modus-wc-line-height-lg)}modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-text-input-icon.modus-wc-text-input-icon-clear{cursor:pointer}modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-clear-icon-container{align-items:center;display:flex;justify-content:center;min-width:var(--modus-wc-line-height-md)}modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-clear-icon-container.modus-wc-clear-icon-hidden{pointer-events:none;visibility:hidden}modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-clear-icon-container.modus-wc-clear-icon-visible{visibility:visible}modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-sm .modus-wc-clear-icon-container{min-width:var(--modus-wc-line-height-sm)}modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-lg .modus-wc-clear-icon-container{min-width:var(--modus-wc-line-height-lg)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input{border-radius:var(--modus-wc-border-radius-md)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-sm,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-sm{font-size:var(--modus-wc-font-size-sm);height:var(--modus-wc-input-height-sm);line-height:var(--modus-wc-line-height-sm);padding:var(--modus-wc-spacing-sm) var(--modus-wc-spacing-xs)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-md,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-md{font-size:var(--modus-wc-font-size-md);height:var(--modus-wc-input-height-md);line-height:var(--modus-wc-line-height-md);padding:var(--modus-wc-spacing-sm)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-lg,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-lg{font-size:var(--modus-wc-font-size-lg);height:var(--modus-wc-input-height-lg);line-height:var(--modus-wc-line-height-xl);padding:var(--modus-wc-spacing-md) var(--modus-wc-spacing-sm)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input:focus-within,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input:focus-within{border-width:var(--modus-wc-border-width-sm);box-shadow:none;outline:none}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-text-input-icon.modus-wc-text-input-icon-clear:focus:not(:focus-visible),[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-text-input-icon.modus-wc-text-input-icon-clear:focus:not(:focus-visible){outline:none}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-text-input--readonly,[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-text-input--readonly{background-color:var(--modus-wc-color-base-100)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-bordered:not(:disabled){border-color:var(--modus-wc-color-accent)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input.modus-wc-input-bordered:not(:disabled):focus-within{border-color:var(--modus-wc-color-blue-light)}[data-theme=modus-classic-light] modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-text-input-icon{color:var(--modus-wc-color-gray-8)}[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input .modus-wc-text-input-icon{color:var(--modus-wc-color-gray-2)}[data-theme=modus-classic-dark] modus-wc-text-input .modus-wc-text-input.modus-wc-input:focus-within{border-color:var(--modus-wc-color-highlight-blue)}"; const ModusWcTextInput = class { constructor(hostRef) { registerInstance(this, hostRef); this.inputBlur = createEvent(this, "inputBlur"); this.inputChange = createEvent(this, "inputChange"); this.inputFocus = createEvent(this, "inputFocus"); this.inheritedAttributes = {}; /** Indicates that the input should have a border. */ this.bordered = true; /** Aria label for the clear icon button. */ this.clearAriaLabel = 'Clear text'; /** Custom CSS class to apply to the input. */ this.customClass = ''; /** Whether the form control is disabled. */ this.disabled = false; /** Show the clear button within the input field. */ this.includeClear = false; /** Show the search icon within the input field. */ this.includeSearch = false; /** * Hints at the type of data that might be entered by the user while editing the element or its contents. * This allows a browser to display an appropriate virtual keyboard. */ this.inputMode = 'text'; /** Text that appears in the form control when it has no value set. */ this.placeholder = ''; /** Whether the value is editable. */ this.readOnly = false; /** A value is required for the form to be submittable. */ this.required = false; /** The size of the input. */ this.size = 'md'; /** Type of form control. */ this.type = 'text'; /** The value of the control. */ this.value = ''; this.handleBlur = (event) => { this.inputBlur.emit(event); }; this.handleClearText = (event) => { this.value = ''; this.inputChange.emit(event); }; this.handleFocus = (event) => { this.inputFocus.emit(event); }; this.handleInput = (event) => { this.value = event.target.value; this.inputChange.emit(event); }; } componentWillLoad() { if (!this.el.ariaLabel) { this.el.ariaLabel = this.placeholder || 'Text input'; } this.inheritedAttributes = Object.assign(Object.assign({}, inheritAriaAttributes(this.el)), inheritAttributes(this.el, ['spellcheck'])); } getClasses() { const classList = [ 'modus-wc-text-input', 'modus-wc-input', 'modus-wc-w-full', 'modus-wc-flex', 'modus-wc-items-center', 'modus-wc-gap-1', ]; const propClasses = convertPropsToClasses({ bordered: this.bordered, disabled: this.disabled, feedback: this.feedback, readOnly: this.readOnly, 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(' '); } shouldIncludeClear() { return (!!this.includeClear && !this.disabled && !this.readOnly && !!this.value); } render() { const showClear = this.shouldIncludeClear(); return (h(Host, { key: '67083501fce3d5d0ffc136c8ef9d5ecbc84bc89b' }, this.label && (h("modus-wc-input-label", { key: 'fc96bc443d4246620f5f1c85d046e6f4a7f50917', forId: this.inputId, labelText: this.label, required: this.required, size: this.size })), h("label", { key: '4f83b07d3847e0ae0a34c1c645d7c163bde2da92', class: this.getClasses() }, this.includeSearch && (h(SearchSolidIcon, { key: '3151ec9863d28fa62043ecbcb8cb40ecf69083bb', className: "modus-wc-text-input-icon modus-wc-text-input-icon-search" })), h("input", Object.assign({ key: '6a0b561925bbe100eec8d85bf94b66fc47183260', "aria-placeholder": this.placeholder, "aria-required": this.required, autocapitalize: this.autoCapitalize, autocomplete: this.autoComplete, autocorrect: this.autoCorrect, class: "modus-wc-grow", disabled: this.disabled, enterkeyhint: this.enterkeyhint, id: this.inputId, inputmode: this.inputMode, maxlength: this.maxLength, minlength: this.minLength, name: this.name, onBlur: this.handleBlur, onFocus: this.handleFocus, onInput: this.handleInput, pattern: this.pattern, placeholder: this.placeholder, readonly: this.readOnly, required: this.required, tabIndex: this.inputTabIndex, type: this.type, value: this.value }, this.inheritedAttributes)), this.includeClear && (h("div", { key: '340410881c6ff48765eb25000815c962da835550', class: `modus-wc-clear-icon-container ${showClear ? 'modus-wc-clear-icon-visible' : 'modus-wc-clear-icon-hidden'}` }, h(CloseSolidIcon, { key: 'e944f8a2dd0444ca6944bc57aec3f89497ae67fe', ariaLabel: this.clearAriaLabel, className: "modus-wc-text-input-icon modus-wc-text-input-icon-clear", decorative: false, onClear: this.handleClearText })))), this.feedback && (h("modus-wc-input-feedback", { key: '8825e88f6cbac14ad072c0988a05604426e1827b', level: this.feedback.level, message: this.feedback.message, size: this.size })))); } get el() { return getElement(this); } }; ModusWcTextInput.style = modusWcTextInputCss; export { ModusWcMenu as modus_wc_menu, ModusWcMenuItem as modus_wc_menu_item, ModusWcTextInput as modus_wc_text_input };