@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,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable divider component used to separate content horizontally or vertically",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "color",
|
|
6
|
+
"type": "| 'primary' | 'secondary' | 'tertiary' | 'high-contrast' | 'success' | 'warning' | 'danger'",
|
|
7
|
+
"description": "The color of the divider line.",
|
|
8
|
+
"default": "'tertiary'",
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 27
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "content",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "The content to display in the divider.",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 30
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "customClass",
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Custom CSS class to apply to the divider element.",
|
|
24
|
+
"default": "''",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 33
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "orientation",
|
|
30
|
+
"type": "Orientation",
|
|
31
|
+
"description": "The orientation of the divider. This is in reference to how content will be rendered around the divider.",
|
|
32
|
+
"default": "'vertical'",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 36
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "position",
|
|
38
|
+
"type": "'center' | 'end' | 'start'",
|
|
39
|
+
"description": "The position of the divider.",
|
|
40
|
+
"default": "'center'",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 39
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "responsive",
|
|
46
|
+
"type": "boolean",
|
|
47
|
+
"description": "Whether the divider is responsive or not.",
|
|
48
|
+
"default": "true",
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 42
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"events": [],
|
|
54
|
+
"methods": [],
|
|
55
|
+
"slots": [],
|
|
56
|
+
"examples": {
|
|
57
|
+
"basic": null,
|
|
58
|
+
"variations": [],
|
|
59
|
+
"args": {
|
|
60
|
+
"color": "'tertiary'",
|
|
61
|
+
"content": "''",
|
|
62
|
+
"custom-class": "''",
|
|
63
|
+
"orientation": "'vertical'",
|
|
64
|
+
"position": "'center'",
|
|
65
|
+
"responsive": "true"
|
|
66
|
+
},
|
|
67
|
+
"argTypes": {},
|
|
68
|
+
"usage": []
|
|
69
|
+
},
|
|
70
|
+
"tag": "modus-wc-divider",
|
|
71
|
+
"storyExample": {
|
|
72
|
+
"template": "",
|
|
73
|
+
"args": {
|
|
74
|
+
"color": "'tertiary'",
|
|
75
|
+
"content": "''",
|
|
76
|
+
"custom-class": "''",
|
|
77
|
+
"orientation": "'vertical'",
|
|
78
|
+
"position": "'center'",
|
|
79
|
+
"responsive": "true"
|
|
80
|
+
},
|
|
81
|
+
"argTypes": {},
|
|
82
|
+
"events": [],
|
|
83
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { Orientation } from '../types';\n\ninterface DividerArgs {\n color:\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'high-contrast'\n | 'success'\n | 'warning'\n | 'danger';\n content: string;\n 'custom-class'?: string;\n orientation: Orientation;\n position: 'center' | 'end' | 'start';\n responsive: boolean;\n}\n\nconst meta: Meta<DividerArgs> = {\n title: 'Components/Divider',\n component: 'modus-wc-divider',\n args: {\n color: 'tertiary',\n content: '',\n 'custom-class': '',\n orientation: 'vertical',\n position: 'center',\n responsive: true,\n },\n argTypes: {\n color: {\n control: { type: 'select' },\n options: [\n 'primary',\n 'secondary',\n 'tertiary',\n 'high-contrast',\n 'success',\n 'warning',\n 'danger',\n ],\n },\n content: {\n control: 'text',\n },\n 'custom-class': {\n control: 'text',\n },\n orientation: {\n control: { type: 'select' },\n options: ['horizontal', 'vertical'],\n },\n position: {\n control: { type: 'select' },\n options: ['start', 'center', 'end'],\n },\n responsive: {\n control: { type: 'boolean' },\n },\n },\n parameters: {\n layout: 'padded',\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<DividerArgs>;\n\nconst Template: Story = {\n render: (args) => html`\n <modus-wc-divider\n color=\"${args.color}\"\n content=\"${args.content}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n orientation=\"${args.orientation}\"\n position=\"${args.position}\"\n responsive=\"${args.responsive}\"\n style=\"${args.orientation === 'horizontal'\n ? 'display: flex; height: 100px'\n : ''}\"\n ></modus-wc-divider>\n `,\n};\n\nexport const Default: Story = { ...Template };\n"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A customizable dropdown menu component used to render a button and toggleable menu. The component supports a 'button' and 'menu' `<slot>` for injecting custom HTML content.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "buttonAriaLabel",
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "The aria-label for the dropdown button.",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 35
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "buttonColor",
|
|
14
|
+
"type": "| 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger'",
|
|
15
|
+
"description": "The color variant of the button.",
|
|
16
|
+
"default": "'primary'",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 43
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "buttonSize",
|
|
22
|
+
"type": "DaisySize",
|
|
23
|
+
"description": "The size of the button.",
|
|
24
|
+
"default": "'md'",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 46
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "buttonVariant",
|
|
30
|
+
"type": "'borderless' | 'filled' | 'outlined'",
|
|
31
|
+
"description": "The variant of the button.",
|
|
32
|
+
"default": "'filled'",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 49
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "customClass",
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "Custom CSS class to apply to the host element.",
|
|
40
|
+
"default": "''",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 52
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "disabled",
|
|
46
|
+
"type": "boolean",
|
|
47
|
+
"description": "If true, the button will be disabled.",
|
|
48
|
+
"default": "false",
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 55
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "menuBordered",
|
|
54
|
+
"type": "boolean",
|
|
55
|
+
"description": "Indicates that the menu should have a border.",
|
|
56
|
+
"default": "true",
|
|
57
|
+
"mutable": false,
|
|
58
|
+
"end_line": 58
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "menuOffset",
|
|
62
|
+
"type": "number",
|
|
63
|
+
"description": "Distance between the button and menu in pixels.",
|
|
64
|
+
"default": "10",
|
|
65
|
+
"mutable": false,
|
|
66
|
+
"end_line": 61
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "menuPlacement",
|
|
70
|
+
"type": "PopoverPlacement",
|
|
71
|
+
"description": "The placement of the menu relative to the button.",
|
|
72
|
+
"default": "'bottom-start'",
|
|
73
|
+
"mutable": false,
|
|
74
|
+
"end_line": 64
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "menuSize",
|
|
78
|
+
"type": "ModusSize",
|
|
79
|
+
"description": "The size of the menu.",
|
|
80
|
+
"default": "'md'",
|
|
81
|
+
"mutable": false,
|
|
82
|
+
"end_line": 67
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "menuVisible",
|
|
86
|
+
"type": "boolean",
|
|
87
|
+
"description": "Indicates that the menu is visible.",
|
|
88
|
+
"default": "false",
|
|
89
|
+
"mutable": true,
|
|
90
|
+
"end_line": 70
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"events": [
|
|
94
|
+
{
|
|
95
|
+
"name": "menuVisibilityChange",
|
|
96
|
+
"detail": "{ isVisible: boolean }",
|
|
97
|
+
"description": "Event emitted when the menuVisible prop changes.",
|
|
98
|
+
"end_line": 73
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"methods": [],
|
|
102
|
+
"slots": [
|
|
103
|
+
{
|
|
104
|
+
"name": "button",
|
|
105
|
+
"description": "Slot for button content"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "menu",
|
|
109
|
+
"description": "Slot for menu content"
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"examples": {
|
|
113
|
+
"basic": "<style>\n /* Storybook styling */\n div#story--components-dropdown-menu--default--primary-inner {\n display: flex;\n align-items: center;\n height: 240px;\n }\n\n [slot=\"button\"] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .value {\n font-size: 14px;\n padding-top: 12px;\n }\n</style>\n\n\n\n<modus-wc-dropdown-menu\n button-aria-label=${ifDefined(args['button-aria-label'])}\n button-color=${ifDefined(args['button-color'])}\n button-size=${ifDefined(args['button-size'])}\n button-variant=${ifDefined(args['button-variant'])}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n ?menu-bordered=${args['menu-bordered']}\n menu-offset=${ifDefined(args['menu-offset'])}\n menu-placement=${ifDefined(args['menu-placement'])}\n menu-size=${ifDefined(args['menu-size'])}\n ?menu-visible=${args['menu-visible']}\n>\n <div slot=\"button\">\n Button\n <modus-wc-icon name=\"expand_more\" size=\"sm\" />\n </div>\n\n <div slot=\"menu\">\n <modus-wc-menu-item label=\"Item One\" value=\"1\" @itemSelect=${handleItemSelect}></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Two\" value=\"2\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Three\" value=\"3\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n </div>\n</modus-wc-dropdown-menu>\n<script>\n // // Adding this block to handle menu item selection to update a label and close the dropdown via JS.\n // let selectedValue = '';\n\n // const handleItemSelect = (event) => {\n // // Update the \"Selected Value\" label\n // selectedValue = event.detail.value;\n // const displayElement = document.querySelector('#selected-value');\n // if (displayElement) {\n // displayElement.textContent = selectedValue;\n // }\n\n // // Close the dropdown menu when an item is selected\n // const dropdownMenu = event.target;\n // const dropdownMenuElement = dropdownMenu.closest(\n // 'modus-wc-dropdown-menu'\n // );\n // if (dropdownMenuElement) {\n // dropdownMenuElement.menuVisible = false;\n // }\n // };\n // const menuItems = document.querySelectorAll('modus-wc-menu-item');\n // menuItems.forEach(item => {\n // item.addEventListener('itemSelect', handleItemSelect);\n // });\n</script>\n\n<div class=\"value\">\n Selected Value:\n <span id=\"selected-value\"></span>\n</div>",
|
|
114
|
+
"variations": [],
|
|
115
|
+
"args": {
|
|
116
|
+
"button-aria-label": "'Dropdown menu button'",
|
|
117
|
+
"button-color": "'primary'",
|
|
118
|
+
"button-size": "'md'",
|
|
119
|
+
"button-variant": "'filled'",
|
|
120
|
+
"disabled": "false",
|
|
121
|
+
"menu-bordered": "true",
|
|
122
|
+
"menu-offset": "14",
|
|
123
|
+
"menu-placement": "'bottom-start'",
|
|
124
|
+
"menu-size": "'md'",
|
|
125
|
+
"menu-visible": "false"
|
|
126
|
+
},
|
|
127
|
+
"argTypes": {},
|
|
128
|
+
"usage": [],
|
|
129
|
+
"events": [
|
|
130
|
+
"menuVisibilityChange"
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
"tag": "modus-wc-dropdown-menu",
|
|
134
|
+
"storyExample": {
|
|
135
|
+
"template": "<style>\n /* Storybook styling */\n div#story--components-dropdown-menu--default--primary-inner {\n display: flex;\n align-items: center;\n height: 240px;\n }\n\n [slot=\"button\"] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .value {\n font-size: 14px;\n padding-top: 12px;\n }\n</style>\n\n\n\n<modus-wc-dropdown-menu\n button-aria-label=${ifDefined(args['button-aria-label'])}\n button-color=${ifDefined(args['button-color'])}\n button-size=${ifDefined(args['button-size'])}\n button-variant=${ifDefined(args['button-variant'])}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n ?menu-bordered=${args['menu-bordered']}\n menu-offset=${ifDefined(args['menu-offset'])}\n menu-placement=${ifDefined(args['menu-placement'])}\n menu-size=${ifDefined(args['menu-size'])}\n ?menu-visible=${args['menu-visible']}\n>\n <div slot=\"button\">\n Button\n <modus-wc-icon name=\"expand_more\" size=\"sm\" />\n </div>\n\n <div slot=\"menu\">\n <modus-wc-menu-item label=\"Item One\" value=\"1\" @itemSelect=${handleItemSelect}></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Two\" value=\"2\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Three\" value=\"3\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n </div>\n</modus-wc-dropdown-menu>\n<script>\n // // Adding this block to handle menu item selection to update a label and close the dropdown via JS.\n // let selectedValue = '';\n\n // const handleItemSelect = (event) => {\n // // Update the \"Selected Value\" label\n // selectedValue = event.detail.value;\n // const displayElement = document.querySelector('#selected-value');\n // if (displayElement) {\n // displayElement.textContent = selectedValue;\n // }\n\n // // Close the dropdown menu when an item is selected\n // const dropdownMenu = event.target;\n // const dropdownMenuElement = dropdownMenu.closest(\n // 'modus-wc-dropdown-menu'\n // );\n // if (dropdownMenuElement) {\n // dropdownMenuElement.menuVisible = false;\n // }\n // };\n // const menuItems = document.querySelectorAll('modus-wc-menu-item');\n // menuItems.forEach(item => {\n // item.addEventListener('itemSelect', handleItemSelect);\n // });\n</script>\n\n<div class=\"value\">\n Selected Value:\n <span id=\"selected-value\"></span>\n</div>",
|
|
136
|
+
"args": {
|
|
137
|
+
"button-aria-label": "'Dropdown menu button'",
|
|
138
|
+
"button-color": "'primary'",
|
|
139
|
+
"button-size": "'md'",
|
|
140
|
+
"button-variant": "'filled'",
|
|
141
|
+
"disabled": "false",
|
|
142
|
+
"menu-bordered": "true",
|
|
143
|
+
"menu-offset": "14",
|
|
144
|
+
"menu-placement": "'bottom-start'",
|
|
145
|
+
"menu-size": "'md'",
|
|
146
|
+
"menu-visible": "false"
|
|
147
|
+
},
|
|
148
|
+
"argTypes": {},
|
|
149
|
+
"events": [
|
|
150
|
+
"menuVisibilityChange"
|
|
151
|
+
],
|
|
152
|
+
"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 { DaisySize, ModusSize, PopoverPlacement } from '../types';\n\ninterface DropdownMenuArgs {\n 'button-aria-label'?: string;\n 'button-color'?: 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';\n 'button-size'?: DaisySize;\n 'button-variant'?: 'borderless' | 'filled' | 'outlined';\n 'custom-class'?: string;\n disabled?: boolean;\n 'menu-bordered'?: boolean;\n 'menu-offset'?: number;\n 'menu-placement'?: PopoverPlacement;\n 'menu-size'?: ModusSize;\n 'menu-visible': boolean;\n}\n\nconst meta: Meta<DropdownMenuArgs> = {\n title: 'Components/Dropdown Menu',\n component: 'modus-wc-dropdown-menu',\n args: {\n 'button-aria-label': 'Dropdown menu button',\n 'button-color': 'primary',\n 'button-size': 'md',\n 'button-variant': 'filled',\n disabled: false,\n 'menu-bordered': true,\n 'menu-offset': 14,\n 'menu-placement': 'bottom-start',\n 'menu-size': 'md',\n 'menu-visible': false,\n },\n argTypes: {\n 'button-color': {\n control: { type: 'select' },\n options: ['primary', 'secondary', 'tertiary', 'warning', 'danger'],\n },\n 'button-size': {\n control: { type: 'select' },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n 'button-variant': {\n control: { type: 'select' },\n options: ['borderless', 'filled', 'outlined'],\n },\n 'menu-placement': {\n control: { type: 'select' },\n options: [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n ],\n },\n 'menu-size': {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['menuVisibilityChange'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<DropdownMenuArgs>;\n\nconst Template: Story = {\n render: (args) => {\n let selectedValue = '';\n\n const handleItemSelect = (event: CustomEvent) => {\n selectedValue = event.detail.value;\n const displayElement = document.querySelector('#selected-value');\n if (displayElement) {\n displayElement.textContent = selectedValue;\n }\n\n // Close the dropdown menu when an item is selected\n const dropdownMenu = event.target as HTMLElement;\n const dropdownMenuElement = dropdownMenu.closest(\n 'modus-wc-dropdown-menu'\n );\n if (dropdownMenuElement) {\n dropdownMenuElement.menuVisible = false;\n }\n };\n\n // prettier-ignore\n return html`\n<style>\n /* Storybook styling */\n div#story--components-dropdown-menu--default--primary-inner {\n display: flex;\n align-items: center;\n height: 240px;\n }\n\n [slot=\"button\"] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .value {\n font-size: 14px;\n padding-top: 12px;\n }\n</style>\n\n\n\n<modus-wc-dropdown-menu\n button-aria-label=${ifDefined(args['button-aria-label'])}\n button-color=${ifDefined(args['button-color'])}\n button-size=${ifDefined(args['button-size'])}\n button-variant=${ifDefined(args['button-variant'])}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n ?menu-bordered=${args['menu-bordered']}\n menu-offset=${ifDefined(args['menu-offset'])}\n menu-placement=${ifDefined(args['menu-placement'])}\n menu-size=${ifDefined(args['menu-size'])}\n ?menu-visible=${args['menu-visible']}\n>\n <div slot=\"button\">\n Button\n <modus-wc-icon name=\"expand_more\" size=\"sm\" />\n </div>\n\n <div slot=\"menu\">\n <modus-wc-menu-item label=\"Item One\" value=\"1\" @itemSelect=${handleItemSelect}></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Two\" value=\"2\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Item Three\" value=\"3\" @itemSelect=${handleItemSelect} /></modus-wc-menu-item>\n </div>\n</modus-wc-dropdown-menu>\n<script>\n // // Adding this block to handle menu item selection to update a label and close the dropdown via JS.\n // let selectedValue = '';\n\n // const handleItemSelect = (event) => {\n // // Update the \"Selected Value\" label\n // selectedValue = event.detail.value;\n // const displayElement = document.querySelector('#selected-value');\n // if (displayElement) {\n // displayElement.textContent = selectedValue;\n // }\n\n // // Close the dropdown menu when an item is selected\n // const dropdownMenu = event.target;\n // const dropdownMenuElement = dropdownMenu.closest(\n // 'modus-wc-dropdown-menu'\n // );\n // if (dropdownMenuElement) {\n // dropdownMenuElement.menuVisible = false;\n // }\n // };\n // const menuItems = document.querySelectorAll('modus-wc-menu-item');\n // menuItems.forEach(item => {\n // item.addEventListener('itemSelect', handleItemSelect);\n // });\n</script>\n\n<div class=\"value\">\n Selected Value:\n <span id=\"selected-value\"></span>\n</div>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "File dropzone component that allows users to drag and drop files for upload. The component supports a `<slot>` called 'dropzone' for adding custom content such as progress indicators or additional instructions within the dropzone area.",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "acceptFileTypes",
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "Accepted file types (e.g. '.jpg,.png' or 'image/*')",
|
|
8
|
+
"default": null,
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 45
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "customClass",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Custom CSS class to apply to the file dropzone element",
|
|
16
|
+
"default": "''",
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 48
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "disabled",
|
|
22
|
+
"type": "boolean",
|
|
23
|
+
"description": "Disable the file input",
|
|
24
|
+
"default": null,
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 51
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "fileDraggedOverInstructions",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "Custom instructions shown when files are dragged over the dropzone",
|
|
32
|
+
"default": null,
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 54
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "includeStateIcon",
|
|
38
|
+
"type": "boolean",
|
|
39
|
+
"description": "Include state icon (upload, success, error)",
|
|
40
|
+
"default": "true",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 57
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "instructions",
|
|
46
|
+
"type": "string",
|
|
47
|
+
"description": "Custom instructions shown as the default dropzone message",
|
|
48
|
+
"default": null,
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 60
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "invalidFileTypeMessage",
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "Custom error message displayed when an invalid file type is selected",
|
|
56
|
+
"default": null,
|
|
57
|
+
"mutable": false,
|
|
58
|
+
"end_line": 63
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "maxFileNameLength",
|
|
62
|
+
"type": "number",
|
|
63
|
+
"description": "Maximum allowed length of filename, will show error if exceeded",
|
|
64
|
+
"default": null,
|
|
65
|
+
"mutable": false,
|
|
66
|
+
"end_line": 66
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "maxFileCount",
|
|
70
|
+
"type": "number",
|
|
71
|
+
"description": "Maximum number of files allowed, will show error if exceeded",
|
|
72
|
+
"default": null,
|
|
73
|
+
"mutable": false,
|
|
74
|
+
"end_line": 69
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "maxTotalFileSizeBytes",
|
|
78
|
+
"type": "number",
|
|
79
|
+
"description": "Maximum total file size in bytes allowed, will show error if exceeded",
|
|
80
|
+
"default": null,
|
|
81
|
+
"mutable": false,
|
|
82
|
+
"end_line": 72
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "multiple",
|
|
86
|
+
"type": "boolean",
|
|
87
|
+
"description": "Allow multiple file selection",
|
|
88
|
+
"default": null,
|
|
89
|
+
"mutable": false,
|
|
90
|
+
"end_line": 75
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "successMessage",
|
|
94
|
+
"type": "string",
|
|
95
|
+
"description": "Success message displayed when files are uploaded successfully",
|
|
96
|
+
"default": null,
|
|
97
|
+
"mutable": false,
|
|
98
|
+
"end_line": 78
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"events": [
|
|
102
|
+
{
|
|
103
|
+
"name": "fileSelect",
|
|
104
|
+
"detail": "FileList",
|
|
105
|
+
"description": "Event emitted when files are selected",
|
|
106
|
+
"end_line": 81
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"methods": [
|
|
110
|
+
{
|
|
111
|
+
"name": "reset",
|
|
112
|
+
"signature": "()",
|
|
113
|
+
"parameters": "",
|
|
114
|
+
"returnType": "void",
|
|
115
|
+
"description": "Reset the dropzone to its initial state, clearing all error and success states",
|
|
116
|
+
"end_line": 91
|
|
117
|
+
}
|
|
118
|
+
],
|
|
119
|
+
"slots": [
|
|
120
|
+
{
|
|
121
|
+
"name": "dropzone",
|
|
122
|
+
"description": "Slot for dropzone content"
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
"examples": {
|
|
126
|
+
"basic": null,
|
|
127
|
+
"variations": [],
|
|
128
|
+
"args": {
|
|
129
|
+
"accept-file-types": "'.doc",
|
|
130
|
+
"disabled": "false",
|
|
131
|
+
"include-state-icon": "true",
|
|
132
|
+
"instructions": "'Drag files here or browse to upload'"
|
|
133
|
+
},
|
|
134
|
+
"argTypes": {},
|
|
135
|
+
"usage": [],
|
|
136
|
+
"events": [
|
|
137
|
+
"fileSelect"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
"tag": "modus-wc-file-dropzone",
|
|
141
|
+
"storyExample": {
|
|
142
|
+
"template": "",
|
|
143
|
+
"args": {
|
|
144
|
+
"accept-file-types": "'.doc",
|
|
145
|
+
"disabled": "false",
|
|
146
|
+
"include-state-icon": "true",
|
|
147
|
+
"instructions": "'Drag files here or browse to upload'"
|
|
148
|
+
},
|
|
149
|
+
"argTypes": {},
|
|
150
|
+
"events": [
|
|
151
|
+
"fileSelect"
|
|
152
|
+
],
|
|
153
|
+
"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';\n\ninterface FileDropzoneArgs {\n 'accept-file-types'?: string;\n 'custom-class'?: string;\n disabled?: boolean;\n 'file-dragged-over-instructions'?: string;\n 'include-state-icon'?: boolean;\n instructions?: string;\n 'invalid-file-type-message'?: string;\n 'max-file-name-length'?: number;\n 'max-file-count'?: number;\n 'max-total-file-size-bytes'?: number;\n multiple?: boolean;\n 'success-message'?: string;\n reset?: () => Promise<void>;\n}\n\nconst meta: Meta<FileDropzoneArgs> = {\n title: 'Components/File Dropzone',\n component: 'modus-wc-file-dropzone',\n args: {\n 'accept-file-types': '.doc, .docx, .pdf',\n disabled: false,\n 'include-state-icon': true,\n instructions: 'Drag files here or browse to upload',\n },\n argTypes: {\n 'accept-file-types': {\n control: 'text',\n description: \"Accepted file types (e.g. '.jpg,.png' or 'image/*')\",\n },\n 'custom-class': {\n control: 'text',\n description: 'Custom CSS class to apply to the file dropzone element',\n },\n disabled: {\n control: 'boolean',\n description: 'Disable the file input',\n table: {\n defaultValue: { summary: 'false' },\n },\n },\n instructions: {\n control: 'text',\n description: 'Default instructions displayed in the dropzone',\n },\n 'invalid-file-type-message': {\n control: 'text',\n description:\n 'Custom error message displayed when an invalid file type is selected',\n },\n 'max-file-name-length': {\n control: 'number',\n description:\n 'Maximum allowed length of filename, will show error if exceeded',\n },\n 'max-file-count': {\n control: 'number',\n description:\n 'Maximum number of files allowed, will show error if exceeded',\n },\n 'max-total-file-size-bytes': {\n control: 'number',\n description:\n 'Maximum total file size in bytes allowed, will show error if exceeded',\n },\n multiple: {\n control: 'boolean',\n description: 'Allow multiple file selection',\n table: {\n defaultValue: { summary: 'false' },\n },\n },\n reset: {\n description:\n 'Reset the dropzone to its initial state, clearing all error and success states',\n table: {\n category: 'Methods',\n type: { summary: '() => Promise<void>' },\n },\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['fileSelect'],\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj;\n\nexport const Default: Story = {\n render: (args) => html`\n <modus-wc-file-dropzone\n accept-file-types=${ifDefined(args['accept-file-types'])}\n custom-class=${ifDefined(args['custom-class'])}\n ?disabled=${args.disabled}\n file-dragged-over-instructions=${ifDefined(\n args['file-dragged-over-instructions']\n )}\n ?include-state-icon=${args['include-state-icon']}\n instructions=${ifDefined(args['instructions'])}\n invalid-file-type-message=${ifDefined(args['invalid-file-type-message'])}\n max-file-name-length=${ifDefined(args['max-file-name-length'])}\n max-file-count=${ifDefined(args['max-file-count'])}\n max-total-file-size-bytes=${ifDefined(args['max-total-file-size-bytes'])}\n ?multiple=${args.multiple}\n success-message=${ifDefined(args['success-message'])}\n ></modus-wc-file-dropzone>\n `,\n};\n\nexport const customContent: Story = {\n args: {\n 'accept-file-types': '.pdf, .doc, .docx',\n 'success-message': 'Files uploaded successfully!',\n },\n\n parameters: {\n docs: {\n source: {\n code: `<div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n <modus-wc-file-dropzone\n id=\"custom-dropzone\"\n accept-file-types=\".pdf, .doc, .docx\"\n success-message=\"Files uploaded successfully!\"\n instructions=\"Drag files here or browse to upload\"\n >\n <div slot=\"dropzone\" style=\"width: 300px; margin-top: 1rem;\">\n <modus-wc-progress value=\"70\" label=\"70% Uploaded\"></modus-wc-progress>\n </div>\n </modus-wc-file-dropzone>\n\n <modus-wc-button id=\"reset-button\">\n Reset Dropzone\n </modus-wc-button>\n</div>\n\n<script>\n const dropzone = document.getElementById('custom-dropzone');\n const resetButton = document.getElementById('reset-button');\n \n resetButton.addEventListener('click', () => {\n if (dropzone?.reset) {\n dropzone.reset();\n }\n });\n</script>`,\n },\n },\n },\n\n render: (args) => html`\n <div style=\"display: flex; flex-direction: column; gap: 1rem;\">\n <modus-wc-file-dropzone\n id=\"custom-dropzone\"\n accept-file-types=${ifDefined(args['accept-file-types'])}\n success-message=${ifDefined(args['success-message'])}\n instructions=\"Drag files here or browse to upload\"\n >\n <div slot=\"dropzone\" style=\"width: 300px; margin-top: 1rem;\">\n <modus-wc-progress\n value=\"70\"\n label=\"70% Uploaded\"\n ></modus-wc-progress>\n </div>\n </modus-wc-file-dropzone>\n\n <modus-wc-button\n @buttonClick=${() => {\n const dropzone = document.getElementById(\n 'custom-dropzone'\n ) as HTMLElement & {\n reset?: () => Promise<void>;\n };\n if (dropzone?.reset) {\n void dropzone.reset();\n }\n }}\n >\n Reset Dropzone\n </modus-wc-button>\n </div>\n `,\n};\n\nexport const fileValidations: Story = {\n args: {\n multiple: true,\n 'max-file-name-length': 20,\n 'max-file-count': 3,\n 'max-total-file-size-bytes': 10485760, // 10MB\n 'invalid-file-type-message':\n 'Invalid file format. Please upload correct file type.',\n },\n render: (args) => html`\n <modus-wc-file-dropzone\n accept-file-types=${ifDefined(args['accept-file-types'])}\n invalid-file-type-message=${ifDefined(args['invalid-file-type-message'])}\n max-file-name-length=${ifDefined(args['max-file-name-length'])}\n max-file-count=${ifDefined(args['max-file-count'])}\n max-total-file-size-bytes=${ifDefined(args['max-total-file-size-bytes'])}\n ?multiple=${args.multiple}\n instructions=\"Upload files (max 3 files, 10MB total, filename ≤ 20 chars)\"\n ></modus-wc-file-dropzone>\n `,\n};\n\nexport const multipleFiles: Story = {\n args: {\n multiple: true,\n 'accept-file-types': 'image/*',\n },\n render: (args) => html`\n <modus-wc-file-dropzone\n accept-file-types=${ifDefined(args['accept-file-types'])}\n multiple=${args.multiple}\n instructions=\"Select multiple image files\"\n ></modus-wc-file-dropzone>\n `,\n};\n"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "A draggable handle component for resizing adjacent elements",
|
|
3
|
+
"properties": [
|
|
4
|
+
{
|
|
5
|
+
"name": "customClass",
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "Custom CSS class to apply to the handle element.",
|
|
8
|
+
"default": "''",
|
|
9
|
+
"mutable": false,
|
|
10
|
+
"end_line": 28
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "leftTarget",
|
|
14
|
+
"type": "string | HTMLElement",
|
|
15
|
+
"description": "The left target element to resize (CSS selector or HTMLElement)",
|
|
16
|
+
"default": null,
|
|
17
|
+
"mutable": false,
|
|
18
|
+
"end_line": 31
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "orientation",
|
|
22
|
+
"type": "Orientation",
|
|
23
|
+
"description": "The orientation of the handle.",
|
|
24
|
+
"default": "'horizontal'",
|
|
25
|
+
"mutable": false,
|
|
26
|
+
"end_line": 34
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "rightTarget",
|
|
30
|
+
"type": "string | HTMLElement",
|
|
31
|
+
"description": "The right target element to resize (CSS selector or HTMLElement)",
|
|
32
|
+
"default": null,
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"end_line": 37
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "size",
|
|
38
|
+
"type": "'default' | 'lg' | 'xl' | '2xl'",
|
|
39
|
+
"description": "The size of the handle.",
|
|
40
|
+
"default": "'default'",
|
|
41
|
+
"mutable": false,
|
|
42
|
+
"end_line": 40
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "density",
|
|
46
|
+
"type": "'compact' | 'comfortable' | 'relaxed'",
|
|
47
|
+
"description": "The density/spacing of the handle container (compact: 8px, comfortable: 12px, relaxed: 16px).",
|
|
48
|
+
"default": "'comfortable'",
|
|
49
|
+
"mutable": false,
|
|
50
|
+
"end_line": 43
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "defaultSplit",
|
|
54
|
+
"type": "number",
|
|
55
|
+
"description": "The initial split percentage for the left/top panel (1-100). The right/bottom panel gets the remaining percentage.",
|
|
56
|
+
"default": "50",
|
|
57
|
+
"mutable": false,
|
|
58
|
+
"end_line": 46
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "buttonSize",
|
|
62
|
+
"type": "DaisySize",
|
|
63
|
+
"description": "The size of the button.",
|
|
64
|
+
"default": "'md'",
|
|
65
|
+
"mutable": false,
|
|
66
|
+
"end_line": 49
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "buttonColor",
|
|
70
|
+
"type": "| 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger'",
|
|
71
|
+
"description": "The color of the button.",
|
|
72
|
+
"default": "'tertiary'",
|
|
73
|
+
"mutable": false,
|
|
74
|
+
"end_line": 57
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "buttonVariant",
|
|
78
|
+
"type": "'borderless' | 'filled' | 'outlined'",
|
|
79
|
+
"description": "The variant of the button.",
|
|
80
|
+
"default": "'filled'",
|
|
81
|
+
"mutable": false,
|
|
82
|
+
"end_line": 60
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "type",
|
|
86
|
+
"type": "'bar' | 'button'",
|
|
87
|
+
"description": "The type of handle to display.",
|
|
88
|
+
"default": "'bar'",
|
|
89
|
+
"mutable": false,
|
|
90
|
+
"end_line": 63
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"events": [],
|
|
94
|
+
"methods": [],
|
|
95
|
+
"slots": [],
|
|
96
|
+
"examples": {
|
|
97
|
+
"basic": "<style>${storyStyles}</style>\n${keyed(orientation, html",
|
|
98
|
+
"variations": [],
|
|
99
|
+
"args": {
|
|
100
|
+
"button-color": "'tertiary'",
|
|
101
|
+
"button-size": "'md'",
|
|
102
|
+
"button-variant": "'filled'",
|
|
103
|
+
"custom-class": "''",
|
|
104
|
+
"default-split": "50",
|
|
105
|
+
"density": "'comfortable'",
|
|
106
|
+
"left-target": "''",
|
|
107
|
+
"orientation": "'vertical'",
|
|
108
|
+
"right-target": "''",
|
|
109
|
+
"size": "'default'",
|
|
110
|
+
"type": "'bar'"
|
|
111
|
+
},
|
|
112
|
+
"argTypes": {},
|
|
113
|
+
"usage": []
|
|
114
|
+
},
|
|
115
|
+
"tag": "modus-wc-handle",
|
|
116
|
+
"storyExample": {
|
|
117
|
+
"template": "<style>${storyStyles}</style>\n${keyed(orientation, html",
|
|
118
|
+
"args": {
|
|
119
|
+
"button-color": "'tertiary'",
|
|
120
|
+
"button-size": "'md'",
|
|
121
|
+
"button-variant": "'filled'",
|
|
122
|
+
"custom-class": "''",
|
|
123
|
+
"default-split": "50",
|
|
124
|
+
"density": "'comfortable'",
|
|
125
|
+
"left-target": "''",
|
|
126
|
+
"orientation": "'vertical'",
|
|
127
|
+
"right-target": "''",
|
|
128
|
+
"size": "'default'",
|
|
129
|
+
"type": "'bar'"
|
|
130
|
+
},
|
|
131
|
+
"argTypes": {},
|
|
132
|
+
"events": [],
|
|
133
|
+
"fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html, unsafeCSS } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { DaisySize, Orientation } from '../types';\n\n// Shared styles for story demos\nconst storyStyles = unsafeCSS(`\n .handle-demo-container {\n display: flex;\n gap: 0;\n }\n\n .handle-demo-container.horizontal {\n height: 300px;\n }\n\n .handle-demo-container.vertical {\n flex-direction: column;\n height: 500px;\n }\n\n .handle-demo-panel {\n background-color: var(--modus-wc-color-base-100);\n overflow: auto;\n }\n\n .handle-demo-panel.initial-size-200 {\n width: 200px;\n }\n\n .handle-demo-panel.initial-height-200 {\n height: 200px;\n }\n\n .handle-demo-panel.initial-size-400 {\n width: 400px;\n }\n\n .handle-demo-panel.flex-fill {\n flex: 1;\n }\n\n .handle-demo-right-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n`);\n\ninterface HandleArgs {\n 'custom-class'?: string;\n 'default-split'?: number;\n density?: 'compact' | 'comfortable' | 'relaxed';\n 'button-color'?: 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';\n 'button-size'?: DaisySize;\n 'button-variant'?: 'borderless' | 'filled' | 'outlined';\n 'left-target'?: string;\n orientation?: Orientation;\n 'right-target'?: string;\n size?: 'default' | 'lg' | 'xl' | '2xl';\n type?: 'bar' | 'button';\n}\n\nconst meta: Meta<HandleArgs> = {\n title: 'Components/Handle',\n component: 'modus-wc-handle',\n args: {\n 'button-color': 'tertiary',\n 'button-size': 'md',\n 'button-variant': 'filled',\n 'custom-class': '',\n 'default-split': 50,\n density: 'comfortable',\n 'left-target': '',\n orientation: 'vertical',\n 'right-target': '',\n size: 'default',\n type: 'bar',\n },\n argTypes: {\n 'custom-class': {\n control: 'text',\n },\n 'default-split': {\n control: { type: 'range', min: 1, max: 100, step: 1 },\n },\n density: {\n control: { type: 'select' },\n options: ['compact', 'comfortable', 'relaxed'],\n },\n 'button-size': {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n 'button-color': {\n control: { type: 'select' },\n options: ['primary', 'secondary', 'tertiary', 'warning', 'danger'],\n },\n 'button-variant': {\n control: { type: 'select' },\n options: ['borderless', 'filled', 'outlined'],\n },\n 'left-target': {\n control: 'text',\n },\n orientation: {\n control: { type: 'select' },\n options: ['horizontal', 'vertical'],\n },\n 'right-target': {\n control: 'text',\n },\n size: {\n control: { type: 'select' },\n options: ['default', 'lg', 'xl', '2xl'],\n },\n type: {\n control: { type: 'select' },\n options: ['bar', 'button'],\n },\n },\n parameters: {\n layout: 'padded',\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<HandleArgs>;\n\nconst HandleTemplate = (args?: HandleArgs) =>\n // prettier-ignore\n html`\n<modus-wc-handle\n custom-class=\"${ifDefined(args?.['custom-class'])}\"\n default-split=\"${args?.['default-split']}\"\n density=\"${args?.density}\"\n button-size=\"${args?.['button-size']}\"\n button-color=\"${args?.['button-color']}\"\n button-variant=\"${args?.['button-variant']}\"\n left-target=\"${ifDefined(args?.['left-target'])}\"\n orientation=\"${ifDefined(args?.orientation)}\"\n right-target=\"${ifDefined(args?.['right-target'])}\"\n size=\"${args?.size}\"\n type=\"${args?.type}\"\n></modus-wc-handle>\n `;\n\n// Helper templates for panels\nconst PanelTemplate = (\n id: string,\n title: string,\n content: string,\n className: string = ''\n) =>\n // prettier-ignore\n html`\n<div id=\"${id}\" class=\"handle-demo-panel ${className}\">\n <h3>${title}</h3>\n <p>${content}</p>\n</div>\n`;\n\nconst PanelWithKeyboardInfo = (\n id: string,\n title: string,\n content: string,\n keyboardInfo: string,\n className: string = ''\n) =>\n // prettier-ignore\n html`\n<div id=\"${id}\" class=\"handle-demo-panel ${className}\">\n <h3>${title}</h3>\n <p>${content}</p>\n <p><strong>Keyboard:</strong> ${keyboardInfo}</p>\n</div>\n`;\n\n// Generate unique ID for each render to avoid conflicts on docs page\nconst generateUniqueId = () => Math.random().toString(36).substring(2, 9);\n\n// Reusable render function for demos\nconst Template = (args?: HandleArgs) => {\n const orientation = args?.orientation ?? 'horizontal';\n const type = args?.type ?? 'bar';\n const isHorizontal = orientation === 'horizontal';\n const uniqueId = generateUniqueId();\n const leftId = `panel-left-${uniqueId}`;\n const rightId = `panel-right-${uniqueId}`;\n // prettier-ignore\n return html`\n<style>${storyStyles}</style>\n${keyed(orientation, html`\n<div class=\"handle-demo-container ${isHorizontal ? 'horizontal' : 'vertical'}\">\n ${PanelWithKeyboardInfo(\n leftId,\n isHorizontal ? 'Left Panel' : 'Top Panel',\n 'Drag the handle to resize this panel.',\n `Focus the handle and use ${isHorizontal ? 'Left/Right' : 'Up/Down'} arrow keys to resize (5px per press, 15px with Shift).`,\n isHorizontal ? 'initial-size-200' : 'initial-height-200'\n )}\n ${HandleTemplate({\n orientation: orientation,\n size: args?.size ?? 'default',\n density: args?.density ?? 'comfortable',\n type: type,\n 'default-split': args?.['default-split'] ?? 50,\n 'custom-class': args?.['custom-class'],\n 'button-size': args?.['button-size'],\n 'button-color': args?.['button-color'],\n 'button-variant': args?.['button-variant'],\n 'left-target': `#${leftId}`,\n 'right-target': `#${rightId}`,\n })}\n ${PanelTemplate(\n rightId,\n isHorizontal ? 'Right Panel' : 'Bottom Panel',\n 'This panel will resize automatically when you drag the handle.',\n 'flex-fill'\n )}\n</div>\n`)}`;\n};\n\nexport const Default: Story = {\n render: (args?: HandleArgs) => Template(args),\n};\n\nexport const ButtonVariant: Story = {\n render: (args?: HandleArgs) => {\n return Template({\n ...args,\n orientation: args?.orientation ?? 'horizontal',\n size: args?.size ?? 'default',\n density: args?.density ?? 'comfortable',\n type: 'button',\n });\n },\n args: {\n type: 'button',\n },\n parameters: {\n docs: {\n description: {\n story: `\nButton type handle with customizable button properties.\n\n**Button Properties Available:**\n- \\`button-size\\`: sm, md, lg\n- \\`button-color\\`: primary, secondary, tertiary, warning, danger\n- \\`button-variant\\`: borderless, filled, outlined\n\n**Keyboard Navigation:**\n- Arrow keys: Move 5px per press\n- Shift + Arrow keys: Move 15px per press\n\nThe button handle provides a more prominent visual indicator compared to the bar type.\n `,\n },\n },\n },\n};\n\nexport const MultipleHandlesNested: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<style>${storyStyles}</style>\n<div class=\"handle-demo-container\" style=\"height: 600px;\">\n ${PanelTemplate('panel-one', 'One', 'Large left panel', 'initial-size-400')}\n ${HandleTemplate({\n orientation: 'horizontal',\n size: 'default',\n density: 'comfortable',\n type: 'bar',\n 'left-target': '#panel-one',\n 'right-target': '#right-container',\n })}\n <div id=\"right-container\" class=\"handle-demo-right-container\">\n ${PanelTemplate('panel-two', 'Two', 'Top right panel', 'initial-height-200')}\n ${HandleTemplate({\n orientation: 'vertical',\n size: 'default',\n density: 'comfortable',\n type: 'bar',\n 'left-target': '#panel-two',\n 'right-target': '#panel-three',\n })}\n ${PanelTemplate('panel-three', 'Three', 'Bottom right panel', 'flex-fill')}\n </div>\n</div>\n `;\n },\n};\n"
|
|
134
|
+
}
|
|
135
|
+
}
|