@trimble-oss/moduswebcomponents-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +337 -0
- package/package.json +39 -0
- package/versions/1.0.0/component-docs/_all_components.json +56 -0
- package/versions/1.0.0/component-docs/modus-wc-autocomplete.json +415 -0
- package/versions/1.0.0/component-docs/modus-wc-date.json +227 -0
- package/versions/1.0.0/component-docs/modus-wc-dropdown-menu.json +164 -0
- package/versions/1.0.0/component-docs/modus-wc-logo.json +61 -0
- package/versions/1.0.0/component-docs/modus-wc-menu-item.json +165 -0
- package/versions/1.0.0/component-docs/modus-wc-menu.json +106 -0
- package/versions/1.0.0/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.0.0/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.0.0/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.0.0/component-docs/modus-wc-table.json +202 -0
- package/versions/1.0.0/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.0.0/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.0.0/docs/_all_docs.json +15 -0
- package/versions/1.0.0/docs/angular.mdx +374 -0
- package/versions/1.0.0/docs/getting-started.mdx +131 -0
- package/versions/1.0.7/component-docs/_all_components.json +55 -0
- package/versions/1.0.7/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.0.7/component-docs/modus-wc-table.json +202 -0
- package/versions/1.0.7/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.0.7/docs/_all_docs.json +15 -0
- package/versions/1.0.7/docs/angular.mdx +374 -0
- package/versions/1.1.0/component-docs/_all_components.json +56 -0
- package/versions/1.1.0/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.1.0/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.1.0/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.1.0/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.1.0/component-docs/modus-wc-table.json +202 -0
- package/versions/1.1.0/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.1.0/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.1.0/docs/_all_docs.json +15 -0
- package/versions/1.1.0/docs/angular.mdx +374 -0
- package/versions/1.1.0/docs/getting-started.mdx +131 -0
- package/versions/1.1.1/component-docs/_all_components.json +56 -0
- package/versions/1.1.1/component-docs/modus-wc-autocomplete.json +405 -0
- package/versions/1.1.1/component-docs/modus-wc-navbar.json +290 -0
- package/versions/1.1.1/component-docs/modus-wc-profile-menu.json +64 -0
- package/versions/1.1.1/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/1.1.1/component-docs/modus-wc-table.json +202 -0
- package/versions/1.1.1/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/1.1.1/component-docs/modus-wc-typography.json +78 -0
- package/versions/1.1.1/docs/_all_docs.json +15 -0
- package/versions/1.1.1/docs/angular.mdx +374 -0
- package/versions/1.1.1/docs/getting-started.mdx +131 -0
- package/versions/base/component-docs/_all_components.json +55 -0
- package/versions/base/component-docs/modus-wc-accordion.json +48 -0
- package/versions/base/component-docs/modus-wc-alert.json +112 -0
- package/versions/base/component-docs/modus-wc-autocomplete.json +397 -0
- package/versions/base/component-docs/modus-wc-avatar.json +83 -0
- package/versions/base/component-docs/modus-wc-badge.json +68 -0
- package/versions/base/component-docs/modus-wc-breadcrumbs.json +63 -0
- package/versions/base/component-docs/modus-wc-button-group.json +100 -0
- package/versions/base/component-docs/modus-wc-button.json +130 -0
- package/versions/base/component-docs/modus-wc-card.json +98 -0
- package/versions/base/component-docs/modus-wc-checkbox.json +149 -0
- package/versions/base/component-docs/modus-wc-chip.json +132 -0
- package/versions/base/component-docs/modus-wc-collapse.json +90 -0
- package/versions/base/component-docs/modus-wc-date.json +227 -0
- package/versions/base/component-docs/modus-wc-divider.json +85 -0
- package/versions/base/component-docs/modus-wc-dropdown-menu.json +154 -0
- package/versions/base/component-docs/modus-wc-file-dropzone.json +155 -0
- package/versions/base/component-docs/modus-wc-handle.json +135 -0
- package/versions/base/component-docs/modus-wc-icon.json +722 -0
- package/versions/base/component-docs/modus-wc-input-feedback.json +71 -0
- package/versions/base/component-docs/modus-wc-input-label.json +84 -0
- package/versions/base/component-docs/modus-wc-loader.json +65 -0
- package/versions/base/component-docs/modus-wc-logo.json +61 -0
- package/versions/base/component-docs/modus-wc-menu-item.json +173 -0
- package/versions/base/component-docs/modus-wc-menu.json +86 -0
- package/versions/base/component-docs/modus-wc-modal.json +108 -0
- package/versions/base/component-docs/modus-wc-navbar.json +280 -0
- package/versions/base/component-docs/modus-wc-number-input.json +219 -0
- package/versions/base/component-docs/modus-wc-pagination.json +103 -0
- package/versions/base/component-docs/modus-wc-panel.json +76 -0
- package/versions/base/component-docs/modus-wc-progress.json +86 -0
- package/versions/base/component-docs/modus-wc-radio.json +139 -0
- package/versions/base/component-docs/modus-wc-rating.json +117 -0
- package/versions/base/component-docs/modus-wc-select.json +159 -0
- package/versions/base/component-docs/modus-wc-side-navigation.json +102 -0
- package/versions/base/component-docs/modus-wc-skeleton.json +65 -0
- package/versions/base/component-docs/modus-wc-slider.json +163 -0
- package/versions/base/component-docs/modus-wc-stepper.json +47 -0
- package/versions/base/component-docs/modus-wc-switch.json +149 -0
- package/versions/base/component-docs/modus-wc-table.json +202 -0
- package/versions/base/component-docs/modus-wc-tabs.json +86 -0
- package/versions/base/component-docs/modus-wc-text-input.json +278 -0
- package/versions/base/component-docs/modus-wc-textarea.json +215 -0
- package/versions/base/component-docs/modus-wc-theme-switcher.json +49 -0
- package/versions/base/component-docs/modus-wc-time-input.json +211 -0
- package/versions/base/component-docs/modus-wc-toast.json +56 -0
- package/versions/base/component-docs/modus-wc-toolbar.json +44 -0
- package/versions/base/component-docs/modus-wc-tooltip.json +94 -0
- package/versions/base/component-docs/modus-wc-typography.json +73 -0
- package/versions/base/component-docs/modus-wc-utility-panel.json +86 -0
- package/versions/base/docs/_all_docs.json +15 -0
- package/versions/base/docs/accessibility.mdx +32 -0
- package/versions/base/docs/angular.mdx +346 -0
- package/versions/base/docs/form-inputs.mdx +86 -0
- package/versions/base/docs/getting-started.mdx +91 -0
- package/versions/base/docs/modus-figma-mcp-integration-guide.mdx +254 -0
- package/versions/base/docs/modus-icon-usage.mdx +210 -0
- package/versions/base/docs/react.mdx +129 -0
- package/versions/base/docs/styling.mdx +107 -0
- package/versions/base/docs/testing.mdx +18 -0
- package/versions/base/docs/vue.mdx +159 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable feedback component used to provide additional context related to form input interactions. <b>To use a custom icon, this component requires Modus icons to be installed in the host application. See [Modus Icon Usage](/docs/documentation-modus-icon-usage--docs) for steps.</b>",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "customClass",
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "Custom CSS class to apply to the outer div element.",
|
|
8
|
+
"default": "''",
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 29
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "icon",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "The Modus icon to use instead of the pre-defined icons.",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 32
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "level",
|
|
22
|
+
"type": "IInputFeedbackLevel",
|
|
23
|
+
"description": "The level informs which icon and color that will be rendered.",
|
|
24
|
+
"default": null,
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 35
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "message",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "The message.",
|
|
32
|
+
"default": "''",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 38
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "size",
|
|
38
|
+
"type": "ModusSize",
|
|
39
|
+
"description": "The size of the feedback component.",
|
|
40
|
+
"default": "'md'",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 41
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"events": [],
|
|
46
|
+
"methods": [],
|
|
47
|
+
"slots": [],
|
|
48
|
+
"examples": {
|
|
49
|
+
"basic": "<modus-wc-input-feedback\n custom-class=${ifDefined(args['custom-class'])}\n icon=${ifDefined(args.icon)}\n level=${args.level}\n message=${ifDefined(args.message)}\n size=${ifDefined(args.size)}\n>\n</modus-wc-input-feedback>",
|
|
50
|
+
"variations": [],
|
|
51
|
+
"args": {
|
|
52
|
+
"level": "'error'",
|
|
53
|
+
"message": "'Uh oh. You done messed up.'",
|
|
54
|
+
"size": "'md'"
|
|
55
|
+
},
|
|
56
|
+
"argTypes": {},
|
|
57
|
+
"usage": []
|
|
58
|
+
},
|
|
59
|
+
"tag": "modus-wc-input-feedback",
|
|
60
|
+
"storyExample": {
|
|
61
|
+
"template": "<modus-wc-input-feedback\n custom-class=${ifDefined(args['custom-class'])}\n icon=${ifDefined(args.icon)}\n level=${args.level}\n message=${ifDefined(args.message)}\n size=${ifDefined(args.size)}\n>\n</modus-wc-input-feedback>",
|
|
62
|
+
"args": {
|
|
63
|
+
"level": "'error'",
|
|
64
|
+
"message": "'Uh oh. You done messed up.'",
|
|
65
|
+
"size": "'md'"
|
|
66
|
+
},
|
|
67
|
+
"argTypes": {},
|
|
68
|
+
"events": [],
|
|
69
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { IInputFeedbackLevel } from './modus-wc-input-feedback';\nimport { createShadowHostClass } from '../../providers/shadow-dom/shadow-host-helper';\nimport { ModusSize } from '../types';\n\ninterface InputFeedbackArgs {\n 'custom-class'?: string;\n icon?: string;\n level: IInputFeedbackLevel;\n message?: string;\n size?: ModusSize;\n}\n\nconst meta: Meta<InputFeedbackArgs> = {\n title: 'Components/Forms/Input Feedback',\n component: 'modus-wc-input-feedback',\n args: {\n level: 'error',\n message: 'Uh oh. You done messed up.',\n size: 'md',\n },\n argTypes: {\n level: {\n control: { type: 'select' },\n options: ['error', 'info', 'success', 'warning'],\n },\n size: {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<InputFeedbackArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-input-feedback\n custom-class=${ifDefined(args['custom-class'])}\n icon=${ifDefined(args.icon)}\n level=${args.level}\n message=${ifDefined(args.message)}\n size=${ifDefined(args.size)}\n>\n</modus-wc-input-feedback>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n\nexport const WithCustomModusIcon: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-input-feedback\n custom-class=${ifDefined(args['custom-class'])}\n icon='calendar_check'\n level='success'\n message='Event added to calendar!'\n size=${ifDefined(args.size)}\n>\n</modus-wc-input-feedback>\n `;\n },\n};\n\nexport const ShadowDomParent: Story = {\n render: (args) => {\n // Create a unique shadow host for input-feedback component\n if (!customElements.get('input-feedback-shadow-host')) {\n const InputFeedbackShadowHost = createShadowHostClass<InputFeedbackArgs>({\n componentTag: 'modus-wc-input-feedback',\n propsMapper: (v: InputFeedbackArgs, el: HTMLElement) => {\n const inputFeedbackEl = el as unknown as {\n customClass: string;\n icon: string;\n level: string;\n message: string;\n size: string;\n };\n inputFeedbackEl.customClass = v['custom-class'] || '';\n inputFeedbackEl.icon = v.icon ?? '';\n inputFeedbackEl.level = v.level;\n inputFeedbackEl.message = v.message ?? '';\n inputFeedbackEl.size = v.size ?? 'md';\n },\n });\n customElements.define(\n 'input-feedback-shadow-host',\n InputFeedbackShadowHost\n );\n }\n\n return html`<input-feedback-shadow-host\n .props=${{ ...args }}\n ></input-feedback-shadow-host>`;\n },\n};\n"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable input label component. The component supports a `<slot>` for injecting additional custom content inside the label, such as icons or formatted text.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "forId",
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "The `for` attribute of the label, matching the `id` of the associated input.",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 22
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "customClass",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Additional classes for custom styling.",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 25
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "labelText",
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "The text to display within the label.",
|
|
24
|
+
"default": null,
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 28
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "required",
|
|
30
|
+
"type": "boolean",
|
|
31
|
+
"description": "Whether the label indicates a required field.",
|
|
32
|
+
"default": "false",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 31
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "size",
|
|
38
|
+
"type": "ModusSize",
|
|
39
|
+
"description": "The size of the label.",
|
|
40
|
+
"default": "'md'",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 34
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "subLabelText",
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "The text rendered beneath the label.",
|
|
48
|
+
"default": null,
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 37
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"events": [],
|
|
54
|
+
"methods": [],
|
|
55
|
+
"slots": [
|
|
56
|
+
{
|
|
57
|
+
"name": "default",
|
|
58
|
+
"description": "Slot for default content"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"examples": {
|
|
62
|
+
"basic": "<input-label-shadow-host\n .props=${{ ...args }}\n ></input-label-shadow-host>",
|
|
63
|
+
"variations": [],
|
|
64
|
+
"args": {
|
|
65
|
+
"label-text": "'Label'",
|
|
66
|
+
"required": "false",
|
|
67
|
+
"size": "'md'"
|
|
68
|
+
},
|
|
69
|
+
"argTypes": {},
|
|
70
|
+
"usage": []
|
|
71
|
+
},
|
|
72
|
+
"tag": "modus-wc-input-label",
|
|
73
|
+
"storyExample": {
|
|
74
|
+
"template": "<input-label-shadow-host\n .props=${{ ...args }}\n ></input-label-shadow-host>",
|
|
75
|
+
"args": {
|
|
76
|
+
"label-text": "'Label'",
|
|
77
|
+
"required": "false",
|
|
78
|
+
"size": "'md'"
|
|
79
|
+
},
|
|
80
|
+
"argTypes": {},
|
|
81
|
+
"events": [],
|
|
82
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createShadowHostClass } from '../../providers/shadow-dom/shadow-host-helper';\nimport { ModusSize } from '../types';\n\ninterface InputLabelArgs {\n 'for-id'?: string;\n 'custom-class'?: string;\n 'label-text'?: string;\n required?: boolean;\n size?: ModusSize;\n 'sub-label-text'?: string;\n}\n\nconst meta: Meta<InputLabelArgs> = {\n title: 'Components/Forms/Input Label',\n component: 'modus-wc-input-label',\n args: {\n 'label-text': 'Label',\n required: false,\n size: 'md',\n },\n argTypes: {\n size: {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<InputLabelArgs>;\n\nconst Template: Story = {\n render: (args) => html`\n <modus-wc-input-label\n for-id=${ifDefined(args['for-id'])}\n custom-class=${ifDefined(args['custom-class'])}\n label-text=${ifDefined(args['label-text'])}\n ?required=${args['required']}\n size=${args.size}\n sub-label-text=${ifDefined(args['sub-label-text'])}\n ></modus-wc-input-label>\n `,\n};\n\nexport const Default: Story = { ...Template };\n\nexport const Required: Story = { ...Template, args: { required: true } };\n\nexport const ShadowDomParent: Story = {\n render: (args) => {\n // Create a unique shadow host for input-label component\n if (!customElements.get('input-label-shadow-host')) {\n const InputLabelShadowHost = createShadowHostClass<InputLabelArgs>({\n componentTag: 'modus-wc-input-label',\n propsMapper: (v: InputLabelArgs, el: HTMLElement) => {\n const inputLabelEl = el as unknown as {\n forId: string;\n customClass: string;\n labelText: string;\n required: boolean;\n size: string;\n subLabelText: string;\n };\n inputLabelEl.forId = v['for-id'] ?? '';\n inputLabelEl.customClass = v['custom-class'] || '';\n inputLabelEl.labelText = v['label-text'] ?? '';\n inputLabelEl.required = Boolean(v.required);\n inputLabelEl.size = v.size ?? 'md';\n inputLabelEl.subLabelText = v['sub-label-text'] ?? '';\n },\n });\n customElements.define('input-label-shadow-host', InputLabelShadowHost);\n }\n\n return html`<input-label-shadow-host\n .props=${{ ...args }}\n ></input-label-shadow-host>`;\n },\n};\n"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable loader component used to indicate the loading of content",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "color",
|
|
6
|
+
"type": "LoaderColor",
|
|
7
|
+
"description": "The color of the loader.",
|
|
8
|
+
"default": "'primary'",
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 38
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "customClass",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Custom CSS class to apply to the loader element.",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 41
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "size",
|
|
22
|
+
"type": "DaisySize",
|
|
23
|
+
"description": "The size of the loader.",
|
|
24
|
+
"default": "'md'",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 44
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "variant",
|
|
30
|
+
"type": "LoaderVariant",
|
|
31
|
+
"description": "The variant of the loader.",
|
|
32
|
+
"default": "'spinner'",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 47
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"events": [],
|
|
38
|
+
"methods": [],
|
|
39
|
+
"slots": [],
|
|
40
|
+
"examples": {
|
|
41
|
+
"basic": "<modus-wc-loader\n aria-label=\"Loading spinner\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n ></modus-wc-loader>",
|
|
42
|
+
"variations": [],
|
|
43
|
+
"args": {
|
|
44
|
+
"color": "'primary'",
|
|
45
|
+
"custom-class": "''",
|
|
46
|
+
"size": "'md'",
|
|
47
|
+
"variant": "'spinner'"
|
|
48
|
+
},
|
|
49
|
+
"argTypes": {},
|
|
50
|
+
"usage": []
|
|
51
|
+
},
|
|
52
|
+
"tag": "modus-wc-loader",
|
|
53
|
+
"storyExample": {
|
|
54
|
+
"template": "<modus-wc-loader\n aria-label=\"Loading spinner\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n ></modus-wc-loader>",
|
|
55
|
+
"args": {
|
|
56
|
+
"color": "'primary'",
|
|
57
|
+
"custom-class": "''",
|
|
58
|
+
"size": "'md'",
|
|
59
|
+
"variant": "'spinner'"
|
|
60
|
+
},
|
|
61
|
+
"argTypes": {},
|
|
62
|
+
"events": [],
|
|
63
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { LoaderColor, LoaderVariant } from './modus-wc-loader';\nimport { DaisySize } from '../types';\n\ninterface LoaderArgs {\n color: LoaderColor;\n 'custom-class'?: string;\n size: DaisySize;\n variant: LoaderVariant;\n}\n\nconst meta: Meta<LoaderArgs> = {\n title: 'Components/Loader',\n component: 'modus-wc-loader',\n args: {\n color: 'primary',\n 'custom-class': '',\n size: 'md',\n variant: 'spinner',\n },\n argTypes: {\n color: {\n control: { type: 'select' },\n options: [\n 'primary',\n 'secondary',\n 'accent',\n 'neutral',\n 'info',\n 'success',\n 'warning',\n 'error',\n ],\n },\n size: {\n control: { type: 'select' },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n variant: {\n control: { type: 'select' },\n options: ['ball', 'bars', 'dots', 'infinity', 'ring', 'spinner'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<LoaderArgs>;\n\nexport const Default: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading spinner\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n ></modus-wc-loader>\n `;\n },\n};\n\nexport const Ball: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading ball\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"md\"\n variant=\"ball\"\n ></modus-wc-loader>\n `;\n },\n};\n\nexport const Bars: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading bars\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"md\"\n variant=\"bars\"\n ></modus-wc-loader>\n `;\n },\n};\n\nexport const Dots: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading dots\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"md\"\n variant=\"dots\"\n ></modus-wc-loader>\n `;\n },\n};\n\n// eslint-disable-next-line no-shadow-restricted-names\nexport const Infinity: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading infinity symbol\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"md\"\n variant=\"infinity\"\n ></modus-wc-loader>\n `;\n },\n};\n\nexport const Ring: Story = {\n render: (args) => {\n return html`\n <modus-wc-loader\n aria-label=\"Loading ring\"\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"md\"\n variant=\"ring\"\n ></modus-wc-loader>\n `;\n },\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n - **Color value changes**: \\`dark\\` and \\`tertiary\\` values from 1.0 have been removed.\n 1.0 value \\`danger\\` has been renamed to \\`error\\` in 2.0. Values \\`accent\\`, \\`info\\`, and \\`neutral\\` are new options in 2.0.\n - In 1.0 \\`size\\` used direct CSS size value strings (e.g., \\`'12rem'\\`). In 2.0 \\`size\\` is now defined by predefined values (\\`xs\\`, \\`sm\\`, \\`md\\`, \\`lg\\`), and CSS can be used for custom sizes.\n - Added new \\`variant\\` prop to specify the loader type in 2.0.\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|----------|----------|--------------------------------------------------------------------------------------------------------|\n| color | color | \\`dark\\` and \\`tertiary\\` from version 1.0 have been removed, \\`danger\\` has been renamed to \\`error\\` |\n| size | size | Now uses predefined sizes (\\`xs\\`, \\`sm\\`, \\`md\\`, \\`lg\\`), use CSS for custom sizes. |\n `,\n },\n },\n // To hide the actual story rendering and only show docs:\n controls: { disable: true },\n canvas: { disable: true },\n },\n // Simple render function or leave it empty\n render: () => html`<div></div>`,\n};\n"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A component for displaying Trimble product logos with support for both fixed and scalable sizing. Provides consistent branding across applications with various product logo options.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "name",
|
|
6
|
+
"type": "LogoName",
|
|
7
|
+
"description": "The name of the logo to display. Accepts values like 'trimble', 'viewpoint_field_view', etc.",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 30
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "emblem",
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"description": "Show emblem version (icon only) instead of full logo",
|
|
16
|
+
"default": "false",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 33
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "customClass",
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Custom CSS class to apply to the logo container.",
|
|
24
|
+
"default": "''",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 36
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "alt",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "The alt text for accessibility. If not provided, defaults to the logo name.",
|
|
32
|
+
"default": null,
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 39
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"events": [],
|
|
38
|
+
"methods": [],
|
|
39
|
+
"slots": [],
|
|
40
|
+
"examples": {
|
|
41
|
+
"basic": "<modus-wc-logo\n name=\"${args.name}\"\n ?emblem=\"${args.emblem}\"\n alt=\"${ifDefined(args.alt)}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ></modus-wc-logo>",
|
|
42
|
+
"variations": [],
|
|
43
|
+
"args": {
|
|
44
|
+
"name": "'trimble'",
|
|
45
|
+
"emblem": "false"
|
|
46
|
+
},
|
|
47
|
+
"argTypes": {},
|
|
48
|
+
"usage": []
|
|
49
|
+
},
|
|
50
|
+
"tag": "modus-wc-logo",
|
|
51
|
+
"storyExample": {
|
|
52
|
+
"template": "<modus-wc-logo\n name=\"${args.name}\"\n ?emblem=\"${args.emblem}\"\n alt=\"${ifDefined(args.alt)}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ></modus-wc-logo>",
|
|
53
|
+
"args": {
|
|
54
|
+
"name": "'trimble'",
|
|
55
|
+
"emblem": "false"
|
|
56
|
+
},
|
|
57
|
+
"argTypes": {},
|
|
58
|
+
"events": [],
|
|
59
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { getAvailableLogos, LogoName } from './logo-constants';\n\ninterface LogoArgs {\n name: LogoName;\n emblem: boolean;\n alt?: string;\n 'custom-class'?: string;\n}\n\nconst meta: Meta<LogoArgs> = {\n title: 'Components/Logo',\n component: 'modus-wc-logo',\n args: {\n name: 'trimble',\n emblem: false,\n },\n argTypes: {\n name: {\n control: { type: 'select' },\n options: getAvailableLogos(),\n },\n emblem: {\n control: { type: 'boolean' },\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<LogoArgs>;\n\nconst Template: Story = {\n render: (args) => {\n return html`\n <modus-wc-logo\n name=\"${args.name}\"\n ?emblem=\"${args.emblem}\"\n alt=\"${ifDefined(args.alt)}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ></modus-wc-logo>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n\nexport const CustomSizeWithClass: Story = {\n render: () => {\n return html`\n <style>\n .logo-small {\n width: 80px;\n }\n .logo-medium {\n width: 150px;\n }\n .logo-large {\n width: 250px;\n }\n .emblem-xs {\n width: 80px;\n height: 80px;\n }\n .emblem-sm {\n width: 150px;\n height: 150px;\n }\n .emblem-lg {\n width: 250px;\n height: 250px;\n }\n </style>\n <div style=\"display: flex; flex-direction: column; gap: 3rem;\">\n <div>\n <h4>Full Logos - Custom Sizes</h4>\n <div\n style=\"display: flex; gap: 2rem; align-items: center; flex-wrap: wrap;\"\n >\n <modus-wc-logo\n name=\"trimble\"\n custom-class=\"logo-small\"\n ></modus-wc-logo>\n <modus-wc-logo\n name=\"trimble\"\n custom-class=\"logo-medium\"\n ></modus-wc-logo>\n <modus-wc-logo\n name=\"trimble\"\n custom-class=\"logo-large\"\n ></modus-wc-logo>\n </div>\n </div>\n\n <div>\n <h4>Emblems - Custom Sizes</h4>\n <div\n style=\"display: flex; gap: 2rem; align-items: center; flex-wrap: wrap;\"\n >\n <modus-wc-logo\n name=\"trimble\"\n emblem\n custom-class=\"emblem-xs\"\n ></modus-wc-logo>\n <modus-wc-logo\n name=\"trimble\"\n emblem\n custom-class=\"emblem-sm\"\n ></modus-wc-logo>\n <modus-wc-logo\n name=\"trimble\"\n emblem\n custom-class=\"emblem-lg\"\n ></modus-wc-logo>\n </div>\n </div>\n </div>\n </div>\n `;\n },\n};\n"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable menu item component used to display the item portion of a menu. This component supports a 'start-icon' `<slot>` that allows for custom icons to be placed at the beginning of the item.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "bordered",
|
|
6
|
+
"type": "boolean",
|
|
7
|
+
"description": "",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 32
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "checkbox",
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"description": "If true, renders a checkbox at the start of the menu item.",
|
|
16
|
+
"default": null,
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 35
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "customClass",
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Custom CSS class to apply to the li element.",
|
|
24
|
+
"default": "''",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 38
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "disabled",
|
|
30
|
+
"type": "boolean",
|
|
31
|
+
"description": "The disabled state of the menu item.",
|
|
32
|
+
"default": null,
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 41
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "label",
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "The text rendered in the menu item.",
|
|
40
|
+
"default": "''",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 44
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "startIcon",
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "The modus icon name to render on the start of the menu item.",
|
|
48
|
+
"default": null,
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 47
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "selected",
|
|
54
|
+
"type": "boolean",
|
|
55
|
+
"description": "The selected state of the menu item.",
|
|
56
|
+
"default": null,
|
|
57
|
+
"mutable": false,
|
|
58
|
+
"end_line": 50
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "focused",
|
|
62
|
+
"type": "boolean",
|
|
63
|
+
"description": "The focused state of the menu item.",
|
|
64
|
+
"default": null,
|
|
65
|
+
"mutable": false,
|
|
66
|
+
"end_line": 53
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "size",
|
|
70
|
+
"type": "ModusSize",
|
|
71
|
+
"description": "The size of the menu item.",
|
|
72
|
+
"default": "'md'",
|
|
73
|
+
"mutable": false,
|
|
74
|
+
"end_line": 56
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "subLabel",
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "The text rendered beneath the label.",
|
|
80
|
+
"default": null,
|
|
81
|
+
"mutable": false,
|
|
82
|
+
"end_line": 59
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "tooltipContent",
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "The tooltip text to display when hovering over the menu item.",
|
|
88
|
+
"default": null,
|
|
89
|
+
"mutable": false,
|
|
90
|
+
"end_line": 62
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "tooltipPosition",
|
|
94
|
+
"type": "'auto' | 'top' | 'right' | 'bottom' | 'left'",
|
|
95
|
+
"description": "The position of the tooltip relative to the menu item.",
|
|
96
|
+
"default": "'auto'",
|
|
97
|
+
"mutable": false,
|
|
98
|
+
"end_line": 66
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "value",
|
|
102
|
+
"type": "string",
|
|
103
|
+
"description": "The unique identifying value of the menu item.",
|
|
104
|
+
"default": "''",
|
|
105
|
+
"mutable": false,
|
|
106
|
+
"end_line": 69
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "hasSubmenu",
|
|
110
|
+
"type": "boolean",
|
|
111
|
+
"description": "Whether this menu item has a collapsible submenu. When true, the item will show a caret and handle toggle behavior.",
|
|
112
|
+
"default": null,
|
|
113
|
+
"mutable": false,
|
|
114
|
+
"end_line": 72
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"events": [
|
|
118
|
+
{
|
|
119
|
+
"name": "itemSelect",
|
|
120
|
+
"detail": "{ value: string; selected?: boolean; }",
|
|
121
|
+
"description": "Event emitted when a menu item is selected.",
|
|
122
|
+
"end_line": 81
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
"methods": [
|
|
126
|
+
{
|
|
127
|
+
"name": "collapseSubmenu",
|
|
128
|
+
"signature": "()",
|
|
129
|
+
"parameters": "",
|
|
130
|
+
"returnType": "P",
|
|
131
|
+
"description": "Public method to collapse the submenu if it's expanded",
|
|
132
|
+
"end_line": 101
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"slots": [
|
|
136
|
+
{
|
|
137
|
+
"name": "start-icon",
|
|
138
|
+
"description": "Slot for start-icon content"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"name": "default",
|
|
142
|
+
"description": "Slot for default content"
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"examples": {
|
|
146
|
+
"basic": "<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n ?checkbox=${args.checkbox}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n tooltip-content=${ifDefined(args['tooltip-content'])}\n tooltip-position=${ifDefined(args['tooltip-position'])}\n value=${args.value}\n ></modus-wc-menu-item>\n</modus-wc-menu>",
|
|
147
|
+
"variations": [],
|
|
148
|
+
"args": {
|
|
149
|
+
"label": "'Menu Item'",
|
|
150
|
+
"size": "'md'",
|
|
151
|
+
"value": "'menuItem'"
|
|
152
|
+
},
|
|
153
|
+
"argTypes": {},
|
|
154
|
+
"usage": [],
|
|
155
|
+
"events": [
|
|
156
|
+
"itemSelect"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"tag": "modus-wc-menu-item",
|
|
160
|
+
"storyExample": {
|
|
161
|
+
"template": "<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n ?checkbox=${args.checkbox}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n tooltip-content=${ifDefined(args['tooltip-content'])}\n tooltip-position=${ifDefined(args['tooltip-position'])}\n value=${args.value}\n ></modus-wc-menu-item>\n</modus-wc-menu>",
|
|
162
|
+
"args": {
|
|
163
|
+
"label": "'Menu Item'",
|
|
164
|
+
"size": "'md'",
|
|
165
|
+
"value": "'menuItem'"
|
|
166
|
+
},
|
|
167
|
+
"argTypes": {},
|
|
168
|
+
"events": [
|
|
169
|
+
"itemSelect"
|
|
170
|
+
],
|
|
171
|
+
"fullContent": "import { withActions } from '@storybook/addon-actions/decorator';\nimport { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createShadowHostClass } from '../../providers/shadow-dom/shadow-host-helper';\nimport { ModusSize } from '../types';\n\ninterface MenuItemArgs {\n bordered?: boolean;\n checkbox?: boolean;\n 'custom-class'?: string;\n disabled?: boolean;\n 'has-submenu'?: boolean;\n label: string;\n selected?: boolean;\n size?: ModusSize;\n 'sub-label'?: string;\n 'tooltip-content'?: string;\n 'tooltip-position'?: 'auto' | 'top' | 'right' | 'bottom' | 'left';\n value: string;\n}\n\nconst meta: Meta<MenuItemArgs> = {\n title: 'Components/Menu Item',\n component: 'modus-wc-menu-item',\n args: {\n label: 'Menu Item',\n size: 'md',\n value: 'menuItem',\n },\n argTypes: {\n size: {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n 'tooltip-position': {\n control: { type: 'select' },\n options: ['auto', 'top', 'right', 'bottom', 'left'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['itemSelect'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<MenuItemArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n ?checkbox=${args.checkbox}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n tooltip-content=${ifDefined(args['tooltip-content'])}\n tooltip-position=${ifDefined(args['tooltip-position'])}\n value=${args.value}\n ></modus-wc-menu-item>\n</modus-wc-menu>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n\nexport const WithIcon: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n ?checkbox=${args.checkbox}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n tooltip-content=${ifDefined(args['tooltip-content'])}\n tooltip-position=${ifDefined(args['tooltip-position'])}\n value=${args.value}\n >\n <modus-wc-icon\n slot=\"start-icon\"\n name=\"alert\"\n size=\"sm\"\n ></modus-wc-icon>\n </modus-wc-menu-item>\n</modus-wc-menu>\n `;\n },\n};\nexport const WithCheckbox: Story = {\n args: {\n checkbox: true,\n },\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n ?checkbox=${args.checkbox}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n value=${args.value}\n ></modus-wc-menu-item>\n</modus-wc-menu>\n `;\n },\n};\n\nexport const WithTooltip: Story = {\n args: {\n 'tooltip-content': 'This is a tooltip for the menu item',\n 'tooltip-position': 'top',\n },\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-menu>\n <modus-wc-menu-item\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n label=${args.label}\n ?selected=${args.selected}\n size=${args.size}\n sub-label=${ifDefined(args['sub-label'])}\n tooltip-content=${ifDefined((args['tooltip-content']))}\n tooltip-position=${ifDefined(args['tooltip-position'])}\n value=${args.value}\n ></modus-wc-menu-item>\n</modus-wc-menu>\n `;\n },\n};\n\nexport const ShadowDomParent: Story = {\n render: (args) => {\n // Create a unique shadow host for menu-item component\n if (!customElements.get('menu-item-shadow-host')) {\n const MenuItemShadowHost = createShadowHostClass<MenuItemArgs>({\n componentTag: 'modus-wc-menu',\n propsMapper: (v: MenuItemArgs, el: HTMLElement) => {\n const menuEl = el as unknown as {\n ariaLabel: string;\n };\n menuEl.ariaLabel = 'Shadow DOM Menu';\n\n // Get or create menu item\n let menuItem = el.querySelector('modus-wc-menu-item');\n if (!menuItem) {\n menuItem = document.createElement('modus-wc-menu-item');\n el.innerHTML = '';\n el.appendChild(menuItem);\n }\n\n // Update properties on the existing element\n const menuItemEl = menuItem as unknown as {\n ariaLabel: string;\n bordered: boolean;\n checkbox: boolean;\n customClass: string;\n disabled: boolean;\n label: string;\n selected: boolean;\n size: string;\n subLabel: string;\n tooltipContent: string;\n tooltipPosition: string;\n value: string;\n };\n\n menuItemEl.ariaLabel = 'Menu item in shadow DOM';\n menuItemEl.bordered = Boolean(v.bordered);\n menuItemEl.checkbox = Boolean(v.checkbox);\n menuItemEl.customClass = v['custom-class'] || '';\n menuItemEl.disabled = Boolean(v.disabled);\n menuItemEl.label = v.label;\n menuItemEl.selected = Boolean(v.selected);\n menuItemEl.size = v.size || 'md';\n menuItemEl.subLabel = v['sub-label'] || '';\n menuItemEl.tooltipContent = v['tooltip-content'] || '';\n menuItemEl.tooltipPosition = v['tooltip-position'] || 'auto';\n menuItemEl.value = v.value;\n },\n });\n customElements.define('menu-item-shadow-host', MenuItemShadowHost);\n }\n\n return html`<menu-item-shadow-host\n .props=${{ ...args }}\n ></menu-item-shadow-host>`;\n },\n};\n"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable menu component used to display a list of li elements vertically or horizontally. The component supports a `<slot>` for injecting custom li elements inside the ul element.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "bordered",
|
|
6
|
+
"type": "boolean",
|
|
7
|
+
"description": "Indicates that the menu should have a border.",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 31
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "customClass",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Custom CSS class to apply to the ul element.",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 34
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "orientation",
|
|
22
|
+
"type": "Orientation",
|
|
23
|
+
"description": "The orientation of the menu.",
|
|
24
|
+
"default": "'vertical'",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 37
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "size",
|
|
30
|
+
"type": "ModusSize",
|
|
31
|
+
"description": "The size of the menu.",
|
|
32
|
+
"default": "'md'",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 40
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "isSubMenu",
|
|
38
|
+
"type": "boolean",
|
|
39
|
+
"description": "Indicates that this menu is a submenu (dropdown).",
|
|
40
|
+
"default": null,
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 43
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"events": [
|
|
46
|
+
{
|
|
47
|
+
"name": "menuFocusout",
|
|
48
|
+
"detail": "FocusEvent",
|
|
49
|
+
"description": "Event emitted when the menu loses focus.",
|
|
50
|
+
"end_line": 46
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"methods": [],
|
|
54
|
+
"slots": [
|
|
55
|
+
{
|
|
56
|
+
"name": "default",
|
|
57
|
+
"description": "Slot for default content"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"examples": {
|
|
61
|
+
"basic": "<modus-wc-menu\n aria-label=\"Menu\"\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n orientation=${ifDefined(args.orientation)}\n size=${ifDefined(args.size)}\n>\n <modus-wc-menu-item\n label=\"Small\"\n value=\"1\"\n size=\"sm\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Medium\" value=\"2\"></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Large\"\n value=\"3\"\n size=\"lg\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Bordered\"\n value=\"3\"\n bordered=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Sub-label\"\n value=\"3\"\n sub-label=\"Sub-label\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Selected\"\n value=\"3\"\n selected=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Start Icon\"\n value=\"3\"\n >\n <modus-wc-icon slot=\"start-icon\" name=\"info\"></modus-wc-icon>\n </modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Disabled\"\n value=\"3\"\n disabled=\"true\"\n ></modus-wc-menu-item>\n</modus-wc-menu>",
|
|
62
|
+
"variations": [],
|
|
63
|
+
"args": {
|
|
64
|
+
"orientation": "'vertical'",
|
|
65
|
+
"size": "'md'"
|
|
66
|
+
},
|
|
67
|
+
"argTypes": {},
|
|
68
|
+
"usage": [],
|
|
69
|
+
"events": [
|
|
70
|
+
"menuFocusout"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"tag": "modus-wc-menu",
|
|
74
|
+
"storyExample": {
|
|
75
|
+
"template": "<modus-wc-menu\n aria-label=\"Menu\"\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n orientation=${ifDefined(args.orientation)}\n size=${ifDefined(args.size)}\n>\n <modus-wc-menu-item\n label=\"Small\"\n value=\"1\"\n size=\"sm\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Medium\" value=\"2\"></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Large\"\n value=\"3\"\n size=\"lg\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Bordered\"\n value=\"3\"\n bordered=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Sub-label\"\n value=\"3\"\n sub-label=\"Sub-label\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Selected\"\n value=\"3\"\n selected=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Start Icon\"\n value=\"3\"\n >\n <modus-wc-icon slot=\"start-icon\" name=\"info\"></modus-wc-icon>\n </modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Disabled\"\n value=\"3\"\n disabled=\"true\"\n ></modus-wc-menu-item>\n</modus-wc-menu>",
|
|
76
|
+
"args": {
|
|
77
|
+
"orientation": "'vertical'",
|
|
78
|
+
"size": "'md'"
|
|
79
|
+
},
|
|
80
|
+
"argTypes": {},
|
|
81
|
+
"events": [
|
|
82
|
+
"menuFocusout"
|
|
83
|
+
],
|
|
84
|
+
"fullContent": "import { withActions } from '@storybook/addon-actions/decorator';\nimport { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createShadowHostClass } from '../../providers/shadow-dom/shadow-host-helper';\nimport { ModusSize, Orientation } from '../types';\n\ninterface MenuArgs {\n bordered?: boolean;\n 'custom-class'?: string;\n orientation?: Orientation;\n size?: ModusSize;\n}\n\nconst meta: Meta<MenuArgs> = {\n title: 'Components/Menu',\n component: 'modus-wc-menu',\n args: {\n orientation: 'vertical',\n size: 'md',\n },\n argTypes: {\n orientation: {\n control: { type: 'select' },\n options: ['horizontal', 'vertical'],\n },\n size: {\n control: { type: 'select' },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['menuFocusout'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<MenuArgs>;\n\nexport const Default: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-menu\n aria-label=\"Menu\"\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n orientation=${ifDefined(args.orientation)}\n size=${ifDefined(args.size)}\n>\n <modus-wc-menu-item\n label=\"Small\"\n value=\"1\"\n size=\"sm\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Medium\" value=\"2\"></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Large\"\n value=\"3\"\n size=\"lg\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Bordered\"\n value=\"3\"\n bordered=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Sub-label\"\n value=\"3\"\n sub-label=\"Sub-label\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Selected\"\n value=\"3\"\n selected=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Start Icon\"\n value=\"3\"\n >\n <modus-wc-icon slot=\"start-icon\" name=\"info\"></modus-wc-icon>\n </modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Disabled\"\n value=\"3\"\n disabled=\"true\"\n ></modus-wc-menu-item>\n</modus-wc-menu>\n `;\n },\n};\n\nexport const CustomMenu: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<style>\n .custom-menu-width {\n width: 400px;\n }\n .custom-flex-row {\n display: flex;\n align-items: center;\n }\n .custom-nested-row {\n padding-inline-start: 3rem;\n }\n .custom-justify-end {\n margin-left: auto;\n }\n .green-square {\n height: 18px;\n width: 18px;\n background-color: green;\n }\n .red-square {\n height: 18px;\n width: 18px;\n background-color: red;\n }\n</style>\n<modus-wc-menu\n aria-label=\"Custom menu\"\n custom-class=\"custom-menu-width\"\n>\n <li>\n <div class=\"custom-flex-row\">\n <modus-wc-icon decorative=\"true\" name=\"expand_more\"></modus-wc-icon>\n <modus-wc-button aria-label=\"Visible button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Visible icon\" name=\"visibility_on\"></modus-wc-icon>\n </modus-wc-button>\n <div>Parent</div>\n <div class=\"custom-justify-end\">\n <modus-wc-button aria-label=\"Actions button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Actions icon\" name=\"more_vertical\"></modus-wc-icon>\n </modus-wc-button>\n </div>\n </div>\n </li>\n <li>\n <div class=\"custom-flex-row custom-nested-row\">\n <modus-wc-button aria-label=\"Visible button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Visible icon\" name=\"visibility_on\"></modus-wc-icon>\n </modus-wc-button>\n <div class=\"green-square\"></div>\n <div>Child</div>\n <div class=\"custom-justify-end\">\n <modus-wc-button aria-label=\"Actions button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Actions icon\" name=\"more_vertical\"></modus-wc-icon>\n </modus-wc-button>\n </div>\n </div>\n </li>\n <li>\n <div class=\"custom-flex-row custom-nested-row\">\n <modus-wc-button aria-label=\"Visible button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Invisible icon\" name=\"visibility_off\"></modus-wc-icon>\n </modus-wc-button>\n <div class=\"red-square\"></div>\n <div>Child</div>\n <div class=\"custom-justify-end\">\n <modus-wc-button aria-label=\"Actions button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Actions icon\" name=\"more_vertical\"></modus-wc-icon>\n </modus-wc-button>\n </div>\n </div>\n </li>\n <li>\n <div class=\"custom-flex-row\">\n <modus-wc-icon decorative=\"true\" name=\"chevron_right\"></modus-wc-icon>\n <modus-wc-button aria-label=\"Visible button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Visible icon\" name=\"visibility_on\"></modus-wc-icon>\n </modus-wc-button>\n <div>Parent</div>\n <div class=\"custom-justify-end\">\n <modus-wc-button aria-label=\"Actions button\" size=\"sm\" shape=\"circle\" variant=\"borderless\">\n <modus-wc-icon aria-label=\"Actions icon\" name=\"more_vertical\"></modus-wc-icon>\n </modus-wc-button>\n </div>\n </div>\n </li>\n</modus-wc-menu>\n `;\n },\n};\n\nexport const CollapsibleMenu: Story = {\n render: () => {\n return html`\n <style>\n .menu-width {\n width: 400px;\n }\n </style>\n <modus-wc-menu custom-class=\"menu-width\">\n <modus-wc-menu-item\n label=\"Charts\"\n .hasSubmenu=${true}\n id=\"charts-menu\"\n value=\"charts\"\n >\n <modus-wc-icon\n slot=\"start-icon\"\n decorative=\"true\"\n name=\"bar_graph\"\n ></modus-wc-icon>\n <modus-wc-menu .isSubMenu=${true} id=\"charts-submenu\">\n <modus-wc-menu-item label=\"Bar Chart\" value=\"bar-chart\">\n </modus-wc-menu-item>\n <modus-wc-menu-item label=\"Line Chart\" value=\"line-chart\">\n </modus-wc-menu-item>\n </modus-wc-menu>\n </modus-wc-menu-item>\n\n <modus-wc-menu-item label=\"Calendar\" value=\"calendar\">\n <modus-wc-icon\n slot=\"start-icon\"\n decorative=\"true\"\n name=\"calendar\"\n ></modus-wc-icon>\n </modus-wc-menu-item>\n\n <modus-wc-menu-item\n label=\"Reports\"\n .hasSubmenu=${true}\n id=\"reports-menu\"\n value=\"reports\"\n >\n <modus-wc-icon\n slot=\"start-icon\"\n decorative=\"true\"\n name=\"master_data\"\n ></modus-wc-icon>\n <modus-wc-menu .isSubMenu=${true} id=\"reports-submenu\">\n <modus-wc-menu-item label=\"Monthly Report\" value=\"monthly-report\">\n </modus-wc-menu-item>\n <modus-wc-menu-item label=\"Annual Report\" value=\"annual-report\">\n </modus-wc-menu-item>\n </modus-wc-menu>\n </modus-wc-menu-item>\n </modus-wc-menu>\n\n <script>\n // Adding this block to show how to set submenu properties via JS\n // document.addEventListener('DOMContentLoaded', () => {\n // const chartsMenu = document.querySelector('#charts-menu');\n // const reportsMenu = document.querySelector('#reports-menu');\n // const chartsSubMenu = document.querySelector('#charts-submenu');\n // const reportsSubMenu = document.querySelector('#reports-submenu');\n\n // // Set hasSubmenu property for menu items with submenus\n // [chartsMenu, reportsMenu].forEach((menuItem) => {\n // if (menuItem) {\n // menuItem.hasSubmenu = true;\n // }\n // });\n\n // // Set isSubMenu for all submenu elements\n // [chartsSubMenu, reportsSubMenu].forEach((submenu) => {\n // if (submenu) {\n // submenu.isSubMenu = true;\n // }\n // });\n // });\n </script>\n `;\n },\n};\n\nexport const ShadowDomParent: Story = {\n render: (args) => {\n // Create a unique shadow host for menu component\n if (!customElements.get('menu-shadow-host')) {\n const MenuShadowHost = createShadowHostClass<MenuArgs>({\n componentTag: 'modus-wc-menu',\n propsMapper: (v: MenuArgs, el: HTMLElement) => {\n const menuEl = el as unknown as {\n ariaLabel: string;\n bordered: boolean;\n customClass: string;\n orientation: string;\n size: string;\n };\n menuEl.ariaLabel = 'Shadow DOM Menu';\n menuEl.bordered = Boolean(v.bordered);\n menuEl.customClass = v['custom-class'] || '';\n menuEl.orientation = v.orientation || 'vertical';\n menuEl.size = v.size || 'md';\n\n // Only set innerHTML once on initial creation\n if (!el.querySelector('modus-wc-menu-item')) {\n el.innerHTML = `\n <modus-wc-menu-item\n label=\"Small\"\n value=\"1\"\n size=\"sm\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Medium\" value=\"2\"></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Large\"\n value=\"3\"\n size=\"lg\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Bordered\"\n value=\"3\"\n bordered=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Sub-label\"\n value=\"3\"\n sub-label=\"Sub-label\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Selected\"\n value=\"3\"\n selected=\"true\"\n ></modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"With Start Icon\"\n value=\"3\"\n >\n <modus-wc-icon slot=\"start-icon\" name=\"info\"></modus-wc-icon>\n </modus-wc-menu-item>\n <modus-wc-menu-item\n label=\"Disabled\"\n value=\"3\"\n disabled=\"true\"\n ></modus-wc-menu-item>\n `;\n }\n },\n });\n customElements.define('menu-shadow-host', MenuShadowHost);\n }\n\n return html`<menu-shadow-host .props=${{ ...args }}></menu-shadow-host>`;\n },\n};\n"
|
|
85
|
+
}
|
|
86
|
+
}
|