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

174 lines (173 loc) 5.53 kB
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"; const meta = { title: 'Components/Menu Item', component: 'modus-wc-menu-item', args: { label: 'Menu Item', size: 'md', value: 'menuItem', }, 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 = { render: (args) => { // prettier-ignore return html ` <modus-wc-menu> <modus-wc-menu-item ?bordered=${args.bordered} ?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-menu-item> </modus-wc-menu> `; }, }; export const Default = Object.assign({}, Template); export const WithIcon = { render: (args) => { // prettier-ignore return html ` <modus-wc-menu> <modus-wc-menu-item ?bordered=${args.bordered} ?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-icon slot="start-icon" name="alert" size="sm" ></modus-wc-icon> </modus-wc-menu-item> </modus-wc-menu> `; }, }; export const WithCheckbox = { args: { checkbox: true, }, render: (args) => { // prettier-ignore return html ` <modus-wc-menu> <modus-wc-menu-item ?bordered=${args.bordered} ?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'])} value=${args.value} ></modus-wc-menu-item> </modus-wc-menu> `; }, }; export const WithTooltip = { args: { 'tooltip-content': 'This is a tooltip for the menu item', 'tooltip-position': 'top', }, render: (args) => { // prettier-ignore return html ` <modus-wc-menu> <modus-wc-menu-item ?bordered=${args.bordered} 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-menu-item> </modus-wc-menu> `; }, }; export const ShadowDomParent = { render: (args) => { // Create a unique shadow host for menu-item component if (!customElements.get('menu-item-shadow-host')) { const MenuItemShadowHost = createShadowHostClass({ componentTag: 'modus-wc-menu', propsMapper: (v, el) => { const menuEl = el; menuEl.ariaLabel = 'Shadow DOM Menu'; // Get or create menu item let menuItem = el.querySelector('modus-wc-menu-item'); if (!menuItem) { menuItem = document.createElement('modus-wc-menu-item'); el.innerHTML = ''; el.appendChild(menuItem); } // Update properties on the existing element const menuItemEl = menuItem; menuItemEl.ariaLabel = 'Menu item in shadow DOM'; menuItemEl.bordered = Boolean(v.bordered); menuItemEl.checkbox = Boolean(v.checkbox); menuItemEl.customClass = v['custom-class'] || ''; menuItemEl.disabled = Boolean(v.disabled); menuItemEl.focused = Boolean(v.focused); menuItemEl.label = v.label; menuItemEl.selected = Boolean(v.selected); menuItemEl.size = v.size || 'md'; menuItemEl.subLabel = v['sub-label'] || ''; menuItemEl.tooltipContent = v['tooltip-content'] || ''; menuItemEl.tooltipPosition = v['tooltip-position'] || 'auto'; menuItemEl.value = v.value; }, }); customElements.define('menu-item-shadow-host', MenuItemShadowHost); } return html `<menu-item-shadow-host .props=${Object.assign({}, args)} ></menu-item-shadow-host>`; }, };