@mozaic-ds/vue 1.0.0-beta.3 → 1.0.0-beta.4

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 (179) hide show
  1. package/LICENSE +51 -0
  2. package/README.md +218 -84
  3. package/dist/mozaic-vue.css +1 -1
  4. package/dist/mozaic-vue.d.ts +920 -0
  5. package/dist/mozaic-vue.js +877 -0
  6. package/dist/mozaic-vue.js.map +1 -0
  7. package/dist/mozaic-vue.umd.cjs +2 -0
  8. package/dist/mozaic-vue.umd.cjs.map +1 -0
  9. package/env.d.ts +1 -0
  10. package/package.json +80 -50
  11. package/src/components/Contributing.mdx +118 -0
  12. package/src/components/GettingStarted.mdx +39 -0
  13. package/src/components/Introduction.mdx +54 -0
  14. package/src/components/Support.mdx +18 -0
  15. package/src/components/badge/MBadge.spec.ts +16 -0
  16. package/src/components/badge/MBadge.stories.ts +50 -0
  17. package/src/components/badge/MBadge.vue +36 -34
  18. package/src/components/button/MButton.spec.ts +191 -0
  19. package/src/components/button/MButton.stories.ts +66 -0
  20. package/src/components/button/MButton.vue +98 -154
  21. package/src/components/checkbox/MCheckbox.spec.ts +104 -0
  22. package/src/components/checkbox/MCheckbox.stories.ts +83 -0
  23. package/src/components/checkbox/MCheckbox.vue +60 -101
  24. package/src/components/checkboxgroup/MCheckboxGroup.spec.ts +78 -0
  25. package/src/components/checkboxgroup/MCheckboxGroup.stories.ts +61 -0
  26. package/src/components/checkboxgroup/MCheckboxGroup.vue +97 -0
  27. package/src/components/field/MField.spec.ts +166 -0
  28. package/src/components/field/MField.stories.ts +376 -0
  29. package/src/components/field/MField.vue +78 -61
  30. package/src/components/fieldgroup/MFieldGroup.spec.ts +165 -0
  31. package/src/components/fieldgroup/MFieldGroup.stories.ts +274 -0
  32. package/src/components/fieldgroup/MFieldGroup.vue +79 -0
  33. package/src/components/iconbutton/MIconButton.spec.ts +108 -0
  34. package/src/components/iconbutton/MIconButton.stories.ts +66 -0
  35. package/src/components/iconbutton/MIconButton.vue +73 -0
  36. package/src/components/link/MLink.spec.ts +154 -0
  37. package/src/components/link/MLink.stories.ts +98 -0
  38. package/src/components/link/MLink.vue +86 -109
  39. package/src/components/loader/MLoader.spec.ts +104 -0
  40. package/src/components/loader/MLoader.stories.ts +45 -0
  41. package/src/components/loader/MLoader.vue +65 -55
  42. package/src/components/overlay/MOverlay.spec.ts +51 -0
  43. package/src/components/overlay/MOverlay.stories.ts +40 -0
  44. package/src/components/overlay/MOverlay.vue +27 -19
  45. package/src/components/quantityselector/MQuantitySelector.spec.ts +262 -0
  46. package/src/components/quantityselector/MQuantitySelector.stories.ts +89 -0
  47. package/src/components/quantityselector/MQuantitySelector.vue +160 -136
  48. package/src/components/radio/MRadio.spec.ts +104 -0
  49. package/src/components/radio/MRadio.stories.ts +68 -0
  50. package/src/components/radio/MRadio.vue +56 -39
  51. package/src/components/radiogroup/MRadioGroup.spec.ts +54 -0
  52. package/src/components/radiogroup/MRadioGroup.stories.ts +61 -0
  53. package/src/components/radiogroup/MRadioGroup.vue +79 -0
  54. package/src/components/select/MSelect.spec.ts +114 -0
  55. package/src/components/select/MSelect.stories.ts +101 -0
  56. package/src/components/select/MSelect.vue +77 -119
  57. package/src/components/statusbadge/MStatusBadge.stories.ts +45 -0
  58. package/src/components/statusbadge/MStatusBadge.vue +40 -0
  59. package/src/components/statusbadge/MStatusDot.vue +32 -0
  60. package/src/components/statusbadge/MstatusBadge.spec.ts +16 -0
  61. package/src/components/textarea/MTextArea.spec.ts +112 -0
  62. package/src/components/textarea/MTextArea.stories.ts +67 -0
  63. package/src/components/textarea/MTextArea.vue +81 -42
  64. package/src/components/textinput/MTextInput.spec.ts +121 -0
  65. package/src/components/textinput/MTextInput.stories.ts +114 -0
  66. package/src/components/textinput/MTextInput.vue +127 -47
  67. package/src/components/toggle/MToggle.spec.ts +99 -0
  68. package/src/components/toggle/MToggle.stories.ts +68 -0
  69. package/src/components/toggle/MToggle.vue +63 -103
  70. package/src/components/usingIcons.mdx +43 -0
  71. package/src/components/usingPresets.mdx +125 -0
  72. package/src/main.ts +39 -0
  73. package/dist/demo.html +0 -1
  74. package/dist/mozaic-vue.adeo.css +0 -45
  75. package/dist/mozaic-vue.adeo.umd.js +0 -41775
  76. package/dist/mozaic-vue.common.js +0 -41765
  77. package/dist/mozaic-vue.common.js.map +0 -1
  78. package/dist/mozaic-vue.umd.js +0 -41776
  79. package/dist/mozaic-vue.umd.js.map +0 -1
  80. package/dist/mozaic-vue.umd.min.js +0 -4
  81. package/dist/mozaic-vue.umd.min.js.map +0 -1
  82. package/postinstall.js +0 -3
  83. package/src/components/accordion/MAccordion.vue +0 -128
  84. package/src/components/accordion/index.js +0 -7
  85. package/src/components/autocomplete/MAutocomplete.vue +0 -198
  86. package/src/components/autocomplete/index.js +0 -7
  87. package/src/components/badge/index.js +0 -7
  88. package/src/components/breadcrumb/MBreadcrumb.vue +0 -73
  89. package/src/components/breadcrumb/index.js +0 -7
  90. package/src/components/button/index.js +0 -7
  91. package/src/components/card/MCard.vue +0 -78
  92. package/src/components/card/index.js +0 -7
  93. package/src/components/checkbox/MCheckboxGroup.vue +0 -155
  94. package/src/components/checkbox/index.js +0 -12
  95. package/src/components/container/MContainer.vue +0 -33
  96. package/src/components/container/index.js +0 -7
  97. package/src/components/datatable/MDataTable.vue +0 -651
  98. package/src/components/datatable/MDataTableHeader.vue +0 -55
  99. package/src/components/datatable/MDataTableTop.vue +0 -35
  100. package/src/components/datatable/helpers.js +0 -132
  101. package/src/components/datatable/index.js +0 -12
  102. package/src/components/field/index.js +0 -7
  103. package/src/components/fileuploader/MFileResult.vue +0 -149
  104. package/src/components/fileuploader/MFileUploader.vue +0 -142
  105. package/src/components/fileuploader/index.js +0 -7
  106. package/src/components/flag/MFlag.vue +0 -46
  107. package/src/components/flag/index.js +0 -7
  108. package/src/components/heading/MHeading.vue +0 -75
  109. package/src/components/heading/index.js +0 -7
  110. package/src/components/hero/MHero.vue +0 -93
  111. package/src/components/hero/index.js +0 -7
  112. package/src/components/icon/MIcon.vue +0 -120
  113. package/src/components/icon/index.js +0 -7
  114. package/src/components/index.js +0 -43
  115. package/src/components/layer/MLayer.vue +0 -208
  116. package/src/components/layer/index.js +0 -7
  117. package/src/components/link/index.js +0 -7
  118. package/src/components/listbox/MListBox.vue +0 -106
  119. package/src/components/listbox/index.js +0 -7
  120. package/src/components/loader/index.js +0 -7
  121. package/src/components/modal/MModal.vue +0 -179
  122. package/src/components/modal/index.js +0 -7
  123. package/src/components/notification/MNotification.vue +0 -110
  124. package/src/components/notification/index.js +0 -7
  125. package/src/components/optionbutton/MOptionButton.vue +0 -67
  126. package/src/components/optionbutton/index.js +0 -7
  127. package/src/components/optioncard/MOptionCard.vue +0 -132
  128. package/src/components/optioncard/index.js +0 -7
  129. package/src/components/optiongroup/MOptionGroup.vue +0 -18
  130. package/src/components/optiongroup/index.js +0 -7
  131. package/src/components/overlay/MOverlayLoader.vue +0 -43
  132. package/src/components/overlay/index.js +0 -12
  133. package/src/components/pagination/MPagination.vue +0 -162
  134. package/src/components/pagination/index.js +0 -7
  135. package/src/components/passwordinput/MPasswordInput.vue +0 -96
  136. package/src/components/passwordinput/index.js +0 -7
  137. package/src/components/phonenumber/MPhoneNumber.vue +0 -390
  138. package/src/components/phonenumber/index.js +0 -7
  139. package/src/components/progressbar/MProgress.vue +0 -102
  140. package/src/components/progressbar/index.js +0 -7
  141. package/src/components/quantityselector/index.js +0 -7
  142. package/src/components/radio/MRadioGroup.vue +0 -111
  143. package/src/components/radio/index.js +0 -12
  144. package/src/components/ratingstars/MStarsInput.vue +0 -118
  145. package/src/components/ratingstars/MStarsResult.vue +0 -89
  146. package/src/components/ratingstars/index.js +0 -12
  147. package/src/components/select/index.js +0 -7
  148. package/src/components/stepper/MStepper.vue +0 -70
  149. package/src/components/stepper/index.js +0 -7
  150. package/src/components/tabs/MTab.vue +0 -184
  151. package/src/components/tabs/index.js +0 -7
  152. package/src/components/tags/MTag.vue +0 -173
  153. package/src/components/tags/index.js +0 -7
  154. package/src/components/textarea/index.js +0 -7
  155. package/src/components/textinput/MTextInputField.vue +0 -105
  156. package/src/components/textinput/MTextInputIcon.vue +0 -42
  157. package/src/components/textinput/index.js +0 -7
  158. package/src/components/toggle/index.js +0 -7
  159. package/src/components/tooltip/MTooltip.vue +0 -42
  160. package/src/components/tooltip/index.js +0 -7
  161. package/src/index.js +0 -62
  162. package/src/shims-tsx.d.ts +0 -13
  163. package/src/shims.vue.d.ts +0 -4
  164. package/src/tokens/adeo/android/colors.xml +0 -391
  165. package/src/tokens/adeo/android/font_dimens.xml +0 -18
  166. package/src/tokens/adeo/css/_variables.scss +0 -385
  167. package/src/tokens/adeo/css/root.scss +0 -387
  168. package/src/tokens/adeo/ios/StyleDictionaryColor.h +0 -399
  169. package/src/tokens/adeo/ios/StyleDictionaryColor.m +0 -411
  170. package/src/tokens/adeo/ios/StyleDictionaryColor.swift +0 -394
  171. package/src/tokens/adeo/ios/StyleDictionarySize.h +0 -69
  172. package/src/tokens/adeo/ios/StyleDictionarySize.m +0 -70
  173. package/src/tokens/adeo/ios/StyleDictionarySize.swift +0 -71
  174. package/src/tokens/adeo/js/tokens.js +0 -483
  175. package/src/tokens/adeo/js/tokensObject.js +0 -10354
  176. package/src/tokens/adeo/scss/_tokens.scss +0 -1300
  177. package/src/utils/mozaicClasses.js +0 -16
  178. package/src/utils/theme.validator.js +0 -19
  179. package/types/index.d.ts +0 -100
@@ -0,0 +1,118 @@
1
+ import { Meta } from '@storybook/blocks';
2
+ import { Mermaid } from 'mdx-mermaid/Mermaid';
3
+
4
+ <Meta title="Contributing" />
5
+
6
+ # Be part of something bigger!
7
+
8
+ **Mozaic-Vue** is made possible by an incredible community that finds issues and creates pull requests.<br/>
9
+ It is our job to enable you to create amazing applications.
10
+
11
+ Most of the time, you find something that can be made better. You could find a bug, or you have an idea for additional functionality.<br/>
12
+ That's great! It's as easy as cloning the [Mozaic-Vue repository](https://github.com/adeo/mozaic-vue) to get started working in the development environment.
13
+
14
+ Hopefully this document makes the process for contributing clear and answers some questions that you may have.<br/>
15
+ If you have any questions, please reach out to us on our [slack channel](https://adeo-tech-community.slack.com/archives/CN4K3A99R).
16
+
17
+ ## Contribution model
18
+
19
+ The contribution process can be summarized as follows:
20
+
21
+ <Mermaid
22
+ chart={`flowchart TD;
23
+ A((I have a need <br/>fix or new feature));
24
+ A --> B{An issue already exists?};
25
+ B --> |YES| I;
26
+ I([The issue corresponds to my needs <br/>or I complete it]);
27
+ I --> D;
28
+ B --> |NO| C;
29
+ C([I create an issue <br/>]);
30
+ C --> D;
31
+ D{I can contribute?};
32
+ D --> |YES| E;
33
+ D --> |NO| J;
34
+ E([I clone the repo <br/>& create a PR associated to the issue]);
35
+ E --> F;
36
+ F([The PR is ready <br/>and I assign it to reviewers]);
37
+ F --> G;
38
+ G{The proofreading is OK <br/>and the PR is validated?};
39
+ G --> |YES| H;
40
+ G --> |NO| K;
41
+ H([The PR is merged and will be released soon]);
42
+ H;
43
+ J([In this case, I wait for the issue <br/>to be traited and delivered.]);
44
+ K([I make the requested changes]);
45
+ K --> F;
46
+ click B "https://github.com/adeo/mozaic-vue/issues" _blank;
47
+ click C "https://github.com/adeo/mozaic-vue/issues/new/choose" _blank;
48
+ `}
49
+ />
50
+
51
+ You can now discover the details of each of these steps below.
52
+
53
+ ## Reporting issues
54
+
55
+ ### Where to find known issues
56
+
57
+ We are using [GitHub Issues](https://github.com/adeo/mozaic-vue/issues) for our bugs.<br/>
58
+ We keep a close eye on this and try to make it clear when we have an internal fix in progress.<br/>
59
+
60
+ **Before filing a new task, try to make sure your problem doesn't already exist.**
61
+
62
+ ### Reporting new issue
63
+
64
+ The best way to get your bug fixed is to provide a reduced test case.
65
+
66
+ Once you've gathered all information, please fill out an issue [here](https://github.com/adeo/mozaic-vue/issues/new/choose).
67
+
68
+ ## Proposing a change
69
+
70
+ If you intend to add a new component, or make any non-trivial changes, we recommend filing an issue.
71
+
72
+ This will lets us prepare an agreement on your proposal before you put significant effort into it.
73
+
74
+ If you’re only fixing a bug, it should be fine to submit a pull request but we still recommend to submit an issue detailing what you’re looking to fix.
75
+
76
+ ## Setup Dev Environment
77
+
78
+ ### Project setup
79
+
80
+ ```bash
81
+ // Clone mozaic-vue repo
82
+ git clone git@github.com:adeo/mozaic-vue.git
83
+
84
+ // Go to the cloned directory
85
+ cd mozaic-vue
86
+
87
+ // Checkout the branch you are working on
88
+ git checkout <branch name>
89
+
90
+ // Install dependencies
91
+ npm install
92
+ ```
93
+
94
+ ## Submitting Changes/ Pull Requests
95
+
96
+ Working on your first Pull Request? You can learn how from this video series:
97
+ [How to contribute to an open source project on Github](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github).
98
+
99
+ Mozaic's team is keeping an eye on pull requests. We will check your pull request, either merge it, request changes or close it with explanation.
100
+
101
+ Before submitting please make sure to run:
102
+
103
+ ```
104
+ // Pull down the latest
105
+ $ git pull origin master
106
+
107
+ // Create your working branch
108
+ $ git branch - b type-id-description
109
+
110
+ // Resolve bugs or implement new pattern
111
+ // Add Tests and documentation
112
+
113
+ // Run linter
114
+ $ npm run lint
115
+
116
+ // Run formatter
117
+ $ npm run format
118
+ ```
@@ -0,0 +1,39 @@
1
+ import { Meta } from '@storybook/blocks';
2
+ import { Source } from '@storybook/addon-docs';
3
+
4
+ <Meta title="Getting Started" />
5
+
6
+ # Getting Started
7
+
8
+ **Mozaic-Vue** is the [Vue.js](https://vuejs.org/) implementation of ADEO Design system.
9
+
10
+ ## 📦 Installation
11
+
12
+ In order to use **Mozaic-Vue** in your **Vue.js** project, you must first install the [npm package](https://www.npmjs.com/package/@mozaic-ds/vue):
13
+
14
+ <Source
15
+ language="bash"
16
+ dark
17
+ code="npm install @mozaic-ds/vue --save --save-exact"
18
+ />
19
+
20
+ Or with **Yarn**:
21
+
22
+ <Source language="bash" dark code="yarn add @mozaic-ds/vue -E" />
23
+
24
+ ## 📝 Usage
25
+
26
+ Now you can import any components in your Vue files and use it directly.
27
+
28
+ <Source
29
+ language='html'
30
+ dark
31
+ code={`
32
+ <script setup>
33
+ import { MButton } from '@mozaic-ds/vue'
34
+ </script>
35
+
36
+ <template>
37
+ <MButton label="This is a Mozaic Button" />
38
+ </template>
39
+ `} />
@@ -0,0 +1,54 @@
1
+ import { Meta } from '@storybook/blocks';
2
+ import { Source } from '@storybook/addon-docs';
3
+ import logo from '../../.storybook/assets/logo.svg';
4
+
5
+ <Meta title="Introduction" />
6
+
7
+ <h1>
8
+ <img
9
+ src={logo}
10
+ alt="Mozaic-Vue logo"
11
+ style={{ height: '48px', marginRight: '8px', verticalAlign: 'middle' }}
12
+ />
13
+ <span style={{ fontSize: '32px' }}>Vue.js library</span>
14
+ </h1>
15
+
16
+ This project contains **Vue.js** components that implements the **ADEO Design system** guidelines.
17
+
18
+ ## 🪄 Introduction
19
+
20
+ ADEO Design system is a global and collaborative design system
21
+ that facilitates the designer and developer experience,
22
+ enabling them to create universal interfaces
23
+ perfectly aligned with the business strategy of Adeo.
24
+
25
+ ## 🎨 Getting Started
26
+
27
+ Ready to begin using Mozaic in your project?\
28
+ Our Getting Started guide will walk you through the basics, \
29
+ from setting up the system to implementing core components in your application.
30
+
31
+ Whether you're new to Mozaic or just need a refresher, \
32
+ this guide has everything you need to hit the ground running.
33
+
34
+ Read how to **[Setup your application](/docs/getting-started--docs)**!
35
+
36
+ ## 🤝 Contributing
37
+
38
+ Be part of something bigger!
39
+
40
+ **Mozaic-Vue** is made possible by an incredible community that finds issues and creates pull requests.\
41
+ It is our job to enable you to create amazing applications.
42
+
43
+ To do so, see our **[contributing process](/docs/contributing--docs)**.
44
+
45
+ ## ℹ️ Support
46
+
47
+ If you have any questions or need assistance,\
48
+ we are here to help.
49
+
50
+ Whether you're troubleshooting, looking for documentation,\
51
+ or need to get in touch with our team,\
52
+ you'll find all the resources you need to get the most out of **Mozaic-Vue**.
53
+
54
+ Visit our **[Support page](/docs/support--docs)** for more information.
@@ -0,0 +1,18 @@
1
+ import { Meta } from '@storybook/blocks';
2
+
3
+ <Meta title="Support" />
4
+
5
+ # Support
6
+
7
+ Need help?
8
+
9
+ Any feedback, ideas or questions?
10
+
11
+ The **Mozaic Design System team** would welcome any feedback, ideas, or requirements that you have.<br/>
12
+ Our goal is to make your lives easier.
13
+
14
+ If you want to get more detailed information on the components or any other topic related to **Mozaic-Vue**, you can contact us through the channels below:
15
+
16
+ - Join the [#mozaic-vue](https://app.slack.com/client/T4R6RCZFA/CN4K3A99R/) channel on **Slack**
17
+ - Join the [#mozaic-support](https://app.slack.com/client/T4R6RCZFA/CKQJZL7C4/) channel on **Slack**
18
+ - Join our [Workplace group](https://adeo.workplace.com/groups/427492661454646/)
@@ -0,0 +1,16 @@
1
+ import { describe, it, expect } from 'vitest';
2
+
3
+ import { mount } from '@vue/test-utils';
4
+ import MBadge from './MBadge.vue';
5
+
6
+ describe('MBadge component', () => {
7
+ it('renders properly', () => {
8
+ const wrapper = mount(MBadge, {
9
+ props: {
10
+ label: 99,
11
+ },
12
+ });
13
+
14
+ expect(wrapper.text()).toContain('99');
15
+ });
16
+ });
@@ -0,0 +1,50 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3';
2
+ import MBadge from './MBadge.vue';
3
+
4
+ const meta: Meta<typeof MBadge> = {
5
+ title: 'Indicators/Badge (number)',
6
+ component: MBadge,
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component:
11
+ 'A badge indicates the status of an entity and can evolve at any time.',
12
+ },
13
+ },
14
+ },
15
+ args: { label: 99 },
16
+ render: (args) => ({
17
+ components: { MBadge },
18
+ setup() {
19
+ return { args };
20
+ },
21
+ template: `
22
+ <MBadge v-bind="args"></MBadge>
23
+ `,
24
+ }),
25
+ };
26
+ export default meta;
27
+ type Story = StoryObj<typeof MBadge>;
28
+
29
+ export const Standard: Story = {};
30
+
31
+ export const Accent: Story = {
32
+ args: { appearance: 'accent' },
33
+ };
34
+
35
+ export const Danger: Story = {
36
+ args: { appearance: 'danger' },
37
+ };
38
+
39
+ export const Inverse: Story = {
40
+ parameters: {
41
+ backgrounds: {
42
+ default: 'Inverse',
43
+ },
44
+ },
45
+ args: { appearance: 'inverse' },
46
+ };
47
+
48
+ export const Size: Story = {
49
+ args: { size: 'm' },
50
+ };
@@ -1,43 +1,45 @@
1
1
  <template>
2
- <component :is="htmlTag" class="mc-badge" :class="setClasses">
3
- <slot />
4
- </component>
2
+ <span class="mc-badge" :class="classObject">
3
+ {{ label }}
4
+ </span>
5
5
  </template>
6
6
 
7
- <script>
8
- export default {
9
- name: 'MBadge',
7
+ <script setup lang="ts">
8
+ import { computed } from 'vue';
9
+ /**
10
+ * A badge indicates the status of an entity and can evolve at any time.
11
+ */
12
+ const props = withDefaults(
13
+ defineProps<{
14
+ /**
15
+ * Content of the badge
16
+ */
17
+ label: number;
18
+ /**
19
+ * Allows to define the Badge style
20
+ */
21
+ appearance?: 'danger' | 'accent' | 'inverse' | 'standard';
10
22
 
11
- props: {
12
- type: {
13
- type: String,
14
- default: null,
15
- validator: (value) =>
16
- ['information', 'success', 'warning', 'danger', 'neutral'].includes(
17
- value
18
- ),
19
- },
20
- htmlTag: {
21
- type: String,
22
- default: 'span',
23
- },
23
+ /**
24
+ * Allows to define the Badge size
25
+ */
26
+ size?: 's' | 'm';
27
+ }>(),
28
+ {
29
+ appearance: 'standard',
30
+ size: 's',
24
31
  },
32
+ );
25
33
 
26
- computed: {
27
- setClasses() {
28
- const classes = [];
29
-
30
- if (this.type) {
31
- classes.push(`mc-badge--${this.type}`);
32
- }
33
-
34
- return classes;
35
- },
36
- },
37
- };
34
+ const classObject = computed(() => {
35
+ return {
36
+ [`mc-badge--${props.appearance}`]:
37
+ props.appearance && props.appearance != 'standard',
38
+ [`mc-badge--${props.size}`]: props.size && props.size != 's',
39
+ };
40
+ });
38
41
  </script>
39
42
 
40
- <style lang="scss">
41
- @import 'settings-tools/_all-settings';
42
- @import 'components/_c.badge';
43
+ <style lang="scss" scoped>
44
+ @use '@mozaic-ds/styles/components/badge';
43
45
  </style>
@@ -0,0 +1,191 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { describe, it, expect } from 'vitest';
3
+ import MButton from './MButton.vue';
4
+ import ChevronRight24 from '@mozaic-ds/icons-vue/src/components/ChevronRight24/ChevronRight24.vue';
5
+ import MLoader from '../loader/MLoader.vue';
6
+
7
+ describe('MButton component', () => {
8
+ it('renders with a label', () => {
9
+ const wrapper = mount(MButton, {
10
+ slots: {
11
+ default: 'Click Me',
12
+ },
13
+ });
14
+ expect(wrapper.text()).toContain('Click Me');
15
+ });
16
+
17
+ it('applies the correct appearance class based on the appearance prop', () => {
18
+ const wrapper = mount(MButton, {
19
+ props: {
20
+ appearance: 'accent',
21
+ },
22
+ slots: {
23
+ default: 'Styled Button',
24
+ },
25
+ });
26
+
27
+ expect(wrapper.classes()).toContain('mc-button--accent');
28
+ });
29
+
30
+ it('applies the correct size class based on the size prop', () => {
31
+ const wrapper = mount(MButton, {
32
+ props: {
33
+ label: 'Sized Button',
34
+ size: 'l',
35
+ },
36
+ slots: {
37
+ default: 'Sized Button',
38
+ },
39
+ });
40
+
41
+ expect(wrapper.classes()).toContain('mc-button--l');
42
+ });
43
+
44
+ it('disables the button when the disabled prop is true', async () => {
45
+ const wrapper = mount(MButton, {
46
+ props: {
47
+ disabled: true,
48
+ },
49
+ slots: {
50
+ default: 'Disabled Button',
51
+ },
52
+ });
53
+
54
+ const button = wrapper.find('button');
55
+ expect(button.attributes('disabled')).toBeDefined();
56
+ });
57
+
58
+ it('applies the correct ghost class when ghost prop is true', () => {
59
+ const wrapper = mount(MButton, {
60
+ props: {
61
+ ghost: true,
62
+ },
63
+ slots: {
64
+ default: 'Ghost Button',
65
+ },
66
+ });
67
+
68
+ expect(wrapper.classes()).toContain('mc-button--ghost');
69
+ });
70
+
71
+ it('applies the outlined class when outlined prop is true', () => {
72
+ const wrapper = mount(MButton, {
73
+ props: {
74
+ outlined: true,
75
+ },
76
+ slots: {
77
+ default: 'Outlined Button',
78
+ },
79
+ });
80
+
81
+ expect(wrapper.classes()).toContain('mc-button--outlined');
82
+ });
83
+
84
+ it('has type="button" by default', () => {
85
+ const wrapper = mount(MButton, {
86
+ slots: {
87
+ default: 'Default Button',
88
+ },
89
+ });
90
+
91
+ const button = wrapper.find('button');
92
+ expect(button.attributes('type')).toBe('button');
93
+ });
94
+
95
+ it('can have type="submit" when the type prop is "submit"', () => {
96
+ const wrapper = mount(MButton, {
97
+ props: {
98
+ type: 'submit',
99
+ },
100
+ slots: {
101
+ default: 'Submit Button',
102
+ },
103
+ });
104
+
105
+ const button = wrapper.find('button');
106
+ expect(button.attributes('type')).toBe('submit');
107
+ });
108
+
109
+ it('renders with an icon in the left position', () => {
110
+ const wrapper = mount(MButton, {
111
+ props: {
112
+ iconPosition: 'left',
113
+ },
114
+ slots: {
115
+ default: 'Button with Icon',
116
+ icon: ChevronRight24,
117
+ },
118
+ });
119
+
120
+ const icon = wrapper.findComponent(ChevronRight24);
121
+ expect(icon.exists()).toBe(true);
122
+ });
123
+
124
+ it('renders with an icon in the right position', () => {
125
+ const wrapper = mount(MButton, {
126
+ props: {
127
+ iconPosition: 'right',
128
+ },
129
+ slots: {
130
+ default: 'Button with Icon',
131
+ icon: ChevronRight24,
132
+ },
133
+ });
134
+
135
+ const icon = wrapper.findComponent(ChevronRight24);
136
+ expect(icon.exists()).toBe(true);
137
+ });
138
+
139
+ it('renders with only an icon when iconPosition is "only"', () => {
140
+ const wrapper = mount(MButton, {
141
+ props: {
142
+ iconPosition: 'only',
143
+ },
144
+ slots: {
145
+ default: 'Icon Only Button',
146
+ icon: ChevronRight24,
147
+ },
148
+ });
149
+
150
+ const icon = wrapper.findComponent(ChevronRight24);
151
+ expect(icon.exists()).toBe(true);
152
+
153
+ const label = wrapper.find('.mc-button__label');
154
+ expect(label.exists()).toBe(false);
155
+ });
156
+
157
+ it('renders loader when isLoading prop is true', () => {
158
+ const wrapper = mount(MButton, {
159
+ props: {
160
+ isLoading: true,
161
+ },
162
+ slots: {
163
+ default: 'Loading Button',
164
+ },
165
+ });
166
+
167
+ const loader = wrapper.findComponent(MLoader);
168
+ expect(loader.exists()).toBe(true);
169
+
170
+ const label = wrapper.find('.mc-button__label');
171
+ expect(label.attributes('style')).toContain('visibility: hidden');
172
+ });
173
+
174
+ it('does not render loader when isLoading prop is false', () => {
175
+ const wrapper = mount(MButton, {
176
+ props: {
177
+ isLoading: false,
178
+ },
179
+ slots: {
180
+ default: 'Normal Button',
181
+ },
182
+ });
183
+
184
+ const loader = wrapper.findComponent(MLoader);
185
+ expect(loader.exists()).toBe(false);
186
+
187
+ const label = wrapper.find('.mc-button__label');
188
+ expect(label.exists()).toBe(true);
189
+ expect(label.text()).toBe('Normal Button');
190
+ });
191
+ });
@@ -0,0 +1,66 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3';
2
+
3
+ import MButton from './MButton.vue';
4
+ import Download24 from '@mozaic-ds/icons-vue/src/components/Download24/Download24.vue';
5
+ import ChevronRight24 from '@mozaic-ds/icons-vue/src/components/ChevronRight24/ChevronRight24.vue';
6
+
7
+ const meta: Meta<typeof MButton> = {
8
+ title: 'Action/Button',
9
+ component: MButton,
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component:
14
+ 'Buttons are used to trigger actions. Their appearance is depending on the type of action required from the user, or the context.',
15
+ },
16
+ },
17
+ },
18
+ args: { default: 'Button Label' },
19
+ argTypes: {
20
+ $slots: {
21
+ table: {
22
+ disable: true,
23
+ },
24
+ },
25
+ },
26
+ render: (args) => ({
27
+ components: { MButton, Download24, ChevronRight24 },
28
+ setup() {
29
+ return { args };
30
+ },
31
+ template: `
32
+ <MButton
33
+ v-bind="args"
34
+ >
35
+ <template v-if="${'icon' in args}" v-slot:icon>${args.icon}</template>
36
+ <template v-if="${'default' in args}" v-slot>${args.default}</template>
37
+ </MButton>
38
+ `,
39
+ }),
40
+ };
41
+ export default meta;
42
+ type Story = StoryObj<typeof MButton>;
43
+
44
+ export const Filled: Story = {};
45
+
46
+ export const Outline: Story = {
47
+ args: { outlined: true },
48
+ };
49
+
50
+ export const Ghost: Story = {
51
+ args: { ghost: true },
52
+ };
53
+
54
+ export const Icon: Story = {
55
+ args: {
56
+ iconPosition: 'left',
57
+ icon: '<ChevronRight24/>',
58
+ },
59
+ };
60
+
61
+ export const Loading: Story = {
62
+ args: {
63
+ isLoading: true,
64
+ ariaLabel: 'Loading button',
65
+ },
66
+ };