@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.
Files changed (108) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +337 -0
  3. package/package.json +39 -0
  4. package/versions/1.0.0/component-docs/_all_components.json +56 -0
  5. package/versions/1.0.0/component-docs/modus-wc-autocomplete.json +415 -0
  6. package/versions/1.0.0/component-docs/modus-wc-date.json +227 -0
  7. package/versions/1.0.0/component-docs/modus-wc-dropdown-menu.json +164 -0
  8. package/versions/1.0.0/component-docs/modus-wc-logo.json +61 -0
  9. package/versions/1.0.0/component-docs/modus-wc-menu-item.json +165 -0
  10. package/versions/1.0.0/component-docs/modus-wc-menu.json +106 -0
  11. package/versions/1.0.0/component-docs/modus-wc-navbar.json +290 -0
  12. package/versions/1.0.0/component-docs/modus-wc-profile-menu.json +64 -0
  13. package/versions/1.0.0/component-docs/modus-wc-side-navigation.json +102 -0
  14. package/versions/1.0.0/component-docs/modus-wc-table.json +202 -0
  15. package/versions/1.0.0/component-docs/modus-wc-tooltip.json +94 -0
  16. package/versions/1.0.0/component-docs/modus-wc-typography.json +78 -0
  17. package/versions/1.0.0/docs/_all_docs.json +15 -0
  18. package/versions/1.0.0/docs/angular.mdx +374 -0
  19. package/versions/1.0.0/docs/getting-started.mdx +131 -0
  20. package/versions/1.0.7/component-docs/_all_components.json +55 -0
  21. package/versions/1.0.7/component-docs/modus-wc-autocomplete.json +405 -0
  22. package/versions/1.0.7/component-docs/modus-wc-table.json +202 -0
  23. package/versions/1.0.7/component-docs/modus-wc-tooltip.json +94 -0
  24. package/versions/1.0.7/docs/_all_docs.json +15 -0
  25. package/versions/1.0.7/docs/angular.mdx +374 -0
  26. package/versions/1.1.0/component-docs/_all_components.json +56 -0
  27. package/versions/1.1.0/component-docs/modus-wc-autocomplete.json +405 -0
  28. package/versions/1.1.0/component-docs/modus-wc-navbar.json +290 -0
  29. package/versions/1.1.0/component-docs/modus-wc-profile-menu.json +64 -0
  30. package/versions/1.1.0/component-docs/modus-wc-side-navigation.json +102 -0
  31. package/versions/1.1.0/component-docs/modus-wc-table.json +202 -0
  32. package/versions/1.1.0/component-docs/modus-wc-tooltip.json +94 -0
  33. package/versions/1.1.0/component-docs/modus-wc-typography.json +78 -0
  34. package/versions/1.1.0/docs/_all_docs.json +15 -0
  35. package/versions/1.1.0/docs/angular.mdx +374 -0
  36. package/versions/1.1.0/docs/getting-started.mdx +131 -0
  37. package/versions/1.1.1/component-docs/_all_components.json +56 -0
  38. package/versions/1.1.1/component-docs/modus-wc-autocomplete.json +405 -0
  39. package/versions/1.1.1/component-docs/modus-wc-navbar.json +290 -0
  40. package/versions/1.1.1/component-docs/modus-wc-profile-menu.json +64 -0
  41. package/versions/1.1.1/component-docs/modus-wc-side-navigation.json +102 -0
  42. package/versions/1.1.1/component-docs/modus-wc-table.json +202 -0
  43. package/versions/1.1.1/component-docs/modus-wc-tooltip.json +94 -0
  44. package/versions/1.1.1/component-docs/modus-wc-typography.json +78 -0
  45. package/versions/1.1.1/docs/_all_docs.json +15 -0
  46. package/versions/1.1.1/docs/angular.mdx +374 -0
  47. package/versions/1.1.1/docs/getting-started.mdx +131 -0
  48. package/versions/base/component-docs/_all_components.json +55 -0
  49. package/versions/base/component-docs/modus-wc-accordion.json +48 -0
  50. package/versions/base/component-docs/modus-wc-alert.json +112 -0
  51. package/versions/base/component-docs/modus-wc-autocomplete.json +397 -0
  52. package/versions/base/component-docs/modus-wc-avatar.json +83 -0
  53. package/versions/base/component-docs/modus-wc-badge.json +68 -0
  54. package/versions/base/component-docs/modus-wc-breadcrumbs.json +63 -0
  55. package/versions/base/component-docs/modus-wc-button-group.json +100 -0
  56. package/versions/base/component-docs/modus-wc-button.json +130 -0
  57. package/versions/base/component-docs/modus-wc-card.json +98 -0
  58. package/versions/base/component-docs/modus-wc-checkbox.json +149 -0
  59. package/versions/base/component-docs/modus-wc-chip.json +132 -0
  60. package/versions/base/component-docs/modus-wc-collapse.json +90 -0
  61. package/versions/base/component-docs/modus-wc-date.json +227 -0
  62. package/versions/base/component-docs/modus-wc-divider.json +85 -0
  63. package/versions/base/component-docs/modus-wc-dropdown-menu.json +154 -0
  64. package/versions/base/component-docs/modus-wc-file-dropzone.json +155 -0
  65. package/versions/base/component-docs/modus-wc-handle.json +135 -0
  66. package/versions/base/component-docs/modus-wc-icon.json +722 -0
  67. package/versions/base/component-docs/modus-wc-input-feedback.json +71 -0
  68. package/versions/base/component-docs/modus-wc-input-label.json +84 -0
  69. package/versions/base/component-docs/modus-wc-loader.json +65 -0
  70. package/versions/base/component-docs/modus-wc-logo.json +61 -0
  71. package/versions/base/component-docs/modus-wc-menu-item.json +173 -0
  72. package/versions/base/component-docs/modus-wc-menu.json +86 -0
  73. package/versions/base/component-docs/modus-wc-modal.json +108 -0
  74. package/versions/base/component-docs/modus-wc-navbar.json +280 -0
  75. package/versions/base/component-docs/modus-wc-number-input.json +219 -0
  76. package/versions/base/component-docs/modus-wc-pagination.json +103 -0
  77. package/versions/base/component-docs/modus-wc-panel.json +76 -0
  78. package/versions/base/component-docs/modus-wc-progress.json +86 -0
  79. package/versions/base/component-docs/modus-wc-radio.json +139 -0
  80. package/versions/base/component-docs/modus-wc-rating.json +117 -0
  81. package/versions/base/component-docs/modus-wc-select.json +159 -0
  82. package/versions/base/component-docs/modus-wc-side-navigation.json +102 -0
  83. package/versions/base/component-docs/modus-wc-skeleton.json +65 -0
  84. package/versions/base/component-docs/modus-wc-slider.json +163 -0
  85. package/versions/base/component-docs/modus-wc-stepper.json +47 -0
  86. package/versions/base/component-docs/modus-wc-switch.json +149 -0
  87. package/versions/base/component-docs/modus-wc-table.json +202 -0
  88. package/versions/base/component-docs/modus-wc-tabs.json +86 -0
  89. package/versions/base/component-docs/modus-wc-text-input.json +278 -0
  90. package/versions/base/component-docs/modus-wc-textarea.json +215 -0
  91. package/versions/base/component-docs/modus-wc-theme-switcher.json +49 -0
  92. package/versions/base/component-docs/modus-wc-time-input.json +211 -0
  93. package/versions/base/component-docs/modus-wc-toast.json +56 -0
  94. package/versions/base/component-docs/modus-wc-toolbar.json +44 -0
  95. package/versions/base/component-docs/modus-wc-tooltip.json +94 -0
  96. package/versions/base/component-docs/modus-wc-typography.json +73 -0
  97. package/versions/base/component-docs/modus-wc-utility-panel.json +86 -0
  98. package/versions/base/docs/_all_docs.json +15 -0
  99. package/versions/base/docs/accessibility.mdx +32 -0
  100. package/versions/base/docs/angular.mdx +346 -0
  101. package/versions/base/docs/form-inputs.mdx +86 -0
  102. package/versions/base/docs/getting-started.mdx +91 -0
  103. package/versions/base/docs/modus-figma-mcp-integration-guide.mdx +254 -0
  104. package/versions/base/docs/modus-icon-usage.mdx +210 -0
  105. package/versions/base/docs/react.mdx +129 -0
  106. package/versions/base/docs/styling.mdx +107 -0
  107. package/versions/base/docs/testing.mdx +18 -0
  108. package/versions/base/docs/vue.mdx +159 -0
@@ -0,0 +1,83 @@
1
+ {
2
+ "description": "A customizable avatar component used to create avatars with different images or user initials. When no image is provided, the component can display initials (up to 3 characters) from the initials prop. The component will extract the first letter of each word in the initials string.",
3
+ "properties": [
4
+ {
5
+ "name": "alt",
6
+ "type": "string",
7
+ "description": "The image alt attribute for accessibility.",
8
+ "default": null,
9
+ "mutable": false,
10
+ "end_line": 22
11
+ },
12
+ {
13
+ "name": "customClass",
14
+ "type": "string",
15
+ "description": "Custom CSS class to apply to the inner div.",
16
+ "default": "''",
17
+ "mutable": false,
18
+ "end_line": 25
19
+ },
20
+ {
21
+ "name": "imgSrc",
22
+ "type": "string",
23
+ "description": "The location of the image.",
24
+ "default": "''",
25
+ "mutable": false,
26
+ "end_line": 28
27
+ },
28
+ {
29
+ "name": "initials",
30
+ "type": "string",
31
+ "description": "The initials to display when no image is provided.",
32
+ "default": "''",
33
+ "mutable": false,
34
+ "end_line": 31
35
+ },
36
+ {
37
+ "name": "shape",
38
+ "type": "'circle' | 'square'",
39
+ "description": "The shape of the avatar.",
40
+ "default": "'circle'",
41
+ "mutable": false,
42
+ "end_line": 36
43
+ },
44
+ {
45
+ "name": "size",
46
+ "type": "DaisySize",
47
+ "description": "The size of the avatar.",
48
+ "default": "'md'",
49
+ "mutable": false,
50
+ "end_line": 39
51
+ }
52
+ ],
53
+ "events": [],
54
+ "methods": [],
55
+ "slots": [],
56
+ "examples": {
57
+ "basic": "<modus-wc-avatar\n alt=\"${args.alt}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n img-src=\"${args['img-src']}\"\n initials=\"${args.initials}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n ></modus-wc-avatar>",
58
+ "variations": [],
59
+ "args": {
60
+ "alt": "'Example avatar'",
61
+ "img-src": "'https://i.pinimg.com/474x/73/54/79/7354794bf3873c3ef2666f778da4bcac.jpg'",
62
+ "shape": "'circle'",
63
+ "initials": "''",
64
+ "size": "'md'"
65
+ },
66
+ "argTypes": {},
67
+ "usage": []
68
+ },
69
+ "tag": "modus-wc-avatar",
70
+ "storyExample": {
71
+ "template": "<modus-wc-avatar\n alt=\"${args.alt}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n img-src=\"${args['img-src']}\"\n initials=\"${args.initials}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n ></modus-wc-avatar>",
72
+ "args": {
73
+ "alt": "'Example avatar'",
74
+ "img-src": "'https://i.pinimg.com/474x/73/54/79/7354794bf3873c3ef2666f778da4bcac.jpg'",
75
+ "shape": "'circle'",
76
+ "initials": "''",
77
+ "size": "'md'"
78
+ },
79
+ "argTypes": {},
80
+ "events": [],
81
+ "fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { DaisySize } from '../types';\n\ninterface AvatarArgs {\n alt: string;\n 'custom-class'?: string;\n 'img-src': string;\n initials: string;\n shape: string;\n size: DaisySize;\n}\n\nconst meta: Meta<AvatarArgs> = {\n title: 'Components/Avatar',\n component: 'modus-wc-avatar',\n args: {\n alt: 'Example avatar',\n 'img-src':\n 'https://i.pinimg.com/474x/73/54/79/7354794bf3873c3ef2666f778da4bcac.jpg',\n shape: 'circle',\n initials: '',\n size: 'md',\n },\n argTypes: {\n shape: {\n control: { type: 'select' },\n options: ['circle', 'square'],\n },\n size: {\n control: { type: 'select' },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<AvatarArgs>;\n\nconst Template: Story = {\n render: (args) => {\n return html`\n <modus-wc-avatar\n alt=\"${args.alt}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n img-src=\"${args['img-src']}\"\n initials=\"${args.initials}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n ></modus-wc-avatar>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n"
82
+ }
83
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "description": "A customizable badge component used to create badges with different sizes, types, and colors. The component supports a `<slot>` for injecting content within the badge.",
3
+ "properties": [
4
+ {
5
+ "name": "color",
6
+ "type": "| 'primary' | 'secondary' | 'tertiary' | 'high-contrast' | 'success' | 'warning' | 'danger'",
7
+ "description": "The color variant of the badge.",
8
+ "default": "'primary'",
9
+ "mutable": false,
10
+ "end_line": 31
11
+ },
12
+ {
13
+ "name": "customClass",
14
+ "type": "string",
15
+ "description": "Custom CSS class to apply to the span element.",
16
+ "default": "''",
17
+ "mutable": false,
18
+ "end_line": 34
19
+ },
20
+ {
21
+ "name": "size",
22
+ "type": "ModusSize",
23
+ "description": "The size of the badge.",
24
+ "default": "'md'",
25
+ "mutable": false,
26
+ "end_line": 37
27
+ },
28
+ {
29
+ "name": "variant",
30
+ "type": "'counter' | 'filled' | 'outlined' | 'text'",
31
+ "description": "The variant of the badge.",
32
+ "default": "'filled'",
33
+ "mutable": false,
34
+ "end_line": 40
35
+ }
36
+ ],
37
+ "events": [],
38
+ "methods": [],
39
+ "slots": [
40
+ {
41
+ "name": "default",
42
+ "description": "Slot for default content"
43
+ }
44
+ ],
45
+ "examples": {
46
+ "basic": "<modus-wc-badge\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n>\n Badge\n</modus-wc-badge>",
47
+ "variations": [],
48
+ "args": {
49
+ "color": "'primary'",
50
+ "size": "'md'",
51
+ "variant": "'filled'"
52
+ },
53
+ "argTypes": {},
54
+ "usage": []
55
+ },
56
+ "tag": "modus-wc-badge",
57
+ "storyExample": {
58
+ "template": "<modus-wc-badge\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n>\n Badge\n</modus-wc-badge>",
59
+ "args": {
60
+ "color": "'primary'",
61
+ "size": "'md'",
62
+ "variant": "'filled'"
63
+ },
64
+ "argTypes": {},
65
+ "events": [],
66
+ "fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { ModusSize } from '../types';\n\ninterface BadgeArgs {\n color:\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'high-contrast'\n | 'success'\n | 'warning'\n | 'danger';\n 'custom-class'?: string;\n size: ModusSize;\n variant: 'counter' | 'filled' | 'outlined' | 'text';\n}\n\nconst meta: Meta<BadgeArgs> = {\n title: 'Components/Badge',\n component: 'modus-wc-badge',\n args: {\n color: 'primary',\n size: 'md',\n variant: 'filled',\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 size: {\n control: { type: 'select' },\n options: ['sm', 'md', 'lg'],\n },\n variant: {\n control: { type: 'select' },\n options: ['counter', 'filled', 'outlined', 'text'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<BadgeArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-badge\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n size=\"${args.size}\"\n variant=\"${args.variant}\"\n>\n Badge\n</modus-wc-badge>\n `;\n },\n};\n\nexport const Default: Story = {\n ...Template,\n};\n\nexport const WithIcon: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<style>\n .modus-wc-icon {\n padding-inline-end: 4px;\n }\n</style>\n<modus-wc-badge>\n <modus-wc-icon decorative name=\"check\" size=\"xs\"></modus-wc-icon>\n Item\n</modus-wc-badge>\n `;\n },\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n - The \\`dark\\` color option is now \\`high-contrast\\`\n - The \\`type\\` prop is now \\`variant\\` and \\`default\\` type is now \\`filled\\`\n - Size values have changed from verbose names (\\`small\\`, \\`medium\\`, \\`large\\`) to abbreviations (\\`sm\\`, \\`md\\`, \\`lg\\`).\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|------------|------------|-------------------------------------------------------------|\n| aria-label | aria-label | |\n| color | color | \\`dark\\` is now \\`high-contrast\\` |\n| size | size | \\`small\\` → \\`sm\\`, \\`medium\\` → \\`md\\`, \\`large\\` → \\`lg\\` |\n| type | variant | \\`default\\` is now \\`filled\\` |\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"
67
+ }
68
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "description": "A customizable breadcrumbs component used to help users navigate through a website.",
3
+ "properties": [
4
+ {
5
+ "name": "items",
6
+ "type": "IBreadcrumb[]",
7
+ "description": "The breadcrumbs to render.",
8
+ "default": "[]",
9
+ "mutable": false,
10
+ "end_line": 35
11
+ },
12
+ {
13
+ "name": "customClass",
14
+ "type": "string",
15
+ "description": "Custom CSS class to apply to the inner div.",
16
+ "default": "''",
17
+ "mutable": false,
18
+ "end_line": 38
19
+ },
20
+ {
21
+ "name": "size",
22
+ "type": "ModusSize",
23
+ "description": "The size of the breadcrumbs.",
24
+ "default": "'md'",
25
+ "mutable": false,
26
+ "end_line": 41
27
+ }
28
+ ],
29
+ "events": [
30
+ {
31
+ "name": "breadcrumbClick",
32
+ "detail": "IBreadcrumb",
33
+ "description": "Event emitted when a breadcrumb is clicked.",
34
+ "end_line": 44
35
+ }
36
+ ],
37
+ "methods": [],
38
+ "slots": [],
39
+ "examples": {
40
+ "basic": "<modus-wc-breadcrumbs\n aria-label=\"Breadcrumbs\"\n custom-class=${ifDefined(args['custom-class'])}\n .items=${args.items}\n size=${ifDefined(args.size)}\n></modus-wc-breadcrumbs>\n<script>\n const items = [\n {\n label: 'Root',\n url: '#',\n },\n {\n label: 'Subpage',\n url: '#',\n },\n {\n label: 'Current Page',\n url: '#',\n },\n ];\n // Adding this block to show how to set options via JS \n // const breadcrumbs = document.querySelector('modus-wc-breadcrumbs');\n // breadcrumbs.items = items;\n</script>",
41
+ "variations": [],
42
+ "args": {
43
+ "size": "'md'"
44
+ },
45
+ "argTypes": {},
46
+ "usage": [],
47
+ "events": [
48
+ "breadcrumbClick"
49
+ ]
50
+ },
51
+ "tag": "modus-wc-breadcrumbs",
52
+ "storyExample": {
53
+ "template": "<modus-wc-breadcrumbs\n aria-label=\"Breadcrumbs\"\n custom-class=${ifDefined(args['custom-class'])}\n .items=${args.items}\n size=${ifDefined(args.size)}\n></modus-wc-breadcrumbs>\n<script>\n const items = [\n {\n label: 'Root',\n url: '#',\n },\n {\n label: 'Subpage',\n url: '#',\n },\n {\n label: 'Current Page',\n url: '#',\n },\n ];\n // Adding this block to show how to set options via JS \n // const breadcrumbs = document.querySelector('modus-wc-breadcrumbs');\n // breadcrumbs.items = items;\n</script>",
54
+ "args": {
55
+ "size": "'md'"
56
+ },
57
+ "argTypes": {},
58
+ "events": [
59
+ "breadcrumbClick"
60
+ ],
61
+ "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 { IBreadcrumb } from './modus-wc-breadcrumbs';\nimport { DaisySize } from '../types';\n\nconst items: IBreadcrumb[] = [\n {\n label: 'Root',\n url: '#',\n },\n {\n label: 'Subpage',\n url: '#',\n },\n {\n label: 'Current Page',\n url: '#',\n },\n];\n\ninterface BreadcrumbArgs {\n 'custom-class'?: string;\n items: IBreadcrumb[];\n size?: DaisySize;\n}\n\nconst meta: Meta<BreadcrumbArgs> = {\n title: 'Components/Breadcrumbs',\n component: 'modus-wc-breadcrumbs',\n args: {\n items,\n size: 'md',\n },\n argTypes: {\n items: {\n description: 'Array of items for the breadcrumbs component',\n table: {\n type: {\n detail: `\n Interface: IBreadcrumb\n Properties:\n - label (string): The text to render in the breadcrumb\n - url (string, optional): The URL emitted when the breadcrumb is clicked\n `,\n },\n },\n },\n size: {\n control: {\n type: 'select',\n },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['breadcrumbClick'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<BreadcrumbArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-breadcrumbs\n aria-label=\"Breadcrumbs\"\n custom-class=${ifDefined(args['custom-class'])}\n .items=${args.items}\n size=${ifDefined(args.size)}\n></modus-wc-breadcrumbs>\n<script>\n const items = [\n {\n label: 'Root',\n url: '#',\n },\n {\n label: 'Subpage',\n url: '#',\n },\n {\n label: 'Current Page',\n url: '#',\n },\n ];\n // Adding this block to show how to set options via JS \n // const breadcrumbs = document.querySelector('modus-wc-breadcrumbs');\n // breadcrumbs.items = items;\n</script>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n\nexport const UnderlineLinks: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<style>\n .underline-links a {\n text-decoration: underline;\n }\n</style>\n<modus-wc-breadcrumbs\n custom-class=\"underline-links\"\n .items=${args.items}\n size=${ifDefined(args.size)}\n></modus-wc-breadcrumbs>\n<script>\n const items = [\n {\n label: 'Root',\n url: '#',\n },\n {\n label: 'Subpage',\n url: '#',\n },\n {\n label: 'Current Page',\n url: '#',\n },\n ];\n // Adding this block to show how to set options via JS \n // const breadcrumbs = document.querySelector('modus-wc-breadcrumbs');\n // breadcrumbs.items = items;\n</script>\n `;\n },\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n - The structure of the breadcrumb \\`items\\` has changed from \\`Crumb\\` interface to \\`IBreadcrumb\\` interface.\n - Underlined links are now applied using a custom class rather than a dedicated prop.\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|-----------------|---------------|-----------------------------------------------------|\n| aria-label | aria-label | |\n| crumbs | items | Interface changed from \\`Crumb\\` to \\`IBreadcrumb\\` |\n| underline-links | | Not carried over, use CSS instead |\n\n#### Event Mapping\n\n| 1.0 Event | 2.0 Event | Notes |\n|------------|-----------------|---------------------------------------------------|\n| crumbClick | breadcrumbClick | Payload changed from \\`Crumb\\` to \\`IBreadcrumb\\` |\n\n#### Interfaces\n\n##### 1.0:\n\\`\\`\\`typescript\ninterface Crumb {\n display: string;\n id: string;\n}\n\\`\\`\\`\n\n##### 2.0:\n\\`\\`\\`typescript\ninterface IBreadcrumb {\n label: string;\n url?: string;\n}\n\\`\\`\\`\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"
62
+ }
63
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "description": "A customizable buttongroup component that groups multiple Modus buttons together. The component supports a `<slot>` for injecting content within the buttongroup.",
3
+ "properties": [
4
+ {
5
+ "name": "variant",
6
+ "type": "'borderless' | 'filled' | 'outlined'",
7
+ "description": "Style variant to apply to all buttons within the button group",
8
+ "default": "'outlined'",
9
+ "mutable": false,
10
+ "end_line": 34
11
+ },
12
+ {
13
+ "name": "color",
14
+ "type": "'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger'",
15
+ "description": "Color to apply to all buttons within the button group",
16
+ "default": null,
17
+ "mutable": false,
18
+ "end_line": 37
19
+ },
20
+ {
21
+ "name": "disabled",
22
+ "type": "boolean",
23
+ "description": "Disables all buttons within the button group",
24
+ "default": "false",
25
+ "mutable": false,
26
+ "end_line": 40
27
+ },
28
+ {
29
+ "name": "orientation",
30
+ "type": "Orientation",
31
+ "description": "Orientation of the button group: horizontal or vertical",
32
+ "default": "'horizontal'",
33
+ "mutable": false,
34
+ "end_line": 43
35
+ },
36
+ {
37
+ "name": "selectionType",
38
+ "type": "'default' | 'single' | 'multiple'",
39
+ "description": "Selection type for button group",
40
+ "default": "'default'",
41
+ "mutable": false,
42
+ "end_line": 46
43
+ }
44
+ ],
45
+ "events": [
46
+ {
47
+ "name": "buttonGroupClick",
48
+ "detail": "{ button: HTMLElement; isSelected: boolean; }",
49
+ "description": "Event emitted when any button in the group is clicked",
50
+ "end_line": 52
51
+ },
52
+ {
53
+ "name": "buttonSelectionChange",
54
+ "detail": "{ selectedButtons: HTMLElement[]; }",
55
+ "description": "Event emitted when button selection changes",
56
+ "end_line": 57
57
+ }
58
+ ],
59
+ "methods": [],
60
+ "slots": [
61
+ {
62
+ "name": "default",
63
+ "description": "Slot for default content"
64
+ }
65
+ ],
66
+ "examples": {
67
+ "basic": "<modus-wc-button-group\n variant=${ifDefined(args.variant)}\n color=${ifDefined(args.color)}\n ?disabled=${(args.disabled)}\n orientation=${ifDefined(args.orientation)}\n selection-type=${ifDefined(args['selection-type'])}\n>\n <modus-wc-button>Button 1</modus-wc-button>\n <modus-wc-button>Button 2</modus-wc-button>\n <modus-wc-button>Button 3</modus-wc-button>\n</modus-wc-button-group>",
68
+ "variations": [],
69
+ "args": {
70
+ "variant": "'outlined'",
71
+ "color": "'primary'",
72
+ "disabled": "false",
73
+ "orientation": "'horizontal'",
74
+ "selection-type": "'default'"
75
+ },
76
+ "argTypes": {},
77
+ "usage": [],
78
+ "events": [
79
+ "buttonSelectionChange",
80
+ "buttonGroupClick"
81
+ ]
82
+ },
83
+ "tag": "modus-wc-button-group",
84
+ "storyExample": {
85
+ "template": "<modus-wc-button-group\n variant=${ifDefined(args.variant)}\n color=${ifDefined(args.color)}\n ?disabled=${(args.disabled)}\n orientation=${ifDefined(args.orientation)}\n selection-type=${ifDefined(args['selection-type'])}\n>\n <modus-wc-button>Button 1</modus-wc-button>\n <modus-wc-button>Button 2</modus-wc-button>\n <modus-wc-button>Button 3</modus-wc-button>\n</modus-wc-button-group>",
86
+ "args": {
87
+ "variant": "'outlined'",
88
+ "color": "'primary'",
89
+ "disabled": "false",
90
+ "orientation": "'horizontal'",
91
+ "selection-type": "'default'"
92
+ },
93
+ "argTypes": {},
94
+ "events": [
95
+ "buttonSelectionChange",
96
+ "buttonGroupClick"
97
+ ],
98
+ "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 { Orientation } from '../types';\n\ninterface ButtonGroupArgs {\n variant: 'borderless' | 'filled' | 'outlined';\n color: 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';\n disabled: boolean;\n orientation: Orientation;\n 'selection-type': 'default' | 'single' | 'multiple';\n}\n\nconst meta: Meta<ButtonGroupArgs> = {\n title: 'Components/Button Group',\n component: 'modus-wc-button-group',\n args: {\n variant: 'outlined',\n color: 'primary',\n disabled: false,\n orientation: 'horizontal',\n 'selection-type': 'default',\n },\n argTypes: {\n variant: {\n control: { type: 'select' },\n options: ['borderless', 'filled', 'outlined'],\n },\n color: {\n control: { type: 'select' },\n options: ['primary', 'secondary', 'tertiary', 'warning', 'danger'],\n },\n disabled: { control: 'boolean' },\n orientation: {\n control: { type: 'select' },\n options: ['horizontal', 'vertical'],\n },\n 'selection-type': {\n control: { type: 'select' },\n options: ['default', 'single', 'multiple'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['buttonSelectionChange', 'buttonGroupClick'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-button-group\n variant=${ifDefined(args.variant)}\n color=${ifDefined(args.color)}\n ?disabled=${(args.disabled)}\n orientation=${ifDefined(args.orientation)}\n selection-type=${ifDefined(args['selection-type'])}\n>\n <modus-wc-button>Button 1</modus-wc-button>\n <modus-wc-button>Button 2</modus-wc-button>\n <modus-wc-button>Button 3</modus-wc-button>\n</modus-wc-button-group>\n `;\n },\n};\n\nexport const Default: Story = { ...Template };\n\nexport const Vertical: Story = {\n ...Template,\n args: {\n variant: 'outlined',\n orientation: 'vertical',\n },\n};\n\nexport const SplitButton: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<script>\n const handleItemSelect = (event) => {\n // Update the \"Selected Value\" label\n const 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\n window.addEventListener('DOMContentLoaded', () => {\n const menuItems = document.querySelectorAll('#split-button-menu modus-wc-menu-item');\n menuItems.forEach(item =>\n item.addEventListener('itemSelect', handleItemSelect)\n );\n });\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 16px; min-height: 300px;\">\n <modus-wc-button-group variant=\"outlined\">\n <modus-wc-button>Save Document</modus-wc-button>\n <modus-wc-dropdown-menu \n menu-placement=\"bottom-end\"\n menu-size=\"lg\"\n >\n <div slot=\"button\">\n <modus-wc-icon name=\"expand_more\" size=\"16\"></modus-wc-icon>\n </div>\n \n <div slot=\"menu\" id=\"split-button-menu\">\n <modus-wc-menu-item label=\"Save as Draft\" value=\"Save as Draft\"></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Save as Template\" value=\"Save as Template\"></modus-wc-menu-item>\n <modus-wc-menu-item label=\"Save and Share\" value=\"Save and Share\"></modus-wc-menu-item>\n </div>\n </modus-wc-dropdown-menu>\n </modus-wc-button-group>\n\n <div style=\"display: flex; gap: 8px;\">\n <modus-wc-typography hierarchy=\"h4\">Selected Option:</modus-wc-typography> \n <modus-wc-typography id=\"selected-value\"></modus-wc-typography>\n </div>\n</div>\n `;\n },\n};\n\nexport const SingleSelection: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<div style=\"display: flex; flex-direction: column; gap: 16px;\">\n <div>\n <h4 style=\"margin-bottom: 8px;\">Single Selection (Only one button can be active at a time)</h4>\n <modus-wc-button-group selection-type=\"single\" variant=\"outlined\">\n <modus-wc-button>Option 1</modus-wc-button>\n <modus-wc-button pressed>Option 2</modus-wc-button>\n <modus-wc-button>Option 3</modus-wc-button>\n <modus-wc-button>Option 4</modus-wc-button>\n </modus-wc-button-group>\n </div>\n \n <div>\n <h4 style=\"margin-bottom: 8px;\">Vertical Single Selection</h4>\n <modus-wc-button-group selection-type=\"single\" orientation=\"vertical\" variant=\"outlined\">\n <modus-wc-button pressed>Option 1</modus-wc-button>\n <modus-wc-button>Option 2</modus-wc-button>\n <modus-wc-button>Option 3</modus-wc-button>\n <modus-wc-button>Option 4</modus-wc-button>\n </modus-wc-button-group>\n </div>\n</div>\n `;\n },\n};\n\nexport const MultipleSelection: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<div style=\"display: flex; flex-direction: column; gap: 16px;\">\n <div>\n <h4 style=\"margin-bottom: 8px;\">Multiple Selection (Multiple buttons can be active)</h4>\n <modus-wc-button-group selection-type=\"multiple\" variant=\"outlined\">\n <modus-wc-button pressed>Bold</modus-wc-button>\n <modus-wc-button>Italic</modus-wc-button>\n <modus-wc-button pressed>Underline</modus-wc-button>\n <modus-wc-button>Strikethrough</modus-wc-button>\n </modus-wc-button-group>\n </div>\n \n <div>\n <h4 style=\"margin-bottom: 8px;\">Multiple Selection with Icons</h4>\n <modus-wc-button-group selection-type=\"multiple\" variant=\"outlined\" color=\"primary\">\n <modus-wc-button pressed icon-only aria-label=\"Align left\">\n <modus-wc-icon name=\"align_left\" size=\"16\"></modus-wc-icon>\n </modus-wc-button>\n <modus-wc-button pressed icon-only aria-label=\"Align center\">\n <modus-wc-icon name=\"align_top\" size=\"16\"></modus-wc-icon>\n </modus-wc-button>\n <modus-wc-button icon-only aria-label=\"Align right\">\n <modus-wc-icon name=\"align_right\" size=\"16\"></modus-wc-icon>\n </modus-wc-button>\n <modus-wc-button icon-only aria-label=\"Align justify\">\n <modus-wc-icon name=\"align_bottom\" size=\"16\"></modus-wc-icon>\n </modus-wc-button>\n </modus-wc-button-group>\n </div>\n</div>\n `;\n },\n};\n\nexport const SelectionEvent: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<script>\n window.addEventListener('DOMContentLoaded', () => {\n const buttonGroup = document.querySelector('#event-demo-group');\n if (buttonGroup) {\n buttonGroup.addEventListener('buttonSelectionChange', (event) => {\n const selectedButtons = event.detail.selectedButtons;\n const buttonTexts = selectedButtons.map(btn => btn.textContent.trim());\n \n // Update the display\n const displayElement = document.querySelector('#selected-buttons-display');\n if (displayElement) {\n displayElement.textContent = buttonTexts.length > 0 \n ? buttonTexts.join(', ') \n : 'None';\n }\n });\n }\n });\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 16px;\">\n <div>\n <modus-wc-button-group \n id=\"event-demo-group\"\n selection-type=\"single\" \n variant=\"outlined\"\n color=\"primary\"\n >\n <modus-wc-button>Apple</modus-wc-button>\n <modus-wc-button>Banana</modus-wc-button>\n <modus-wc-button>Cherry</modus-wc-button>\n <modus-wc-button>Date</modus-wc-button>\n </modus-wc-button-group>\n </div>\n \n <div style=\"display: flex; gap: 8px;\">\n <modus-wc-typography hierarchy=\"h4\">Selected Button(s):</modus-wc-typography> \n <modus-wc-typography id=\"selected-buttons-display\"></modus-wc-typography>\n </div>\n\n `;\n },\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n- The \\`size\\` prop has been removed. Button sizes are now controlled individually on each button within the group.\n- Selection state is now managed internally - the \\`selected\\` attribute on individual buttons is no longer used.\n- Shadow DOM has been removed (\\`shadow: false\\`) for better composability.\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|-----------------|-----------------|--------------------------------------------------------------------------|\n| aria-label | aria-label | Unchanged |\n| aria-disabled | - | Removed. Use \\`disabled\\` prop instead |\n| button-style | variant | Values changed: \\`fill\\` → \\`filled\\`, \\`outline\\` → \\`outlined\\` |\n| color | color | \\`special\\` color removed. Other values unchanged |\n| disabled | disabled | Unchanged |\n| - | orientation | New in 2.0. Controls horizontal/vertical layout |\n| selection-type | selection-type | Values changed: \\`none\\` → \\`default\\`, \\`single\\` and \\`multiple\\` unchanged |\n| size | - | Removed. Control size on individual buttons |\n\n#### Event Mapping\n\n| 1.0 Event | 2.0 Event | Notes |\n|------------------------|------------------------|------------------------------------------------------------|\n| buttonGroupClick | buttonGroupClick | Event detail changed: now includes \\`{ button, isSelected }\\` |\n| buttonSelectionChange | buttonSelectionChange | Returns array of selected buttons |\n `,\n },\n },\n controls: { disable: true },\n canvas: { disable: true },\n },\n render: () => html`<div></div>`,\n};\n"
99
+ }
100
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "description": "A customizable button component used to create buttons with different sizes, variants, and types. The component supports a `<slot>` for injecting content within the button, similar to a native HTML button.",
3
+ "properties": [
4
+ {
5
+ "name": "color",
6
+ "type": "'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger'",
7
+ "description": "The color variant of the button.",
8
+ "default": "'primary'",
9
+ "mutable": false,
10
+ "end_line": 33
11
+ },
12
+ {
13
+ "name": "customClass",
14
+ "type": "string",
15
+ "description": "Custom CSS class to apply to the button element.",
16
+ "default": "''",
17
+ "mutable": false,
18
+ "end_line": 36
19
+ },
20
+ {
21
+ "name": "disabled",
22
+ "type": "boolean",
23
+ "description": "If true, the button will be disabled.",
24
+ "default": "false",
25
+ "mutable": false,
26
+ "end_line": 39
27
+ },
28
+ {
29
+ "name": "fullWidth",
30
+ "type": "boolean",
31
+ "description": "If true, the button will take the full width of its container.",
32
+ "default": "false",
33
+ "mutable": false,
34
+ "end_line": 42
35
+ },
36
+ {
37
+ "name": "pressed",
38
+ "type": "boolean",
39
+ "description": "If true, the button will be in a pressed state (for toggle buttons).",
40
+ "default": "false",
41
+ "mutable": false,
42
+ "end_line": 45
43
+ },
44
+ {
45
+ "name": "shape",
46
+ "type": "'circle' | 'ellipse' | 'rectangle' | 'square'",
47
+ "description": "The shape of the button.",
48
+ "default": "'rectangle'",
49
+ "mutable": false,
50
+ "end_line": 48
51
+ },
52
+ {
53
+ "name": "size",
54
+ "type": "DaisySize",
55
+ "description": "The size of the button.",
56
+ "default": "'md'",
57
+ "mutable": false,
58
+ "end_line": 51
59
+ },
60
+ {
61
+ "name": "type",
62
+ "type": "'button' | 'submit' | 'reset'",
63
+ "description": "The type of the button.",
64
+ "default": "'button'",
65
+ "mutable": false,
66
+ "end_line": 54
67
+ },
68
+ {
69
+ "name": "variant",
70
+ "type": "'borderless' | 'filled' | 'outlined'",
71
+ "description": "The variant of the button.",
72
+ "default": "'filled'",
73
+ "mutable": false,
74
+ "end_line": 57
75
+ }
76
+ ],
77
+ "events": [
78
+ {
79
+ "name": "buttonClick",
80
+ "detail": "MouseEvent | KeyboardEvent",
81
+ "description": "Event emitted when the button is clicked or activated via keyboard.",
82
+ "end_line": 60
83
+ }
84
+ ],
85
+ "methods": [],
86
+ "slots": [
87
+ {
88
+ "name": "default",
89
+ "description": "Slot for default content"
90
+ }
91
+ ],
92
+ "examples": {
93
+ "basic": "<modus-wc-button\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ?disabled=\"${args.disabled}\"\n ?full-width=\"${args['full-width']}\"\n ?pressed=\"${args.pressed}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n type=\"${args.type}\"\n variant=\"${args.variant}\"\n>\n Click me\n</modus-wc-button>",
94
+ "variations": [],
95
+ "args": {
96
+ "color": "'primary'",
97
+ "disabled": "false",
98
+ "full-width": "false",
99
+ "pressed": "false",
100
+ "shape": "'rectangle'",
101
+ "size": "'md'",
102
+ "type": "'button'",
103
+ "variant": "'filled'"
104
+ },
105
+ "argTypes": {},
106
+ "usage": [],
107
+ "events": [
108
+ "buttonClick"
109
+ ]
110
+ },
111
+ "tag": "modus-wc-button",
112
+ "storyExample": {
113
+ "template": "<modus-wc-button\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ?disabled=\"${args.disabled}\"\n ?full-width=\"${args['full-width']}\"\n ?pressed=\"${args.pressed}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n type=\"${args.type}\"\n variant=\"${args.variant}\"\n>\n Click me\n</modus-wc-button>",
114
+ "args": {
115
+ "color": "'primary'",
116
+ "disabled": "false",
117
+ "full-width": "false",
118
+ "pressed": "false",
119
+ "shape": "'rectangle'",
120
+ "size": "'md'",
121
+ "type": "'button'",
122
+ "variant": "'filled'"
123
+ },
124
+ "argTypes": {},
125
+ "events": [
126
+ "buttonClick"
127
+ ],
128
+ "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 { DaisySize } from '../types';\n\ninterface ButtonArgs {\n color: 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';\n 'custom-class'?: string;\n disabled: boolean;\n 'full-width': boolean;\n pressed: boolean;\n shape: 'circle' | 'ellipse' | 'rectangle' | 'square';\n size: DaisySize;\n type: 'button' | 'submit' | 'reset';\n variant: 'borderless' | 'filled' | 'outlined';\n}\n\nconst meta: Meta<ButtonArgs> = {\n title: 'Components/Button',\n component: 'modus-wc-button',\n args: {\n color: 'primary',\n disabled: false,\n 'full-width': false,\n pressed: false,\n shape: 'rectangle',\n size: 'md',\n type: 'button',\n variant: 'filled',\n },\n argTypes: {\n color: {\n control: { type: 'select' },\n options: ['primary', 'secondary', 'tertiary', 'warning', 'danger'],\n },\n shape: {\n control: { type: 'select' },\n options: ['circle', 'ellipse', 'rectangle', 'square'],\n },\n size: {\n control: { type: 'select' },\n options: ['xs', 'sm', 'md', 'lg'],\n },\n type: {\n control: { type: 'select' },\n options: ['button', 'submit', 'reset'],\n },\n variant: {\n control: { type: 'select' },\n options: ['borderless', 'filled', 'outlined'],\n },\n },\n decorators: [withActions],\n parameters: {\n actions: {\n handles: ['buttonClick'],\n },\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<ButtonArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<modus-wc-button\n color=\"${args.color}\"\n custom-class=\"${ifDefined(args['custom-class'])}\"\n ?disabled=\"${args.disabled}\"\n ?full-width=\"${args['full-width']}\"\n ?pressed=\"${args.pressed}\"\n shape=\"${args.shape}\"\n size=\"${args.size}\"\n type=\"${args.type}\"\n variant=\"${args.variant}\"\n>\n Click me\n</modus-wc-button>\n `;\n },\n};\n\nexport const Default: Story = {\n ...Template,\n};\n\nexport const ButtonShapes: Story = {\n render: () => {\n // prettier-ignore\n return html`\n <modus-wc-button\n shape=\"rectangle\"\n >\n Rectangle\n </modus-wc-button>\n<modus-wc-button\n shape=\"circle\"\n>\n Circle\n</modus-wc-button>\n<modus-wc-button\n shape=\"square\"\n>\n Square\n</modus-wc-button>\n<modus-wc-button\n shape=\"ellipse\"\n>\n Ellipse\n</modus-wc-button>\n `;\n },\n};\n\nexport const DynamicTextUpdate: Story = {\n render: () => {\n const updateButtonText = () => {\n const btnText = document.getElementById('btn-text') as HTMLSpanElement;\n const input = document.getElementById(\n 'btn-text-input'\n ) as HTMLInputElement;\n\n btnText.textContent = input.value;\n };\n\n // prettier-ignore\n return html`\n<script>\n function updateButtonText() {\n const btnText = document.getElementById('btn-text');\n const input = document.getElementById('btn-text-input');\n btnText.textContent = input.value;\n }\n // Call updateButtonText function using the button's click event\n // Example: <modus-wc-button color=\"primary\" variant=\"filled\" buttonClick=\"updateButtonText()\"></modus-wc-button>\n</script>\n\n<div>\n <modus-wc-button id=\"text-update-btn\" color=\"primary\" variant=\"filled\" @buttonClick=${updateButtonText}>\n <modus-wc-icon decorative name=\"shopping_cart\"></modus-wc-icon><span id=\"btn-text\">Press button to update content</span>\n <modus-wc-icon decorative name=\"shopping_cart\"></modus-wc-icon>\n </modus-wc-button>\n\n <div style=\"margin-top: 8px; display: flex; gap: 8px; align-items: center;\">\n <modus-wc-text-input id=\"btn-text-input\" type=\"text\" value=\"Updated Text\" style=\"padding: 4px 8px;\" />\n </div>\n</div>\n `;\n },\n};\nexport const IconOnlyButton: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<modus-wc-button aria-label=\"Notification button\">\n <modus-wc-icon decorative name=\"notifications\"></modus-wc-icon>\n</modus-wc-button>\n `;\n },\n};\n\nexport const IconLeftButton: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<modus-wc-button>\n <modus-wc-icon decorative name=\"download\"></modus-wc-icon>\n Download\n</modus-wc-button>\n `;\n },\n};\n\nexport const IconRightButton: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<modus-wc-button>\n Details\n <modus-wc-icon decorative name=\"launch\"></modus-wc-icon>\n</modus-wc-button>\n `;\n },\n};\n\nexport const IconLeftAndRightButton: Story = {\n render: () => {\n // prettier-ignore\n return html`\n<modus-wc-button>\n <modus-wc-icon decorative name=\"shopping_cart\"></modus-wc-icon>\n Checkout\n <modus-wc-icon decorative name=\"shopping_cart\"></modus-wc-icon>\n</modus-wc-button>\n `;\n },\n};\n\nexport const ShadowDomParent: Story = {\n render: (args) => {\n // Create a unique shadow host for button component\n if (!customElements.get('button-shadow-host')) {\n const ButtonShadowHost = createShadowHostClass<ButtonArgs>({\n componentTag: 'modus-wc-button',\n propsMapper: (v: ButtonArgs, el: HTMLElement) => {\n const buttonEl = el as unknown as {\n ariaLabel: string;\n color: string;\n shape: string;\n size: string;\n type: string;\n variant: string;\n customClass: string;\n disabled: boolean;\n fullWidth: boolean;\n pressed: boolean;\n };\n buttonEl.ariaLabel = 'Click me button';\n buttonEl.color = v.color;\n buttonEl.shape = v.shape;\n buttonEl.size = v.size;\n buttonEl.type = v.type;\n buttonEl.variant = v.variant;\n buttonEl.customClass = v['custom-class'] || '';\n buttonEl.disabled = Boolean(v.disabled);\n buttonEl.fullWidth = Boolean(v['full-width']);\n buttonEl.pressed = Boolean(v.pressed);\n // DO NOT set textContent - it destroys the component's internal structure!\n // Button content should be set via defaultContent in the helper config\n },\n defaultContent: 'Click me', // Set content here instead\n });\n customElements.define('button-shadow-host', ButtonShadowHost);\n }\n\n return html`<button-shadow-host\n .props=${{ ...args }}\n ></button-shadow-host>`;\n },\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n - In 1.0 buttons had specific properties for adding icons (\\`icon-only\\`, \\`left-icon\\`, \\`right-icon\\`). In 2.0, icons are added via slots using the \\`modus-wc-icon\\` component.\n - The \\`button-style\\` property has been renamed to \\`variant\\` with similar options.\n - Size values have changed from verbose names (\\`small\\`, \\`medium\\`, \\`large\\`) to abbreviations (\\`sm\\`, \\`md\\`, \\`lg\\`).\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|-----------------|------------|-------------------------------------------------------------|\n| aria-label | aria-label | |\n| button-style | variant | \\`fill\\` → \\`filled\\`, \\`outline\\` → \\`outlined\\` |\n| color | color | \\`dark\\` and \\`special\\` removed, \\`warning\\` added |\n| critical-action | | Not carried over |\n| disabled | disabled | |\n| icon-only | | Not carried over, use \\`icon\\` slot |\n| left-icon | | Not carried over, use \\`icon\\` slot |\n| right-icon | | Not carried over, use \\`icon\\` slot |\n| show-caret | | Not carried over |\n| size | size | \\`small\\` → \\`sm\\`, \\`medium\\` → \\`md\\`, \\`large\\` → \\`lg\\` |\n| type | type | |\n\n#### Event Mapping\n\n| 1.0 Event | 2.0 Event | Notes |\n|--------------|--------------|------------------|\n| buttonClick | buttonClick | |\n `,\n },\n },\n controls: { disable: true },\n canvas: { disable: true },\n },\n render: () => html`<div></div>`,\n};\n"
129
+ }
130
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "description": "A customizable card component used to group and display content in a way that is easily readable. This component supports multiple `<slot>` elements including 'header' for images or custom content, 'title', 'subtitle', a default slot for main content, 'actions' for buttons or interactive elements, and 'footer'.",
3
+ "properties": [
4
+ {
5
+ "name": "backgroundFigure",
6
+ "type": "boolean",
7
+ "description": "Makes any \\<figure> in the 'header' slot cover the background",
8
+ "default": "false",
9
+ "mutable": false,
10
+ "end_line": 21
11
+ },
12
+ {
13
+ "name": "bordered",
14
+ "type": "boolean",
15
+ "description": "Adds a hard border to the card",
16
+ "default": "false",
17
+ "mutable": false,
18
+ "end_line": 24
19
+ },
20
+ {
21
+ "name": "customClass",
22
+ "type": "string",
23
+ "description": "Custom CSS class to apply",
24
+ "default": "''",
25
+ "mutable": false,
26
+ "end_line": 27
27
+ },
28
+ {
29
+ "name": "layout",
30
+ "type": "'vertical' | 'horizontal'",
31
+ "description": "Determines how the card is laid out",
32
+ "default": "'vertical'",
33
+ "mutable": false,
34
+ "end_line": 30
35
+ },
36
+ {
37
+ "name": "padding",
38
+ "type": "'compact' | 'comfortable'",
39
+ "description": "Determines the interior padding size",
40
+ "default": "'compact'",
41
+ "mutable": false,
42
+ "end_line": 33
43
+ }
44
+ ],
45
+ "events": [],
46
+ "methods": [],
47
+ "slots": [
48
+ {
49
+ "name": "header",
50
+ "description": "Slot for header content"
51
+ },
52
+ {
53
+ "name": "title",
54
+ "description": "Slot for title content"
55
+ },
56
+ {
57
+ "name": "subtitle",
58
+ "description": "Slot for subtitle content"
59
+ },
60
+ {
61
+ "name": "default",
62
+ "description": "Slot for default content"
63
+ },
64
+ {
65
+ "name": "actions",
66
+ "description": "Slot for actions content"
67
+ },
68
+ {
69
+ "name": "footer",
70
+ "description": "Slot for footer content"
71
+ }
72
+ ],
73
+ "examples": {
74
+ "basic": "<style>\n .modus-wc-card {\n width: 400px;\n }\n</style>\n<modus-wc-card\n ?background-figure=${args['background-figure']}\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <span slot=\"title\">Card Title</span>\n <span slot=\"subtitle\">Card Subtitle</span>\n <p>This is a sample card content. You can place any content here.</p>\n <div slot=\"actions\" class=\"modus-wc-justify-end\">\n <modus-wc-button aria-label=\"Click me\">Click me</modus-wc-button>\n </div>\n</modus-wc-card>",
75
+ "variations": [],
76
+ "args": {
77
+ "background-figure": "false",
78
+ "bordered": "false",
79
+ "layout": "'vertical'",
80
+ "padding": "'compact'"
81
+ },
82
+ "argTypes": {},
83
+ "usage": []
84
+ },
85
+ "tag": "modus-wc-card",
86
+ "storyExample": {
87
+ "template": "<style>\n .modus-wc-card {\n width: 400px;\n }\n</style>\n<modus-wc-card\n ?background-figure=${args['background-figure']}\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <span slot=\"title\">Card Title</span>\n <span slot=\"subtitle\">Card Subtitle</span>\n <p>This is a sample card content. You can place any content here.</p>\n <div slot=\"actions\" class=\"modus-wc-justify-end\">\n <modus-wc-button aria-label=\"Click me\">Click me</modus-wc-button>\n </div>\n</modus-wc-card>",
88
+ "args": {
89
+ "background-figure": "false",
90
+ "bordered": "false",
91
+ "layout": "'vertical'",
92
+ "padding": "'compact'"
93
+ },
94
+ "argTypes": {},
95
+ "events": [],
96
+ "fullContent": "import { Meta, StoryObj } from '@storybook/web-components';\nimport { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\ninterface CardArgs {\n 'background-figure'?: boolean;\n bordered?: boolean;\n 'custom-class'?: string;\n layout?: 'vertical' | 'horizontal';\n padding?: 'compact' | 'comfortable';\n}\n\nconst meta: Meta<CardArgs> = {\n title: 'Components/Card',\n component: 'modus-wc-card',\n args: {\n 'background-figure': false,\n bordered: false,\n layout: 'vertical',\n padding: 'compact',\n },\n argTypes: {\n layout: {\n control: { type: 'select' },\n options: ['vertical', 'horizontal'],\n },\n padding: {\n control: { type: 'select' },\n options: ['compact', 'comfortable'],\n },\n },\n parameters: {\n layout: 'padded',\n },\n};\n\nexport default meta;\n\ntype Story = StoryObj<CardArgs>;\n\nconst Template: Story = {\n render: (args) => {\n // prettier-ignore\n return html`\n<style>\n .modus-wc-card {\n width: 400px;\n }\n</style>\n<modus-wc-card\n ?background-figure=${args['background-figure']}\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <span slot=\"title\">Card Title</span>\n <span slot=\"subtitle\">Card Subtitle</span>\n <p>This is a sample card content. You can place any content here.</p>\n <div slot=\"actions\" class=\"modus-wc-justify-end\">\n <modus-wc-button aria-label=\"Click me\">Click me</modus-wc-button>\n </div>\n</modus-wc-card>\n `;\n },\n};\n\nexport const Default: Story = {\n ...Template,\n};\n\nexport const SimpleCard: Story = {\n ...Template,\n // prettier-ignore\n render: () => html`\n<modus-wc-card>\n Raw card content.\n</modus-wc-card>\n `,\n};\n\nexport const SlotsLayout: Story = {\n ...Template,\n // prettier-ignore\n render: (args) => html`\n<style>\n .slot-box {\n background: #ccccff;\n border: 2px solid purple;\n color: purple;\n display: flex;\n justify-content: center;\n }\n</style>\n<modus-wc-card\n ?background-figure=${args['background-figure']}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <div slot=\"header\" class=\"slot-box\">Header Slot</div>\n <div slot=\"title\" class=\"slot-box\">Title Slot</div>\n <div slot=\"subtitle\" class=\"slot-box\">Subtitle Slot</div>\n <div class=\"slot-box\">Default (Body) Slot</div>\n <div slot=\"actions\" class=\"slot-box\">Actions Slot</div>\n <div slot=\"footer\" class=\"slot-box\">Footer Slot</div>\n</modus-wc-card>\n `,\n};\n\nexport const ComplexCard: Story = {\n ...Template,\n // prettier-ignore\n render: (args) => html`\n<style>\n #complex-card > .modus-wc-card:hover {\n box-shadow:\n 0 20px 25px -5px rgba(0, 0, 0, 0.1),\n 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n }\n</style>\n<modus-wc-card\n id=\"complex-card\"\n ?background-figure=${args['background-figure']}\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <figure slot=\"header\">\n <img\n src=\"https://picsum.photos/id/643/750/300\"\n alt=\"Header Image with Shadow\"\n />\n </figure>\n <span slot=\"title\">Complex Card</span>\n <span slot=\"subtitle\">With Shadow</span>\n <p>\n This is a more of a traditional Card, featuring a header image, content,\n multiple buttons, and a larger shadow that appears on hover.\n </p>\n <div slot=\"actions\" class=\"modus-wc-justify-end\">\n <modus-wc-button aria-label=\"Action 1\">Action 1</modus-wc-button>\n <modus-wc-button aria-label=\"Action 2\">Action 2</modus-wc-button>\n </div>\n</modus-wc-card>\n `,\n};\n\nexport const HorizontalImage: Story = {\n ...Template,\n // prettier-ignore\n render: (args) => html`\n<modus-wc-card\n ?background-figure=${args['background-figure']}\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=\"horizontal\"\n padding=${ifDefined(args.padding)}\n>\n <figure slot=\"header\">\n <img src=\"https://picsum.photos/id/1025/200/300\" alt=\"Horizontal Image\" />\n </figure>\n <p>This card uses a horizontal layout.</p>\n</modus-wc-card>\n `,\n};\n\nexport const BackgroundFigureImage: Story = {\n ...Template,\n // prettier-ignore\n render: (args) => html`\n<modus-wc-card\n background-figure\n ?bordered=${args.bordered}\n custom-class=${ifDefined(args['custom-class'])}\n layout=${ifDefined(args.layout)}\n padding=${ifDefined(args.padding)}\n>\n <figure slot=\"header\">\n <img src=\"https://picsum.photos/id/1045/600/400\" alt=\"Full Image\" />\n </figure>\n <span slot=\"title\">Full Image Card</span>\n <p>This card has a figure image in the background.</p>\n</modus-wc-card>\n `,\n};\n\nexport const Migration: Story = {\n parameters: {\n docs: {\n description: {\n story: `\n#### Breaking Changes\n\n - In 1.0, card dimensions were controlled via direct props. In 2.0, styling should be handled through CSS.\n - Shadow effects on hover are now controlled via CSS rather than props.\n - The card component in 2.0 focuses on layout and structure rather than specific styling.\n\n#### Prop Mapping\n\n| 1.0 Prop | 2.0 Prop | Notes |\n|----------------------|---------------------|--------------------------------------|\n| border-radius | | Not carried over, use CSS instead |\n| height | | Not carried over, use CSS instead |\n| show-card-border | bordered | |\n| show-shadow-on-hover | | Not carried over, use CSS instead |\n| width | | Not carried over, use CSS instead |\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"
97
+ }
98
+ }