@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
227 lines (226 loc) • 7.23 kB
JavaScript
import { withActions } from "@storybook/addon-actions/decorator";
import { html } from "lit";
import { ifDefined } from "lit/directives/if-defined.js";
import { createShadowHostClass } from "../../providers/shadow-dom/shadow-host-helper";
import { treeItemCustomSourceCode, treeItemDefaultSourceCode, treeItemShadowDomParentSourceCode, treeItemWithCheckboxSourceCode, treeItemWithEndSlotSourceCode, treeItemWithStartSlotSourceCode, treeItemWithTooltipSourceCode, } from "./modus-wc-tree-item.story-source";
const meta = {
title: 'Components/Tree Item',
component: 'modus-wc-tree-item',
args: {
label: 'Tree Item',
size: 'md',
value: 'treeItem',
},
argTypes: {
size: {
control: { type: 'select' },
options: ['sm', 'md', 'lg'],
},
'tooltip-position': {
control: { type: 'select' },
options: ['auto', 'top', 'right', 'bottom', 'left'],
},
},
decorators: [withActions],
parameters: {
actions: {
handles: ['itemSelect'],
},
},
};
export default meta;
const Template = {
parameters: {
docs: { source: { code: treeItemDefaultSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu>
<modus-wc-tree-item
?bordered=${args.bordered}
?block-expand=${args['block-expand']}
?checkbox=${args.checkbox}
custom-class=${ifDefined(args['custom-class'])}
?disabled=${args.disabled}
?focused=${args.focused}
label=${args.label}
?selected=${args.selected}
size=${args.size}
sub-label=${ifDefined(args['sub-label'])}
tooltip-content=${ifDefined(args['tooltip-content'])}
tooltip-position=${ifDefined(args['tooltip-position'])}
value=${args.value}
></modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const Default = Object.assign({}, Template);
export const WithStartSlot = {
parameters: {
docs: { source: { code: treeItemWithStartSlotSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu>
<modus-wc-tree-item
?bordered=${args.bordered}
?disabled=${args.disabled}
label=${args.label}
?selected=${args.selected}
size=${args.size}
value=${args.value}
>
<modus-wc-icon slot="start" name="alert" size="sm"></modus-wc-icon>
</modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const WithEndSlot = {
parameters: {
docs: { source: { code: treeItemWithEndSlotSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu>
<modus-wc-tree-item
label=${args.label}
value=${args.value}
>
<modus-wc-dropdown-menu
slot="end"
button-variant="borderless"
button-size="sm"
button-shape="circle"
button-aria-label="More options"
>
<div slot="button">
<modus-wc-icon name="more_vertical" size="sm"></modus-wc-icon>
</div>
<div slot="menu">
<modus-wc-menu-item label="Rename" value="rename"></modus-wc-menu-item>
<modus-wc-menu-item label="Duplicate" value="duplicate"></modus-wc-menu-item>
<modus-wc-menu-item label="Delete" value="delete"></modus-wc-menu-item>
</div>
</modus-wc-dropdown-menu>
</modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const CustomTreeItem = {
parameters: {
docs: { source: { code: treeItemCustomSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu size="sm">
<modus-wc-tree-item
label=${args.label}
value=${args.value}
>
<modus-wc-icon slot="start" name="search"></modus-wc-icon>
<div slot="end" style="display: flex; align-items: center;">
<div
style="width: 1px; background: currentColor; opacity: 0.3; margin-inline-end: 4px; align-self: stretch;"
></div>
<modus-wc-button
variant="borderless"
size="sm"
aria-label="Open folder"
>
<modus-wc-icon name="folder_closed" size="sm"></modus-wc-icon>
<modus-wc-icon name="chevron_right" size="sm"></modus-wc-icon>
</modus-wc-button>
</div>
</modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const WithCheckbox = {
args: {
checkbox: true,
},
parameters: {
docs: { source: { code: treeItemWithCheckboxSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu>
<modus-wc-tree-item
?checkbox=${args.checkbox}
label=${args.label}
value=${args.value}
></modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const WithTooltip = {
args: {
'tooltip-content': 'Tooltip content',
},
parameters: {
docs: { source: { code: treeItemWithTooltipSourceCode } },
},
render: (args) => {
// prettier-ignore
return html `
<modus-wc-tree-menu>
<modus-wc-tree-item
label=${args.label}
tooltip-content=${ifDefined(args['tooltip-content'])}
value=${args.value}
></modus-wc-tree-item>
</modus-wc-tree-menu>
`;
},
};
export const ShadowDomParent = {
parameters: {
docs: { source: { code: treeItemShadowDomParentSourceCode } },
},
render: (args) => {
if (!customElements.get('tree-item-shadow-host')) {
const TreeItemShadowHost = createShadowHostClass({
componentTag: 'modus-wc-tree-menu',
propsMapper: (v, el) => {
const treeMenuEl = el;
treeMenuEl.ariaLabel = 'Shadow DOM Tree Menu';
let treeItem = el.querySelector('modus-wc-tree-item');
if (!treeItem) {
treeItem = document.createElement('modus-wc-tree-item');
el.innerHTML = '';
el.appendChild(treeItem);
}
const treeItemEl = treeItem;
treeItemEl.bordered = Boolean(v.bordered);
treeItemEl.blockExpand = Boolean(v['block-expand']);
treeItemEl.checkbox = Boolean(v.checkbox);
treeItemEl.customClass = v['custom-class'] || '';
treeItemEl.disabled = Boolean(v.disabled);
treeItemEl.focused = Boolean(v.focused);
treeItemEl.hasSubmenu = Boolean(v['has-submenu']);
treeItemEl.label = v.label;
treeItemEl.selected = Boolean(v.selected);
treeItemEl.size = v.size || 'md';
treeItemEl.subLabel = v['sub-label'] || '';
treeItemEl.tooltipContent = v['tooltip-content'] || '';
treeItemEl.tooltipPosition = v['tooltip-position'] || 'auto';
treeItemEl.value = v.value;
},
});
customElements.define('tree-item-shadow-host', TreeItemShadowHost);
}
return html `<tree-item-shadow-host
.props=${Object.assign({}, args)}
></tree-item-shadow-host>`;
},
};