@casoon/pages-theme 0.0.0-stage → 0.12.8

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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +279 -2
  3. package/assets/casoon-logo-dark.svg +70 -0
  4. package/assets/casoon-logo.svg +71 -0
  5. package/assets/favicon.svg +1 -0
  6. package/components/AnchorGrid.astro +135 -0
  7. package/components/ApiEntry.astro +136 -0
  8. package/components/Badge.astro +31 -0
  9. package/components/Badges.astro +10 -0
  10. package/components/BuildOutput.astro +84 -0
  11. package/components/Button.astro +55 -0
  12. package/components/CallToAction.astro +64 -0
  13. package/components/Callout.astro +66 -0
  14. package/components/CodeBlock.astro +84 -0
  15. package/components/Demo.astro +80 -0
  16. package/components/ExamplePanel.astro +153 -0
  17. package/components/Facts.astro +112 -0
  18. package/components/Faq.astro +123 -0
  19. package/components/Features.astro +139 -0
  20. package/components/FileSet.astro +258 -0
  21. package/components/Footer.astro +160 -0
  22. package/components/Header.astro +278 -0
  23. package/components/Hero.astro +318 -0
  24. package/components/Install.astro +154 -0
  25. package/components/Integrations.astro +125 -0
  26. package/components/Keymap.astro +102 -0
  27. package/components/Quickstart.astro +95 -0
  28. package/components/ReleaseHighlights.astro +115 -0
  29. package/components/Spotlight.astro +177 -0
  30. package/components/Swatch.astro +45 -0
  31. package/components/Tabs.astro +90 -0
  32. package/components/Terminal.astro +79 -0
  33. package/components/index.ts +25 -0
  34. package/content.ts +23 -0
  35. package/fonts/OFL.txt +95 -0
  36. package/fonts/inter-latin-400-normal.woff2 +0 -0
  37. package/fonts/inter-latin-500-normal.woff2 +0 -0
  38. package/fonts/inter-latin-600-normal.woff2 +0 -0
  39. package/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  40. package/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  41. package/fonts/onest-latin-wght-normal.woff2 +0 -0
  42. package/index.ts +204 -0
  43. package/layouts/Base.astro +131 -0
  44. package/layouts/Docs.astro +286 -0
  45. package/lib/ansi.ts +168 -0
  46. package/lib/changelog.ts +85 -0
  47. package/lib/docs.ts +54 -0
  48. package/lib/i18n.ts +136 -0
  49. package/lib/og.ts +91 -0
  50. package/lib/showcase.ts +48 -0
  51. package/lib/url.ts +16 -0
  52. package/lib/version.ts +50 -0
  53. package/package.json +71 -4
  54. package/routes/404.astro +49 -0
  55. package/routes/changelog.astro +129 -0
  56. package/routes/docs/[...slug].astro +39 -0
  57. package/routes/showcase/[slug].astro +108 -0
  58. package/routes/showcase/index.astro +195 -0
  59. package/styles/base.css +307 -0
  60. package/styles/fonts.css +52 -0
  61. package/styles/tokens.css +136 -0
  62. package/virtual.d.ts +12 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CASOON
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,280 @@
1
- # Temporary Holding Version
1
+ # @casoon/pages-theme
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Shared Astro theme for the GitHub Pages sites of CASOON open-source projects: one layout,
4
+ one set of tokens and components, and generated routes for docs, showcase, changelog and 404.
5
+ Projects supply content, examples and configuration.
6
+
7
+ ## Project layout
8
+
9
+ ```
10
+ <repo>/
11
+ ├── site/ # Astro project (this theme as dependency)
12
+ │ ├── astro.config.mjs # casoonPages({ … })
13
+ │ └── src/
14
+ │ ├── pages/index.astro # start page, composed from theme components
15
+ │ ├── showcase.ts # exports `examples`
16
+ │ └── content.config.ts # docs collection
17
+ ├── docs/ # Markdown / MDX, versioned with the code
18
+ ├── examples/ # fixtures, shared with the test suite
19
+ ├── CHANGELOG.md # Keep a Changelog
20
+ └── .github/workflows/pages.yml
21
+ ```
22
+
23
+ ## Install
24
+
25
+ ```bash
26
+ pnpm add @casoon/pages-theme
27
+ ```
28
+
29
+ Requires Astro 7.3 or newer (peer dependency). The package ships its TypeScript and Astro
30
+ sources; Astro compiles them with the site.
31
+
32
+ Releases are published from the GitHub Actions workflow of `casoon/pages-theme` via npm trusted
33
+ publishing, never from a developer machine, and carry signed build provenance. To check an
34
+ installed copy:
35
+
36
+ ```bash
37
+ npm audit signatures
38
+ ```
39
+
40
+ ## Setup
41
+
42
+ ```js
43
+ // site/astro.config.mjs
44
+ import casoonPages from '@casoon/pages-theme';
45
+ import { defineConfig } from 'astro/config';
46
+
47
+ export default defineConfig({
48
+ site: 'https://casoon.github.io/runemark',
49
+ base: '/runemark/',
50
+ integrations: [
51
+ casoonPages({
52
+ name: 'runemark',
53
+ description: 'Renders ANSI terminal output as accessible, script-free HTML.',
54
+ repo: 'casoon/runemark',
55
+ version: '0.4.2',
56
+ packages: [{ label: 'crates.io', href: 'https://crates.io/crates/runemark' }],
57
+ docsGroups: { 'getting-started': 'Getting started', reference: 'Reference' },
58
+ }),
59
+ ],
60
+ });
61
+ ```
62
+
63
+ ```ts
64
+ // site/src/content.config.ts
65
+ import { docsCollection } from '@casoon/pages-theme/content';
66
+ export const collections = { docs: docsCollection() };
67
+ ```
68
+
69
+ ### Options
70
+
71
+ | Option | Default | Purpose |
72
+ | --- | --- | --- |
73
+ | `name`, `description`, `repo` | – | Header, meta tags, GitHub links, JSON-LD |
74
+ | `tagline` | – | A few words for the start page's `<title>` and the OG image; see „Search engines" |
75
+ | `website` | – | The project's landing page (`https://example.com`): header, footer, JSON-LD `sameAs` |
76
+ | `catalog` | repository name | Slug of the project's entry on casoon.dev (`#projekt-<slug>`), linked in the footer; `false` for none |
77
+ | `version` | the project's manifest | Header badge, "Docs for vX"; see „Version" |
78
+ | `license` | `MIT` | SPDX id for footer and JSON-LD; `false` for proprietary code names no licence |
79
+ | `branch` | `main` | "Edit this page" links |
80
+ | `accent` | CASOON petrol | `{ light, dark }` project colour; needs 4.5:1 on `#f4f1eb` and `#151412` |
81
+ | `packages` | `[]` | Registry and API-doc links in the footer |
82
+ | `docsGroups` | `{}` | Sidebar groups: folder in `docs/` → label, in order. Root pages join the first group |
83
+ | `changelog` | `../CHANGELOG.md` | Path relative to `site/`, or `false` |
84
+ | `showcase` | `./src/showcase.ts` | Module exporting `examples: ShowcaseExample[]`, or `false` |
85
+ | `demo` | `false` | Header label of a live demo page; the project supplies `src/pages/demo.astro` |
86
+ | `mdxComponents` | – | Module exporting `components` for docs MDX, next to the theme's; see „Docs frontmatter" |
87
+ | `lang` | `en` | `en` or `de`: `<html lang>` and the theme's own UI strings (`lib/i18n.ts`); props passed by the project win |
88
+ | `showcaseLead` | – | Lead paragraph of the showcase overview, instead of the theme's generic one |
89
+
90
+ #### Version
91
+
92
+ Left out, `version` comes from the manifest next to `site/`: `version` in `package.json`, else
93
+ `[package]` or `[workspace.package]` in `Cargo.toml`. So the number is maintained in one place,
94
+ and a release updates the site by itself. Pages read it as `config.version` from
95
+ `virtual:casoon-pages/config` — a start page that shows the release in a `Badge` takes it from
96
+ there instead of typing it out.
97
+
98
+ A wrong number is worse than none, so anything that cannot be read with certainty yields none:
99
+ a workspace whose version sits in a member crate, a `package.json` without `version`, a project
100
+ with neither manifest. Those pass `version` themselves, and `false` shows none at all.
101
+
102
+ ### Routes
103
+
104
+ | Route | Source |
105
+ | --- | --- |
106
+ | `/` | the project's `src/pages/index.astro` |
107
+ | `/docs/…` | `docs/**/*.{md,mdx}`; `docs/index.md` becomes `/docs/` |
108
+ | `/showcase/`, `/showcase/<slug>/` | `examples` from the showcase module |
109
+ | `/changelog/` | `CHANGELOG.md` (`## [x.y.z] - YYYY-MM-DD`, `### Added` …, `### Breaking`) |
110
+ | `/demo/` | the project's `src/pages/demo.astro`, linked once `demo` is set |
111
+ | `/404` | theme |
112
+ | `/sitemap.xml`, `/og.png` | written after the build when `site` is set; see „Search engines" |
113
+
114
+ ### Docs frontmatter
115
+
116
+ `title` (required), `description` (lead paragraph), `order` (position in its group),
117
+ `sidebarLabel`.
118
+
119
+ MDX pages use theme components **without importing them**. `docs/` sits outside `site/` and
120
+ cannot resolve packages, so the docs route provides all components. A project adds its own
121
+ with `mdxComponents: './src/mdx-components.ts'` — a module exporting
122
+ `components = { Name: Component }` — for anything only the site can build, such as a
123
+ component rendering the project's own output. Its names win over the theme's. Write links between docs
124
+ pages relative (`../quickstart/`), because the base path differs per project.
125
+
126
+ ## Components
127
+
128
+ Import from `@casoon/pages-theme/components` in `.astro` files; available directly in MDX.
129
+
130
+ | Component | Use |
131
+ | --- | --- |
132
+ | `Hero` | Title, lead, default slot (install, badges), `output` slot (real output); `layout`, `command` and `tone` pick the variant |
133
+ | `AnchorGrid` | Card grid under the hero, each linking to a section further down or out to a doc |
134
+ | `Install` | Install command per ecosystem, CSS-only tabs, copy button; long commands wrap at spaces and after a `/` |
135
+ | `Badge`, `Badges` | Static badges (no external badge services) |
136
+ | `Facts` | Verifiable key figures; `layout="grid"` (tiles) or `"list"` (spec sheet) |
137
+ | `Features` | Core points; `layout="numbered"` (3–5 items) or `"grid"` (an icon-tile catalog) |
138
+ | `Spotlight` | Repeatable two-column feature section — eyebrow, title, lead, bullets, links, beside a media slot |
139
+ | `Integrations` | Grid of what the project plugs into: icon tile, name, category |
140
+ | `FileSet` | The files a run produced: `tabs`, `grid` or `rail` view |
141
+ | `BuildOutput` | One real build output on the start page |
142
+ | `Quickstart` | Steps, docs link, code slot |
143
+ | `Keymap` | Keyboard shortcuts or CLI flags, grouped cards of label + `<kbd>` keys |
144
+ | `ReleaseHighlights` | Teaser of one changelog release on the start page |
145
+ | `Faq` | Native `<details>` accordion, no JS |
146
+ | `CodeBlock` | Build-time highlighting (Shiki, theme-aware), copy button |
147
+ | `Terminal` | `ansi` prop (converted at build time) or pre-rendered HTML as slot |
148
+ | `Callout` | `note`, `tip`, `caution`, `deprecated` |
149
+ | `Tabs` | CSS-only tabs, one named slot per tab id |
150
+ | `ApiEntry` | API overview entry; item-level docs stay on docs.rs / TypeDoc |
151
+ | `Swatch` | Colour token preview |
152
+ | `ExamplePanel` | Input next to output; used by the showcase routes |
153
+ | `Demo` | Stage for the project running live in the page; see „Live demo" |
154
+
155
+ `@casoon/pages-theme/ansi` exports `ansiToHtml` and `escapeAnsi` for projects without their
156
+ own renderer. `ansiToHtml` renders the 16-colour palette as classes (so the theme's colours
157
+ apply) and 256-colour and 24-bit colour — foreground and background — as inline styles. `@casoon/pages-theme/layouts/Base.astro` wraps custom pages in the frame, and
158
+ `@casoon/pages-theme/url` exports `url()` — a project page that links or loads something
159
+ site-internal needs it, because the base path changes per project.
160
+
161
+ ## Hero variants
162
+
163
+ `Hero` carries four start-page openings. All of them use the same props; `layout`, `command`
164
+ and `tone` decide which one, and what goes into the slots decides the rest. The `output`
165
+ slot takes the project's real output — a `Terminal`, or `FileSet` when the project writes
166
+ files.
167
+
168
+ | Variant | Hero | `output` slot |
169
+ | --- | --- | --- |
170
+ | Artefacts | `layout="split"` (default) | `FileSet view="grid"` — one card per file |
171
+ | Pipeline | `layout="stack" command="<cmd>"` plus a `source` slot | `FileSet view="tabs"` — one pane per file |
172
+ | Colour field | `tone="invert"` on any layout | `Terminal`, or whatever the project shows |
173
+ | Editorial | `layout="editorial"` | `FileSet view="rail"` — names and one line each |
174
+
175
+ The split layout gives the text column a little more than half from 900 px up, with a title
176
+ size that fits about 40 characters on two lines at 1440 px; below 900 px text and output stack.
177
+
178
+ The stack layout reads as a pipeline from top to bottom: the `source` slot (usually a
179
+ `CodeBlock` with the configuration), the `command` pill, then the output — each over the full
180
+ width of the container. Side by side the three do not fit inside `--max`: the source is cut off
181
+ mid-line and the file names wrap to a second row. Without a `source` slot the band is just the
182
+ output.
183
+
184
+ `FileSet` takes `files` — `id`, `name` and optional `path`, `size`, `note` — and one named slot
185
+ per `id` holding that file's content, the same way `Tabs` does. The `rail` view needs no slots.
186
+ The tab strip stays on one row at every width: below 640 px the names lose their suffix
187
+ (`robots.txt` → `robots`, and only when the stems stay distinct), and a strip that still does not
188
+ fit scrolls sideways. Each pane scrolls on its own for long lines.
189
+
190
+ `tone="invert"` redefines the colour tokens inside the hero, so `Install`, `Badges` and
191
+ `FileSet` follow without knowing about it. The ground is `--invert-bg` with `--invert-accent`,
192
+ the same in both colour schemes.
193
+
194
+ ## Showcase descriptions
195
+
196
+ `description` is plain text with one piece of markup: `` `backtick spans` `` become inline
197
+ code on the detail page and the overview cards, styled like inline code in the docs. Everything
198
+ else is escaped, so a description cannot inject HTML. In the meta description the backticks are
199
+ dropped. Descriptions without backticks render as before.
200
+
201
+ ## Large showcases
202
+
203
+ A showcase with many examples gets two optional fields per `ShowcaseExample`:
204
+
205
+ - `group`: the heading the example is listed under. Examples of one group appear together, groups in
206
+ the order of their first example, with a jump list at the top of the overview.
207
+ - `preview`: HTML for a small preview, typically a lazily loaded image. An example with a preview
208
+ appears on the overview as a card (title, description, preview, link to the detail page);
209
+ input and output stay on the detail page. Without it the overview shows the full panel as before.
210
+
211
+ ## Live demo
212
+
213
+ The showcase shows what a package produced at build time. A demo shows the package itself,
214
+ running in the visitor's browser — for projects whose point only becomes visible in motion.
215
+
216
+ Set `demo: '<label>'` for the header entry and write `site/src/pages/demo.astro`; the theme
217
+ injects no route, so the page is the project's own. Wrap the running instance in the `Demo`
218
+ component and put everything it needs, including its `<script is:inline>`, in the default
219
+ slot.
220
+
221
+ The component marks its stage `data-demo`, and that mark carries two exceptions from the
222
+ rules below — nowhere else on the site:
223
+
224
+ - The demo's own scripts live inside the stage. Outside it, the two inline scripts stay the
225
+ limit.
226
+ - `check-site.cjs` excludes the stage from axe. A demo may deliberately exhibit what the
227
+ project reports on; a broken form inside the stage is the exhibit, not a defect of the
228
+ page.
229
+
230
+ Everything else still holds, the origin rule above all: a demo loads its code from the site
231
+ itself. One that needs a CDN cannot ship here.
232
+
233
+ ## Search engines
234
+
235
+ Each page gets canonical URL, meta description, Open Graph and `twitter:card`
236
+ (`summary_large_image`), and JSON-LD `SoftwareSourceCode` with `url`, `codeRepository`, `sameAs`
237
+ (`website` and the `packages` links) and CASOON as author and publisher. All of it needs `site`
238
+ in `astro.config.mjs`.
239
+
240
+ - **Title:** the start page is `<name> – <tagline> | CASOON`, other pages `<page> · <name>`.
241
+ Without `tagline` the start page is `<name> | CASOON`. Keep the tagline to a few words, so the
242
+ title stays under about 60 characters; `description` remains the meta description.
243
+ - **OG image:** `og.png` (1200×630) is rendered at build time from name, tagline, description
244
+ and address, in the theme's fonts and the dark theme, with the project's dark `accent` as edge.
245
+ - **Sitemap:** `sitemap.xml` lists every built page except 404, linked from the head. A project
246
+ that writes its own — `@casoon/astro-site-files` does — keeps it: the theme skips the file when
247
+ it already exists. That works only when the project's integration is listed before
248
+ `casoonPages()` in `astro.config.mjs`, because the hooks run in that order.
249
+ - **Links out:** the header shows `website` next to the project name; the footer links
250
+ `website`, the project's catalog entry on casoon.dev and the catalog itself, all with
251
+ descriptive text in the page's `lang`.
252
+
253
+ The root `https://casoon.github.io/` comes from the repository `casoon/casoon.github.io`: an
254
+ overview of the project sites, the only `robots.txt` crawlers read for the domain (one `Sitemap:`
255
+ line per project), and the Google Search Console verification. Its URL-prefix property
256
+ `https://casoon.github.io/` covers every project site, so a project needs no property and no
257
+ verification file of its own. For a new site:
258
+
259
+ 1. Deploy it and check that `https://casoon.github.io/<repo>/sitemap.xml` answers 200.
260
+ 2. In `casoon/casoon.github.io`, add `Sitemap: https://casoon.github.io/<repo>/sitemap.xml` to
261
+ `robots.txt` and the site to `index.html`, then push.
262
+ 3. In the property `https://casoon.github.io/`, *Sitemaps* → submit `<repo>/sitemap.xml`.
263
+
264
+ Never set a custom domain on `casoon/casoon.github.io`: GitHub would redirect every project site
265
+ to it as well.
266
+
267
+ ## Rules the theme enforces
268
+
269
+ - No external requests: fonts are bundled (Inter, Onest, JetBrains Mono, Latin subset; licence
270
+ in `fonts/OFL.txt`), no CDNs, embeds, analytics or cookies.
271
+ - JavaScript: two small inline scripts (theme before first paint; theme toggle and copy
272
+ buttons). Tabs work without JavaScript. The one exception is a `Demo` stage, see above.
273
+ - Footer on every page, in the site's language (`lang`): "A CASOON project · Jörn Seidel",
274
+ licence, imprint and privacy policy (casoon.de), the project catalog on casoon.dev.
275
+ - Light and dark theme, following `prefers-color-scheme` until the visitor chooses.
276
+
277
+ ## Maintaining
278
+
279
+ Development, releases, the rollout to all project sites and setting up a new one:
280
+ [MAINTAINING.md](MAINTAINING.md).
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Ebene_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 450 121.8">
3
+ <defs>
4
+ <style>
5
+ .st0 {
6
+ fill: none;
7
+ }
8
+
9
+ .st1 {
10
+ isolation: isolate;
11
+ }
12
+
13
+ .st2 {
14
+ fill: #fff;
15
+ }
16
+
17
+ .st3 {
18
+ fill: #e52248;
19
+ }
20
+ </style>
21
+ </defs>
22
+ <g>
23
+ <path class="st0" d="M242.4,68c2.3,2.1,5.1,3.1,8.3,3.1h18.5c3.3,0,6.1-1,8.4-3.1s3.4-4.5,3.4-7.4v-12h-42.1v12c0,2.9,1.2,5.4,3.5,7.4h0Z"/>
24
+ <path class="st0" d="M355.7,18.6c-2.3-2.1-5.1-3.1-8.4-3.1h-18.5c-3.3,0-6,1-8.3,3.1s-3.5,4.5-3.5,7.4v12.7h42.1v-12.7c0-2.9-1.1-5.3-3.4-7.4h0Z"/>
25
+ <path class="st0" d="M277.6,18.6c-2.3-2.1-5.1-3.1-8.4-3.1h-18.5c-3.3,0-6,1-8.3,3.1s-3.5,4.5-3.5,7.4v12.7h42.1v-12.7c0-2.9-1.1-5.3-3.4-7.4Z"/>
26
+ <path class="st0" d="M320.6,68c2.3,2.1,5.1,3.1,8.3,3.1h18.5c3.3,0,6.1-1,8.4-3.1s3.4-4.5,3.4-7.4v-12h-42.1v12c0,2.9,1.2,5.4,3.5,7.4h0Z"/>
27
+ <path class="st3" d="M16.3,6.8c-3.4,2-6.1,4.7-8.1,8s-3,7.1-3,11.2v34.9c0,4,1,7.6,3,10.9s4.7,5.9,8.1,7.9c3.4,2,7.2,2.9,11.3,2.9h41.3v-11.7H27.6c-3,0-5.5-1-7.7-3-2.1-2-3.2-4.4-3.2-7.2V26c0-2.9,1.1-5.4,3.2-7.5s4.7-3.1,7.7-3.1h41.3V3.9H27.6c-4.1,0-7.9,1-11.3,3h0Z"/>
28
+ <polygon class="st3" points="102.6 3.9 74.3 82.7 86.8 82.7 109.9 19.2 120.1 47.3 106.5 47.3 102.3 59 124.3 59 132.9 82.7 145.4 82.7 117.2 3.9 102.6 3.9"/>
29
+ <path class="st3" d="M206,38.4c-3-1.7-6.2-2.6-9.9-2.6h-25.1c-2.1,0-4-.7-5.5-2.1-1.6-1.4-2.3-3.1-2.3-5v-5.4c0-2.1.8-4,2.3-5.5s3.4-2.3,5.5-2.3h40.8V3.9h-40.8c-3.6,0-6.9.9-9.8,2.6-3,1.7-5.3,4-7.1,6.9s-2.6,6.1-2.6,9.6v5.8c0,3.4.9,6.6,2.6,9.4,1.8,2.8,4.1,5.1,7.1,6.8s6.3,2.5,9.8,2.5h25.1c2.2,0,4,.7,5.6,2.2,1.5,1.5,2.3,3.3,2.3,5.3v8.5c0,2.1-.8,3.8-2.3,5.3s-3.4,2.2-5.6,2.2h-44.6v11.7h44.6c3.6,0,6.9-.9,9.9-2.6s5.3-4,7.1-6.9,2.6-6.1,2.6-9.6v-8.6c0-3.5-.9-6.7-2.6-9.6-1.8-2.9-4.1-5.2-7.1-6.9h0Z"/>
30
+ <path class="st3" d="M281,60.6c0,2.9-1.1,5.4-3.4,7.4-2.3,2.1-5.1,3.1-8.4,3.1h-18.5c-3.3,0-6-1-8.3-3.1s-3.5-4.5-3.5-7.4v-12h-11.7v12c0,4.1,1.1,7.8,3.2,11.1,2.1,3.4,5,6,8.5,8s7.5,3,11.8,3h18.5c4.3,0,8.3-1,11.8-3,3.6-2,6.4-4.7,8.5-8s3.2-7.1,3.2-11.1v-12h-11.7v12Z"/>
31
+ <path class="st3" d="M238.9,26c0-2.9,1.2-5.3,3.5-7.4s5.1-3.1,8.3-3.1h18.5c3.3,0,6.1,1,8.4,3.1s3.4,4.5,3.4,7.4v12.7h11.7v-12.7c0-4.1-1.1-7.8-3.2-11.2-2.1-3.3-4.9-6-8.5-8s-7.5-3-11.8-3h-18.5c-4.3,0-8.3,1-11.8,3s-6.4,4.7-8.5,8-3.2,7.1-3.2,11.2v12.7h11.7v-12.7h0Z"/>
32
+ <path class="st3" d="M359.2,60.6c0,2.9-1.1,5.4-3.4,7.4-2.3,2.1-5.1,3.1-8.4,3.1h-18.5c-3.3,0-6-1-8.3-3.1s-3.5-4.5-3.5-7.4v-12h-11.7v12c0,4.1,1.1,7.8,3.2,11.1s5,6,8.5,8,7.5,3,11.8,3h18.5c4.3,0,8.3-1,11.8-3,3.6-2,6.4-4.7,8.5-8,2.1-3.4,3.2-7.1,3.2-11.1v-12h-11.7v12Z"/>
33
+ <path class="st3" d="M317.1,26c0-2.9,1.2-5.3,3.5-7.4s5.1-3.1,8.3-3.1h18.5c3.3,0,6.1,1,8.4,3.1s3.4,4.5,3.4,7.4v12.7h11.7v-12.7c0-4.1-1.1-7.8-3.2-11.2-2.1-3.3-4.9-6-8.5-8s-7.5-3-11.8-3h-18.5c-4.3,0-8.3,1-11.8,3s-6.4,4.7-8.5,8-3.2,7.1-3.2,11.2v12.7h11.7v-12.7Z"/>
34
+ <polygon class="st3" points="433.1 3.9 433.1 65.8 398.8 3.9 383.6 3.9 383.6 82.7 395.3 82.7 395.3 21.6 429.6 82.7 444.8 82.7 444.8 3.9 433.1 3.9"/>
35
+ </g>
36
+ <g class="st1">
37
+ <g class="st1">
38
+ <g class="st1">
39
+ <path class="st2" d="M71.7,114.3v-11.8h3.3c.8,0,1.4.1,2,.4.6.3,1,.7,1.3,1.3.3.5.5,1.2.5,1.9v4.5c0,.7-.2,1.4-.5,1.9-.3.5-.8,1-1.3,1.3-.6.3-1.2.5-2,.5h-3.3ZM73.5,112.7h1.5c.6,0,1.1-.2,1.5-.5.4-.4.6-.9.6-1.5v-4.5c0-.6-.2-1.1-.6-1.5-.4-.4-.9-.6-1.5-.6h-1.5v8.6Z"/>
40
+ <path class="st2" d="M81.6,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
41
+ <path class="st2" d="M94.6,114.5c-1.2,0-2.1-.3-2.8-.9-.7-.6-1-1.4-1-2.5h1.7c0,.6.2,1.1.6,1.4.4.3.9.5,1.5.5s1.1-.2,1.5-.5.5-.8.5-1.4-.1-.8-.4-1.1c-.2-.3-.6-.5-1-.7l-1.7-.5c-.8-.2-1.4-.6-1.9-1.2-.5-.6-.7-1.3-.7-2s.1-1.2.4-1.7c.3-.5.7-.9,1.2-1.1.5-.3,1.1-.4,1.8-.4s1.3.1,1.8.4c.5.3.9.6,1.2,1.1s.4,1,.4,1.7h-1.7c0-.5-.2-.9-.5-1.2-.3-.3-.8-.5-1.3-.5s-1,.2-1.3.5c-.3.3-.5.7-.5,1.2s.1.7.3,1c.2.3.5.5.9.6l1.7.5c.8.2,1.5.6,1.9,1.3.5.6.7,1.4.7,2.2s-.2,1.3-.5,1.8c-.3.5-.7.9-1.3,1.2-.6.3-1.2.4-2,.4Z"/>
42
+ <path class="st2" d="M101,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
43
+ <path class="st2" d="M113.9,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
44
+ <path class="st2" d="M120,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1,0,.4,0,.8,0,1.3,0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
45
+ <path class="st2" d="M142.8,114.5c-.4,0-.8-.1-1-.4-.3-.3-.4-.6-.4-1s.1-.8.4-1c.3-.3.6-.4,1-.4s.8.1,1,.4c.3.3.4.6.4,1s-.1.8-.4,1c-.3.3-.6.4-1,.4Z"/>
46
+ <path class="st2" d="M162.2,114.5c-1.2,0-2.1-.3-2.8-.9-.7-.6-1-1.4-1-2.5h1.7c0,.6.2,1.1.6,1.4.4.3.9.5,1.5.5s1.1-.2,1.5-.5.5-.8.5-1.4-.1-.8-.4-1.1c-.2-.3-.6-.5-1-.7l-1.7-.5c-.8-.2-1.4-.6-1.9-1.2-.5-.6-.7-1.3-.7-2s.1-1.2.4-1.7c.3-.5.7-.9,1.2-1.1.5-.3,1.1-.4,1.8-.4s1.3.1,1.8.4c.5.3.9.6,1.2,1.1s.4,1,.4,1.7h-1.7c0-.5-.2-.9-.5-1.2-.3-.3-.8-.5-1.3-.5s-1,.2-1.3.5c-.3.3-.5.7-.5,1.2s.1.7.3,1c.2.3.5.5.9.6l1.7.5c.8.2,1.5.6,1.9,1.3.5.6.7,1.4.7,2.2s-.2,1.3-.5,1.8c-.3.5-.7.9-1.3,1.2-.6.3-1.2.4-2,.4Z"/>
47
+ <path class="st2" d="M171,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
48
+ <path class="st2" d="M178,114.3v-11.8h3.7c.7,0,1.4.1,1.9.4.6.3,1,.7,1.3,1.2.3.5.5,1.1.5,1.8s-.2,1.5-.6,2c-.4.6-.9,1-1.6,1.2l2.4,5h-1.9l-2.2-4.8h-1.7v4.8h-1.7ZM179.7,107.9h1.9c.6,0,1-.2,1.4-.5.3-.3.5-.8.5-1.4s-.2-1.1-.5-1.4c-.3-.3-.8-.5-1.4-.5h-1.9v3.8Z"/>
49
+ <path class="st2" d="M187,114.3l3-11.8h2.3l3,11.8h-1.8l-.7-3h-3.3l-.7,3h-1.8ZM189.8,109.9h2.7l-.8-3.4c-.1-.6-.3-1.1-.3-1.6s-.2-.7-.2-.9c0,.2,0,.5-.2.9s-.2,1-.4,1.5l-.8,3.4Z"/>
50
+ <path class="st2" d="M199.9,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
51
+ <path class="st2" d="M207.2,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
52
+ <path class="st2" d="M220.2,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
53
+ <path class="st2" d="M226.5,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
54
+ <path class="st2" d="M236.1,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
55
+ <path class="st2" d="M258.8,114.5c-.4,0-.8-.1-1-.4-.3-.3-.4-.6-.4-1s.1-.8.4-1,.6-.4,1-.4.8.1,1,.4c.3.3.4.6.4,1s-.1.8-.4,1c-.3.3-.6.4-1,.4Z"/>
56
+ <path class="st2" d="M274.8,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
57
+ <path class="st2" d="M284.2,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1s0,.8,0,1.3c0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
58
+ <path class="st2" d="M296.5,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
59
+ <path class="st2" d="M303.8,114.3l-1.3-11.8h1.5l.8,8.4c0,.3,0,.7,0,1.1s0,.7,0,1c0-.3,0-.6,0-1,0-.4,0-.8.1-1.1l1.1-8.4h1.6l1,8.4c0,.3,0,.7.1,1.1,0,.4,0,.7.1,1,0-.3,0-.6,0-1,0-.4,0-.8,0-1.1l.8-8.4h1.5l-1.4,11.8h-2l-1-8.5c0-.3,0-.7,0-1.1,0-.4,0-.7,0-1,0,.2,0,.6,0,1,0,.4,0,.8-.1,1.1l-1,8.5h-2Z"/>
60
+ <path class="st2" d="M313.5,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
61
+ <path class="st2" d="M326.5,114.5c-1.1,0-2-.3-2.6-.9s-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9c.6.6,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4h1.7c0,1.1-.3,1.9-1,2.5-.7.6-1.5.9-2.6.9Z"/>
62
+ <path class="st2" d="M332.6,114.3v-11.8h1.7v4.9h1.6l2.4-4.9h1.9l-2.8,5.6,2.9,6.1h-2l-2.5-5.3h-1.5v5.3h-1.7Z"/>
63
+ <path class="st2" d="M342.9,114.3v-11.8h1.7v10.2h5.1v1.6h-6.9Z"/>
64
+ <path class="st2" d="M355.4,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-.9-1.5-.9-2.5v-8.5h1.7v8.5c0,.6.1,1.1.5,1.4s.7.5,1.3.5,1-.2,1.3-.5.5-.8.5-1.4v-8.5h1.7v8.5c0,1.1-.3,1.9-.9,2.5-.6.6-1.5.9-2.6.9Z"/>
65
+ <path class="st2" d="M361.5,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1,0,.4,0,.8,0,1.3,0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
66
+ <path class="st2" d="M374.8,114.5c-1.1,0-2-.3-2.6-.9-.7-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
67
+ </g>
68
+ </g>
69
+ </g>
70
+ </svg>
@@ -0,0 +1,71 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Ebene_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 450 121.8">
3
+ <!-- Generator: Adobe Illustrator 29.6.1, SVG Export Plug-In . SVG Version: 2.1.1 Build 9) -->
4
+ <defs>
5
+ <style>
6
+ .st0 {
7
+ fill: none;
8
+ }
9
+
10
+ .st1 {
11
+ isolation: isolate;
12
+ }
13
+
14
+ .st2 {
15
+ fill: #575756;
16
+ }
17
+
18
+ .st3 {
19
+ fill: #e52248;
20
+ }
21
+ </style>
22
+ </defs>
23
+ <g>
24
+ <path class="st0" d="M242.4,68c2.3,2.1,5.1,3.1,8.3,3.1h18.5c3.3,0,6.1-1,8.4-3.1s3.4-4.5,3.4-7.4v-12h-42.1v12c0,2.9,1.2,5.4,3.5,7.4h0Z"/>
25
+ <path class="st0" d="M355.7,18.6c-2.3-2.1-5.1-3.1-8.4-3.1h-18.5c-3.3,0-6,1-8.3,3.1s-3.5,4.5-3.5,7.4v12.7h42.1v-12.7c0-2.9-1.1-5.3-3.4-7.4h0Z"/>
26
+ <path class="st0" d="M277.6,18.6c-2.3-2.1-5.1-3.1-8.4-3.1h-18.5c-3.3,0-6,1-8.3,3.1s-3.5,4.5-3.5,7.4v12.7h42.1v-12.7c0-2.9-1.1-5.3-3.4-7.4Z"/>
27
+ <path class="st0" d="M320.6,68c2.3,2.1,5.1,3.1,8.3,3.1h18.5c3.3,0,6.1-1,8.4-3.1s3.4-4.5,3.4-7.4v-12h-42.1v12c0,2.9,1.2,5.4,3.5,7.4h0Z"/>
28
+ <path class="st3" d="M16.3,6.8c-3.4,2-6.1,4.7-8.1,8s-3,7.1-3,11.2v34.9c0,4,1,7.6,3,10.9s4.7,5.9,8.1,7.9c3.4,2,7.2,2.9,11.3,2.9h41.3v-11.7H27.6c-3,0-5.5-1-7.7-3-2.1-2-3.2-4.4-3.2-7.2V26c0-2.9,1.1-5.4,3.2-7.5s4.7-3.1,7.7-3.1h41.3V3.9H27.6c-4.1,0-7.9,1-11.3,3h0Z"/>
29
+ <polygon class="st3" points="102.6 3.9 74.3 82.7 86.8 82.7 109.9 19.2 120.1 47.3 106.5 47.3 102.3 59 124.3 59 132.9 82.7 145.4 82.7 117.2 3.9 102.6 3.9"/>
30
+ <path class="st3" d="M206,38.4c-3-1.7-6.2-2.6-9.9-2.6h-25.1c-2.1,0-4-.7-5.5-2.1-1.6-1.4-2.3-3.1-2.3-5v-5.4c0-2.1.8-4,2.3-5.5s3.4-2.3,5.5-2.3h40.8V3.9h-40.8c-3.6,0-6.9.9-9.8,2.6-3,1.7-5.3,4-7.1,6.9s-2.6,6.1-2.6,9.6v5.8c0,3.4.9,6.6,2.6,9.4,1.8,2.8,4.1,5.1,7.1,6.8s6.3,2.5,9.8,2.5h25.1c2.2,0,4,.7,5.6,2.2,1.5,1.5,2.3,3.3,2.3,5.3v8.5c0,2.1-.8,3.8-2.3,5.3s-3.4,2.2-5.6,2.2h-44.6v11.7h44.6c3.6,0,6.9-.9,9.9-2.6s5.3-4,7.1-6.9,2.6-6.1,2.6-9.6v-8.6c0-3.5-.9-6.7-2.6-9.6-1.8-2.9-4.1-5.2-7.1-6.9h0Z"/>
31
+ <path class="st3" d="M281,60.6c0,2.9-1.1,5.4-3.4,7.4-2.3,2.1-5.1,3.1-8.4,3.1h-18.5c-3.3,0-6-1-8.3-3.1s-3.5-4.5-3.5-7.4v-12h-11.7v12c0,4.1,1.1,7.8,3.2,11.1,2.1,3.4,5,6,8.5,8s7.5,3,11.8,3h18.5c4.3,0,8.3-1,11.8-3,3.6-2,6.4-4.7,8.5-8s3.2-7.1,3.2-11.1v-12h-11.7v12Z"/>
32
+ <path class="st3" d="M238.9,26c0-2.9,1.2-5.3,3.5-7.4s5.1-3.1,8.3-3.1h18.5c3.3,0,6.1,1,8.4,3.1s3.4,4.5,3.4,7.4v12.7h11.7v-12.7c0-4.1-1.1-7.8-3.2-11.2-2.1-3.3-4.9-6-8.5-8s-7.5-3-11.8-3h-18.5c-4.3,0-8.3,1-11.8,3s-6.4,4.7-8.5,8-3.2,7.1-3.2,11.2v12.7h11.7v-12.7h0Z"/>
33
+ <path class="st3" d="M359.2,60.6c0,2.9-1.1,5.4-3.4,7.4-2.3,2.1-5.1,3.1-8.4,3.1h-18.5c-3.3,0-6-1-8.3-3.1s-3.5-4.5-3.5-7.4v-12h-11.7v12c0,4.1,1.1,7.8,3.2,11.1s5,6,8.5,8,7.5,3,11.8,3h18.5c4.3,0,8.3-1,11.8-3,3.6-2,6.4-4.7,8.5-8,2.1-3.4,3.2-7.1,3.2-11.1v-12h-11.7v12Z"/>
34
+ <path class="st3" d="M317.1,26c0-2.9,1.2-5.3,3.5-7.4s5.1-3.1,8.3-3.1h18.5c3.3,0,6.1,1,8.4,3.1s3.4,4.5,3.4,7.4v12.7h11.7v-12.7c0-4.1-1.1-7.8-3.2-11.2-2.1-3.3-4.9-6-8.5-8s-7.5-3-11.8-3h-18.5c-4.3,0-8.3,1-11.8,3s-6.4,4.7-8.5,8-3.2,7.1-3.2,11.2v12.7h11.7v-12.7Z"/>
35
+ <polygon class="st3" points="433.1 3.9 433.1 65.8 398.8 3.9 383.6 3.9 383.6 82.7 395.3 82.7 395.3 21.6 429.6 82.7 444.8 82.7 444.8 3.9 433.1 3.9"/>
36
+ </g>
37
+ <g class="st1">
38
+ <g class="st1">
39
+ <g class="st1">
40
+ <path class="st2" d="M71.7,114.3v-11.8h3.3c.8,0,1.4.1,2,.4.6.3,1,.7,1.3,1.3.3.5.5,1.2.5,1.9v4.5c0,.7-.2,1.4-.5,1.9-.3.5-.8,1-1.3,1.3-.6.3-1.2.5-2,.5h-3.3ZM73.5,112.7h1.5c.6,0,1.1-.2,1.5-.5.4-.4.6-.9.6-1.5v-4.5c0-.6-.2-1.1-.6-1.5-.4-.4-.9-.6-1.5-.6h-1.5v8.6Z"/>
41
+ <path class="st2" d="M81.6,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
42
+ <path class="st2" d="M94.6,114.5c-1.2,0-2.1-.3-2.8-.9-.7-.6-1-1.4-1-2.5h1.7c0,.6.2,1.1.6,1.4.4.3.9.5,1.5.5s1.1-.2,1.5-.5.5-.8.5-1.4-.1-.8-.4-1.1c-.2-.3-.6-.5-1-.7l-1.7-.5c-.8-.2-1.4-.6-1.9-1.2-.5-.6-.7-1.3-.7-2s.1-1.2.4-1.7c.3-.5.7-.9,1.2-1.1.5-.3,1.1-.4,1.8-.4s1.3.1,1.8.4c.5.3.9.6,1.2,1.1s.4,1,.4,1.7h-1.7c0-.5-.2-.9-.5-1.2-.3-.3-.8-.5-1.3-.5s-1,.2-1.3.5c-.3.3-.5.7-.5,1.2s.1.7.3,1c.2.3.5.5.9.6l1.7.5c.8.2,1.5.6,1.9,1.3.5.6.7,1.4.7,2.2s-.2,1.3-.5,1.8c-.3.5-.7.9-1.3,1.2-.6.3-1.2.4-2,.4Z"/>
43
+ <path class="st2" d="M101,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
44
+ <path class="st2" d="M113.9,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
45
+ <path class="st2" d="M120,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1,0,.4,0,.8,0,1.3,0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
46
+ <path class="st2" d="M142.8,114.5c-.4,0-.8-.1-1-.4-.3-.3-.4-.6-.4-1s.1-.8.4-1c.3-.3.6-.4,1-.4s.8.1,1,.4c.3.3.4.6.4,1s-.1.8-.4,1c-.3.3-.6.4-1,.4Z"/>
47
+ <path class="st2" d="M162.2,114.5c-1.2,0-2.1-.3-2.8-.9-.7-.6-1-1.4-1-2.5h1.7c0,.6.2,1.1.6,1.4.4.3.9.5,1.5.5s1.1-.2,1.5-.5.5-.8.5-1.4-.1-.8-.4-1.1c-.2-.3-.6-.5-1-.7l-1.7-.5c-.8-.2-1.4-.6-1.9-1.2-.5-.6-.7-1.3-.7-2s.1-1.2.4-1.7c.3-.5.7-.9,1.2-1.1.5-.3,1.1-.4,1.8-.4s1.3.1,1.8.4c.5.3.9.6,1.2,1.1s.4,1,.4,1.7h-1.7c0-.5-.2-.9-.5-1.2-.3-.3-.8-.5-1.3-.5s-1,.2-1.3.5c-.3.3-.5.7-.5,1.2s.1.7.3,1c.2.3.5.5.9.6l1.7.5c.8.2,1.5.6,1.9,1.3.5.6.7,1.4.7,2.2s-.2,1.3-.5,1.8c-.3.5-.7.9-1.3,1.2-.6.3-1.2.4-2,.4Z"/>
48
+ <path class="st2" d="M171,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
49
+ <path class="st2" d="M178,114.3v-11.8h3.7c.7,0,1.4.1,1.9.4.6.3,1,.7,1.3,1.2.3.5.5,1.1.5,1.8s-.2,1.5-.6,2c-.4.6-.9,1-1.6,1.2l2.4,5h-1.9l-2.2-4.8h-1.7v4.8h-1.7ZM179.7,107.9h1.9c.6,0,1-.2,1.4-.5.3-.3.5-.8.5-1.4s-.2-1.1-.5-1.4c-.3-.3-.8-.5-1.4-.5h-1.9v3.8Z"/>
50
+ <path class="st2" d="M187,114.3l3-11.8h2.3l3,11.8h-1.8l-.7-3h-3.3l-.7,3h-1.8ZM189.8,109.9h2.7l-.8-3.4c-.1-.6-.3-1.1-.3-1.6s-.2-.7-.2-.9c0,.2,0,.5-.2.9s-.2,1-.4,1.5l-.8,3.4Z"/>
51
+ <path class="st2" d="M199.9,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
52
+ <path class="st2" d="M207.2,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
53
+ <path class="st2" d="M220.2,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
54
+ <path class="st2" d="M226.5,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
55
+ <path class="st2" d="M236.1,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
56
+ <path class="st2" d="M258.8,114.5c-.4,0-.8-.1-1-.4-.3-.3-.4-.6-.4-1s.1-.8.4-1,.6-.4,1-.4.8.1,1,.4c.3.3.4.6.4,1s-.1.8-.4,1c-.3.3-.6.4-1,.4Z"/>
57
+ <path class="st2" d="M274.8,114.3v-11.8h6.9v1.5h-5.2v3.3h4.6v1.5h-4.6v3.8h5.2v1.5h-6.9Z"/>
58
+ <path class="st2" d="M284.2,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1s0,.8,0,1.3c0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
59
+ <path class="st2" d="M296.5,114.3v-10.2h-3.1v-1.6h8v1.6h-3.2v10.2h-1.7Z"/>
60
+ <path class="st2" d="M303.8,114.3l-1.3-11.8h1.5l.8,8.4c0,.3,0,.7,0,1.1s0,.7,0,1c0-.3,0-.6,0-1s0-.8.1-1.1l1.1-8.4h1.6l1,8.4c0,.3,0,.7.1,1.1,0,.4,0,.7.1,1,0-.3,0-.6,0-1,0-.4,0-.8,0-1.1l.8-8.4h1.5l-1.4,11.8h-2l-1-8.5c0-.3,0-.7,0-1.1,0-.4,0-.7,0-1,0,.2,0,.6,0,1,0,.4,0,.8-.1,1.1l-1,8.5h-2Z"/>
61
+ <path class="st2" d="M313.5,114.3v-1.6h2.4v-8.6h-2.4v-1.6h6.5v1.6h-2.4v8.6h2.4v1.6h-6.5Z"/>
62
+ <path class="st2" d="M326.5,114.5c-1.1,0-2-.3-2.6-.9s-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9c.6.6,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5c.3-.3.5-.8.5-1.4h1.7c0,1.1-.3,1.9-1,2.5-.7.6-1.5.9-2.6.9Z"/>
63
+ <path class="st2" d="M332.6,114.3v-11.8h1.7v4.9h1.6l2.4-4.9h1.9l-2.8,5.6,2.9,6.1h-2l-2.5-5.3h-1.5v5.3h-1.7Z"/>
64
+ <path class="st2" d="M342.9,114.3v-11.8h1.7v10.2h5.1v1.6h-6.9Z"/>
65
+ <path class="st2" d="M355.4,114.5c-1.1,0-2-.3-2.6-.9-.6-.6-.9-1.5-.9-2.5v-8.5h1.7v8.5c0,.6.1,1.1.5,1.4s.7.5,1.3.5,1-.2,1.3-.5.5-.8.5-1.4v-8.5h1.7v8.5c0,1.1-.3,1.9-.9,2.5-.6.6-1.5.9-2.6.9Z"/>
66
+ <path class="st2" d="M361.5,114.3v-11.8h2.2l3.4,9.8c0-.3,0-.7,0-1.1,0-.4,0-.9,0-1.3,0-.5,0-.9,0-1.3v-6.1h1.6v11.8h-2.2l-3.4-9.8c0,.3,0,.6,0,1.1,0,.4,0,.8,0,1.3,0,.5,0,.9,0,1.3v6.2h-1.6Z"/>
67
+ <path class="st2" d="M374.8,114.5c-1.1,0-2-.3-2.6-.9-.7-.6-1-1.5-1-2.5v-5.2c0-1.1.3-1.9,1-2.5.6-.6,1.5-.9,2.6-.9s2,.3,2.6.9,1,1.5,1,2.5h-1.7c0-.6-.2-1.1-.5-1.4-.3-.3-.8-.5-1.4-.5s-1,.2-1.4.5c-.3.3-.5.8-.5,1.4v5.2c0,.6.2,1.1.5,1.4.3.3.8.5,1.4.5s1-.2,1.4-.5.5-.8.5-1.4v-1.4h-2.2v-1.5h3.9v3c0,1.1-.3,1.9-1,2.5s-1.5.9-2.6.9Z"/>
68
+ </g>
69
+ </g>
70
+ </g>
71
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><rect x="11.55" y="11.48" width="476.9" height="477.03" rx="10" fill="none" stroke="#e52248" stroke-width="8"/><path fill="#e52248" d="M169.49,108.38c-13.22,7.76-23.78,18.14-31.69,31.15-7.9,13.01-11.85,27.49-11.85,43.44v135.58c0,15.52,3.95,29.71,11.85,42.57,7.9,12.86,18.47,23.1,31.69,30.72,13.22,7.62,27.88,11.42,43.97,11.42h160.59v-45.48h-160.59c-11.64,0-21.55-3.91-29.75-11.74-8.19-7.83-12.28-17.21-12.28-28.13v-134.93c0-11.35,4.09-21.01,12.28-28.99,8.19-7.98,18.11-11.96,29.75-11.96h160.59v-45.26h-160.59c-16.09,0-30.75,3.88-43.97,11.64Z"/></svg>
@@ -0,0 +1,135 @@
1
+ ---
2
+ /**
3
+ * Cards right under the hero, each jumping to a section further down the page (or out, to a
4
+ * doc). For projects with more than one entry point or audience — "what's in it for you,
5
+ * specifically" before the long-form pitch. The solid label pill reuses the Hero `step` pill;
6
+ * the tinted card background reuses the brand/accent-soft tokens Callout already carries.
7
+ */
8
+ import config from 'virtual:casoon-pages/config';
9
+ import { t } from '../lib/i18n';
10
+
11
+ interface Props {
12
+ items: {
13
+ label: string;
14
+ title: string;
15
+ body: string;
16
+ href: string;
17
+ tone?: 'accent' | 'brand';
18
+ }[];
19
+ /** Section label above the grid. Omitted: the grid carries no heading of its own. */
20
+ heading?: string;
21
+ }
22
+
23
+ // Paper, ink, accent in turn. `tone` is kept for
24
+ // compatibility but no longer picks the colour.
25
+ const TONES = ['paper', 'ink', 'accent'];
26
+ const { items, heading } = Astro.props;
27
+ ---
28
+
29
+ <nav class="anchor-grid" aria-label={heading ?? t(config.lang).overview}>
30
+ {heading && <p class="cp-label">{heading}</p>}
31
+ <ul>
32
+ {
33
+ items.map((item, i) => (
34
+ <li>
35
+ <a class={TONES[i % TONES.length]} href={item.href}>
36
+ <span class="label">{item.label}</span>
37
+ <h2>{item.title}</h2>
38
+ <p>{item.body}</p>
39
+ <span class="go" aria-hidden="true">
40
+ →
41
+ </span>
42
+ </a>
43
+ </li>
44
+ ))
45
+ }
46
+ </ul>
47
+ </nav>
48
+
49
+ <style>
50
+ .anchor-grid {
51
+ max-width: var(--max);
52
+ margin: 0 auto;
53
+ padding: 80px 24px;
54
+ }
55
+ ul {
56
+ display: grid;
57
+ grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
58
+ gap: 20px;
59
+ margin: 0;
60
+ padding: 0;
61
+ list-style: none;
62
+ }
63
+ /* 4px edge in a lighter shade of the card. */
64
+ a {
65
+ position: relative;
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 16px;
69
+ height: 100%;
70
+ min-height: 260px;
71
+ padding: 20px 20px 64px;
72
+ border: 4px solid #fff;
73
+ border-radius: var(--r-step);
74
+ color: var(--heading);
75
+ transition: transform 0.2s ease;
76
+ }
77
+ a:hover {
78
+ transform: translateY(-3px);
79
+ }
80
+ a.paper {
81
+ background: var(--bg);
82
+ }
83
+ a.ink {
84
+ border-color: #5b5854;
85
+ background: #11100e;
86
+ color: #fff;
87
+ }
88
+ a.accent {
89
+ border-color: var(--accent-edge);
90
+ background: var(--accent-fill);
91
+ color: #fff;
92
+ }
93
+ :global([data-theme='dark']) a.paper {
94
+ border-color: var(--border-strong);
95
+ }
96
+ .label {
97
+ align-self: flex-start;
98
+ padding: 4px 10px;
99
+ border-radius: 7px;
100
+ background: #fff;
101
+ box-shadow:
102
+ 0 1px 1px rgb(0 0 0 / 0.3),
103
+ inset 0 0.5px 0 rgb(255 255 255 / 0.5);
104
+ color: #11100e;
105
+ font-size: 14px;
106
+ line-height: 1.6;
107
+ }
108
+ h2 {
109
+ margin: 0;
110
+ color: inherit;
111
+ font-size: 20px;
112
+ font-weight: 600;
113
+ letter-spacing: -0.01em;
114
+ line-height: 1.3;
115
+ }
116
+ p {
117
+ margin: 0;
118
+ color: inherit;
119
+ font-size: 16px;
120
+ line-height: 1.5;
121
+ }
122
+ .go {
123
+ position: absolute;
124
+ left: 20px;
125
+ bottom: 16px;
126
+ font-size: 40px;
127
+ font-weight: 200;
128
+ line-height: 1;
129
+ transition: transform 0.2s ease;
130
+ }
131
+ a:hover .go,
132
+ a:focus-visible .go {
133
+ transform: translateX(4px);
134
+ }
135
+ </style>