@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
178 lines (172 loc) • 18.5 kB
JavaScript
'use strict';
var index = require('./index-CtEGR9Z7.js');
var baseComponent = require('./base-component-Dx-Crsr_.js');
var utils = require('./utils-B2oo-h7a.js');
const convertPropsToClasses = ({ bordered, expanded, }) => {
let classes = '';
if (bordered) {
classes = `${classes} modus-wc-border`;
}
if (expanded) {
classes = `${classes} modus-wc-collapse-open`;
}
else {
classes = `${classes} modus-wc-collapse-close`;
}
return classes.trim();
};
const convertPropsToDescriptionDivClasses = ({ size, }) => {
let sizeClass = 'modus-wc-text-base';
if (size) {
sizeClass = `modus-wc-text-${size}`;
}
return sizeClass;
};
const convertPropsToTitleChildDivClasses = ({ size, }) => {
let classes = '';
if (size) {
switch (size) {
case 'xs':
classes = 'modus-wc-text-base';
break;
case 'sm':
classes = 'modus-wc-text-lg';
break;
case 'md':
classes = 'modus-wc-text-xl';
break;
case 'lg':
classes = 'modus-wc-text-2xl';
break;
}
}
return classes;
};
const convertPropsToTitleDivClasses = ({ size, }) => {
let classes = '';
if (size) {
switch (size) {
case 'xs':
classes = 'modus-wc-pb-2 modus-wc-pl-2 modus-wc-pt-2';
break;
case 'sm':
classes = 'modus-wc-pb-3 modus-wc-pl-3 modus-wc-pt-3';
break;
case 'md':
classes = 'modus-wc-pb-4 modus-wc-pl-4 modus-wc-pt-4';
break;
case 'lg':
classes = 'modus-wc-pb-5 modus-wc-pl-5 modus-wc-pt-5';
break;
}
}
return classes;
};
const modusWcCollapseCss = "modus-wc-collapse details.modus-wc-collapse>summary{display:inline-flex}modus-wc-collapse .modus-wc-collapse{background-color:var(--modus-wc-color-base-100);border-radius:0;box-sizing:border-box;color:var(--modus-wc-color-base-content);margin-bottom:var(--modus-wc-spacing-md);transition:none}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title{cursor:pointer;font-size:var(--modus-wc-font-size-md);font-weight:var(--modus-wc-font-weight-semibold);min-height:unset;padding:var(--modus-wc-spacing-lg) var(--modus-wc-spacing-3xl) var(--modus-wc-spacing-lg) var(--modus-wc-spacing-3xl);position:relative;width:auto}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:hover{background-color:var(--modus-wc-color-base-100);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:focus{background-color:var(--modus-wc-color-base-200);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:active{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-selected{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-active{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-open{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title.selected{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title.active{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-disabled:hover{background-color:inherit}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title--active{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title--selected{background-color:var(--modus-wc-color-primary-pale);color:var(--modus-wc-color-primary)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:checked{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title.checked{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-checked{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title.pressed{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title-pressed{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title[aria-pressed=true]{background-color:var(--modus-wc-color-primary);color:var(--modus-wc-color-primary-content)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:hover,modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:active,modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title:focus{background-color:transparent;color:var(--modus-wc-color-base-content)}modus-wc-collapse .modus-wc-collapse .description{font-size:var(--modus-wc-font-size-md);padding-inline-start:var(--modus-wc-spacing-md)}modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-content{font-size:var(--modus-wc-font-size-md)}modus-wc-collapse .modus-wc-collapse .modus-wc-title-main-content{display:inline-flex;flex:1;flex-direction:column;min-width:0}modus-wc-collapse .modus-wc-collapse .modus-wc-summary-main-content{align-items:center;display:flex;justify-content:space-between;min-height:1rem;width:100%}modus-wc-collapse .modus-wc-collapse .modus-wc-title-main-row>modus-wc-icon{height:24px;margin-inline-end:var(--modus-wc-spacing-sm)}modus-wc-collapse .modus-wc-collapse .modus-wc-title-end-content{align-items:center;display:inline-flex}modus-wc-collapse .modus-wc-collapse .title-end-icon{height:24px;margin-inline-start:var(--modus-wc-spacing-sm);pointer-events:none;position:relative;top:2px}modus-wc-collapse .modus-wc-collapse .title-start-icon{height:24px;inset-inline-start:var(--modus-wc-spacing-lg);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}modus-wc-collapse .modus-wc-collapse.modus-wc-border{background-color:var(--modus-wc-color-base-page);border:none;border-bottom:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-base-200)}modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open .modus-wc-collapse-content{padding:var(--modus-wc-spacing-md);padding-top:var(--modus-wc-spacing-sm)}modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open .modus-wc-collapse-title{color:var(--modus-wc-color-base-content)}modus-wc-collapse .modus-wc-collapse.has-start-icon>.modus-wc-collapse-title{padding-inline-start:var(--modus-wc-size-xxl)}modus-wc-collapse .modus-wc-collapse.has-start-icon>.modus-wc-collapse-title::before{inset-inline-start:49px}modus-wc-collapse .modus-wc-collapse.modus-wc-chevron-left>.modus-wc-collapse-title{padding-inline-end:16px}modus-wc-collapse .modus-wc-collapse.no-leading-icons>.modus-wc-collapse-title{padding-inline-start:16px}modus-wc-collapse .modus-wc-collapse.no-leading-icons>.modus-wc-collapse-description{padding-inline-start:var(--modus-wc-spacing-md)}.modus-wc-collapse-arrow.modus-wc-chevron-left>.modus-wc-collapse-title::before{box-shadow:2px 2px;content:\"\";display:block;height:0.5rem;inset-inline-start:var(--modus-wc-spacing-lg);pointer-events:none;position:absolute;top:44%;transform:translateY(-50%) rotate(45deg);transform-origin:75% 75%;transition-duration:0.2s;transition-property:transform;transition-timing-function:cubic-bezier(0, 0, 0.2, 1);width:0.5rem}.modus-wc-collapse-arrow.modus-wc-chevron-left.modus-wc-collapse-open>.modus-wc-collapse-title::before{top:50%;transform:translateY(-50%) rotate(225deg)}.modus-wc-collapse-arrow.modus-wc-chevron-left>.modus-wc-collapse-title::after{display:none}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse,[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse{border-radius:var(--modus-wc-border-radius-md);margin-bottom:0;margin-bottom:-1px}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title,[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title{font-weight:var(--modus-wc-font-weight-normal);min-height:unset;width:auto}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse{background-color:var(--modus-wc-color-white);color:inherit}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse.modus-wc-border{border:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-base-200)}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse .description{color:var(--modus-wc-color-gray-6)}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open{border-left:var(--modus-wc-spacing-xs) solid var(--modus-wc-color-trimble-blue)}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open .modus-wc-collapse-title{background-color:var(--modus-wc-color-blue-pale);font-weight:var(--modus-wc-font-weight-normal)}[data-theme=modus-classic-light] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open.no-leading-icons .modus-wc-collapse-description{padding-inline-start:var(--modus-wc-spacing-md)}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse{background-color:var(--modus-wc-color-trimble-gray);color:inherit}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-border{border:var(--modus-wc-border-width-xs) solid var(--modus-wc-color-base-200)}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse .description{color:var(--modus-wc-color-base-inverted)}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open{border-left:var(--modus-wc-spacing-xs) solid var(--modus-wc-color-highlight-blue)}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open .modus-wc-collapse-title{background-color:color-mix(in sRGB, var(--modus-wc-color-highlight-blue) 30%, transparent)}[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open.no-leading-icons .modus-wc-collapse-title,[data-theme=modus-classic-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open.no-leading-icons .modus-wc-collapse-description{padding-inline-start:var(--modus-wc-spacing-md)}[data-theme=connect-light] modus-wc-collapse .modus-wc-collapse,[data-theme=connect-dark] modus-wc-collapse .modus-wc-collapse{background-color:var(--modus-wc-color-base-page);border:1px solid var(--modus-wc-color-base-200);color:var(--modus-wc-color-base-content)}[data-theme=connect-light] modus-wc-collapse .modus-wc-collapse.modus-wc-border,[data-theme=connect-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-border{border-radius:var(--modus-wc-border-radius-box)}[data-theme=modus-modern-light] modus-wc-collapse .modus-wc-collapse:not(.modus-wc-border){border-radius:var(--modus-wc-border-radius-box)}[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse:not(.modus-wc-border){border-radius:var(--modus-wc-border-radius-box)}[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse{color:var(--modus-wc-color-base-inverted)}[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-title,[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse .description,[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse .modus-wc-collapse-content,[data-theme=modus-modern-dark] modus-wc-collapse .modus-wc-collapse.modus-wc-collapse-arrow.modus-wc-collapse-open .modus-wc-collapse-title{color:var(--modus-wc-color-base-inverted)}";
const ModusWcCollapse = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
this.expandedChange = index.createEvent(this, "expandedChange", 7);
this.inheritedAttributes = {};
/** When true, renders a border-bottom on the collapse component. */
this.bordered = false;
/** Controls chevron placement. */
this.chevronPosition = 'right';
/** Custom CSS class to apply to the outer div. */
this.customClass = '';
/** Controls whether the collapse is expanded or not. */
this.expanded = false;
this.handleToggle = (event) => {
const detailsElement = event.currentTarget;
const isOpen = detailsElement.open;
if (this.expanded !== isOpen) {
this.expanded = isOpen;
this.expandedChange.emit({ expanded: isOpen });
}
};
}
expandedChanged(newValue) {
if (this.detailsRef && this.detailsRef.open !== newValue) {
this.detailsRef.open = newValue;
}
}
componentWillLoad() {
// Auto-inject CSS if component is used inside user's shadow DOM
baseComponent.handleShadowDOMStyles(this.el);
if (!this.collapseId) {
this.collapseId = utils.generateRandomId();
}
this.inheritedAttributes = utils.inheritAriaAttributes(this.el);
}
getOuterDivClasses() {
var _a, _b;
const classList = ['modus-wc-collapse modus-wc-collapse-arrow'];
const propClasses = convertPropsToClasses({
bordered: this.bordered,
expanded: this.expanded,
});
// The order CSS classes are added matters to CSS specificity
if (propClasses)
classList.push(propClasses);
classList.push(`modus-wc-chevron-${this.chevronPosition}`);
if (!((_a = this.options) === null || _a === void 0 ? void 0 : _a.startIcon) && this.chevronPosition !== 'left') {
classList.push('no-leading-icons');
}
if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.startIcon) && this.chevronPosition === 'left') {
classList.push('has-start-icon');
}
if (this.customClass)
classList.push(this.customClass);
return classList.join(' ');
}
// istanbul ignore next
getTitleClasses() {
var _a;
const classList = [
'modus-wc-collapse-title modus-wc-inline-flex modus-wc-items-center modus-wc-justify-between modus-wc-min-h-4',
];
const paddingClass = convertPropsToTitleDivClasses({
size: (_a = this.options) === null || _a === void 0 ? void 0 : _a.size,
});
if (paddingClass)
classList.push(paddingClass);
return classList.join(' ');
}
// istanbul ignore next
getTitleChildDivClasses() {
var _a;
const classList = [
'modus-wc-title-main-row modus-wc-inline-flex modus-wc-items-center',
];
const titleFontSize = convertPropsToTitleChildDivClasses({
size: (_a = this.options) === null || _a === void 0 ? void 0 : _a.size,
});
if (titleFontSize)
classList.push(titleFontSize);
return classList.join(' ');
}
// istanbul ignore next
getDescriptionDivClasses() {
var _a;
const classList = ['description modus-wc-font-light'];
const descriptionFontSize = convertPropsToDescriptionDivClasses({
size: (_a = this.options) === null || _a === void 0 ? void 0 : _a.size,
});
if (descriptionFontSize)
classList.push(descriptionFontSize);
return classList.join(' ');
}
render() {
var _a;
const baseId = this.collapseId;
const titleId = `${baseId}-title`;
const contentId = `${baseId}-content`;
return (index.h(index.Host, { key: '066210e7a999faf40422efe7bc50281975585fad' }, index.h("details", Object.assign({ key: '6ea85a85f00b3328dc744a2ba4b58abfd64ce534', class: this.getOuterDivClasses(), open: this.expanded, onToggle: this.handleToggle, ref: (el) => (this.detailsRef = el) }, this.inheritedAttributes), index.h("summary", { key: 'e5f2f7edbbbbc4e2b520ade5cd5eddc9e9fcb5bd', class: this.getTitleClasses(), id: titleId }, this.options ? (index.h("div", { class: "modus-wc-summary-main-content" }, this.options.startIcon && (index.h("modus-wc-icon", { "aria-label": this.options.startIconAriaLabel, class: "title-start-icon", decorative: !this.options.startIconAriaLabel, name: this.options.startIcon, size: this.options.size })), index.h("div", { class: "modus-wc-title-main-content" }, index.h("div", { class: this.getTitleChildDivClasses() }, this.options.icon && (index.h("modus-wc-icon", { "aria-label": this.options.iconAriaLabel, decorative: !this.options.iconAriaLabel, name: this.options.icon, size: this.options.size })), this.options.title)), this.options.endIcon && (index.h("div", { class: "modus-wc-title-end-content" }, index.h("modus-wc-icon", { "aria-label": this.options.endIconAriaLabel, class: "title-end-icon", decorative: !this.options.endIconAriaLabel, name: this.options.endIcon, size: this.options.size }))))) : (index.h("slot", { name: "header" }))), this.expanded && ((_a = this.options) === null || _a === void 0 ? void 0 : _a.description) && (index.h("div", { key: 'b13862fde0e208df6598d1bfd54977e8d3fd6b6d', class: `modus-wc-collapse-description ${this.getDescriptionDivClasses()}` }, this.options.description)), index.h("div", { key: '40538c27af9f30b527e52ae40d4ac6c5a65b366a', "aria-labelledby": titleId, class: "modus-wc-collapse-content modus-wc-cursor-default", id: contentId }, index.h("slot", { key: 'c0563a96763e89fe916748a9155590d6074cadbc', name: "content" })))));
}
get el() { return index.getElement(this); }
static get watchers() { return {
"expanded": ["expandedChanged"]
}; }
};
ModusWcCollapse.style = modusWcCollapseCss;
exports.modus_wc_collapse = ModusWcCollapse;