@mozaic-ds/web-components 1.6.0 → 1.8.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 (215) hide show
  1. package/dist/Condition20.js +1 -1
  2. package/dist/attributes.js +1 -1
  3. package/dist/attributes.js.map +1 -1
  4. package/dist/branches.js +1 -1
  5. package/dist/branches.js.map +1 -1
  6. package/dist/bundle.d.ts +2 -0
  7. package/dist/bundle.d.ts.map +1 -1
  8. package/dist/bundle.js +2 -0
  9. package/dist/components/accordionlist/AccordionList.js +2 -2
  10. package/dist/components/accordionlistItem/AccordionListItem.js +2 -2
  11. package/dist/components/actionbottombar/ActionBottomBar.js +2 -2
  12. package/dist/components/actionlistbox/ActionListbox.js +3 -3
  13. package/dist/components/actionlistbox/ActionListbox.js.map +1 -1
  14. package/dist/components/actionlistbox/ActionListbox.svelte +1 -1
  15. package/dist/components/actionlistboxitem/ActionListboxItem.js +2 -2
  16. package/dist/components/avatar/Avatar.js +2 -2
  17. package/dist/components/breadcrumb/Breadcrumb.js +2 -2
  18. package/dist/components/builtinmenu/BuiltInMenu.js +2 -2
  19. package/dist/components/builtinmenuitem/BuiltInMenuItem.js +2 -2
  20. package/dist/components/button/Button.js +1 -1
  21. package/dist/components/callout/Callout.js +2 -2
  22. package/dist/components/carousel/Carousel.js +2 -2
  23. package/dist/components/checkbox/Checkbox.js +2 -2
  24. package/dist/components/checkboxgroup/CheckboxGroup.js +1 -1
  25. package/dist/components/checklistmenu/CheckListMenu.js +1 -1
  26. package/dist/components/circularprogressbar/CircularProgressbar.js +2 -2
  27. package/dist/components/combobox/Combobox.js +4 -0
  28. package/dist/components/combobox/Combobox.js.map +1 -0
  29. package/dist/components/combobox/Combobox.spec.js +186 -0
  30. package/dist/components/combobox/Combobox.stories.d.ts +17 -0
  31. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -0
  32. package/dist/components/combobox/Combobox.stories.js +126 -0
  33. package/dist/components/combobox/Combobox.svelte +421 -0
  34. package/dist/components/combobox/Combobox.svelte.d.ts +104 -0
  35. package/dist/components/combobox/Combobox.svelte.d.ts.map +1 -0
  36. package/dist/components/combobox/README.md +38 -0
  37. package/dist/components/container/Container.js +2 -2
  38. package/dist/components/datepicker/Datepicker.js +3 -3
  39. package/dist/components/datepicker/Datepicker.js.map +1 -1
  40. package/dist/components/datepicker/Datepicker.svelte +2 -1
  41. package/dist/components/divider/Divider.js +2 -2
  42. package/dist/components/drawer/Drawer.js +4 -4
  43. package/dist/components/drawer/Drawer.svelte +2 -1
  44. package/dist/components/field/Field.js +2 -2
  45. package/dist/components/fileuploader/FileUploader.js +2 -2
  46. package/dist/components/fileuploader/FileUploader.js.map +1 -1
  47. package/dist/components/fileuploader/FileUploader.svelte +4 -4
  48. package/dist/components/fileuploader/FileUploader.svelte.d.ts +1 -0
  49. package/dist/components/fileuploader/FileUploader.svelte.d.ts.map +1 -1
  50. package/dist/components/fileuploaderitem/FileUploaderItem.js +3 -3
  51. package/dist/components/fileuploaderitem/FileUploaderItem.svelte +1 -4
  52. package/dist/components/flag/Flag.js +2 -2
  53. package/dist/components/iconbutton/IconButton.js +2 -2
  54. package/dist/components/kpiitem/KpiItem.js +2 -2
  55. package/dist/components/linearprogressbarbuffer/LinearProgressbarBuffer.js +2 -2
  56. package/dist/components/linearprogressbarpercentage/LinearProgressbarPercentage.js +2 -2
  57. package/dist/components/link/Link.js +1 -1
  58. package/dist/components/loader/Loader.js +2 -2
  59. package/dist/components/loadingoverlay/LoadingOverlay.js +2 -2
  60. package/dist/components/loadingoverlay/LoadingOverlay.svelte +1 -1
  61. package/dist/components/modal/Modal.js +4 -4
  62. package/dist/components/modal/Modal.js.map +1 -1
  63. package/dist/components/modal/Modal.spec.js +3 -1
  64. package/dist/components/modal/Modal.svelte +9 -3
  65. package/dist/components/modal/Modal.svelte.d.ts +4 -0
  66. package/dist/components/modal/Modal.svelte.d.ts.map +1 -1
  67. package/dist/components/modal/README.md +1 -0
  68. package/dist/components/navigationindicator/NavigationIndicator.js +2 -2
  69. package/dist/components/numberbadge/NumberBadge.js +2 -2
  70. package/dist/components/optionlistbox/OptionListbox.js +23 -0
  71. package/dist/components/optionlistbox/OptionListbox.js.map +1 -0
  72. package/dist/components/optionlistbox/OptionListbox.spec.js +350 -0
  73. package/dist/components/optionlistbox/OptionListbox.svelte +566 -0
  74. package/dist/components/optionlistbox/OptionListbox.svelte.d.ts +92 -0
  75. package/dist/components/optionlistbox/OptionListbox.svelte.d.ts.map +1 -0
  76. package/dist/components/optionlistbox/README.md +38 -0
  77. package/dist/components/overlay/Overlay.js +2 -2
  78. package/dist/components/overlay/Overlay.svelte +2 -2
  79. package/dist/components/pageheader/PageHeader.js +2 -2
  80. package/dist/components/pagination/Pagination.js +4 -4
  81. package/dist/components/passwordinput/PasswordInput.js +3 -3
  82. package/dist/components/passwordinput/PasswordInput.js.map +1 -1
  83. package/dist/components/passwordinput/PasswordInput.svelte +2 -1
  84. package/dist/components/phonenumber/PhoneNumber.js +4 -4
  85. package/dist/components/phonenumber/PhoneNumber.js.map +1 -1
  86. package/dist/components/phonenumber/PhoneNumber.svelte +3 -2
  87. package/dist/components/pincode/Pincode.js +2 -2
  88. package/dist/components/pincode/Pincode.js.map +1 -1
  89. package/dist/components/pincode/Pincode.svelte +3 -2
  90. package/dist/components/pincode/Pincode.svelte.d.ts +2 -1
  91. package/dist/components/pincode/Pincode.svelte.d.ts.map +1 -1
  92. package/dist/components/pincode/README.md +1 -1
  93. package/dist/components/popover/Popover.js +2 -2
  94. package/dist/components/quantityselector/QuantitySelector.js +3 -3
  95. package/dist/components/quantityselector/QuantitySelector.svelte +1 -1
  96. package/dist/components/radio/Radio.js +2 -2
  97. package/dist/components/radiogroup/RadioGroup.js +3 -3
  98. package/dist/components/radiogroup/RadioGroup.js.map +1 -1
  99. package/dist/components/radiogroup/RadioGroup.svelte +3 -2
  100. package/dist/components/radiogroup/RadioGroup.svelte.d.ts +1 -0
  101. package/dist/components/radiogroup/RadioGroup.svelte.d.ts.map +1 -1
  102. package/dist/components/segmentedcontrol/README.md +6 -3
  103. package/dist/components/segmentedcontrol/SegmentedControl.js +2 -2
  104. package/dist/components/segmentedcontrol/SegmentedControl.js.map +1 -1
  105. package/dist/components/segmentedcontrol/SegmentedControl.spec.js +60 -23
  106. package/dist/components/segmentedcontrol/SegmentedControl.stories.d.ts.map +1 -1
  107. package/dist/components/segmentedcontrol/SegmentedControl.stories.js +6 -1
  108. package/dist/components/segmentedcontrol/SegmentedControl.svelte +23 -10
  109. package/dist/components/segmentedcontrol/SegmentedControl.svelte.d.ts +10 -3
  110. package/dist/components/segmentedcontrol/SegmentedControl.svelte.d.ts.map +1 -1
  111. package/dist/components/select/Select.js +2 -2
  112. package/dist/components/sidebar/Sidebar.js +2 -2
  113. package/dist/components/sidebarexpandableitem/SidebarExpandableItem.js +2 -2
  114. package/dist/components/sidebarfooter/SidebarFooter.js +2 -2
  115. package/dist/components/sidebarfooter/_SidebarFooterMenu.js +2 -2
  116. package/dist/components/sidebarheader/SidebarHeader.js +2 -2
  117. package/dist/components/sidebarnavitem/SidebarNavItem.js +2 -2
  118. package/dist/components/sidebarshortcutitem/SidebarShortcutItem.js +2 -2
  119. package/dist/components/sidebarshortcuts/SidebarShortcuts.js +2 -2
  120. package/dist/components/starrating/StarRating.js +2 -2
  121. package/dist/components/statusbadge/StatusBadge.js +2 -2
  122. package/dist/components/statusdot/StatusDot.js +2 -2
  123. package/dist/components/statusmessage/StatusMessage.js +2 -2
  124. package/dist/components/statusmessage/StatusMessage.js.map +1 -1
  125. package/dist/components/statusmessage/StatusMessage.svelte +5 -0
  126. package/dist/components/statusnotification/StatusNotification.js +2 -2
  127. package/dist/components/statusnotification/StatusNotification.js.map +1 -1
  128. package/dist/components/statusnotification/StatusNotification.svelte +5 -0
  129. package/dist/components/stepperbottombar/StepperBottomBar.js +1 -1
  130. package/dist/components/steppercompact/StepperCompact.js +2 -2
  131. package/dist/components/stepperinline/README.md +6 -2
  132. package/dist/components/stepperinline/StepperInline.js +2 -2
  133. package/dist/components/stepperinline/StepperInline.js.map +1 -1
  134. package/dist/components/stepperinline/StepperInline.spec.js +57 -23
  135. package/dist/components/stepperinline/StepperInline.stories.d.ts.map +1 -1
  136. package/dist/components/stepperinline/StepperInline.stories.js +6 -11
  137. package/dist/components/stepperinline/StepperInline.svelte +23 -10
  138. package/dist/components/stepperinline/StepperInline.svelte.d.ts +10 -2
  139. package/dist/components/stepperinline/StepperInline.svelte.d.ts.map +1 -1
  140. package/dist/components/stepperstacked/README.md +15 -0
  141. package/dist/components/stepperstacked/StepperStacked.js +18 -0
  142. package/dist/components/stepperstacked/StepperStacked.js.map +1 -0
  143. package/dist/components/stepperstacked/StepperStacked.spec.js +138 -0
  144. package/dist/components/stepperstacked/StepperStacked.stories.d.ts +8 -0
  145. package/dist/components/stepperstacked/StepperStacked.stories.d.ts.map +1 -0
  146. package/dist/components/stepperstacked/StepperStacked.stories.js +33 -0
  147. package/dist/components/stepperstacked/StepperStacked.svelte +214 -0
  148. package/dist/components/stepperstacked/StepperStacked.svelte.d.ts +35 -0
  149. package/dist/components/stepperstacked/StepperStacked.svelte.d.ts.map +1 -0
  150. package/dist/components/tab/README.md +1 -0
  151. package/dist/components/tab/Tab.js +2 -2
  152. package/dist/components/tab/Tab.js.map +1 -1
  153. package/dist/components/tab/Tab.svelte +17 -1
  154. package/dist/components/tab/Tab.svelte.d.ts +4 -0
  155. package/dist/components/tab/Tab.svelte.d.ts.map +1 -1
  156. package/dist/components/tabs/Tabs.js +2 -2
  157. package/dist/components/tabs/Tabs.stories.d.ts +1 -0
  158. package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
  159. package/dist/components/tabs/Tabs.stories.js +10 -0
  160. package/dist/components/tag/README.md +1 -0
  161. package/dist/components/tag/Tag.js +2 -2
  162. package/dist/components/tag/Tag.js.map +1 -1
  163. package/dist/components/tag/Tag.svelte +7 -0
  164. package/dist/components/tag/Tag.svelte.d.ts +4 -0
  165. package/dist/components/tag/Tag.svelte.d.ts.map +1 -1
  166. package/dist/components/textarea/README.md +1 -1
  167. package/dist/components/textarea/Textarea.js +2 -2
  168. package/dist/components/textarea/Textarea.js.map +1 -1
  169. package/dist/components/textarea/Textarea.svelte +2 -1
  170. package/dist/components/textarea/Textarea.svelte.d.ts +1 -1
  171. package/dist/components/textarea/Textarea.svelte.d.ts.map +1 -1
  172. package/dist/components/textinput/README.md +1 -0
  173. package/dist/components/textinput/Textinput.js +4 -4
  174. package/dist/components/textinput/Textinput.js.map +1 -1
  175. package/dist/components/textinput/Textinput.stories.d.ts.map +1 -1
  176. package/dist/components/textinput/Textinput.stories.js +1 -0
  177. package/dist/components/textinput/Textinput.svelte +5 -1
  178. package/dist/components/textinput/Textinput.svelte.d.ts +2 -1
  179. package/dist/components/textinput/Textinput.svelte.d.ts.map +1 -1
  180. package/dist/components/tile/Tile.js +2 -2
  181. package/dist/components/tileclickable/TileClickable.js +1 -1
  182. package/dist/components/tileexpandable/TileExpandable.js +2 -2
  183. package/dist/components/tileexpandable/TileExpandable.js.map +1 -1
  184. package/dist/components/tileselectable/TileSelectable.js +2 -2
  185. package/dist/components/toaster/Toaster.js +3 -3
  186. package/dist/components/toaster/Toaster.js.map +1 -1
  187. package/dist/components/toaster/Toaster.svelte +6 -1
  188. package/dist/components/toggle/Toggle.js +2 -2
  189. package/dist/components/togglegroup/ToggleGroup.js +3 -3
  190. package/dist/components/togglegroup/ToggleGroup.js.map +1 -1
  191. package/dist/components/togglegroup/ToggleGroup.svelte +3 -2
  192. package/dist/components/togglegroup/ToggleGroup.svelte.d.ts +1 -0
  193. package/dist/components/togglegroup/ToggleGroup.svelte.d.ts.map +1 -1
  194. package/dist/components/tooltip/Tooltip.js +2 -2
  195. package/dist/custom-element.js +3 -3
  196. package/dist/custom-element.js.map +1 -1
  197. package/dist/documentation/DarkMode.mdx +115 -0
  198. package/dist/each.js +1 -1
  199. package/dist/each.js.map +1 -1
  200. package/dist/floating-item.svelte.js +1 -1
  201. package/dist/if.js +1 -1
  202. package/dist/if.js.map +1 -1
  203. package/dist/index-client.js +1 -1
  204. package/dist/input.js +1 -1
  205. package/dist/input.js.map +1 -1
  206. package/dist/main.d.ts +3 -1
  207. package/dist/main.d.ts.map +1 -1
  208. package/dist/main.js +3 -1
  209. package/dist/svelte-component.js +1 -1
  210. package/dist/svelte-component.js.map +1 -1
  211. package/dist/svelte-element.js +1 -1
  212. package/dist/svelte-element.js.map +1 -1
  213. package/dist/this.js +1 -1
  214. package/dist/this.js.map +1 -1
  215. package/package.json +7 -5
@@ -2,7 +2,11 @@ import { render } from '@testing-library/svelte';
2
2
  import StepperInline from './StepperInline.svelte';
3
3
  import { describe, it, expect } from 'vitest';
4
4
  describe('StepperInline', () => {
5
- const defaultSteps = [{ label: 'Step 1' }, { label: 'Step 2' }, { label: 'Step 3' }];
5
+ const defaultSteps = [
6
+ { id: '1', label: 'Step 1' },
7
+ { id: '2', label: 'Step 2' },
8
+ { id: '3', label: 'Step 3' },
9
+ ];
6
10
  it('renders correctly with default props', () => {
7
11
  const { getAllByRole, getByText } = render(StepperInline, {
8
12
  props: {
@@ -13,31 +17,61 @@ describe('StepperInline', () => {
13
17
  expect(getAllByRole('listitem').length).toBe(defaultSteps.length);
14
18
  expect(getByText('Step 1')).toBeTruthy();
15
19
  });
16
- it('marks the correct step as active', async () => {
17
- const { container, rerender } = render(StepperInline, {
18
- props: {
19
- step: 2,
20
- steps: defaultSteps,
21
- },
20
+ describe('Active step - number type', () => {
21
+ it('marks the correct step as active', async () => {
22
+ const { container, rerender } = render(StepperInline, {
23
+ props: {
24
+ step: 2,
25
+ steps: defaultSteps,
26
+ },
27
+ });
28
+ let labels = container.querySelectorAll('.mc-stepper-inline__label');
29
+ expect(labels[1].classList.contains('is-current')).toBe(true);
30
+ expect(labels[0].classList.contains('is-current')).toBe(false);
31
+ await rerender({ step: 3, steps: defaultSteps });
32
+ labels = container.querySelectorAll('.mc-stepper-inline__label');
33
+ expect(labels[2].classList.contains('is-current')).toBe(true);
34
+ });
35
+ it('marks completed steps', () => {
36
+ const { container } = render(StepperInline, {
37
+ props: {
38
+ step: 3,
39
+ steps: defaultSteps,
40
+ },
41
+ });
42
+ const items = container.querySelectorAll('.mc-stepper-inline__item');
43
+ expect(items[0].classList.contains('is-completed')).toBe(true);
44
+ expect(items[1].classList.contains('is-completed')).toBe(true);
45
+ expect(items[2].classList.contains('is-completed')).toBe(false);
22
46
  });
23
- let labels = container.querySelectorAll('.mc-stepper-inline__label');
24
- expect(labels[1].classList.contains('is-current')).toBe(true);
25
- expect(labels[0].classList.contains('is-current')).toBe(false);
26
- await rerender({ step: 3, steps: defaultSteps });
27
- labels = container.querySelectorAll('.mc-stepper-inline__label');
28
- expect(labels[2].classList.contains('is-current')).toBe(true);
29
47
  });
30
- it('marks completed steps', () => {
31
- const { container } = render(StepperInline, {
32
- props: {
33
- step: 3,
34
- steps: defaultSteps,
35
- },
48
+ describe('Active step - string type', () => {
49
+ it('marks the correct step as active', async () => {
50
+ const { container, rerender } = render(StepperInline, {
51
+ props: {
52
+ step: '2',
53
+ steps: defaultSteps,
54
+ },
55
+ });
56
+ let labels = container.querySelectorAll('.mc-stepper-inline__label');
57
+ expect(labels[1].classList.contains('is-current')).toBe(true);
58
+ expect(labels[0].classList.contains('is-current')).toBe(false);
59
+ await rerender({ step: '3', steps: defaultSteps });
60
+ labels = container.querySelectorAll('.mc-stepper-inline__label');
61
+ expect(labels[2].classList.contains('is-current')).toBe(true);
62
+ });
63
+ it('marks completed steps', () => {
64
+ const { container } = render(StepperInline, {
65
+ props: {
66
+ step: '3',
67
+ steps: defaultSteps,
68
+ },
69
+ });
70
+ const items = container.querySelectorAll('.mc-stepper-inline__item');
71
+ expect(items[0].classList.contains('is-completed')).toBe(true);
72
+ expect(items[1].classList.contains('is-completed')).toBe(true);
73
+ expect(items[2].classList.contains('is-completed')).toBe(false);
36
74
  });
37
- const items = container.querySelectorAll('.mc-stepper-inline__item');
38
- expect(items[0].classList.contains('is-completed')).toBe(true);
39
- expect(items[1].classList.contains('is-completed')).toBe(true);
40
- expect(items[2].classList.contains('is-completed')).toBe(false);
41
75
  });
42
76
  it('renders no steps when steps prop is empty', () => {
43
77
  const { queryAllByRole } = render(StepperInline, {
@@ -1 +1 @@
1
- {"version":3,"file":"StepperInline.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stepperinline/StepperInline.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,wBAAwB,CAAC;AAEhC,QAAA,MAAM,IAAI,EAAE,IAmBX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
1
+ {"version":3,"file":"StepperInline.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stepperinline/StepperInline.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,wBAAwB,CAAC;AAEhC,QAAA,MAAM,IAAI,EAAE,IAcX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
@@ -3,21 +3,16 @@ import './StepperInline.svelte';
3
3
  const meta = {
4
4
  title: 'Indicators/Stepper Inline',
5
5
  component: 'm-stepper-inline',
6
- argTypes: {
7
- step: {
8
- control: { type: 'number', min: 1, max: 10 },
9
- },
10
- },
11
6
  args: {
12
- currentStep: 2,
7
+ step: 'step1',
13
8
  steps: [
14
- { label: 'Cart' },
15
- { label: 'Delivery address' },
16
- { label: 'Payment' },
17
- { label: 'Order confirmation' },
9
+ { id: 'step1', label: 'Cart' },
10
+ { id: 'step2', label: 'Delivery address' },
11
+ { id: 'step3', label: 'Payment' },
12
+ { id: 'step4', label: 'Order confirmation' },
18
13
  ],
19
14
  },
20
- render: (args) => html `<m-stepper-inline step="${args.currentStep}" .steps="${args.steps}"></m-stepper-inline>`,
15
+ render: (args) => html `<m-stepper-inline step="${args.step}" .steps="${args.steps}"></m-stepper-inline>`,
21
16
  };
22
17
  export default meta;
23
18
  export const Default = {};
@@ -10,19 +10,25 @@
10
10
  interface Props {
11
11
  [key: string]: any;
12
12
  /**
13
- * Current step of the stepper compact.
13
+ * Defines the currently active step.
14
+ *
15
+ * - If a `number` is provided, it represents the 1-based position of the step
16
+ * in the `steps` array (e.g. `1` for the first step).
17
+ * - If a `string` is provided, it must match the `id` of one of the steps.
14
18
  */
15
- step?: number;
16
-
19
+ step?: number | string;
17
20
  /**
18
21
  * Steps of the stepper inline.
19
22
  */
20
23
  steps?: Array<{
24
+ /**
25
+ * Uniquer identifier for the step.
26
+ */
27
+ id?: string;
21
28
  /**
22
29
  * Label of the step.
23
30
  */
24
31
  label: string;
25
-
26
32
  /**
27
33
  * Optional additional information under the label.
28
34
  */
@@ -30,14 +36,21 @@
30
36
  }>;
31
37
  }
32
38
 
33
- let { step = $bindable(1), steps = $bindable([]), ...attrs }: Props = $props();
39
+ let { step = $bindable(0), steps = $bindable([]), ...attrs }: Props = $props();
34
40
 
35
- const safeStep = $derived(() => Math.min(Math.max(step ?? 1, 1), steps.length ?? 1));
41
+ const activeStep = $derived.by(() => {
42
+ if (typeof step === 'number') {
43
+ return Math.min(Math.max(step, 1), steps.length) - 1;
44
+ } else {
45
+ const activeIndex = steps.findIndex((el) => el.id === step);
46
+ return activeIndex === -1 ? 0 : activeIndex;
47
+ }
48
+ });
36
49
 
37
- const stepStates = $derived(() =>
50
+ const stepStates = $derived.by(() =>
38
51
  steps.map((_, i) => ({
39
- completed: i + 1 < safeStep(),
40
- current: i + 1 === safeStep(),
52
+ completed: i < activeStep,
53
+ current: i === activeStep,
41
54
  })),
42
55
  );
43
56
  </script>
@@ -45,7 +58,7 @@
45
58
  <nav class="mc-stepper-inline" aria-label="Stepper" {...attrs}>
46
59
  <ol class="mc-stepper-inline__container">
47
60
  {#each steps as step, i (i)}
48
- {@const state = stepStates()[i]}
61
+ {@const state = stepStates[i]}
49
62
  <li class={['mc-stepper-inline__item', state.completed ? 'is-completed' : '']}>
50
63
  {#if state.completed}
51
64
  <span class="mc-stepper-inline__icon mc-stepper-inline__icon--check" aria-hidden="true">
@@ -4,13 +4,21 @@
4
4
  interface Props {
5
5
  [key: string]: any;
6
6
  /**
7
- * Current step of the stepper compact.
7
+ * Defines the currently active step.
8
+ *
9
+ * - If a `number` is provided, it represents the 1-based position of the step
10
+ * in the `steps` array (e.g. `1` for the first step).
11
+ * - If a `string` is provided, it must match the `id` of one of the steps.
8
12
  */
9
- step?: number;
13
+ step?: number | string;
10
14
  /**
11
15
  * Steps of the stepper inline.
12
16
  */
13
17
  steps?: Array<{
18
+ /**
19
+ * Uniquer identifier for the step.
20
+ */
21
+ id?: string;
14
22
  /**
15
23
  * Label of the step.
16
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"StepperInline.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/stepperinline/StepperInline.svelte.ts"],"names":[],"mappings":"AAME;;GAEG;AAEH,UAAU,KAAK;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;CACJ;AAqDH,QAAA,MAAM,aAAa,yDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"StepperInline.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/stepperinline/StepperInline.svelte.ts"],"names":[],"mappings":"AAME;;GAEG;AAEH,UAAU,KAAK;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ;;WAEG;QACH,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;CACJ;AA4DH,QAAA,MAAM,aAAa,yDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ # `m-stepper-stacked`
2
+
3
+ A stepper is a navigation component that guides users through a sequence of steps in a structured process. It visually represents progress, completed steps, and upcoming steps, helping users understand their position within a workflow. Steppers are commonly used in multi-step forms, onboarding flows, checkout processes, and task completion sequences to improve clarity and reduce cognitive load.
4
+
5
+ ## Props
6
+
7
+ | Name | Description | Type | Default |
8
+ |------|-------------|------|---------|
9
+ | `step` | Defines the currently active step.
10
+
11
+ - If a `number` is provided, it represents the 1-based position of the step
12
+ in the `steps` array (e.g. `1` for the first step).
13
+ - If a `string` is provided, it must match the `id` of one of the steps. | `string` `number` | `$bindable(1)` |
14
+ | `steps` | Steps of the stepper stacked. | `Array<{ id?: string; label: string; additionalinfo?: string; }>` | `$bindable([])` |
15
+
@@ -0,0 +1,18 @@
1
+ import{c as J,e as K,a as L,p as $,g as N,b as v,d as O,f,l as P,h as o,m as j,i as t,r,s as C,t as I,j as u,n as k,k as M,w}from"../../custom-element.js";import{i as Q}from"../../if.js";import{e as R,i as T}from"../../each.js";import{a as U}from"../../attributes.js";import{f as V}from"../../Condition20.js";import"../../branches.js";var W=f('<span class="mc-stepper-stacked__icon mc-stepper-stacked__icon--check svelte-wnz47h"><!></span>'),Y=f("<span></span>"),Z=f('<li><div class="mc-stepper-stacked__indicator svelte-wnz47h"><!></div> <div class="mc-stepper-stacked__content svelte-wnz47h"><span> </span> <span class="mc-stepper-stacked__additional svelte-wnz47h"> </span></div></li>'),ee=f('<nav><ol class="mc-stepper-stacked__container svelte-wnz47h"></ol></nav>');const te={hash:"svelte-wnz47h",code:`/**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */.mc-stepper-stacked__container.svelte-wnz47h {display:flex;flex-direction:column;list-style:none;padding:0;margin:0;}.mc-stepper-stacked__indicator.svelte-wnz47h {display:flex;flex-direction:column;align-items:center;margin-right:0.5rem;position:relative;min-height:100%;padding-bottom:2rem;}.mc-stepper-stacked__indicator.svelte-wnz47h::after {content:"";position:absolute;top:1.5rem;bottom:0;width:0.125rem;background-color:var(--stepper-color-progress-bar-background, #c9d0de);left:50%;transform:translateX(-50%);}.mc-stepper-stacked__circle.svelte-wnz47h {box-sizing:border-box;width:1.5rem;height:1.5rem;border-radius:50%;border:0.125rem solid var(--stepper-color-step-item-default-border, #333333);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-100, 0.875rem);font-weight:var(--font-weight-bold, 700);color:var(--stepper-color-information, #666666);background-color:var(--stepper-color-step-item-default-background, #ffffff);z-index:1;flex-shrink:0;transition:background-color 200ms ease, color 200ms ease, border-color 200ms ease;}.mc-stepper-stacked__circle.is-current.svelte-wnz47h {background-color:var(--stepper-color-step-item-active-background, #117f03);border-color:var(--stepper-color-step-item-active-background, #117f03);color:var(--stepper-color-step-item-active-text, #ffffff);
4
+ animation: svelte-wnz47h-pop-in 300ms cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;}.mc-stepper-stacked__icon--check.svelte-wnz47h {width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;color:var(--stepper-color-step-item-default-icon, #666666);fill:currentcolor;border:0.125rem solid var(--stepper-color-step-item-default-border, #333333);border-radius:50%;box-sizing:border-box;background-color:var(--stepper-color-step-item-default-background, #ffffff);z-index:1;}.mc-stepper-stacked__content.svelte-wnz47h {display:flex;flex-direction:column;padding-top:0.25rem;}.mc-stepper-stacked__label.svelte-wnz47h {font-size:var(--font-size-100, 0.875rem);color:var(--stepper-color-step-label-default, #666666);line-height:var(--line-height-s, 1.3);transition:color 200ms ease;}.mc-stepper-stacked__label.is-current.svelte-wnz47h {font-weight:var(--font-weight-medium, 600);color:var(--stepper-color-step-label-active, #000000);}.mc-stepper-stacked__additional.svelte-wnz47h {font-size:var(--font-size-50, 0.75rem);color:var(--stepper-color-information, #666666);margin-top:0.25rem;}.mc-stepper-stacked__item.svelte-wnz47h {display:flex;position:relative;}.mc-stepper-stacked__item.has-additional.svelte-wnz47h .mc-stepper-stacked__indicator:where(.svelte-wnz47h),
5
+ .mc-stepper-stacked__item.has-additional.svelte-wnz47h .mc-stepper-stacked__content:where(.svelte-wnz47h) {padding-bottom:1rem;}.mc-stepper-stacked__item.svelte-wnz47h:last-child .mc-stepper-stacked__indicator:where(.svelte-wnz47h),
6
+ .mc-stepper-stacked__item.svelte-wnz47h:last-child .mc-stepper-stacked__content:where(.svelte-wnz47h) {padding-bottom:0;}.mc-stepper-stacked__item.svelte-wnz47h:last-child .mc-stepper-stacked__indicator:where(.svelte-wnz47h)::after {display:none;}
7
+
8
+ @keyframes svelte-wnz47h-pop-in {
9
+ 0% {
10
+ transform: scale(0.5);
11
+ opacity: 0;
12
+ }
13
+ 100% {
14
+ transform: scale(1);
15
+ opacity: 1;
16
+ }
17
+ }`};function se(b,p){K(p,!0),L(b,te);let i=$(p,"step",15,1),n=$(p,"steps",31,()=>N([])),D=P(p,["$$slots","$$events","$$legacy","$$host","step","steps"]);const z=w(()=>{if(typeof i()=="number")return Math.min(Math.max(i(),1),n().length)-1;{const e=n().findIndex(s=>s.id===i());return e===-1?0:e}}),E=w(()=>()=>n().map((e,s)=>({completed:s<t(z),current:s===t(z)})));var X={get step(){return i()},set step(e=1){i(e),j()},get steps(){return n()},set steps(e=[]){n(e),j()}},l=ee();U(l,()=>({class:"mc-stepper-stacked","aria-label":"Stepper",...D}),void 0,void 0,void 0,"svelte-wnz47h");var g=o(l);return R(g,21,n,T,(e,s,x,re)=>{const _=w(()=>t(E)()[x]);var d=Z(),h=o(d),q=o(h);{var A=c=>{var a=W(),H=o(a);V(H,{}),r(a),v(c,a)},B=c=>{var a=Y();a.textContent=x+1,I(()=>u(a,1,k({"mc-stepper-stacked__circle":!0,"is-current":t(_).current}),"svelte-wnz47h")),v(c,a)};Q(q,c=>{t(_).completed?c(A):c(B,-1)})}r(h);var y=C(h,2),m=o(y),F=o(m,!0);r(m);var S=C(m,2),G=o(S,!0);r(S),r(y),r(d),I(()=>{u(d,1,k({"mc-stepper-stacked__item":!0,"has-additional":t(s).additionalinfo}),"svelte-wnz47h"),u(m,1,k({"mc-stepper-stacked__label":!0,"is-current":t(_).current}),"svelte-wnz47h"),M(F,t(s).label),M(G,t(s).additionalinfo)}),v(e,d)}),r(g),r(l),v(b,l),O(X)}customElements.define("m-stepper-stacked",J(se,{step:{},steps:{}},[],[],{mode:"open"}));
18
+ //# sourceMappingURL=StepperStacked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepperStacked.js","sources":["../../../src/components/stepperstacked/StepperStacked.svelte"],"sourcesContent":["<svelte:options customElement={{ tag: 'm-stepper-stacked' }} />\n\n<script lang=\"ts\">\n import { Check24 } from '@mozaic-ds/icons-svelte';\n /**\n * A stepper is a navigation component that guides users through a sequence of steps in a structured process. It visually represents progress, completed steps, and upcoming steps, helping users understand their position within a workflow. Steppers are commonly used in multi-step forms, onboarding flows, checkout processes, and task completion sequences to improve clarity and reduce cognitive load.\n */\n\n interface Props {\n [key: string]: any;\n /**\n * Defines the currently active step.\n *\n * - If a `number` is provided, it represents the 1-based position of the step\n * in the `steps` array (e.g. `1` for the first step).\n * - If a `string` is provided, it must match the `id` of one of the steps.\n */\n step?: string | number;\n\n /**\n * Steps of the stepper stacked.\n */\n steps?: Array<{\n /**\n * Unique identifier for the step.\n */\n id?: string;\n /**\n * Label of the step.\n */\n label: string;\n\n /**\n * Optional additional information under the label.\n */\n additionalinfo?: string;\n }>;\n }\n\n let { step = $bindable(1), steps = $bindable([]), ...attrs }: Props = $props();\n\n const activeStep = $derived.by(() => {\n if (typeof step === 'number') {\n return Math.min(Math.max(step, 1), steps.length) - 1;\n } else {\n const activeIndex = steps.findIndex((el) => el.id === step);\n return activeIndex === -1 ? 0 : activeIndex;\n }\n });\n\n const stepStates = $derived(() =>\n steps.map((_, i) => ({\n completed: i < activeStep,\n current: i === activeStep,\n })),\n );\n</script>\n\n<nav class=\"mc-stepper-stacked\" aria-label=\"Stepper\" {...attrs}>\n <ol class=\"mc-stepper-stacked__container\">\n {#each steps as step, index (index)}\n {@const state = stepStates()[index]}\n <li\n class={{\n 'mc-stepper-stacked__item': true,\n 'has-additional': step.additionalinfo,\n }}\n >\n <div class=\"mc-stepper-stacked__indicator\">\n {#if state.completed}\n <span class=\"mc-stepper-stacked__icon mc-stepper-stacked__icon--check\">\n <Check24 />\n </span>\n {:else}\n <span\n class={{\n 'mc-stepper-stacked__circle': true,\n 'is-current': state.current,\n }}\n >\n {index + 1}\n </span>\n {/if}\n </div>\n <div class=\"mc-stepper-stacked__content\">\n <span\n class={{\n 'mc-stepper-stacked__label': true,\n 'is-current': state.current,\n }}\n >\n {step.label}\n </span>\n <span class=\"mc-stepper-stacked__additional\">\n {step.additionalinfo}\n </span>\n </div>\n </li>\n {/each}\n </ol>\n</nav>\n\n<style lang=\"scss\">\n @use '@mozaic-ds/styles/components/stepper-stacked';\n</style>\n"],"names":["step","steps","$.prop","$$props","$.proxy","attrs","$.rest_props","activeStep","$.derived","activeIndex","el","stepStates","_","i","$.get","nav","root","ol","$.index","$$anchor","index","$$array","state","li","root_1","div","$.child","span","root_2","Check24","node_1","span_1","root_3","$.append","$$render","consequent","alternate","div_1","span_2","text","$.reset","span_3","$.sibling","$.set_text","text_1"],"mappings":";;;;;;;;;;;;;;;;oBAEA,iBAqCQ,IAAAA,gBAAiB,CAAC,EAAGC,EAAKC,EAAAC,EAAA,QAAA,GAAA,IAAAC,EAAA,CAAA,CAAA,CAAA,EAAqBC,EAAKC,EAAAH,EAAA,CAAA,UAAA,WAAA,WAAA,SAAA,OAAA,OAAA,CAAA,EAEpD,MAAAI,EAAUC,EAAA,IAAqB,WACxBR,EAAI,GAAK,SACX,OAAA,KAAK,IAAI,KAAK,IAAIA,IAAM,CAAC,EAAGC,IAAM,MAAM,EAAI,EAC9C,OACCQ,EAAcR,EAAK,EAAC,UAAWS,GAAOA,EAAG,KAAOV,GAAI,EACnD,OAAAS,IAAW,GAAU,EAAIA,CAClC,CACF,CAAC,EAEKE,YACJV,EAAK,EAAC,IAAG,CAAEW,EAAGC,KAAC,CACb,UAAWA,EAACC,EAAGP,CAAU,EACzB,QAASM,IAACC,EAAKP,CAAU,+CAdN,EAAC,8DAmBzBQ,EAAGC,GAAA,IAAHD,6DAAwDV,0CACtD,IAAAY,IADFF,CAAG,WACDE,EAAE,GACMhB,EAAKiB,EAAA,CAAAC,EAAInB,EAAIoB,EAAAC,KAAA,OACVC,EAAKd,EAAA,IAAAM,EAAGH,CAAU,EAAA,EAAGS,CAAK,CAAA,EACjC,IAAAG,EAAAC,EAAA,EAMEC,EAAGC,EANLH,CAAA,MAMEE,CAAG,iBAECE,EAAIC,EAAA,MAAJD,CAAI,EACFE,EAAOC,EAAA,EAAA,IADTH,CAAI,MAAJA,CAAI,SAIJ,IAAAI,EAAAC,EAAA,EAAAD,EAAA,YAMEX,EAAQ,UANVW,OAEG,6BAA8B,GAC9B,aAAYjB,EAAEQ,CAAK,EAAC,4BAHvBW,EAAAd,EAAAY,CAAA,WALEjB,EAAAQ,CAAK,EAAC,UAASY,EAAAC,CAAA,EAAAD,EAAAE,EAAA,EAAA,MADrBX,CAAG,EAgBH,IAAAY,IAhBAZ,EAAG,CAAA,EAiBDa,EAAAZ,EADFW,CAAG,EACDE,EAAAb,EAAAY,EAAA,EAAA,EAAAE,EAAAF,CAAA,EAQA,IAAAG,EAAIC,EARJJ,EAAA,CAAA,MAQAG,EAAI,EAAA,IAAJA,CAAI,IATNJ,CAAG,EAtBLG,EAAAjB,CAAA,WAAAA,OAEG,2BAA4B,GAC5B,iBAAgBT,EAAEd,CAAI,EAAC,oCAoBtBsC,OAEG,4BAA6B,GAC7B,aAAYxB,EAAEQ,CAAK,EAAC,2BAGrBqB,EAAAJ,EAAAzB,EAAAd,CAAI,EAAC,KAAK,EAGV2C,EAAAC,EAAA9B,EAAAd,CAAI,EAAC,cAAc,IAhCzBiC,EAAAd,EAAAI,CAAA,MAHJN,CAAE,IADJF,CAAG,MAAHA,CAAG,MAFI"}
@@ -0,0 +1,138 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import { describe, it, expect } from 'vitest';
3
+ import StepperStacked from './StepperStacked.svelte';
4
+ const defaultSteps = [
5
+ { label: 'Step 1', additionalinfo: 'Info 1' },
6
+ { label: 'Step 2', additionalinfo: 'Info 2' },
7
+ { label: 'Step 3' },
8
+ ];
9
+ describe('StepperStacked', () => {
10
+ it('renders the correct number of list items', () => {
11
+ render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
12
+ const items = screen.getAllByRole('listitem');
13
+ expect(items).toHaveLength(defaultSteps.length);
14
+ });
15
+ it('renders step labels', () => {
16
+ render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
17
+ defaultSteps.forEach(({ label }) => {
18
+ expect(screen.getByText(label)).toBeTruthy();
19
+ });
20
+ });
21
+ it('renders additionalinfo when provided', () => {
22
+ render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
23
+ expect(screen.getByText('Info 1')).toBeTruthy();
24
+ expect(screen.getByText('Info 2')).toBeTruthy();
25
+ });
26
+ it('adds has-additional class on items with additionalinfo', () => {
27
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
28
+ const items = container.querySelectorAll('li.mc-stepper-stacked__item');
29
+ expect(items[0].classList.contains('has-additional')).toBe(true);
30
+ expect(items[1].classList.contains('has-additional')).toBe(true);
31
+ expect(items[2].classList.contains('has-additional')).toBe(false);
32
+ });
33
+ it('renders nothing when steps is empty', () => {
34
+ const { container } = render(StepperStacked, { props: { steps: [], step: 1 } });
35
+ const items = container.querySelectorAll('li');
36
+ expect(items).toHaveLength(0);
37
+ });
38
+ describe('active step as number - 1 based', () => {
39
+ it('marks the current step circle with is-current class', () => {
40
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 2 } });
41
+ const currentCircles = container.querySelectorAll('.mc-stepper-stacked__circle.is-current');
42
+ expect(currentCircles).toHaveLength(1);
43
+ expect(currentCircles[0].textContent?.trim()).toBe('2');
44
+ });
45
+ it('marks the current step label with is-current class', () => {
46
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 2 } });
47
+ const currentLabels = container.querySelectorAll('.mc-stepper-stacked__label.is-current');
48
+ expect(currentLabels).toHaveLength(1);
49
+ expect(currentLabels[0].textContent?.trim()).toBe('Step 2');
50
+ });
51
+ it('renders check icon for completed steps', () => {
52
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 3 } });
53
+ const checkIcons = container.querySelectorAll('.mc-stepper-stacked__icon--check');
54
+ expect(checkIcons).toHaveLength(2);
55
+ });
56
+ it('renders no check icon when on step 1', () => {
57
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
58
+ const checkIcons = container.querySelectorAll('.mc-stepper-stacked__icon--check');
59
+ expect(checkIcons).toHaveLength(0);
60
+ });
61
+ it('renders circles (not checks) for incomplete and upcoming steps', () => {
62
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 2 } });
63
+ const circles = container.querySelectorAll('.mc-stepper-stacked__circle');
64
+ expect(circles).toHaveLength(2);
65
+ });
66
+ it('circle text reflects 1-based step index', () => {
67
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 1 } });
68
+ const circles = container.querySelectorAll('.mc-stepper-stacked__circle');
69
+ expect(circles[0].textContent?.trim()).toBe('1');
70
+ expect(circles[1].textContent?.trim()).toBe('2');
71
+ expect(circles[2].textContent?.trim()).toBe('3');
72
+ });
73
+ it('clamps step below 1 to 1', () => {
74
+ const { container } = render(StepperStacked, { props: { steps: defaultSteps, step: 0 } });
75
+ const currentCircles = container.querySelectorAll('.mc-stepper-stacked__circle.is-current');
76
+ expect(currentCircles[0].textContent?.trim()).toBe('1');
77
+ });
78
+ it('clamps step above steps.length to last step', () => {
79
+ const { container } = render(StepperStacked, {
80
+ props: { steps: defaultSteps, step: 99 },
81
+ });
82
+ const currentLabels = container.querySelectorAll('.mc-stepper-stacked__label.is-current');
83
+ expect(currentLabels[0].textContent?.trim()).toBe('Step 3');
84
+ const checkIcons = container.querySelectorAll('.mc-stepper-stacked__icon--check');
85
+ expect(checkIcons).toHaveLength(defaultSteps.length - 1);
86
+ });
87
+ it('defaults to step=1 and empty steps without props', () => {
88
+ const { container } = render(StepperStacked, { props: {} });
89
+ expect(container.querySelectorAll('li')).toHaveLength(0);
90
+ });
91
+ it('handles a single step correctly', () => {
92
+ const { container } = render(StepperStacked, {
93
+ props: { steps: [{ label: 'Only step' }], step: 1 },
94
+ });
95
+ const items = container.querySelectorAll('li');
96
+ expect(items).toHaveLength(1);
97
+ const currentCircles = container.querySelectorAll('.mc-stepper-stacked__circle.is-current');
98
+ expect(currentCircles).toHaveLength(1);
99
+ });
100
+ });
101
+ describe('Active step as string (id-based)', () => {
102
+ const stepsWithIds = [
103
+ { id: 'first', label: 'Step 1', additionalinfo: 'Info 1' },
104
+ { id: 'second', label: 'Step 2' },
105
+ { id: 'third', label: 'Step 3' },
106
+ ];
107
+ it('marks the correct step as current when step matches an id', () => {
108
+ const { container } = render(StepperStacked, {
109
+ props: { steps: stepsWithIds, step: 'second' },
110
+ });
111
+ const currentLabels = container.querySelectorAll('.mc-stepper-stacked__label.is-current');
112
+ expect(currentLabels).toHaveLength(1);
113
+ expect(currentLabels[0].textContent?.trim()).toBe('Step 2');
114
+ });
115
+ it('marks previous steps as completed when step is identified by id', () => {
116
+ const { container } = render(StepperStacked, {
117
+ props: { steps: stepsWithIds, step: 'third' },
118
+ });
119
+ const checkIcons = container.querySelectorAll('.mc-stepper-stacked__icon--check');
120
+ expect(checkIcons).toHaveLength(2);
121
+ });
122
+ it('falls back to the first step when the string id does not match any step', () => {
123
+ const { container } = render(StepperStacked, {
124
+ props: { steps: stepsWithIds, step: 'unknown-id' },
125
+ });
126
+ const currentCircles = container.querySelectorAll('.mc-stepper-stacked__circle.is-current');
127
+ expect(currentCircles).toHaveLength(1);
128
+ expect(currentCircles[0].textContent?.trim()).toBe('1');
129
+ });
130
+ it('renders no completed steps when the first step is active via id', () => {
131
+ const { container } = render(StepperStacked, {
132
+ props: { steps: stepsWithIds, step: 'first' },
133
+ });
134
+ const checkIcons = container.querySelectorAll('.mc-stepper-stacked__icon--check');
135
+ expect(checkIcons).toHaveLength(0);
136
+ });
137
+ });
138
+ });
@@ -0,0 +1,8 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import './StepperStacked.svelte';
3
+ declare const meta: Meta;
4
+ export default meta;
5
+ type Story = StoryObj;
6
+ export declare const Default: Story;
7
+ export declare const AditionnalInfo: Story;
8
+ //# sourceMappingURL=StepperStacked.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepperStacked.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stepperstacked/StepperStacked.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,yBAAyB,CAAC;AAEjC,QAAA,MAAM,IAAI,EAAE,IAmBX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,cAAc,EAAE,KAS5B,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { html } from 'lit';
2
+ import './StepperStacked.svelte';
3
+ const meta = {
4
+ title: 'Indicators/Stepper Stacked',
5
+ component: 'm-stepper-stacked',
6
+ argTypes: {
7
+ step: {
8
+ control: { type: 'number', min: 1, max: 10 },
9
+ },
10
+ },
11
+ args: {
12
+ step: 2,
13
+ steps: [
14
+ { label: 'Cart' },
15
+ { label: 'Delivery address' },
16
+ { label: 'Payment' },
17
+ { label: 'Order confirmation' },
18
+ ],
19
+ },
20
+ render: (args) => html `<m-stepper-stacked .step="${args.step}" .steps="${args.steps}"></m-stepper-stacked>`,
21
+ };
22
+ export default meta;
23
+ export const Default = {};
24
+ export const AditionnalInfo = {
25
+ args: {
26
+ steps: [
27
+ { label: 'Cart', additionalinfo: 'Additional information' },
28
+ { label: 'Delivery address', additionalinfo: 'Additional information' },
29
+ { label: 'Payment', additionalinfo: 'Additional information' },
30
+ { label: 'Order confirmation', additionalinfo: 'Additional information' },
31
+ ],
32
+ },
33
+ };