x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<ol class="midwest-timeline" aria-label="Deploy #447 · feat/timeline"> <li class="midwest-timeline-item complete"> <div class="midwest-timeline-item-connector" aria-hidden="true"> <span class="midwest-timeline-item-dot"> <div class="midwest-icon " aria-hidden="true"> <div class="midwest-icon-inner"> <svg xmlns="http://www.w3.org/2000/svg" class="Midwest-Icon__Svg" viewbox="0 0 512 512" focusable="false" role="img" aria-label="Checkmark"><title>Checkmark</title> <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M416 128L192 384l-96-96"></path></svg> </div> </div> </span> <span class="midwest-timeline-item-line"></span> </div> <div class="midwest-timeline-item-card"> <article data-controller="midwest-card" class="midwest-card"> <div class="wrap"> <header> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Build & test</span> <span class="midwest-badge size-default theme-primary"> <span class="value">feat/timeline</span> </span> </div> </header> <section> <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"> <span class="midwest-avatar size-xs theme-blue shape-circle" title="You tabbed on an Avatar for Will Riley"> <div class="letter" title="Will Riley"> WR </div> </span> <span style="font-size: 0.8125rem; color: var(--gray-9);">Will Riley · 312 tests passed</span> </div> <span class="midwest-badge size-default theme-primary"> <span class="value">sha: a3f91c2</span> </span> </section> </div> </article> </div> </li> <li class="midwest-timeline-item complete"> <div class="midwest-timeline-item-connector" aria-hidden="true"> <span class="midwest-timeline-item-dot"> <div class="midwest-icon " aria-hidden="true"> <div class="midwest-icon-inner"> <svg xmlns="http://www.w3.org/2000/svg" class="Midwest-Icon__Svg" viewbox="0 0 512 512" focusable="false" role="img" aria-label="Checkmark"><title>Checkmark</title> <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M416 128L192 384l-96-96"></path></svg> </div> </div> </span> <span class="midwest-timeline-item-line"></span> </div> <div class="midwest-timeline-item-card"> <article data-controller="midwest-card" class="midwest-card"> <div class="wrap"> <header> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Lint & type-check</span> <span class="midwest-badge size-default theme-green"> <span class="value">Passed</span> </span> </div> </header> <section> <span style="font-size: 0.8125rem; color: var(--gray-9);">RuboCop and Sorbet both clean. No offenses.</span> </section> </div> </article> </div> </li> <li class="midwest-timeline-item complete"> <div class="midwest-timeline-item-connector" aria-hidden="true"> <span class="midwest-timeline-item-dot"> <div class="midwest-icon " aria-hidden="true"> <div class="midwest-icon-inner"> <svg xmlns="http://www.w3.org/2000/svg" class="Midwest-Icon__Svg" viewbox="0 0 512 512" focusable="false" role="img" aria-label="Checkmark"><title>Checkmark</title> <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M416 128L192 384l-96-96"></path></svg> </div> </div> </span> <span class="midwest-timeline-item-line"></span> </div> <div class="midwest-timeline-item-card"> <article data-controller="midwest-card" class="midwest-card"> <div class="wrap"> <header> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Staging deploy</span> <span class="midwest-badge size-default theme-green"> <span class="value">Reviewed</span> </span> </div> </header> <section> <p style="margin: 0 0 0.5rem; font-size: 0.8125rem; color: var(--gray-9);">Smoke tests passed on staging — all 8 monitors green.</p> <div role="group" aria-label="3 avatars" class="midwest-group size-xs gap-overlap midwest-avatar-group"> <span class="midwest-avatar size-xs theme-green shape-circle" title="You tabbed on an Avatar for Amy Kim"> <div class="letter" title="Amy Kim"> AK </div> </span> <span class="midwest-avatar size-xs theme-indigo shape-circle" title="You tabbed on an Avatar for Jake Sullivan"> <div class="letter" title="Jake Sullivan"> JS </div> </span> <span class="midwest-avatar size-xs theme-violet shape-circle" title="You tabbed on an Avatar for Priya Sharma"> <div class="letter" title="Priya Sharma"> PS </div> </span> </div> </section> </div> </article> </div> </li> <li class="midwest-timeline-item active"> <div class="midwest-timeline-item-connector" aria-hidden="true"> <span class="midwest-timeline-item-dot"> </span> <span class="midwest-timeline-item-line"></span> </div> <div class="midwest-timeline-item-card"> <article data-controller="midwest-card" class="midwest-card"> <div class="wrap"> <header> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Production deploy</span> <span class="midwest-badge size-default theme-cyan"> <span class="value">In progress</span> </span> </div> </header> <section> <p style="margin: 0 0 0.625rem; font-size: 0.8125rem; color: var(--gray-9);">Rolling update — 3 of 6 pods healthy.</p> <div class="midwest-progress-bar size-sm variant-default animated theme-cyan"> <div class="progress-track" role="progressbar" aria-label="Deploy progress" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50"> <div class="progress-fill" style="width: 50.0%"></div> </div> </div> </section> </div> </article> </div> </li> <li class="midwest-timeline-item"> <div class="midwest-timeline-item-connector" aria-hidden="true"> <span class="midwest-timeline-item-dot"> </span> <span class="midwest-timeline-item-line"></span> </div> <div class="midwest-timeline-item-card"> <article data-controller="midwest-card" class="midwest-card"> <div class="wrap"> <header> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Post-deploy checks</span> <span class="midwest-badge size-default theme-primary"> <span class="value">Queued</span> </span> </div> </header> <section> <span style="font-size: 0.8125rem; color: var(--gray-9);">Synthetic monitors and Lighthouse audit queued.</span> </section> </div> </article> </div> </li></ol>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<%# CI/CD pipeline — vertical with icon slots and rich card composition. Each card composes: midwest_badge for branch/commit refs, midwest_avatar for the committer, midwest_avatar_group for reviewers, and midwest_progress_bar on the in-progress step.%><%= midwest_timeline(label: 'Deploy #447 · feat/timeline') do |t| %> <% t.with_item(complete: true) do |item| %> <% item.with_icon { midwest_icon(:checkmark, aria: { hidden: 'true' }) } %> <%= midwest_card do |c| %> <% c.with_header do %> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Build & test</span> <%= midwest_badge('feat/timeline', state: :default) %> </div> <% end %> <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"> <%= midwest_avatar(name: 'Will Riley', size: :xs, shape: :circle, color: :blue) %> <span style="font-size: 0.8125rem; color: var(--gray-9);">Will Riley · 312 tests passed</span> </div> <%= midwest_badge('sha: a3f91c2', state: :default, dot: false) %> <% end %> <% end %> <% t.with_item(complete: true) do |item| %> <% item.with_icon { midwest_icon(:checkmark, aria: { hidden: 'true' }) } %> <%= midwest_card do |c| %> <% c.with_header do %> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Lint & type-check</span> <%= midwest_badge('Passed', state: :success) %> </div> <% end %> <span style="font-size: 0.8125rem; color: var(--gray-9);">RuboCop and Sorbet both clean. No offenses.</span> <% end %> <% end %> <% t.with_item(complete: true) do |item| %> <% item.with_icon { midwest_icon(:checkmark, aria: { hidden: 'true' }) } %> <%= midwest_card do |c| %> <% c.with_header do %> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Staging deploy</span> <%= midwest_badge('Reviewed', state: :success) %> </div> <% end %> <p style="margin: 0 0 0.5rem; font-size: 0.8125rem; color: var(--gray-9);">Smoke tests passed on staging — all 8 monitors green.</p> <%= render Midwest::AvatarGroupComponent.new(max: 3, size: :xs, shape: :circle) do |g| %> <% g.with_avatar(name: 'Amy Kim', color: :green) %> <% g.with_avatar(name: 'Jake Sullivan', color: :indigo) %> <% g.with_avatar(name: 'Priya Sharma', color: :violet) %> <% end %> <% end %> <% end %> <% t.with_item(active: true) do %> <%= midwest_card do |c| %> <% c.with_header do %> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Production deploy</span> <%= midwest_badge('In progress', state: :info) %> </div> <% end %> <p style="margin: 0 0 0.625rem; font-size: 0.8125rem; color: var(--gray-9);">Rolling update — 3 of 6 pods healthy.</p> <%= midwest_progress_bar(value: 50, state: :info, size: :sm, animated: true, label: 'Deploy progress', show_label: false) %> <% end %> <% end %> <% t.with_item do %> <%= midwest_card do |c| %> <% c.with_header do %> <div style="display: flex; align-items: center; justify-content: space-between; gap: 0.5rem;"> <span>Post-deploy checks</span> <%= midwest_badge('Queued', state: :default) %> </div> <% end %> <span style="font-size: 0.8125rem; color: var(--gray-9);">Synthetic monitors and Lighthouse audit queued.</span> <% end %> <% end %><% end %>Pipeline
Vertical layout with icon slots and complete/active states —
well-suited for CI/CD pipelines or multi-step approval workflows.
No params configured.
No assets to display.
Add a .js or .css file alongside the component to see it here.
Figma embed for Timeline/pipeline
Annotate a preview to embed its Figma design here:
@figma "https://figma.com/..."