@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.
- package/LICENSE +21 -0
- package/README.md +279 -2
- package/assets/casoon-logo-dark.svg +70 -0
- package/assets/casoon-logo.svg +71 -0
- package/assets/favicon.svg +1 -0
- package/components/AnchorGrid.astro +135 -0
- package/components/ApiEntry.astro +136 -0
- package/components/Badge.astro +31 -0
- package/components/Badges.astro +10 -0
- package/components/BuildOutput.astro +84 -0
- package/components/Button.astro +55 -0
- package/components/CallToAction.astro +64 -0
- package/components/Callout.astro +66 -0
- package/components/CodeBlock.astro +84 -0
- package/components/Demo.astro +80 -0
- package/components/ExamplePanel.astro +153 -0
- package/components/Facts.astro +112 -0
- package/components/Faq.astro +123 -0
- package/components/Features.astro +139 -0
- package/components/FileSet.astro +258 -0
- package/components/Footer.astro +160 -0
- package/components/Header.astro +278 -0
- package/components/Hero.astro +318 -0
- package/components/Install.astro +154 -0
- package/components/Integrations.astro +125 -0
- package/components/Keymap.astro +102 -0
- package/components/Quickstart.astro +95 -0
- package/components/ReleaseHighlights.astro +115 -0
- package/components/Spotlight.astro +177 -0
- package/components/Swatch.astro +45 -0
- package/components/Tabs.astro +90 -0
- package/components/Terminal.astro +79 -0
- package/components/index.ts +25 -0
- package/content.ts +23 -0
- package/fonts/OFL.txt +95 -0
- package/fonts/inter-latin-400-normal.woff2 +0 -0
- package/fonts/inter-latin-500-normal.woff2 +0 -0
- package/fonts/inter-latin-600-normal.woff2 +0 -0
- package/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
- package/fonts/onest-latin-wght-normal.woff2 +0 -0
- package/index.ts +204 -0
- package/layouts/Base.astro +131 -0
- package/layouts/Docs.astro +286 -0
- package/lib/ansi.ts +168 -0
- package/lib/changelog.ts +85 -0
- package/lib/docs.ts +54 -0
- package/lib/i18n.ts +136 -0
- package/lib/og.ts +91 -0
- package/lib/showcase.ts +48 -0
- package/lib/url.ts +16 -0
- package/lib/version.ts +50 -0
- package/package.json +71 -4
- package/routes/404.astro +49 -0
- package/routes/changelog.astro +129 -0
- package/routes/docs/[...slug].astro +39 -0
- package/routes/showcase/[slug].astro +108 -0
- package/routes/showcase/index.astro +195 -0
- package/styles/base.css +307 -0
- package/styles/fonts.css +52 -0
- package/styles/tokens.css +136 -0
- 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
|
-
#
|
|
1
|
+
# @casoon/pages-theme
|
|
2
2
|
|
|
3
|
-
|
|
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>
|