maverick-wave 5.28.0 → 5.30.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 (52) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +4 -2
  2. package/.claude/skills/mw-maverick-wave/references/components.md +217 -4
  3. package/.claude/skills/mw-maverick-wave/references/javascript.md +6 -1
  4. package/.claude/skills/mw-maverick-wave/references/theming.md +55 -51
  5. package/CHANGELOG.md +16 -0
  6. package/CLAUDE.md +4 -4
  7. package/README.md +2 -2
  8. package/index.html +65 -0
  9. package/maverick-wave.min.css +2 -2
  10. package/maverick-wave.min.js +1 -1
  11. package/package.json +2 -2
  12. package/scripts/verify.js +2 -1
  13. package/src/assets/images/photo-balloon.svg +35 -0
  14. package/src/assets/images/photo-forest-path.svg +31 -0
  15. package/src/assets/images/photo-lighthouse.svg +42 -0
  16. package/src/assets/images/photo-palm.svg +27 -0
  17. package/src/assets/images/photo-peak.svg +27 -0
  18. package/src/assets/images/photo-tower.svg +34 -0
  19. package/src/assets/images/photo-waterfall.svg +32 -0
  20. package/src/assets/images/story-aurora.svg +36 -0
  21. package/src/assets/images/story-beach.svg +34 -0
  22. package/src/assets/images/story-stars.svg +35 -0
  23. package/src/assets/media/story-sunrise.jpg +0 -0
  24. package/src/assets/media/story-sunrise.mp4 +0 -0
  25. package/src/js/main.js +403 -0
  26. package/src/partials/avatars-container.html +50 -0
  27. package/src/partials/calendar-container.html +36 -38
  28. package/src/partials/feed-container.html +506 -0
  29. package/src/partials/item-lists-container.html +80 -130
  30. package/src/partials/kanban-container.html +17 -294
  31. package/src/partials/mosaic-container.html +173 -0
  32. package/src/partials/panels-container.html +113 -162
  33. package/src/partials/portrait-gallery-container.html +175 -0
  34. package/src/partials/stories-container.html +182 -0
  35. package/src/partials/tables-container.html +21 -40
  36. package/src/scss/abstracts/_mixins.scss +2 -0
  37. package/src/scss/abstracts/_variables.scss +3 -0
  38. package/src/scss/components/_avatars.scss +85 -1
  39. package/src/scss/components/_cards.scss +7 -3
  40. package/src/scss/components/_dropdown.scss +24 -1
  41. package/src/scss/components/_feed.scss +203 -0
  42. package/src/scss/components/_index.scss +6 -0
  43. package/src/scss/components/_lang-switch.scss +4 -8
  44. package/src/scss/components/_lightbox.scss +178 -0
  45. package/src/scss/components/_modals.scss +19 -5
  46. package/src/scss/components/_mosaic.scss +83 -0
  47. package/src/scss/components/_overlay-btn.scss +47 -0
  48. package/src/scss/components/_portrait-gallery.scss +180 -0
  49. package/src/scss/components/_stories.scss +443 -0
  50. package/src/scss/components/_tiles.scss +4 -1
  51. package/src/scss/utilities/_fit.scss +29 -0
  52. package/src/scss/utilities/_index.scss +1 -0
@@ -0,0 +1,173 @@
1
+ <h3 class="mw-section-subtitle">Mosaic</h3>
2
+ <p class="mw-text-muted mw-text-measure">
3
+ Photos of any shape in one grid. The script reads each photo's proportions
4
+ from its <code>width</code> and <code>height</code> and gives it a tile to
5
+ match - wide for landscape, tall for portrait, square for the rest - and the
6
+ smaller tiles fill the holes. The tile crops, the lightbox does not: a tap
7
+ opens the photo whole with its caption, and a swipe moves on to the next one.
8
+ <code>mw-mosaic-gap-sm</code> and <code>mw-mosaic-gap-lg</code> change the
9
+ gaps.
10
+ </p>
11
+
12
+ <div class="mw-segmented mw-mb-5" data-modifier-demo="mosaic-demo">
13
+ <button
14
+ type="button"
15
+ class="mw-segmented-item"
16
+ data-modifier="mw-mosaic-gap-sm"
17
+ >
18
+ Gap sm
19
+ </button>
20
+ <button type="button" class="mw-segmented-item mw-active" data-modifier="">
21
+ Default
22
+ </button>
23
+ <button
24
+ type="button"
25
+ class="mw-segmented-item"
26
+ data-modifier="mw-mosaic-gap-lg"
27
+ >
28
+ Gap lg
29
+ </button>
30
+ </div>
31
+
32
+ <div class="mw-mosaic" id="mosaic-demo">
33
+ <figure class="mw-mosaic-item mw-mosaic-big">
34
+ <a href="images/gallery-mountain.svg">
35
+ <img
36
+ src="images/gallery-mountain.svg"
37
+ alt="Mountain range at sunrise"
38
+ width="800"
39
+ height="450"
40
+ loading="lazy"
41
+ />
42
+ </a>
43
+ <figcaption>
44
+ First light on the ridge. <code>mw-mosaic-big</code> makes a photo the
45
+ centrepiece.
46
+ </figcaption>
47
+ </figure>
48
+ <figure class="mw-mosaic-item">
49
+ <a href="images/photo-peak.svg">
50
+ <img
51
+ src="images/photo-peak.svg"
52
+ alt="Snowy mountain peak under a starry sky"
53
+ width="600"
54
+ height="800"
55
+ loading="lazy"
56
+ />
57
+ </a>
58
+ <figcaption>Summit night, 3,000 metres up.</figcaption>
59
+ </figure>
60
+ <figure class="mw-mosaic-item">
61
+ <a href="images/photo-balloon.svg">
62
+ <img
63
+ src="images/photo-balloon.svg"
64
+ alt="Hot air balloon in a morning sky"
65
+ width="800"
66
+ height="800"
67
+ loading="lazy"
68
+ />
69
+ </a>
70
+ </figure>
71
+ <figure class="mw-mosaic-item">
72
+ <a href="images/photo-palm.svg">
73
+ <img
74
+ src="images/photo-palm.svg"
75
+ alt="Palm tree against a sunset over the sea"
76
+ width="800"
77
+ height="800"
78
+ loading="lazy"
79
+ />
80
+ </a>
81
+ <figcaption>The last evening on the island.</figcaption>
82
+ </figure>
83
+ <figure class="mw-mosaic-item">
84
+ <a href="images/gallery-lake.svg">
85
+ <img
86
+ src="images/gallery-lake.svg"
87
+ alt="Peaceful lake"
88
+ width="800"
89
+ height="450"
90
+ loading="lazy"
91
+ />
92
+ </a>
93
+ </figure>
94
+ <figure class="mw-mosaic-item">
95
+ <a href="images/photo-tower.svg">
96
+ <img
97
+ src="images/photo-tower.svg"
98
+ alt="Television tower above the city at night"
99
+ width="600"
100
+ height="800"
101
+ loading="lazy"
102
+ />
103
+ </a>
104
+ </figure>
105
+ <figure class="mw-mosaic-item">
106
+ <a href="images/photo-waterfall.svg">
107
+ <img
108
+ src="images/photo-waterfall.svg"
109
+ alt="Waterfall between mossy cliffs"
110
+ width="600"
111
+ height="800"
112
+ loading="lazy"
113
+ />
114
+ </a>
115
+ <figcaption>Two hours up the gorge, and worth every step of it.</figcaption>
116
+ </figure>
117
+ <figure class="mw-mosaic-item">
118
+ <a href="images/gallery-city.svg">
119
+ <img
120
+ src="images/gallery-city.svg"
121
+ alt="City skyline at night"
122
+ width="800"
123
+ height="450"
124
+ loading="lazy"
125
+ />
126
+ </a>
127
+ </figure>
128
+ <figure class="mw-mosaic-item">
129
+ <a href="images/photo-lighthouse.svg">
130
+ <img
131
+ src="images/photo-lighthouse.svg"
132
+ alt="Lighthouse on a cliff at dusk"
133
+ width="600"
134
+ height="800"
135
+ loading="lazy"
136
+ />
137
+ </a>
138
+ </figure>
139
+ <figure class="mw-mosaic-item">
140
+ <a href="images/story-aurora.svg">
141
+ <img
142
+ src="images/story-aurora.svg"
143
+ alt="Northern lights over a snowy forest"
144
+ width="720"
145
+ height="1280"
146
+ loading="lazy"
147
+ />
148
+ </a>
149
+ <figcaption>Minus eighteen degrees. Nobody minded.</figcaption>
150
+ </figure>
151
+ <figure class="mw-mosaic-item">
152
+ <a href="images/gallery-desert.svg">
153
+ <img
154
+ src="images/gallery-desert.svg"
155
+ alt="Desert dunes"
156
+ width="800"
157
+ height="450"
158
+ loading="lazy"
159
+ />
160
+ </a>
161
+ </figure>
162
+ <figure class="mw-mosaic-item">
163
+ <a href="images/gallery-snow.svg">
164
+ <img
165
+ src="images/gallery-snow.svg"
166
+ alt="Snowy hills"
167
+ width="800"
168
+ height="450"
169
+ loading="lazy"
170
+ />
171
+ </a>
172
+ </figure>
173
+ </div>
@@ -1,175 +1,126 @@
1
1
  <h3 class="mw-section-subtitle">Panels</h3>
2
2
  <p class="mw-text-muted mw-text-measure">
3
3
  A card whose header and footer are part of the frame rather than the content.
4
- The body scrolls on its own, which is what the max-height variants are for.
4
+ <code>mw-panel-primary</code> and <code>mw-panel-secondary</code> fill the
5
+ header. The body scrolls on its own, which is what the max-height variants are
6
+ for: <code>mw-panel-max-height-sm</code>, <code>-md</code> and
7
+ <code>-lg</code> cap the panel at 300, 500 and 700px.
8
+ <code>mw-panel-scrollable</code> is the older name for md.
5
9
  </p>
6
10
 
7
- <div class="mw-grid-1 mw-mb-6">
8
- <div class="mw-panel">
9
- <h4 class="mw-panel-header">Default Panel</h4>
10
- <div class="mw-panel-body">
11
- <p>
12
- This is a default panel with header, body, and footer sections. Panels
13
- are useful for grouping related content.
14
- </p>
11
+ <div class="mw-grid-2-lg mw-mb-6">
12
+ <div>
13
+ <div class="mw-segmented mw-mb-4" data-modifier-demo="panel-color-demo">
14
+ <button
15
+ type="button"
16
+ class="mw-segmented-item mw-active"
17
+ data-modifier=""
18
+ >
19
+ Default
20
+ </button>
21
+ <button
22
+ type="button"
23
+ class="mw-segmented-item"
24
+ data-modifier="mw-panel-primary"
25
+ >
26
+ Primary
27
+ </button>
28
+ <button
29
+ type="button"
30
+ class="mw-segmented-item"
31
+ data-modifier="mw-panel-secondary"
32
+ >
33
+ Secondary
34
+ </button>
15
35
  </div>
16
- <div class="mw-panel-footer">
17
- <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
18
- <button type="button" class="mw-btn mw-btn-primary">Save</button>
19
- </div>
20
- </div>
21
- </div>
22
-
23
- <div class="mw-grid-3-lg">
24
- <div class="mw-panel mw-panel-primary">
25
- <h4 class="mw-panel-header">Primary Panel</h4>
26
- <div class="mw-panel-body">
27
- <p>
28
- This is a primary panel with a colored header. You can use different
29
- panel variants to indicate different types of content.
30
- </p>
31
- </div>
32
- <div class="mw-panel-footer">
33
- <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
34
- <button type="button" class="mw-btn mw-btn-primary">Save</button>
35
- </div>
36
- </div>
37
-
38
- <div class="mw-panel mw-panel-secondary">
39
- <h4 class="mw-panel-header">Secondary Panel</h4>
40
- <div class="mw-panel-body">
41
- <p>
42
- This is a secondary panel with a colored header. Panels can contain any
43
- type of content, including forms, tables, or other components.
44
- </p>
45
- </div>
46
- </div>
47
-
48
- <div class="mw-panel mw-panel-scrollable">
49
- <h4 class="mw-panel-header">Scrollable Panel</h4>
50
- <div class="mw-panel-body">
51
- <p>
52
- This panel has a fixed maximum height of 500px and will scroll when
53
- content exceeds this height. Scrollable panels are ideal for displaying
54
- large amounts of content in a constrained space.
55
- </p>
56
- <p>
57
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
58
- mauris.
59
- </p>
60
- <p>
61
- Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
62
- tellus.
63
- </p>
64
- <p>
65
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
66
- cubilia Curae.
67
- </p>
68
- <p>
69
- Pellentesque habitant morbi tristique senectus et netus et malesuada
70
- fames ac turpis egestas.
71
- </p>
72
- <p>
73
- Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
74
- malesuada fames ac ante ipsum primis in faucibus.
75
- </p>
76
- <p>
77
- Mauris egestas elit vel nunc maximus, in aliquam magna vehicula. Cras
78
- vitae sapien a erat facilisis faucibus.
79
- </p>
80
- <p>
81
- Donec dignissim, odio ac imperdiet luctus, elit lorem eleifend massa,
82
- sed efficitur turpis velit vel odio.
83
- </p>
84
- <p>
85
- Suspendisse potenti. Nullam gravida fermentum turpis eu ultrices.
86
- Curabitur imperdiet imperdiet lacus.
87
- </p>
88
- <p>
89
- Praesent ac semper ante. Interdum et malesuada fames ac ante ipsum
90
- primis in faucibus.
91
- </p>
92
- </div>
93
- <div class="mw-panel-footer">
94
- <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
95
- <button type="button" class="mw-btn mw-btn-primary">Save</button>
96
- </div>
97
- </div>
98
- </div>
99
-
100
- <div class="mw-grid-2 mw-my-6">
101
- <div class="mw-panel mw-panel-primary mw-panel-max-height-md">
102
- <h4 class="mw-panel-header">Medium Height Panel</h4>
103
- <div class="mw-panel-body">
104
- <p>
105
- This panel uses the medium height variant (500px) and will scroll when
106
- content exceeds this height.
107
- </p>
108
- <p>
109
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
110
- mauris.
111
- </p>
112
- <p>
113
- Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
114
- tellus.
115
- </p>
116
- <p>
117
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
118
- cubilia Curae.
119
- </p>
120
- <p>
121
- Pellentesque habitant morbi tristique senectus et netus et malesuada
122
- fames ac turpis egestas.
123
- </p>
124
- <p>
125
- Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
126
- malesuada fames ac ante ipsum primis in faucibus.
127
- </p>
128
- <p>
129
- Mauris egestas elit vel nunc maximus, in aliquam magna vehicula. Cras
130
- vitae sapien a erat facilisis faucibus.
131
- </p>
132
- <p>
133
- Donec dignissim, odio ac imperdiet luctus, elit lorem eleifend massa,
134
- sed efficitur turpis velit vel odio.
135
- </p>
136
- </div>
137
- <div class="mw-panel-footer">
138
- <button type="button" class="mw-btn mw-btn-primary">OK</button>
36
+ <div class="mw-panel" id="panel-color-demo">
37
+ <h4 class="mw-panel-header">Panel</h4>
38
+ <div class="mw-panel-body">
39
+ <p>
40
+ This is a panel with header, body, and footer sections. Panels are
41
+ useful for grouping related content, including forms, tables, or other
42
+ components.
43
+ </p>
44
+ </div>
45
+ <div class="mw-panel-footer">
46
+ <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
47
+ <button type="button" class="mw-btn mw-btn-primary">Save</button>
48
+ </div>
139
49
  </div>
140
50
  </div>
141
51
 
142
- <div class="mw-panel mw-panel-secondary mw-panel-max-height-sm">
143
- <h4 class="mw-panel-header">Small Height Panel</h4>
144
- <div class="mw-panel-body">
145
- <p>
146
- This panel uses the small height variant (300px) and will scroll when
147
- content exceeds this height. Ideal for compact UI elements.
148
- </p>
149
- <p>
150
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
151
- mauris.
152
- </p>
153
- <p>
154
- Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
155
- tellus.
156
- </p>
157
- <p>
158
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
159
- cubilia Curae.
160
- </p>
161
- <p>
162
- Pellentesque habitant morbi tristique senectus et netus et malesuada
163
- fames ac turpis egestas.
164
- </p>
165
- <p>
166
- Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
167
- malesuada fames ac ante ipsum primis in faucibus.
168
- </p>
52
+ <div>
53
+ <div class="mw-segmented mw-mb-4" data-modifier-demo="panel-height-demo">
54
+ <button
55
+ type="button"
56
+ class="mw-segmented-item"
57
+ data-modifier="mw-panel-max-height-sm"
58
+ >
59
+ 300px
60
+ </button>
61
+ <button
62
+ type="button"
63
+ class="mw-segmented-item mw-active"
64
+ data-modifier="mw-panel-max-height-md"
65
+ >
66
+ 500px
67
+ </button>
68
+ <button
69
+ type="button"
70
+ class="mw-segmented-item"
71
+ data-modifier="mw-panel-max-height-lg"
72
+ >
73
+ 700px
74
+ </button>
169
75
  </div>
170
- <div class="mw-panel-footer">
171
- <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
172
- <button type="button" class="mw-btn mw-btn-secondary">Submit</button>
76
+ <div class="mw-panel mw-panel-max-height-md" id="panel-height-demo">
77
+ <h4 class="mw-panel-header">Scrollable Panel</h4>
78
+ <div class="mw-panel-body">
79
+ <p>
80
+ The body scrolls once the content outgrows the cap. Header and footer
81
+ stay where they are.
82
+ </p>
83
+ <p>
84
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
85
+ mauris.
86
+ </p>
87
+ <p>
88
+ Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
89
+ tellus.
90
+ </p>
91
+ <p>
92
+ Vestibulum ante ipsum primis in faucibus orci luctus et ultrices
93
+ posuere cubilia Curae.
94
+ </p>
95
+ <p>
96
+ Pellentesque habitant morbi tristique senectus et netus et malesuada
97
+ fames ac turpis egestas.
98
+ </p>
99
+ <p>
100
+ Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
101
+ malesuada fames ac ante ipsum primis in faucibus.
102
+ </p>
103
+ <p>
104
+ Mauris egestas elit vel nunc maximus, in aliquam magna vehicula. Cras
105
+ vitae sapien a erat facilisis faucibus.
106
+ </p>
107
+ <p>
108
+ Donec dignissim, odio ac imperdiet luctus, elit lorem eleifend massa,
109
+ sed efficitur turpis velit vel odio.
110
+ </p>
111
+ <p>
112
+ Suspendisse potenti. Nullam gravida fermentum turpis eu ultrices.
113
+ Curabitur imperdiet imperdiet lacus.
114
+ </p>
115
+ <p>
116
+ Praesent ac semper ante. Interdum et malesuada fames ac ante ipsum
117
+ primis in faucibus.
118
+ </p>
119
+ </div>
120
+ <div class="mw-panel-footer">
121
+ <button type="button" class="mw-btn mw-btn-outline">Cancel</button>
122
+ <button type="button" class="mw-btn mw-btn-primary">Save</button>
123
+ </div>
173
124
  </div>
174
125
  </div>
175
126
  </div>
@@ -0,0 +1,175 @@
1
+ <h3 class="mw-section-subtitle">Portrait Gallery</h3>
2
+ <p class="mw-text-muted mw-text-measure">
3
+ Upright photos in a strip the browser scrolls itself: a swipe on a phone,
4
+ arrows under a mouse, and the next photo always peeks in at the edge. One
5
+ slide on a phone, two and a half on a tablet, three on a desktop. A photo in
6
+ the other orientation - the lake below - is not cropped to a sliver but shown
7
+ whole, over a blurred copy of itself.
8
+ <code>mw-portrait-gallery-gap-sm</code> and
9
+ <code>mw-portrait-gallery-gap-lg</code> change the gaps.
10
+ </p>
11
+
12
+ <div class="mw-segmented mw-mb-5" data-modifier-demo="portrait-demo">
13
+ <button
14
+ type="button"
15
+ class="mw-segmented-item"
16
+ data-modifier="mw-portrait-gallery-gap-sm"
17
+ >
18
+ Gap sm
19
+ </button>
20
+ <button type="button" class="mw-segmented-item mw-active" data-modifier="">
21
+ Default
22
+ </button>
23
+ <button
24
+ type="button"
25
+ class="mw-segmented-item"
26
+ data-modifier="mw-portrait-gallery-gap-lg"
27
+ >
28
+ Gap lg
29
+ </button>
30
+ </div>
31
+
32
+ <div class="mw-portrait-gallery mw-mb-8" id="portrait-demo">
33
+ <div
34
+ class="mw-portrait-gallery-track"
35
+ tabindex="0"
36
+ aria-label="Portrait photos"
37
+ >
38
+ <figure class="mw-portrait-gallery-slide">
39
+ <img
40
+ src="images/photo-lighthouse.svg"
41
+ alt="Lighthouse on a cliff at dusk"
42
+ width="600"
43
+ height="800"
44
+ loading="lazy"
45
+ />
46
+ <figcaption>
47
+ <strong>North Cape</strong>
48
+ The lamp comes on just after the sun goes.
49
+ </figcaption>
50
+ </figure>
51
+ <figure class="mw-portrait-gallery-slide">
52
+ <img
53
+ src="images/photo-peak.svg"
54
+ alt="Snowy mountain peak under a starry sky"
55
+ width="600"
56
+ height="800"
57
+ loading="lazy"
58
+ />
59
+ <figcaption>
60
+ <strong>Summit night</strong>
61
+ 3,000 metres and one thermos of tea.
62
+ </figcaption>
63
+ </figure>
64
+ <figure class="mw-portrait-gallery-slide">
65
+ <img
66
+ src="images/gallery-lake.svg"
67
+ alt="Peaceful lake"
68
+ width="800"
69
+ height="450"
70
+ loading="lazy"
71
+ />
72
+ <figcaption>
73
+ <strong>Landscape, not cropped</strong>
74
+ Shown whole over a blurred copy of itself.
75
+ </figcaption>
76
+ </figure>
77
+ <figure class="mw-portrait-gallery-slide">
78
+ <img
79
+ src="images/photo-forest-path.svg"
80
+ alt="Path through a sunlit forest"
81
+ width="600"
82
+ height="800"
83
+ loading="lazy"
84
+ />
85
+ </figure>
86
+ <figure class="mw-portrait-gallery-slide">
87
+ <img
88
+ src="images/photo-tower.svg"
89
+ alt="Television tower above the city at night"
90
+ width="600"
91
+ height="800"
92
+ loading="lazy"
93
+ />
94
+ <figcaption>
95
+ <strong>Blue hour</strong>
96
+ The tower, the moon and not a single cloud.
97
+ </figcaption>
98
+ </figure>
99
+ <figure class="mw-portrait-gallery-slide">
100
+ <img
101
+ src="images/photo-waterfall.svg"
102
+ alt="Waterfall between mossy cliffs"
103
+ width="600"
104
+ height="800"
105
+ loading="lazy"
106
+ />
107
+ </figure>
108
+ </div>
109
+ </div>
110
+
111
+ <h4 class="mw-text-medium mw-mb-2">Story shape</h4>
112
+ <p class="mw-text-muted mw-text-measure">
113
+ <code>mw-portrait-gallery-tall</code> turns the slides into 9:16, the shape of
114
+ a phone screen - for stories, reels and screenshots. A video works like a
115
+ photo; the square balloon gets the same blurred frame the lake did.
116
+ </p>
117
+
118
+ <div class="mw-portrait-gallery mw-portrait-gallery-tall">
119
+ <div
120
+ class="mw-portrait-gallery-track"
121
+ tabindex="0"
122
+ aria-label="Story-shaped photos"
123
+ >
124
+ <figure class="mw-portrait-gallery-slide">
125
+ <img
126
+ src="images/story-beach.svg"
127
+ alt="Beach at sunset with waves running up the sand"
128
+ width="720"
129
+ height="1280"
130
+ loading="lazy"
131
+ />
132
+ </figure>
133
+ <figure class="mw-portrait-gallery-slide">
134
+ <video
135
+ src="media/story-sunrise.mp4"
136
+ poster="media/story-sunrise.jpg"
137
+ autoplay
138
+ muted
139
+ loop
140
+ playsinline
141
+ ></video>
142
+ <figcaption>
143
+ <strong>Sunrise</strong>
144
+ A muted, looping video.
145
+ </figcaption>
146
+ </figure>
147
+ <figure class="mw-portrait-gallery-slide">
148
+ <img
149
+ src="images/story-aurora.svg"
150
+ alt="Northern lights over a snowy forest"
151
+ width="720"
152
+ height="1280"
153
+ loading="lazy"
154
+ />
155
+ </figure>
156
+ <figure class="mw-portrait-gallery-slide">
157
+ <img
158
+ src="images/photo-balloon.svg"
159
+ alt="Hot air balloon in a morning sky"
160
+ width="800"
161
+ height="800"
162
+ loading="lazy"
163
+ />
164
+ </figure>
165
+ <figure class="mw-portrait-gallery-slide">
166
+ <img
167
+ src="images/story-stars.svg"
168
+ alt="Tent glowing under the milky way"
169
+ width="720"
170
+ height="1280"
171
+ loading="lazy"
172
+ />
173
+ </figure>
174
+ </div>
175
+ </div>