maverick-wave 4.20.0 → 4.22.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 (48) hide show
  1. package/.claude/skills/maverick-wave/SKILL.md +9 -7
  2. package/.claude/skills/maverick-wave/references/components.md +85 -0
  3. package/.claude/skills/maverick-wave/references/layout.md +30 -7
  4. package/.claude/skills/maverick-wave/references/theming.md +1 -1
  5. package/CHANGELOG.md +17 -0
  6. package/index.html +40 -0
  7. package/package.json +2 -2
  8. package/src/assets/images/gallery-city.svg +49 -0
  9. package/src/assets/images/gallery-desert.svg +25 -0
  10. package/src/assets/images/gallery-forest.svg +46 -0
  11. package/src/assets/images/gallery-lake.svg +26 -0
  12. package/src/assets/images/gallery-mountain.svg +19 -0
  13. package/src/assets/images/gallery-ocean.svg +26 -0
  14. package/src/assets/images/gallery-oldtown.svg +41 -0
  15. package/src/assets/images/gallery-snow.svg +39 -0
  16. package/src/assets/images/slider-field.svg +124 -0
  17. package/src/assets/images/slider-forest.svg +33 -0
  18. package/src/assets/images/slider-lake.svg +35 -0
  19. package/src/assets/images/slider-mountains.svg +29 -0
  20. package/src/assets/images/slider-trees.svg +41 -0
  21. package/src/assets/images/tile-analytics.svg +22 -0
  22. package/src/assets/images/tile-cloud.svg +19 -0
  23. package/src/assets/images/tile-ecommerce.svg +14 -0
  24. package/src/assets/images/tile-enterprise.svg +22 -0
  25. package/src/assets/images/tile-marketing.svg +16 -0
  26. package/src/assets/media/demo-chime.wav +0 -0
  27. package/src/partials/announcement-container.html +67 -0
  28. package/src/partials/content-slider-container.html +5 -17
  29. package/src/partials/gallery-container.html +8 -8
  30. package/src/partials/home-container.html +11 -20
  31. package/src/partials/media-container.html +27 -0
  32. package/src/partials/prose-container.html +43 -0
  33. package/src/partials/testimonials-container.html +82 -0
  34. package/src/partials/tiles-container.html +5 -20
  35. package/src/scss/base/_base.scss +7 -1
  36. package/src/scss/components/_announcement.scss +84 -0
  37. package/src/scss/components/_index.scss +4 -0
  38. package/src/scss/components/_media.scss +26 -0
  39. package/src/scss/components/_prose.scss +42 -0
  40. package/src/scss/components/_testimonial.scss +58 -0
  41. package/src/scss/layout/_grid.scss +39 -0
  42. package/src/scss/layout/_main.scss +16 -1
  43. package/src/scss/layout/_section.scss +24 -0
  44. package/src/scss/utilities/_index.scss +1 -0
  45. package/src/scss/utilities/_reveal.scss +34 -0
  46. package/src/scss/utilities/_touch-targets.scss +10 -2
  47. package/maverick-wave.min.css +0 -12
  48. package/maverick-wave.min.js +0 -1
@@ -215,7 +215,8 @@ feature frame) ·
215
215
  `mw-rating` · `mw-meta-header` · `mw-stepper` · `mw-timeline-big` /
216
216
  `mw-timeline-simple`
217
217
 
218
- **Feedback** `mw-alert` · `mw-toast-stack` · `mw-empty-state` ·
218
+ **Feedback** `mw-alert` · `mw-toast-stack` · `mw-announcement` (+ `-content`,
219
+ `-highlight`, `-static`, color variants) · `mw-empty-state` ·
219
220
  `mw-spinner-border` / `mw-spinner-dots` / `mw-spinner-dual-ring` · `mw-skeleton`
220
221
 
221
222
  **Navigation** `mw-header` + `mw-navbar` · `mw-breadcrumbs` · `mw-pagination` ·
@@ -223,9 +224,10 @@ feature frame) ·
223
224
  `-caret`, `-end`, `-up`) · `mw-section-nav` (`references/layout.md`)
224
225
 
225
226
  **Media & content** `mw-avatar` (+ `initials`, `group`) · `mw-gallery` ·
226
- `mw-image-slider` · `mw-blog-post` · `mw-code-block` / `mw-terminal` ·
227
- `mw-techstack-bucket` · `mw-coming-soon` · `mw-divider` · `mw-kbd` ·
228
- `mw-list` family
227
+ `mw-image-slider` · `mw-blog-post` · `mw-testimonial` (+ `-source`, `-detail`,
228
+ `-featured`) · `mw-prose` · `mw-media` (+ `-caption`) · `mw-code-block` /
229
+ `mw-terminal` · `mw-techstack-bucket` · `mw-coming-soon` · `mw-divider` ·
230
+ `mw-kbd` · `mw-list` family
229
231
 
230
232
  **Forms** (`references/forms.md`) `mw-field` · `mw-input` · `mw-select` ·
231
233
  `mw-textarea` · `mw-checkbox` · `mw-radio` · `mw-toggle` · `mw-slider` ·
@@ -233,8 +235,8 @@ feature frame) ·
233
235
  `mw-form-actions` · `mw-login`
234
236
 
235
237
  **Layout** (`references/layout.md`) `mw-main` · `mw-container` · `mw-content` ·
236
- `mw-section` · `mw-page-header` · `mw-grid-*` · `mw-row-split` · `mw-hero` ·
237
- `mw-footer`
238
+ `mw-section` (+ `mw-section-intro`) · `mw-page-header` · `mw-grid-*` ·
239
+ `mw-columns-2/3` · `mw-row-split` · `mw-hero` · `mw-footer`
238
240
 
239
241
  **Utilities** (`references/layout.md`) `mw-sr-only` / `mw-sr-only-focusable` /
240
242
  `mw-skip-link` · `mw-row-split` (+ `center`) · `mw-text-numeric` /
@@ -244,7 +246,7 @@ feature frame) ·
244
246
  `mw-corner-plain` ·
245
247
  `mw-aspect-square|video|wide|portrait|photo` · `mw-d-{sm,md,lg,xl}-*` /
246
248
  `mw-hide-mobile` / `mw-hide-desktop` · `mw-overflow-*` / `mw-snap-x` ·
247
- spacing, flex, display, text
249
+ `mw-reveal` · spacing, flex, display, text
248
250
 
249
251
  ## Pitfalls
250
252
 
@@ -636,6 +636,32 @@ class), `-top-center`, `-bottom-right`. Width is capped at
636
636
  the entry animation respects `prefers-reduced-motion`. Auto-dismiss is the
637
637
  application's job.
638
638
 
639
+ ## Announcement
640
+
641
+ The ribbon glued under the fixed header - a discount, a launch note, a
642
+ maintenance window. One per page.
643
+
644
+ ```html
645
+ <aside class="mw-announcement mw-announcement-secondary">
646
+ <a class="mw-announcement-content" href="#pricing">
647
+ <span class="mw-announcement-highlight">-20 %</span>
648
+ <span>Summer discount on all coachings until 06.09.</span>
649
+ </a>
650
+ </aside>
651
+ ```
652
+
653
+ Positioned fixed below the header and one z-index layer under it, and it stays
654
+ there - the page scrolls beneath it. Variants: `mw-announcement-secondary`,
655
+ `-success`, `-warning`, `-danger`, `-info` (primary is the default).
656
+ `mw-announcement-highlight` is the pill in front of the text; the content
657
+ element is usually an `<a>` but a plain `<div>` works.
658
+ `mw-announcement-static` puts the ribbon into the document flow instead - it
659
+ then scrolls with the content and shifts no anchor offset.
660
+
661
+ The height lives in `--mw-announcement-height` and drives the anchor scroll
662
+ offset (`scroll-padding-top`) automatically - a taller ribbon raises the token
663
+ instead of fighting the offset.
664
+
639
665
  ## Empty state
640
666
 
641
667
  ```html
@@ -1561,6 +1587,65 @@ current button carry `active`.
1561
1587
  `mw-blog-post-content-markdown` styles unclassed HTML - the target for rendered
1562
1588
  markdown. `mw-blog-post-content` is the same wrapper for hand-written markup.
1563
1589
 
1590
+ ## Testimonial
1591
+
1592
+ A quote card with its source - a voice about the product. A `figure`, because
1593
+ quote and attribution belong together:
1594
+
1595
+ ```html
1596
+ <figure class="mw-testimonial">
1597
+ <blockquote>
1598
+ The workshop picked me up after a long day of talking.
1599
+ </blockquote>
1600
+ <figcaption class="mw-testimonial-source">
1601
+ Anna M. <span class="mw-testimonial-detail">&middot; voice workshop</span>
1602
+ </figcaption>
1603
+ </figure>
1604
+ ```
1605
+
1606
+ The card carries the surface, so inside it the blockquote drops most of its
1607
+ tint and keeps only the edge and the quotation marks. `mw-testimonial-source`
1608
+ uses `margin-top: auto` - in a grid of equal-height cards every source line
1609
+ sits on its card's bottom edge. `mw-testimonial-featured` sets the quote a
1610
+ size larger, for the one voice lifted above the grid.
1611
+
1612
+ For a wall of testimonials of unequal length, put them in `mw-columns-2` or
1613
+ `mw-columns-3` (`references/layout.md`) instead of a grid.
1614
+
1615
+ ## Prose
1616
+
1617
+ Long-form running text - a legal page, terms, a plain article. One class on
1618
+ the container, bare `h2`/`h3`/`p`/`ul` inside:
1619
+
1620
+ ```html
1621
+ <div class="mw-card mw-card-simple mw-prose">
1622
+ <h2>1. Scope</h2>
1623
+ <p>...</p>
1624
+ <h2>2. Contact</h2>
1625
+ <p>...</p>
1626
+ </div>
1627
+ ```
1628
+
1629
+ Headings are deliberately small (`lg`/`md`, primary ink) - in a document they
1630
+ structure the reading rather than compete with the page title. First and last
1631
+ child lose their outer margins, so the container's own padding rules.
1632
+
1633
+ ## Media
1634
+
1635
+ Self-hosted audio and video. The native controls are the player -
1636
+ `accent-color` already brands them - the wrapper only makes the element sit
1637
+ right:
1638
+
1639
+ ```html
1640
+ <div class="mw-media">
1641
+ <video src="/media/intro.mp4" controls preload="metadata"></video>
1642
+ <p class="mw-media-caption">Two minutes about how a session works.</p>
1643
+ </div>
1644
+ ```
1645
+
1646
+ `audio` and `video` become full-width blocks; a video also gets the surface
1647
+ silhouette and a resting shadow. Works with `<audio controls>` the same way.
1648
+
1564
1649
  ## Code & terminal
1565
1650
 
1566
1651
  ```html
@@ -162,13 +162,14 @@ viewport, so keep long tooltips off the outermost elements.
162
162
 
163
163
  ## Sections
164
164
 
165
- | Class | Use |
166
- | ----------------------------------- | -------------------------------------------------------------------------- |
167
- | `mw-section` | Vertical rhythm for a page band - `--mw-section-padding-block`, 1.75rem |
168
- | `mw-section-alternate` | Diagonal pattern background; combine with `mw-section` |
169
- | `mw-section-title` | Centered `3xl` heading with a decorative primary underline - landing pages |
170
- | `mw-section-subtitle` | Centered `2xl` heading with a thin secondary underline |
171
- | `mw-section-nav` + `mw-section-btn` | Centered, wrapping row of outline-style jump links |
165
+ | Class | Use |
166
+ | ----------------------------------- | -------------------------------------------------------------------------------------------------------------- |
167
+ | `mw-section` | Vertical rhythm for a page band - `--mw-section-padding-block`, 3.3rem (2.5rem below `md`, 1.75rem below `sm`) |
168
+ | `mw-section-alternate` | Diagonal pattern background; combine with `mw-section` |
169
+ | `mw-section-title` | Centered `3xl` heading with a decorative primary underline - landing pages |
170
+ | `mw-section-intro` | The lead paragraph under a section title - centred, muted, 46rem measure |
171
+ | `mw-section-subtitle` | Centered `2xl` heading with a thin secondary underline |
172
+ | `mw-section-nav` + `mw-section-btn` | Centered, wrapping row of outline-style jump links |
172
173
 
173
174
  ```html
174
175
  <section class="mw-section mw-section-alternate">
@@ -303,6 +304,21 @@ Every one of them has a `-lg` twin with a wider gap (2.5rem instead of 1.35rem):
303
304
  | `mw-grid-stack-stretch` | full width (same result as `mw-grid-1`) |
304
305
  | `mw-grid-stack-lg`, `mw-grid-stack-center-lg` | wide-gap twins |
305
306
 
307
+ **Masonry columns** - `mw-columns-2` and `mw-columns-3`, for cards of unequal
308
+ height where a row grid tears a gap under every short one. CSS multi-column:
309
+ the children flow into columns and close up, the count steps down with the
310
+ viewport (3 → 2 below `lg`, → 1 below `sm`), and every child keeps
311
+ `break-inside: avoid` so a break never lands mid-card. Reading order runs top
312
+ to bottom, then across - right for testimonials and galleries, wrong for
313
+ anything ranked or chronological.
314
+
315
+ ```html
316
+ <div class="mw-columns-3">
317
+ <figure class="mw-testimonial">...</figure>
318
+ <figure class="mw-testimonial">...</figure>
319
+ </div>
320
+ ```
321
+
306
322
  ## Utilities
307
323
 
308
324
  **Spacing** - margin `mw-m-*`, `mw-mt-*`, `mw-mb-*`, `mw-ml-*`, `mw-mr-*`,
@@ -340,6 +356,13 @@ with it; `mw-text-capitalize` is the plain transform.
340
356
  **Elevation** - `mw-elevation-0` through `-5`, the same ramp every component
341
357
  uses. See the scale table in `SKILL.md`. Never hand-roll a `box-shadow`.
342
358
 
359
+ **Scroll entrance** - `mw-reveal` lets a block rise briefly as it scrolls into
360
+ view, driven by the browser's scroll timeline (`animation-timeline: view()`) -
361
+ no JavaScript, no observer. Doubly guarded: `prefers-reduced-motion` turns it
362
+ off, and a browser without scroll timelines renders the block in place instead
363
+ of leaving it invisible. Put it on section content, not on the section itself -
364
+ a screen-high band finishes its entrance before its content is halfway up.
365
+
343
366
  **Corner accent** - `mw-corner-plain` drops the accent arc that sits on the
344
367
  two round corners of every card, panel, modal, tile, accordion, calendar,
345
368
  pagination and login box. Everything else stays: the radii, the border, the
@@ -77,7 +77,7 @@ Safari 16.4+, Firefox 128+. The same range is declared as `browserslist` in
77
77
  | `--mw-table-scroll-height` | Per-table height cap for `mw-table-responsive-scroll` |
78
78
  | `--mw-kanban-background`, `--mw-kanban-lane-border`, `--mw-kanban-column-min-height` | Per-board surface, lane border and lane floor (120px, 90px on `mw-kanban-compact`) |
79
79
  | `--mw-container-gutter`, `--mw-container-width` | Page gutter of `mw-container` (fluid `clamp(1rem, 4.2vw + 0.5rem, 4rem)`, never below the safe-area inset) and the width derived from it (`min(1200px, 100% - 2 * gutter)`) |
80
- | `--mw-section-padding-block` | Top/bottom rhythm of `mw-section` (1.75rem) |
80
+ | `--mw-section-padding-block` | Top/bottom rhythm of `mw-section` (3.3rem, stepping down to 2.5rem below `md` and 1.75rem below `sm`) |
81
81
  | `--mw-calendar-dot` | Colour of a single calendar dot - set it per dot or per cell; the `mw-calendar-dot-*` classes are presets for it |
82
82
  | `--mw-scroll-hint-cover` | Colour the scroll hint on a tab bar fades into. Preset to the page, re-pointed to the card background inside `mw-card`, `mw-panel`, `mw-modal`, `mw-tile`, `mw-calendar` |
83
83
  | `--mw-elevation-1` … `-5` | Every shadow in the framework. Two layers per level - contact plus ambient. Never write a `box-shadow` by hand: a hand-rolled one is the wrong colour in one of the two themes |
package/CHANGELOG.md CHANGED
@@ -6,6 +6,23 @@ Patch releases are only for test purposes - here I only document major and minor
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [4.22.0] - 2026-09-01
10
+
11
+ ### Added
12
+
13
+ - `mw-announcement` - the ribbon under the fixed header (discount, launch note), with `-content`, `-highlight` pill, color variants, a `-static` in-flow variant and `--mw-announcement-height` driving the anchor scroll offset
14
+ - `mw-testimonial` - quote card with `-source`, `-detail` and `-featured`, built for walls of voices
15
+ - `mw-prose` - long-form running text container (legal pages, terms, articles): bare h2/h3/p/ul inside, no utility chains
16
+ - `mw-section-intro` - the lead paragraph under a `mw-section-title`
17
+ - `mw-reveal` - scroll entrance via `animation-timeline: view()`, guarded for reduced motion and older browsers
18
+ - `mw-media` - self-hosted audio and video sit full width, video in the surface silhouette
19
+
20
+ ## [4.21.0] - 2026-08-31
21
+
22
+ ### Fixed
23
+
24
+ - `mw-scroll-hint` keeps a smaller reserve below `md`, where the full one tipped the hero past 100dvh and moved the cue off screen
25
+
9
26
  ## [4.20.0] - 2026-08-31
10
27
 
11
28
  ### Added
package/index.html CHANGED
@@ -150,6 +150,10 @@
150
150
  <section id="foundations" class="mw-section">
151
151
  <div class="mw-container">
152
152
  <h2 class="mw-section-title">Foundations</h2>
153
+ <p class="mw-section-intro">
154
+ The raw material - type, color, spacing and the small utilities
155
+ everything else is built from.
156
+ </p>
153
157
  <nav class="mw-section-nav">
154
158
  <a href="#typography" class="mw-section-btn">Typography</a>
155
159
  <a href="#colors" class="mw-section-btn">Main Colors</a>
@@ -197,6 +201,10 @@
197
201
  <section id="layout" class="mw-section mw-section-alternate">
198
202
  <div class="mw-container">
199
203
  <h2 class="mw-section-title">Layout</h2>
204
+ <p class="mw-section-intro">
205
+ The bones of a page - grids, cards, panels and the containers that
206
+ hold content together.
207
+ </p>
200
208
  <nav class="mw-section-nav">
201
209
  <a href="#grid" class="mw-section-btn">Grid System</a>
202
210
  <a href="#cards" class="mw-section-btn">Cards</a>
@@ -264,6 +272,10 @@
264
272
  <section id="components" class="mw-section">
265
273
  <div class="mw-container">
266
274
  <h2 class="mw-section-title">Components</h2>
275
+ <p class="mw-section-intro">
276
+ The everyday parts - buttons, tags, alerts and their many friends,
277
+ ready to drop in.
278
+ </p>
267
279
  <nav class="mw-section-nav">
268
280
  <a href="#buttons" class="mw-section-btn">Buttons</a>
269
281
  <a href="#button-bar" class="mw-section-btn">Button Bar</a>
@@ -277,6 +289,7 @@
277
289
  <a href="#ratings" class="mw-section-btn">Ratings</a>
278
290
  <a href="#info" class="mw-section-btn">Info</a>
279
291
  <a href="#alerts" class="mw-section-btn">Alerts</a>
292
+ <a href="#announcement" class="mw-section-btn">Announcement</a>
280
293
  <a href="#code" class="mw-section-btn">Code</a>
281
294
  <a href="#skeleton" class="mw-section-btn">Skeleton</a>
282
295
  <a href="#empty-state" class="mw-section-btn">Empty State</a>
@@ -337,6 +350,11 @@
337
350
  @@include('./src/partials/alerts-container.html')
338
351
  </div>
339
352
 
353
+ <!-- Announcement container -->
354
+ <div id="announcement">
355
+ @@include('./src/partials/announcement-container.html')
356
+ </div>
357
+
340
358
  <!-- Code container -->
341
359
  <div id="code">@@include('./src/partials/code-container.html')</div>
342
360
 
@@ -361,6 +379,10 @@
361
379
  <section id="forms" class="mw-section mw-section-alternate">
362
380
  <div class="mw-container">
363
381
  <h2 class="mw-section-title">Forms</h2>
382
+ <p class="mw-section-intro">
383
+ Inputs, selects, toggles and validation - fields and buttons share
384
+ one height scale by construction.
385
+ </p>
364
386
  <nav class="mw-section-nav">
365
387
  <a href="#form-elements" class="mw-section-btn">Form Elements</a>
366
388
  <a href="#input-group" class="mw-section-btn">Input Group</a>
@@ -402,6 +424,10 @@
402
424
  <section id="data-display" class="mw-section">
403
425
  <div class="mw-container">
404
426
  <h2 class="mw-section-title">Data & Display</h2>
427
+ <p class="mw-section-intro">
428
+ Tables, boards, timelines and long-form content - everything that
429
+ shows real data.
430
+ </p>
405
431
  <nav class="mw-section-nav">
406
432
  <a href="#page-header" class="mw-section-btn">Page Header</a>
407
433
  <a href="#meta-info" class="mw-section-btn">Meta Info</a>
@@ -415,6 +441,9 @@
415
441
  >Technology Stack Bucket</a
416
442
  >
417
443
  <a href="#content-slider" class="mw-section-btn">Content Slider</a>
444
+ <a href="#testimonials" class="mw-section-btn">Testimonials</a>
445
+ <a href="#prose" class="mw-section-btn">Prose</a>
446
+ <a href="#media" class="mw-section-btn">Media</a>
418
447
  <a href="#blog-posts" class="mw-section-btn">Blog Posts</a>
419
448
  </nav>
420
449
 
@@ -468,6 +497,17 @@
468
497
  @@include('./src/partials/content-slider-container.html')
469
498
  </div>
470
499
 
500
+ <!-- Testimonials container-->
501
+ <div id="testimonials">
502
+ @@include('./src/partials/testimonials-container.html')
503
+ </div>
504
+
505
+ <!-- Prose container-->
506
+ <div id="prose">@@include('./src/partials/prose-container.html')</div>
507
+
508
+ <!-- Media container-->
509
+ <div id="media">@@include('./src/partials/media-container.html')</div>
510
+
471
511
  <!-- Blogposts container-->
472
512
  <div id="blog-posts">
473
513
  @@include('./src/partials/blog-posts-container.html')
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "maverick-wave",
3
- "version": "4.20.0",
3
+ "version": "4.22.0",
4
4
  "config": {
5
- "version_short": "4.20"
5
+ "version_short": "4.22"
6
6
  },
7
7
  "description": "A lightweight, modern CSS framework for building responsive websites with elegance and speed.",
8
8
  "main": "src/js/main.js",
@@ -0,0 +1,49 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="City skyline at night">
2
+ <defs>
3
+ <linearGradient id="city-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#101830"/>
5
+ <stop offset="0.6" stop-color="#3a3566"/>
6
+ <stop offset="1" stop-color="#a5628a"/>
7
+ </linearGradient>
8
+ <pattern id="city-win" x="0" y="0" width="18" height="24" patternUnits="userSpaceOnUse">
9
+ <rect x="4" y="6" width="7" height="9" fill="#ffd98a" opacity="0.72"/>
10
+ </pattern>
11
+ </defs>
12
+ <rect width="800" height="450" fill="url(#city-sky)"/>
13
+ <circle cx="150" cy="98" r="30" fill="#f4e7c8"/>
14
+ <circle cx="163" cy="90" r="30" fill="#26224a"/>
15
+ <g fill="#241f43">
16
+ <rect x="20" y="248" width="72" height="202"/>
17
+ <rect x="104" y="196" width="58" height="254"/>
18
+ <rect x="176" y="286" width="86" height="164"/>
19
+ </g>
20
+ <g fill="url(#city-win)">
21
+ <rect x="20" y="248" width="72" height="202"/>
22
+ <rect x="104" y="196" width="58" height="254"/>
23
+ <rect x="176" y="286" width="86" height="164"/>
24
+ </g>
25
+ <g fill="#1a1633">
26
+ <rect x="272" y="156" width="78" height="294"/>
27
+ <rect x="362" y="228" width="64" height="222"/>
28
+ <rect x="440" y="122" width="52" height="328"/>
29
+ <rect x="506" y="204" width="88" height="246"/>
30
+ </g>
31
+ <g fill="url(#city-win)">
32
+ <rect x="272" y="156" width="78" height="294"/>
33
+ <rect x="362" y="228" width="64" height="222"/>
34
+ <rect x="440" y="122" width="52" height="328"/>
35
+ <rect x="506" y="204" width="88" height="246"/>
36
+ </g>
37
+ <rect x="462" y="96" width="8" height="30" fill="#1a1633"/>
38
+ <circle cx="466" cy="92" r="6" fill="#ff7b6b"/>
39
+ <g fill="#120f27">
40
+ <rect x="604" y="262" width="70" height="188"/>
41
+ <rect x="686" y="182" width="60" height="268"/>
42
+ <rect x="758" y="300" width="42" height="150"/>
43
+ </g>
44
+ <g fill="url(#city-win)">
45
+ <rect x="604" y="262" width="70" height="188"/>
46
+ <rect x="686" y="182" width="60" height="268"/>
47
+ <rect x="758" y="300" width="42" height="150"/>
48
+ </g>
49
+ </svg>
@@ -0,0 +1,25 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Desert dunes under a low sun">
2
+ <defs>
3
+ <linearGradient id="des-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#e28b52"/>
5
+ <stop offset="0.6" stop-color="#f3b972"/>
6
+ <stop offset="1" stop-color="#fbdda6"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <rect width="800" height="450" fill="url(#des-sky)"/>
10
+ <circle cx="256" cy="180" r="62" fill="#fff2cf"/>
11
+ <circle cx="256" cy="180" r="104" fill="#fff2cf" opacity="0.16"/>
12
+ <path d="M0,250 C130,214 236,268 360,252 C486,236 588,196 800,246 L800,450 L0,450 Z" fill="#e9b273"/>
13
+ <path d="M0,306 C142,264 266,330 402,308 C540,286 660,246 800,304 L800,450 L0,450 Z" fill="#d3924f"/>
14
+ <g fill="#7d4520">
15
+ <path d="M602,368 c-5,-28 -3,-54 8,-78 l11,4 c-10,23 -12,48 -8,74 Z"/>
16
+ <path d="M616,292 c-32,-12 -58,-2 -72,16 c26,-10 48,-11 70,-4 Z"/>
17
+ <path d="M616,292 c-30,-24 -58,-24 -78,-14 c28,0 52,6 74,20 Z"/>
18
+ <path d="M616,292 c32,-12 58,-2 72,16 c-26,-10 -48,-11 -70,-4 Z"/>
19
+ <path d="M616,292 c30,-24 58,-24 78,-14 c-28,0 -52,6 -74,20 Z"/>
20
+ <path d="M616,292 c-8,-30 2,-50 18,-60 c-8,22 -12,40 -12,60 Z"/>
21
+ <circle cx="612" cy="296" r="5"/>
22
+ </g>
23
+ <path d="M0,368 C122,332 246,390 396,364 C548,338 668,314 800,372 L800,450 L0,450 Z" fill="#b0703a"/>
24
+ <path d="M0,424 C160,398 300,436 452,414 C598,392 690,382 800,420 L800,450 L0,450 Z" fill="#8a5228"/>
25
+ </svg>
@@ -0,0 +1,46 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Autumn forest with light through the trees">
2
+ <defs>
3
+ <linearGradient id="for-bg" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#fbe3ab"/>
5
+ <stop offset="0.45" stop-color="#e0a659"/>
6
+ <stop offset="1" stop-color="#7d5327"/>
7
+ </linearGradient>
8
+ <linearGradient id="for-haze" x1="0" y1="0" x2="0" y2="1">
9
+ <stop offset="0" stop-color="#ffeec2" stop-opacity="0.6"/>
10
+ <stop offset="1" stop-color="#ffeec2" stop-opacity="0"/>
11
+ </linearGradient>
12
+ </defs>
13
+ <rect width="800" height="450" fill="url(#for-bg)"/>
14
+ <circle cx="404" cy="132" r="58" fill="#fff6da" opacity="0.75"/>
15
+ <circle cx="404" cy="132" r="110" fill="#fff6da" opacity="0.22"/>
16
+ <g fill="#a97236" opacity="0.4">
17
+ <rect x="72" y="0" width="13" height="450"/>
18
+ <rect x="214" y="0" width="10" height="450"/>
19
+ <rect x="352" y="0" width="14" height="450"/>
20
+ <rect x="498" y="0" width="11" height="450"/>
21
+ <rect x="628" y="0" width="13" height="450"/>
22
+ <rect x="756" y="0" width="10" height="450"/>
23
+ </g>
24
+ <g fill="#6b451f" opacity="0.85">
25
+ <rect x="128" y="0" width="22" height="450"/>
26
+ <rect x="288" y="0" width="18" height="450"/>
27
+ <rect x="566" y="0" width="20" height="450"/>
28
+ <rect x="702" y="0" width="16" height="450"/>
29
+ </g>
30
+ <g fill="#3d2611">
31
+ <rect x="24" y="0" width="30" height="450"/>
32
+ <rect x="428" y="0" width="26" height="450"/>
33
+ <rect x="772" y="0" width="28" height="450"/>
34
+ </g>
35
+ <path d="M0,342 C140,326 280,356 420,340 C560,324 680,344 800,332 L800,450 L0,450 Z" fill="#5b3818"/>
36
+ <rect y="316" width="800" height="134" fill="url(#for-haze)"/>
37
+ <g fill="#e8a94d" opacity="0.65">
38
+ <ellipse cx="150" cy="392" rx="11" ry="7"/>
39
+ <ellipse cx="298" cy="420" rx="9" ry="6"/>
40
+ <ellipse cx="472" cy="386" rx="12" ry="7"/>
41
+ <ellipse cx="624" cy="424" rx="10" ry="6"/>
42
+ <ellipse cx="722" cy="390" rx="9" ry="6"/>
43
+ <ellipse cx="76" cy="428" rx="10" ry="6"/>
44
+ <ellipse cx="390" cy="436" rx="9" ry="6"/>
45
+ </g>
46
+ </svg>
@@ -0,0 +1,26 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Calm lake at dusk">
2
+ <defs>
3
+ <linearGradient id="lake-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#2b3a63"/>
5
+ <stop offset="0.55" stop-color="#8f6d8e"/>
6
+ <stop offset="1" stop-color="#f0b083"/>
7
+ </linearGradient>
8
+ <linearGradient id="lake-water" x1="0" y1="0" x2="0" y2="1">
9
+ <stop offset="0" stop-color="#c98f74"/>
10
+ <stop offset="0.35" stop-color="#5c5f85"/>
11
+ <stop offset="1" stop-color="#24304f"/>
12
+ </linearGradient>
13
+ </defs>
14
+ <rect width="800" height="450" fill="url(#lake-sky)"/>
15
+ <circle cx="400" cy="238" r="38" fill="#ffd9a8"/>
16
+ <polygon points="0,258 132,182 250,246 360,196 470,252 600,178 720,250 800,214 800,272 0,272" fill="#5b4f74"/>
17
+ <polygon points="0,272 800,272 800,450 0,450" fill="url(#lake-water)"/>
18
+ <rect x="386" y="278" width="28" height="96" rx="14" fill="#ffd9a8" opacity="0.5"/>
19
+ <rect x="120" y="296" width="180" height="5" rx="2.5" fill="#e7c3ae" opacity="0.35"/>
20
+ <rect x="470" y="318" width="230" height="5" rx="2.5" fill="#e7c3ae" opacity="0.3"/>
21
+ <rect x="220" y="348" width="300" height="6" rx="3" fill="#e7c3ae" opacity="0.22"/>
22
+ <rect x="80" y="392" width="420" height="6" rx="3" fill="#e7c3ae" opacity="0.16"/>
23
+ <polygon points="586,272 612,192 638,272" fill="#1e2a44"/>
24
+ <polygon points="634,272 658,206 682,272" fill="#1e2a44"/>
25
+ <rect x="607" y="262" width="10" height="18" fill="#1e2a44"/>
26
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Mountain range at sunrise">
2
+ <defs>
3
+ <linearGradient id="mtn-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#14273f"/>
5
+ <stop offset="0.5" stop-color="#3d6a97"/>
6
+ <stop offset="1" stop-color="#a8c6d8"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <rect width="800" height="450" fill="url(#mtn-sky)"/>
10
+ <circle cx="612" cy="128" r="44" fill="#ffe0ae"/>
11
+ <circle cx="612" cy="128" r="76" fill="#ffe0ae" opacity="0.18"/>
12
+ <polygon points="0,318 118,214 228,286 344,176 470,296 588,206 704,300 800,224 800,450 0,450" fill="#7096b8"/>
13
+ <polygon points="344,176 383,214 370,209 357,220 342,210 320,216" fill="#e8f1f7"/>
14
+ <polygon points="588,206 620,238 608,233 597,243 585,234 566,240" fill="#e8f1f7"/>
15
+ <polygon points="0,360 96,272 206,344 318,252 438,352 560,268 672,356 800,286 800,450 0,450" fill="#3f6489"/>
16
+ <polygon points="318,252 350,286 338,281 327,291 315,282 297,288" fill="#dae7f0"/>
17
+ <polygon points="-20,412 130,320 268,404 404,314 548,406 676,330 800,398 800,450 0,450" fill="#22405e"/>
18
+ <rect y="424" width="800" height="26" fill="#182f47"/>
19
+ </svg>
@@ -0,0 +1,26 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Ocean waves rolling to the horizon">
2
+ <defs>
3
+ <linearGradient id="oce-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#5aa8cc"/>
5
+ <stop offset="1" stop-color="#d3edf3"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="800" height="450" fill="url(#oce-sky)"/>
9
+ <g fill="#ffffff" opacity="0.5">
10
+ <ellipse cx="150" cy="88" rx="66" ry="20"/>
11
+ <ellipse cx="198" cy="78" rx="44" ry="16"/>
12
+ <ellipse cx="596" cy="126" rx="78" ry="18"/>
13
+ <ellipse cx="644" cy="116" rx="46" ry="14"/>
14
+ </g>
15
+ <rect y="204" width="800" height="246" fill="#1f6f96"/>
16
+ <path d="M0,204 C120,196 200,222 320,214 C440,206 540,228 660,218 C720,213 764,220 800,216 L800,268 L0,268 Z" fill="#2b88ad"/>
17
+ <path d="M0,262 C140,250 230,286 372,272 C500,259 596,290 800,272 L800,330 L0,330 Z" fill="#1a6c92"/>
18
+ <path d="M0,326 C150,310 260,354 410,336 C556,318 660,352 800,330 L800,394 L0,394 Z" fill="#125877"/>
19
+ <path d="M0,390 C170,370 300,414 460,394 C610,375 700,404 800,390 L800,450 L0,450 Z" fill="#0b4159"/>
20
+ <g fill="#eaf7fb" opacity="0.85">
21
+ <path d="M60,268 c40,-8 70,6 108,0 c-34,14 -70,4 -108,0 Z"/>
22
+ <path d="M430,276 c48,-10 84,6 128,-2 c-40,18 -84,6 -128,2 Z"/>
23
+ <path d="M170,336 c56,-12 96,8 148,-2 c-46,20 -96,6 -148,2 Z"/>
24
+ <path d="M560,392 c46,-10 80,6 120,-2 c-36,18 -78,6 -120,2 Z"/>
25
+ </g>
26
+ </svg>
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 450" width="800" height="450" role="img" aria-label="Old town rooftops and a church tower">
2
+ <defs>
3
+ <linearGradient id="old-sky" x1="0" y1="0" x2="0" y2="1">
4
+ <stop offset="0" stop-color="#6f93b5"/>
5
+ <stop offset="1" stop-color="#f2ddc0"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="800" height="450" fill="url(#old-sky)"/>
9
+ <circle cx="668" cy="112" r="34" fill="#fff3d6" opacity="0.85"/>
10
+ <g fill="#9a8570" opacity="0.6">
11
+ <polygon points="60,300 118,240 176,300"/>
12
+ <rect x="60" y="300" width="116" height="150"/>
13
+ <polygon points="640,296 700,234 760,296"/>
14
+ <rect x="640" y="296" width="120" height="154"/>
15
+ </g>
16
+ <polygon points="330,206 372,146 414,206" fill="#8f4b3c"/>
17
+ <rect x="344" y="206" width="56" height="244" fill="#e0cdb2"/>
18
+ <rect x="360" y="142" width="24" height="10" fill="#6b4136"/>
19
+ <circle cx="372" cy="238" r="14" fill="#f6efe1" stroke="#6b4136" stroke-width="3"/>
20
+ <g>
21
+ <polygon points="140,326 196,268 252,326" fill="#a4553f"/>
22
+ <rect x="146" y="326" width="100" height="124" fill="#e6d4b8"/>
23
+ <polygon points="252,308 316,246 380,308" fill="#8d4a38"/>
24
+ <rect x="258" y="308" width="116" height="142" fill="#dcc7a6"/>
25
+ <polygon points="400,318 458,258 516,318" fill="#b25e44"/>
26
+ <rect x="406" y="318" width="104" height="132" fill="#e9d9be"/>
27
+ <polygon points="516,300 578,240 640,300" fill="#94503b"/>
28
+ <rect x="522" y="300" width="112" height="150" fill="#d9c4a2"/>
29
+ </g>
30
+ <g fill="#6b5a45">
31
+ <rect x="168" y="356" width="20" height="26"/><rect x="206" y="356" width="20" height="26"/>
32
+ <rect x="168" y="404" width="20" height="26"/><rect x="206" y="404" width="20" height="26"/>
33
+ <rect x="282" y="342" width="22" height="30"/><rect x="328" y="342" width="22" height="30"/>
34
+ <rect x="282" y="396" width="22" height="30"/><rect x="328" y="396" width="22" height="30"/>
35
+ <rect x="428" y="352" width="20" height="28"/><rect x="468" y="352" width="20" height="28"/>
36
+ <rect x="428" y="404" width="20" height="28"/><rect x="468" y="404" width="20" height="28"/>
37
+ <rect x="546" y="336" width="22" height="30"/><rect x="590" y="336" width="22" height="30"/>
38
+ <rect x="546" y="392" width="22" height="30"/><rect x="590" y="392" width="22" height="30"/>
39
+ </g>
40
+ <rect y="440" width="800" height="10" fill="#6b5a45"/>
41
+ </svg>