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

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 (191) hide show
  1. package/LICENSE +51 -0
  2. package/README.md +224 -82
  3. package/dist/mozaic-vue.css +1 -1
  4. package/dist/mozaic-vue.d.ts +1202 -0
  5. package/dist/mozaic-vue.js +1220 -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 +81 -50
  11. package/src/components/Contributing.mdx +118 -0
  12. package/src/components/GettingStarted.mdx +50 -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/breadcrumb/MBreadcrumb.spec.ts +105 -0
  19. package/src/components/breadcrumb/MBreadcrumb.stories.ts +57 -0
  20. package/src/components/breadcrumb/MBreadcrumb.vue +52 -55
  21. package/src/components/button/MButton.spec.ts +191 -0
  22. package/src/components/button/MButton.stories.ts +66 -0
  23. package/src/components/button/MButton.vue +98 -154
  24. package/src/components/checkbox/MCheckbox.spec.ts +104 -0
  25. package/src/components/checkbox/MCheckbox.stories.ts +83 -0
  26. package/src/components/checkbox/MCheckbox.vue +60 -101
  27. package/src/components/checkboxgroup/MCheckboxGroup.spec.ts +78 -0
  28. package/src/components/checkboxgroup/MCheckboxGroup.stories.ts +61 -0
  29. package/src/components/checkboxgroup/MCheckboxGroup.vue +97 -0
  30. package/src/components/field/MField.spec.ts +166 -0
  31. package/src/components/field/MField.stories.ts +376 -0
  32. package/src/components/field/MField.vue +78 -61
  33. package/src/components/fieldgroup/MFieldGroup.spec.ts +165 -0
  34. package/src/components/fieldgroup/MFieldGroup.stories.ts +423 -0
  35. package/src/components/fieldgroup/MFieldGroup.vue +79 -0
  36. package/src/components/iconbutton/MIconButton.spec.ts +108 -0
  37. package/src/components/iconbutton/MIconButton.stories.ts +66 -0
  38. package/src/components/iconbutton/MIconButton.vue +73 -0
  39. package/src/components/link/MLink.spec.ts +154 -0
  40. package/src/components/link/MLink.stories.ts +98 -0
  41. package/src/components/link/MLink.vue +86 -109
  42. package/src/components/loader/MLoader.spec.ts +104 -0
  43. package/src/components/loader/MLoader.stories.ts +45 -0
  44. package/src/components/loader/MLoader.vue +65 -55
  45. package/src/components/overlay/MOverlay.spec.ts +51 -0
  46. package/src/components/overlay/MOverlay.stories.ts +40 -0
  47. package/src/components/overlay/MOverlay.vue +27 -19
  48. package/src/components/passwordinput/MPasswordInput.spec.ts +104 -0
  49. package/src/components/passwordinput/MPasswordInput.stories.ts +75 -0
  50. package/src/components/passwordinput/MPasswordInput.vue +129 -76
  51. package/src/components/quantityselector/MQuantitySelector.spec.ts +262 -0
  52. package/src/components/quantityselector/MQuantitySelector.stories.ts +89 -0
  53. package/src/components/quantityselector/MQuantitySelector.vue +160 -136
  54. package/src/components/radio/MRadio.spec.ts +104 -0
  55. package/src/components/radio/MRadio.stories.ts +68 -0
  56. package/src/components/radio/MRadio.vue +56 -39
  57. package/src/components/radiogroup/MRadioGroup.spec.ts +54 -0
  58. package/src/components/radiogroup/MRadioGroup.stories.ts +61 -0
  59. package/src/components/radiogroup/MRadioGroup.vue +79 -0
  60. package/src/components/select/MSelect.spec.ts +114 -0
  61. package/src/components/select/MSelect.stories.ts +101 -0
  62. package/src/components/select/MSelect.vue +77 -119
  63. package/src/components/statusbadge/MStatusBadge.stories.ts +45 -0
  64. package/src/components/statusbadge/MStatusBadge.vue +40 -0
  65. package/src/components/statusbadge/MstatusBadge.spec.ts +16 -0
  66. package/src/components/statusdot/MStatusDot.spec.ts +51 -0
  67. package/src/components/statusdot/MStatusDot.stories.ts +48 -0
  68. package/src/components/statusdot/MStatusDot.vue +36 -0
  69. package/src/components/statusnotification/MStatusNotification.spec.ts +99 -0
  70. package/src/components/statusnotification/MStatusNotification.stories.ts +96 -0
  71. package/src/components/statusnotification/MStatusNotification.vue +106 -0
  72. package/src/components/textarea/MTextArea.spec.ts +112 -0
  73. package/src/components/textarea/MTextArea.stories.ts +67 -0
  74. package/src/components/textarea/MTextArea.vue +81 -42
  75. package/src/components/textinput/MTextInput.spec.ts +121 -0
  76. package/src/components/textinput/MTextInput.stories.ts +114 -0
  77. package/src/components/textinput/MTextInput.vue +127 -47
  78. package/src/components/toggle/MToggle.spec.ts +99 -0
  79. package/src/components/toggle/MToggle.stories.ts +68 -0
  80. package/src/components/toggle/MToggle.vue +63 -103
  81. package/src/components/togglegroup/MToggleGroup.spec.ts +78 -0
  82. package/src/components/togglegroup/MToggleGroup.stories.ts +61 -0
  83. package/src/components/togglegroup/MToggleGroup.vue +97 -0
  84. package/src/components/usingIcons.mdx +43 -0
  85. package/src/components/usingPresets.mdx +125 -0
  86. package/src/main.ts +47 -0
  87. package/dist/demo.html +0 -1
  88. package/dist/mozaic-vue.adeo.css +0 -45
  89. package/dist/mozaic-vue.adeo.umd.js +0 -41775
  90. package/dist/mozaic-vue.common.js +0 -41765
  91. package/dist/mozaic-vue.common.js.map +0 -1
  92. package/dist/mozaic-vue.umd.js +0 -41776
  93. package/dist/mozaic-vue.umd.js.map +0 -1
  94. package/dist/mozaic-vue.umd.min.js +0 -4
  95. package/dist/mozaic-vue.umd.min.js.map +0 -1
  96. package/postinstall.js +0 -3
  97. package/src/components/accordion/MAccordion.vue +0 -128
  98. package/src/components/accordion/index.js +0 -7
  99. package/src/components/autocomplete/MAutocomplete.vue +0 -198
  100. package/src/components/autocomplete/index.js +0 -7
  101. package/src/components/badge/index.js +0 -7
  102. package/src/components/breadcrumb/index.js +0 -7
  103. package/src/components/button/index.js +0 -7
  104. package/src/components/card/MCard.vue +0 -78
  105. package/src/components/card/index.js +0 -7
  106. package/src/components/checkbox/MCheckboxGroup.vue +0 -155
  107. package/src/components/checkbox/index.js +0 -12
  108. package/src/components/container/MContainer.vue +0 -33
  109. package/src/components/container/index.js +0 -7
  110. package/src/components/datatable/MDataTable.vue +0 -651
  111. package/src/components/datatable/MDataTableHeader.vue +0 -55
  112. package/src/components/datatable/MDataTableTop.vue +0 -35
  113. package/src/components/datatable/helpers.js +0 -132
  114. package/src/components/datatable/index.js +0 -12
  115. package/src/components/field/index.js +0 -7
  116. package/src/components/fileuploader/MFileResult.vue +0 -149
  117. package/src/components/fileuploader/MFileUploader.vue +0 -142
  118. package/src/components/fileuploader/index.js +0 -7
  119. package/src/components/flag/MFlag.vue +0 -46
  120. package/src/components/flag/index.js +0 -7
  121. package/src/components/heading/MHeading.vue +0 -75
  122. package/src/components/heading/index.js +0 -7
  123. package/src/components/hero/MHero.vue +0 -93
  124. package/src/components/hero/index.js +0 -7
  125. package/src/components/icon/MIcon.vue +0 -120
  126. package/src/components/icon/index.js +0 -7
  127. package/src/components/index.js +0 -43
  128. package/src/components/layer/MLayer.vue +0 -208
  129. package/src/components/layer/index.js +0 -7
  130. package/src/components/link/index.js +0 -7
  131. package/src/components/listbox/MListBox.vue +0 -106
  132. package/src/components/listbox/index.js +0 -7
  133. package/src/components/loader/index.js +0 -7
  134. package/src/components/modal/MModal.vue +0 -179
  135. package/src/components/modal/index.js +0 -7
  136. package/src/components/notification/MNotification.vue +0 -110
  137. package/src/components/notification/index.js +0 -7
  138. package/src/components/optionbutton/MOptionButton.vue +0 -67
  139. package/src/components/optionbutton/index.js +0 -7
  140. package/src/components/optioncard/MOptionCard.vue +0 -132
  141. package/src/components/optioncard/index.js +0 -7
  142. package/src/components/optiongroup/MOptionGroup.vue +0 -18
  143. package/src/components/optiongroup/index.js +0 -7
  144. package/src/components/overlay/MOverlayLoader.vue +0 -43
  145. package/src/components/overlay/index.js +0 -12
  146. package/src/components/pagination/MPagination.vue +0 -162
  147. package/src/components/pagination/index.js +0 -7
  148. package/src/components/passwordinput/index.js +0 -7
  149. package/src/components/phonenumber/MPhoneNumber.vue +0 -390
  150. package/src/components/phonenumber/index.js +0 -7
  151. package/src/components/progressbar/MProgress.vue +0 -102
  152. package/src/components/progressbar/index.js +0 -7
  153. package/src/components/quantityselector/index.js +0 -7
  154. package/src/components/radio/MRadioGroup.vue +0 -111
  155. package/src/components/radio/index.js +0 -12
  156. package/src/components/ratingstars/MStarsInput.vue +0 -118
  157. package/src/components/ratingstars/MStarsResult.vue +0 -89
  158. package/src/components/ratingstars/index.js +0 -12
  159. package/src/components/select/index.js +0 -7
  160. package/src/components/stepper/MStepper.vue +0 -70
  161. package/src/components/stepper/index.js +0 -7
  162. package/src/components/tabs/MTab.vue +0 -184
  163. package/src/components/tabs/index.js +0 -7
  164. package/src/components/tags/MTag.vue +0 -173
  165. package/src/components/tags/index.js +0 -7
  166. package/src/components/textarea/index.js +0 -7
  167. package/src/components/textinput/MTextInputField.vue +0 -105
  168. package/src/components/textinput/MTextInputIcon.vue +0 -42
  169. package/src/components/textinput/index.js +0 -7
  170. package/src/components/toggle/index.js +0 -7
  171. package/src/components/tooltip/MTooltip.vue +0 -42
  172. package/src/components/tooltip/index.js +0 -7
  173. package/src/index.js +0 -62
  174. package/src/shims-tsx.d.ts +0 -13
  175. package/src/shims.vue.d.ts +0 -4
  176. package/src/tokens/adeo/android/colors.xml +0 -391
  177. package/src/tokens/adeo/android/font_dimens.xml +0 -18
  178. package/src/tokens/adeo/css/_variables.scss +0 -385
  179. package/src/tokens/adeo/css/root.scss +0 -387
  180. package/src/tokens/adeo/ios/StyleDictionaryColor.h +0 -399
  181. package/src/tokens/adeo/ios/StyleDictionaryColor.m +0 -411
  182. package/src/tokens/adeo/ios/StyleDictionaryColor.swift +0 -394
  183. package/src/tokens/adeo/ios/StyleDictionarySize.h +0 -69
  184. package/src/tokens/adeo/ios/StyleDictionarySize.m +0 -70
  185. package/src/tokens/adeo/ios/StyleDictionarySize.swift +0 -71
  186. package/src/tokens/adeo/js/tokens.js +0 -483
  187. package/src/tokens/adeo/js/tokensObject.js +0 -10354
  188. package/src/tokens/adeo/scss/_tokens.scss +0 -1300
  189. package/src/utils/mozaicClasses.js +0 -16
  190. package/src/utils/theme.validator.js +0 -19
  191. package/types/index.d.ts +0 -100
@@ -0,0 +1,68 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3';
2
+ import { action } from '@storybook/addon-actions';
3
+
4
+ import MToggle from './MToggle.vue';
5
+
6
+ const meta: Meta<typeof MToggle> = {
7
+ title: 'Form Elements/Toggle',
8
+ component: MToggle,
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component:
13
+ 'A toggle is a switch component that allows users to enable or disable a setting, representing a binary state such as on/off or active/inactive. It provides a quick and intuitive way to control preferences or system settings. Toggles are commonly used in settings menus, dark mode switches, and feature activations, offering an alternative to checkboxes for immediate visual feedback.',
14
+ },
15
+ },
16
+ },
17
+ args: {
18
+ id: 'ToggleId',
19
+ label: 'Toggle Label',
20
+ },
21
+ render: (args) => ({
22
+ components: { MToggle },
23
+ setup() {
24
+ const handleUpdate = action('update:modelValue');
25
+
26
+ return { args, handleUpdate };
27
+ },
28
+ template: `
29
+ <MToggle
30
+ v-bind="args"
31
+ @update:modelValue="handleUpdate"
32
+ />
33
+ `,
34
+ }),
35
+ };
36
+ export default meta;
37
+ type Story = StoryObj<typeof MToggle>;
38
+
39
+ export const Default: Story = {};
40
+
41
+ export const Checked: Story = {
42
+ args: {
43
+ modelValue: true,
44
+ id: 'checkedId',
45
+ },
46
+ };
47
+
48
+ export const Disabled: Story = {
49
+ args: {
50
+ disabled: true,
51
+ id: 'disabledId',
52
+ },
53
+ };
54
+
55
+ export const Size: Story = {
56
+ args: {
57
+ id: 'sizeId',
58
+ size: 's',
59
+ },
60
+ };
61
+
62
+ export const HideLabel: Story = {
63
+ args: {
64
+ id: 'hideLabelId',
65
+ label: undefined,
66
+ ariaLabel: 'Label',
67
+ },
68
+ };
@@ -1,117 +1,77 @@
1
1
  <template>
2
- <div class="mc-toggle" :class="setClasses">
3
- <input
4
- :id="id"
5
- :name="name"
6
- type="checkbox"
7
- class="mc-toggle__input"
8
- :checked="checked"
9
- :disabled="disabled"
10
- @change="$emit('change', $event.target.checked)"
11
- />
12
- <label :for="id" class="mc-toggle__label">
13
- <span class="mc-toggle__content">
2
+ <div class="mc-toggle" :class="classObject">
3
+ <label class="mc-toggle__container" :for="id">
4
+ <input
5
+ :id="id"
6
+ type="checkbox"
7
+ class="mc-toggle__input"
8
+ :name="name"
9
+ :checked="modelValue"
10
+ :disabled="disabled"
11
+ v-bind="$attrs"
12
+ @change="
13
+ emit('update:modelValue', ($event.target as HTMLInputElement).checked)
14
+ "
15
+ />
16
+ <span v-if="label" :for="id" class="mc-toggle__label">
14
17
  {{ label }}
15
- <span
16
- v-if="stateLabelOff && stateLabelOn"
17
- class="mc-toggle__state"
18
- aria-hidden="true"
19
- >
20
- <span class="mc-toggle__off">{{ stateLabelOff }}</span>
21
- <span class="mc-toggle__on">{{ stateLabelOn }}</span>
22
- </span>
23
18
  </span>
24
19
  </label>
25
20
  </div>
26
21
  </template>
27
22
 
28
- <script>
29
- import {
30
- responsiveModifierValidators,
31
- responsiveModifiers,
32
- } from '../../utils/mozaicClasses';
23
+ <script setup lang="ts">
24
+ import { computed } from 'vue';
33
25
 
34
- export default {
35
- name: 'MToggle',
36
-
37
- props: {
38
- id: {
39
- type: String,
40
- required: true,
41
- },
42
- label: {
43
- type: String,
44
- default: null,
45
- },
46
- name: {
47
- type: String,
48
- default: null,
49
- },
50
- checked: {
51
- type: Boolean,
52
- default: false,
53
- },
54
- disabled: {
55
- type: Boolean,
56
- default: false,
57
- },
58
- size: {
59
- type: String,
60
- default: 'm',
61
- validator: (value) => responsiveModifierValidators(value, ['s', 'm']),
62
- },
63
- // Experimental solution waiting on this issue https://github.com/adeo/mozaic-vue/issues/52
64
- responsiveSizeModifiers: {
65
- type: Array,
66
- default: null,
67
- validator: (array) =>
68
- array.every((e) =>
69
- responsiveModifierValidators(e, [
70
- 's@from-m',
71
- 's@from-l',
72
- 's@from-xl',
73
- 's@from-xxl',
74
- 'm@from-m',
75
- 'm@from-l',
76
- 'm@from-xl',
77
- 'm@from-xxl',
78
- ])
79
- ),
80
- },
81
- stateLabelOff: {
82
- type: String,
83
- default: null,
84
- },
85
- stateLabelOn: {
86
- type: String,
87
- default: null,
88
- },
26
+ /**
27
+ * A toggle is used to choose between two possibilities and when the user needs instant feedback. It is common to use toggles when you need to show or hide content and "on/off" switch.
28
+ */
29
+ const props = withDefaults(
30
+ defineProps<{
31
+ /**
32
+ * A unique identifier for the toggle, used to associate the label with the form element.
33
+ */
34
+ id: string;
35
+ /**
36
+ * The name attribute for the toggle element, typically used for form submission.
37
+ */
38
+ name?: string;
39
+ /**
40
+ * The text label displayed next to the toggle.
41
+ */
42
+ label?: string;
43
+ /**
44
+ * The toggle's checked state, bound via v-model.
45
+ */
46
+ modelValue?: boolean;
47
+ /**
48
+ * Determines the size of the toggle
49
+ */
50
+ size?: 's' | 'm';
51
+ /**
52
+ * If `true`, disables the toggle, making it non-interactive.
53
+ */
54
+ disabled?: boolean;
55
+ }>(),
56
+ {
57
+ size: 's',
89
58
  },
59
+ );
90
60
 
91
- computed: {
92
- setClasses() {
93
- const classes = [];
94
-
95
- if (this.size) {
96
- classes.push(`mc-toggle--${this.size}`);
97
- }
61
+ const classObject = computed(() => {
62
+ return {
63
+ [`mc-toggle--${props.size}`]: props.size && props.size != 's',
64
+ };
65
+ });
98
66
 
99
- if (
100
- this.responsiveSizeModifiers &&
101
- this.responsiveSizeModifiers.length > 0
102
- ) {
103
- for (const modifier of this.responsiveSizeModifiers) {
104
- responsiveModifiers('mc-toggle', modifier, classes);
105
- }
106
- }
107
-
108
- return classes;
109
- },
110
- },
111
- };
67
+ const emit = defineEmits<{
68
+ /**
69
+ * Emits when the toggle value changes, updating the modelValue prop.
70
+ */
71
+ (on: 'update:modelValue', value: boolean): void;
72
+ }>();
112
73
  </script>
113
74
 
114
- <style lang="scss">
115
- @import 'settings-tools/_all-settings';
116
- @import 'components/c.toggle';
75
+ <style lang="scss" scoped>
76
+ @use '@mozaic-ds/styles/components/toggle';
117
77
  </style>
@@ -0,0 +1,78 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { describe, it, expect } from 'vitest';
3
+ import MToggleGroup from './MToggleGroup.vue';
4
+ import MToggle from '@/components/toggle/MToggle.vue';
5
+
6
+ describe('MToggleGroup.vue', () => {
7
+ it('renders toggles based on options', async () => {
8
+ const options = [
9
+ { id: '1', label: 'Option 1', value: 'option1' },
10
+ { id: '2', label: 'Option 2', value: 'option2' },
11
+ ];
12
+
13
+ const wrapper = mount(MToggleGroup, {
14
+ props: {
15
+ name: 'test-name',
16
+ options,
17
+ },
18
+ });
19
+
20
+ const toggles = wrapper.findAllComponents(MToggle);
21
+ expect(toggles.length).toBe(2);
22
+
23
+ expect(toggles[0].props('label')).toBe('Option 1');
24
+ expect(toggles[1].props('label')).toBe('Option 2');
25
+ });
26
+
27
+ it('updates modelValue when a toggle is checked', async () => {
28
+ const options = [
29
+ { id: '1', label: 'Option 1', value: 'option1' },
30
+ { id: '2', label: 'Option 2', value: 'option2' },
31
+ ];
32
+
33
+ const wrapper = mount(MToggleGroup, {
34
+ props: {
35
+ name: 'test-name',
36
+ options,
37
+ modelValue: [],
38
+ },
39
+ });
40
+
41
+ const toggle1 = wrapper.findAllComponents(MToggle)[0].find('input');
42
+ await toggle1.setChecked(true);
43
+
44
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy();
45
+ expect(wrapper.emitted('update:modelValue')[0]).toEqual([['option1']]);
46
+
47
+ const toggle2 = wrapper.findAllComponents(MToggle)[1].find('input');
48
+ await toggle2.setChecked(true);
49
+
50
+ expect(wrapper.emitted('update:modelValue')[1]).toEqual([
51
+ ['option1', 'option2'],
52
+ ]);
53
+ });
54
+
55
+ it('syncs with the v-model when initial value is passed', async () => {
56
+ const options = [
57
+ { id: '1', label: 'Option 1', value: 'option1' },
58
+ { id: '2', label: 'Option 2', value: 'option2' },
59
+ ];
60
+
61
+ const wrapper = mount(MToggleGroup, {
62
+ props: {
63
+ name: 'test-name',
64
+ options,
65
+ modelValue: ['option1'],
66
+ },
67
+ });
68
+
69
+ const toggles = wrapper.findAllComponents(MToggle);
70
+ expect(toggles[0].props('modelValue')).toBe(true);
71
+ expect(toggles[1].props('modelValue')).toBe(false);
72
+
73
+ await wrapper.setProps({ modelValue: ['option2'] });
74
+
75
+ expect(toggles[0].props('modelValue')).toBe(false);
76
+ expect(toggles[1].props('modelValue')).toBe(true);
77
+ });
78
+ });
@@ -0,0 +1,61 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3';
2
+ import { action } from '@storybook/addon-actions';
3
+
4
+ import MToggleGroup from './MToggleGroup.vue';
5
+
6
+ const meta: Meta<typeof MToggleGroup> = {
7
+ title: 'Form Elements/Toggle Group',
8
+ component: MToggleGroup,
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component:
13
+ 'A toggle is a switch component that allows users to enable or disable a setting, representing a binary state such as on/off or active/inactive. It provides a quick and intuitive way to control preferences or system settings. Toggles are commonly used in settings menus, dark mode switches, and feature activations, offering an alternative to checkboxes for immediate visual feedback.<br><br> To put a label, requierement text, help text or to apply a valid or invalid message, the examples are available in the [Field Group section](/docs/form-elements-field-group--docs#toggle-group).',
14
+ },
15
+ },
16
+ },
17
+ args: {
18
+ name: 'toggleGroupName',
19
+ modelValue: ['toggle2'],
20
+ options: [
21
+ {
22
+ id: 'toggle-01',
23
+ label: 'Toggle Label',
24
+ value: 'toggle1',
25
+ },
26
+ {
27
+ id: 'toggle-02',
28
+ label: 'Toggle Label',
29
+ value: 'toggle2',
30
+ },
31
+ {
32
+ id: 'toggle-03',
33
+ label: 'Toggle Label',
34
+ value: 'toggle3',
35
+ },
36
+ {
37
+ id: 'toggle-04',
38
+ label: 'Toggle Label',
39
+ value: 'toggle4',
40
+ },
41
+ ],
42
+ },
43
+ render: (args) => ({
44
+ components: { MToggleGroup },
45
+ setup() {
46
+ const handleUpdate = action('update:modelValue');
47
+
48
+ return { args, handleUpdate };
49
+ },
50
+ template: `
51
+ <MToggleGroup
52
+ v-bind="args"
53
+ @update:modelValue="handleUpdate"
54
+ />
55
+ `,
56
+ }),
57
+ };
58
+ export default meta;
59
+ type Story = StoryObj<typeof MToggleGroup>;
60
+
61
+ export const Default: Story = {};
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div :class="classObjectContainer">
3
+ <MToggle
4
+ v-for="option in options"
5
+ :id="option.id"
6
+ :key="option.id"
7
+ :label="option.label"
8
+ :is-invalid="option.isInvalid"
9
+ :name="name"
10
+ :class="classObjectItem"
11
+ :model-value="modelValue ? modelValue.includes(option.value) : undefined"
12
+ :disabled="option.disabled"
13
+ @update:model-value="(v: boolean) => onChange(v, option.value)"
14
+ />
15
+ </div>
16
+ </template>
17
+
18
+ <script setup lang="ts">
19
+ import { computed, ref, watch } from 'vue';
20
+ import MToggle from '../toggle/MToggle.vue';
21
+
22
+ /**
23
+ * A toggle is used to choose between two possibilities and when the user needs instant feedback. It is common to use toggles when you need to show or hide content and "on/off" switch.
24
+ */
25
+ const props = defineProps<{
26
+ /**
27
+ * The name attribute for the toggle element, typically used for form submission.
28
+ */
29
+ name: string;
30
+ /**
31
+ * Property used to manage the values checked by v-model
32
+ * (Do not use directly)
33
+ */
34
+ modelValue?: Array<string>;
35
+ /**
36
+ * list of properties of each toggle of the toggle group
37
+ */
38
+ options: Array<{
39
+ id: string;
40
+ label: string;
41
+ value: string;
42
+ disabled?: boolean;
43
+ isInvalid?: boolean;
44
+ size?: 's' | 'm';
45
+ }>;
46
+ /**
47
+ * If `true`, make the form element of the group inline.
48
+ */
49
+ inline?: boolean;
50
+ }>();
51
+
52
+ const selectedValue = ref<string[]>([]);
53
+
54
+ watch(
55
+ () => props.modelValue,
56
+ (newValue) => {
57
+ selectedValue.value = newValue || [];
58
+ },
59
+ { immediate: true },
60
+ );
61
+
62
+ const onChange = (isChecked: boolean, value: string) => {
63
+ let values = [...selectedValue.value];
64
+
65
+ if (isChecked && !values.includes(value)) {
66
+ values.push(value);
67
+ } else {
68
+ values = values.filter((val) => val !== value);
69
+ }
70
+
71
+ emit('update:modelValue', values);
72
+ selectedValue.value = values;
73
+ };
74
+
75
+ const classObjectContainer = computed(() => {
76
+ return {
77
+ 'mc-field__container--inline': props.inline,
78
+ };
79
+ });
80
+
81
+ const classObjectItem = computed(() => {
82
+ return {
83
+ 'mc-field__container--inline__item': props.inline,
84
+ };
85
+ });
86
+
87
+ const emit = defineEmits<{
88
+ /**
89
+ * Emits when the toggle group value changes, updating the modelValue prop.
90
+ */
91
+ (on: 'update:modelValue', value: Array<string>): void;
92
+ }>();
93
+ </script>
94
+
95
+ <style lang="scss" scoped>
96
+ @use '@mozaic-ds/styles/components/field';
97
+ </style>
@@ -0,0 +1,43 @@
1
+ import { Meta } from '@storybook/blocks';
2
+ import { Source } from '@storybook/addon-docs';
3
+
4
+ <Meta title="Using Icons" />
5
+
6
+ # Using Icons
7
+
8
+ To use icons in Vue applications, you need to install a dedicated package.
9
+
10
+ You must first install the [npm package](https://www.npmjs.com/package/@mozaic-ds/icons-vue):
11
+
12
+ <Source
13
+ language="bash"
14
+ dark
15
+ code="npm install @mozaic-ds/icons-vue"
16
+ />
17
+
18
+ Or with **Yarn**:
19
+
20
+ <Source
21
+ language="bash"
22
+ dark
23
+ code="yarn add @mozaic-ds/icons-vue"
24
+ />
25
+
26
+ You can then start importing the icon of your choice into your Vue component:
27
+
28
+ <Source
29
+ language='html'
30
+ dark
31
+ code={`
32
+ // In one of the .vue file of your application
33
+
34
+ <template>
35
+ <A11y20 fill="#333" />
36
+ </template>
37
+
38
+ <script setup>
39
+ import A11y20 from '@mozaic-ds/icons-vue/src/components/A11y20/A11y20.vue';
40
+ </script>
41
+ `} />
42
+
43
+ [The full list of icons is available here](https://github.com/adeo/mozaic-icons-vue/tree/main/src/components).
@@ -0,0 +1,125 @@
1
+ import { Meta } from '@storybook/blocks';
2
+ import { Source } from '@storybook/addon-docs';
3
+
4
+ <Meta title="Using Presets" />
5
+
6
+ # Mozaic's presets
7
+
8
+ **Mozaic** is a **multi-brand** design system.<br/>
9
+ This means that it is fully customisable so that its constituent elements _(foundations, components, etc.)_ can be adapted to the graphic charter of the brand that uses it.
10
+
11
+ To simplify this aspect of customising **Mozaic** for you, we have created themes _(which we also call **"presets"**)_ ready to use according to your context of use.
12
+
13
+ Currently **Mozaic** can be customized with the following presets:
14
+
15
+ - Preset **Leroy Merlin**: this is the default preset/theme configured when **Mozaic** was first installed
16
+ - Preset **Adeo**: dedicated to the **Adeo Group's** internal interfaces and products
17
+ - Preset **Bricoman**: dedicated to the interfaces and products of the **Bricoman** brand
18
+
19
+ The rest of this documentation shows you how to use/install the Adeo preset in your project.
20
+
21
+ > Note that the procedure remains the same for all other presets.<br/> You just need to replace all references to "Adeo" with the brand name of your choice.
22
+
23
+ ## Using the Adeo's preset
24
+
25
+ Before anything else, make sure you have followed the **Mozaic-Vue** installation procedure as described in the [Getting Started](?path=/docs/getting-started--docs) page.
26
+
27
+ Once **Mozaic-Vue** is installed as shown, we can make the following changes:
28
+
29
+ ### 1. Loading preset
30
+
31
+ All it has to do is insert the following code into its main Sass file (entrypoint stylesheet):
32
+
33
+ <Source
34
+ language='css'
35
+ dark
36
+ code={`
37
+ // Entrypoint stylesheet
38
+ @use "@mozaic-ds/tokens/<presetName>" as *;
39
+ `} />
40
+
41
+ > [!NOTE]
42
+ > The `<presetName>` string should be replaced by the name of the preset you want, one of the following values: `adeo | enki | mbrand`.
43
+ > As the `leroymerlin` preset is the default preset, you don't need to use this syntax to use it.
44
+
45
+ For example, for ADEO
46
+
47
+ <Source
48
+ language='css'
49
+ dark
50
+ code={`
51
+ // Entrypoint stylesheet
52
+ @use "@mozaic-ds/tokens/adeo" as *;
53
+ `} />
54
+
55
+ ### 2. Font by brand
56
+
57
+ Each brand is distinguished not only by different styles but also by a different font.
58
+
59
+ The table below summarises which font to use depending on the brand.
60
+
61
+ <table>
62
+ <tr>
63
+ <td>Brand</td>
64
+ <td>Font</td>
65
+ </tr>
66
+ <tr>
67
+ <td>Leroy Merlin</td>
68
+ <td>[LeroyMerlinSans](https://mozaic.adeo.cloud/foundations/typography/font-families/)</td>
69
+ </tr>
70
+ <tr>
71
+ <td>Adeo</td>
72
+ <td>[Roboto](https://fonts.google.com/specimen/Roboto)</td>
73
+ </tr>
74
+ <tr>
75
+ <td>Bricoman</td>
76
+ <td>[Inter](https://fonts.google.com/specimen/Inter)</td>
77
+ </tr>
78
+ </table>
79
+
80
+ From there, we can update the main style sheet of your project, in order to import the right font.
81
+
82
+ <Source
83
+ language='css'
84
+ dark
85
+ code={`
86
+ @use "@mozaic-ds/styles/tools/t.font" as *;
87
+
88
+ body {
89
+ @include set-font-family();
90
+ }
91
+ `} />
92
+
93
+ Specific for LM fonts
94
+
95
+ > This section describes the use of fonts for the **Leroy Merlin** preset, but if you are using another preset, please see [the associated documentation](?path=/docs/using-presets--docs).
96
+
97
+ The theme defined by default when **Mozaic-Vue** is first installed/used is the theme corresponding to the **Leroy Merlin** charter.
98
+
99
+ For any use of the **Leroy Merlin** theme, it is recommended to use the font [LeroyMerlinSans](/typography/font-families/) which has been specially designed for **Leroy Merlin** products.
100
+
101
+ To use the `LeroyMerlinSans` font in your project, you must copy it into your project so that it is present in your `assets`.
102
+
103
+ You can do this as follows:
104
+
105
+ 1. Create a folder in your project where you can save the fonts, for example: `static/assets/fonts`
106
+
107
+ 2. Copy fonts from Mozaic dependencies:
108
+
109
+ <Source
110
+ language="bash"
111
+ dark
112
+ code='cp node_modules/@mozaic-ds/web-fonts/*.{woff,woff2} static/assets/fonts'
113
+ />
114
+
115
+ ### 3. Usage
116
+
117
+ At this stage, the integration of the **Mozaic-Vue** components should normally be customised with the preset values.
118
+
119
+ All that remains is to use the components as usual:
120
+
121
+ <Source
122
+ language="html"
123
+ dark
124
+ code='<MButton label="This is a Mozaic Button" />'
125
+ />