Skip to content

Commit 61aca21

Browse files
mdatellemdatelle
andauthored
refactor: make stepper responsive (#1144)
This PR adds a responsive layout for the Stepper component on small screens. There's a vertical orientation version but the changes here won't be compatible. If we need a verticle version we can just create a separate component folder for the vertical only version. <img width="171" alt="image" src="https://github.com/user-attachments/assets/4e38ac68-ca17-400a-b07b-2bfcb2c0a192" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit - **Style** - Enhanced the visual design of the stepper components with improved responsive layouts—displaying vertically on smaller screens and horizontally on medium and larger screens. - **New Features** - Added an interactive demo showcasing the stepper workflow in Storybook. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: mdatelle <mike@datelle.net>
1 parent af2057c commit 61aca21

File tree

5 files changed

+92
-4
lines changed

5 files changed

+92
-4
lines changed

unraid-ui/src/components/common/stepper/Stepper.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
1717
</script>
1818

1919
<template>
20-
<StepperRoot v-slot="slotProps" :class="cn('flex gap-2', props.class)" v-bind="forwarded">
20+
<StepperRoot
21+
v-slot="slotProps"
22+
:class="cn('flex flex-col gap-2 md:flex-row', props.class)"
23+
v-bind="forwarded"
24+
>
2125
<slot v-bind="slotProps" />
2226
</StepperRoot>
2327
</template>

unraid-ui/src/components/common/stepper/StepperItem.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,15 @@ const forwarded = useForwardProps(delegatedProps);
1919
<StepperItem
2020
v-slot="slotProps"
2121
v-bind="forwarded"
22-
:class="cn('flex items-center gap-2 group data-[disabled]:pointer-events-none', props.class)"
22+
:class="
23+
cn(
24+
'flex flex-col items-start gap-1',
25+
'md:flex-row md:items-center md:gap-2',
26+
'group transition-all duration-200',
27+
'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
28+
props.class
29+
)
30+
"
2331
>
2432
<slot v-bind="slotProps" />
2533
</StepperItem>

unraid-ui/src/components/common/stepper/StepperSeparator.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const forwarded = useForwardProps(delegatedProps);
2020
v-bind="forwarded"
2121
:class="
2222
cn(
23-
'bg-muted',
23+
'hidden md:block bg-muted md:w-24 md:h-px md:my-0',
2424
// Disabled
2525
'group-data-[disabled]:bg-muted group-data-[disabled]:opacity-75',
2626
// Completed

unraid-ui/src/components/common/stepper/StepperTrigger.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ const forwarded = useForwardProps(delegatedProps);
1818
<template>
1919
<StepperTrigger
2020
v-bind="forwarded"
21-
:class="cn('p-2 flex flex-col items-center text-center gap-2 rounded-md', props.class)"
21+
:class="
22+
cn(
23+
'flex flex-col items-center justify-center text-center gap-2 rounded-md w-full md:w-auto',
24+
props.class
25+
)
26+
"
2227
>
2328
<slot />
2429
</StepperTrigger>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import type { Meta, StoryObj } from '@storybook/vue3';
2+
import {
3+
Stepper as StepperComponent,
4+
StepperDescription,
5+
StepperIndicator,
6+
StepperItem,
7+
StepperSeparator,
8+
StepperTitle,
9+
StepperTrigger,
10+
} from '../../../src/components/common/stepper';
11+
12+
const meta = {
13+
title: 'Components/Common',
14+
component: StepperComponent,
15+
parameters: {
16+
layout: 'padded',
17+
viewport: {
18+
defaultViewport: 'responsive',
19+
viewports: {
20+
responsive: {
21+
name: 'Responsive',
22+
styles: { width: '100%', height: '100%' },
23+
},
24+
mobile: {
25+
name: 'Mobile',
26+
styles: { width: '320px', height: '100%' },
27+
},
28+
},
29+
},
30+
},
31+
} satisfies Meta<typeof StepperComponent>;
32+
33+
export default meta;
34+
35+
type Story = StoryObj<typeof meta>;
36+
37+
export const Stepper: Story = {
38+
render: () => ({
39+
components: {
40+
StepperComponent,
41+
StepperItem,
42+
StepperTitle,
43+
StepperDescription,
44+
StepperIndicator,
45+
StepperSeparator,
46+
StepperTrigger,
47+
},
48+
template: `
49+
<StepperComponent>
50+
<template v-for="(step, index) in steps" :key="index">
51+
<StepperItem :step="index + 1">
52+
<StepperTrigger>
53+
<StepperIndicator>{{ index + 1 }}</StepperIndicator>
54+
<StepperTitle>{{ step.title }}</StepperTitle>
55+
<StepperDescription>{{ step.description }}</StepperDescription>
56+
</StepperTrigger>
57+
<StepperSeparator v-if="index < steps.length - 1" />
58+
</StepperItem>
59+
</template>
60+
</StepperComponent>
61+
`,
62+
setup() {
63+
const steps = [
64+
{ title: 'Account Setup', description: 'Create your account' },
65+
{ title: 'Server Details', description: 'Configure your server' },
66+
{ title: 'Review', description: 'Review and confirm' },
67+
];
68+
return { steps };
69+
},
70+
}),
71+
};

0 commit comments

Comments
 (0)