@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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
/** One showcase example: input next to the output the package produced at build time. */
|
|
3
|
+
import { Code } from 'astro:components';
|
|
4
|
+
import config from 'virtual:casoon-pages/config';
|
|
5
|
+
import { t } from '../lib/i18n';
|
|
6
|
+
import type { ShowcaseExample } from '../lib/showcase';
|
|
7
|
+
import { url } from '../lib/url';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
example: ShowcaseExample;
|
|
11
|
+
/** Heading level of the title; the detail page uses its own h1. */
|
|
12
|
+
headingLevel?: 2 | 3;
|
|
13
|
+
detailLink?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const { example, headingLevel = 2, detailLink = true } = Astro.props;
|
|
17
|
+
const s = t(config.lang);
|
|
18
|
+
const Heading = `h${headingLevel}` as 'h2' | 'h3';
|
|
19
|
+
const outputKind = example.output.kind ?? 'terminal';
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
<section class="example">
|
|
23
|
+
<header>
|
|
24
|
+
<Heading>{example.title}</Heading>
|
|
25
|
+
<span class="file">{example.file}</span>
|
|
26
|
+
{
|
|
27
|
+
detailLink && (
|
|
28
|
+
<a href={url(`showcase/${example.slug}/`)}>
|
|
29
|
+
{s.detail}<span class="visually-hidden">: {example.title}</span> →
|
|
30
|
+
</a>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
</header>
|
|
34
|
+
<div class="grid">
|
|
35
|
+
<div class="input" aria-label={s.input}>
|
|
36
|
+
<Code code={example.input.code} lang={(example.input.lang ?? 'text') as never} theme="css-variables" />
|
|
37
|
+
</div>
|
|
38
|
+
<div class:list={['output', outputKind]} aria-label={s.output}>
|
|
39
|
+
{outputKind === 'terminal' ? <pre tabindex="0" set:html={example.output.html} /> : <Fragment set:html={example.output.html} />}
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
{
|
|
43
|
+
example.tags && example.tags.length > 0 && (
|
|
44
|
+
<ul class="tags">
|
|
45
|
+
{example.tags.map((tag) => (
|
|
46
|
+
<li>{tag}</li>
|
|
47
|
+
))}
|
|
48
|
+
</ul>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
</section>
|
|
52
|
+
|
|
53
|
+
<style>
|
|
54
|
+
.example {
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
border: 1px solid var(--border);
|
|
57
|
+
border-radius: 16px;
|
|
58
|
+
background: var(--surface);
|
|
59
|
+
box-shadow: var(--shadow);
|
|
60
|
+
}
|
|
61
|
+
header {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-wrap: wrap;
|
|
64
|
+
align-items: baseline;
|
|
65
|
+
gap: 4px 12px;
|
|
66
|
+
padding: 14px 20px;
|
|
67
|
+
border-bottom: 1px solid var(--border);
|
|
68
|
+
}
|
|
69
|
+
h2,
|
|
70
|
+
h3 {
|
|
71
|
+
margin: 0;
|
|
72
|
+
color: var(--heading);
|
|
73
|
+
font-size: 16px;
|
|
74
|
+
font-weight: 600;
|
|
75
|
+
}
|
|
76
|
+
.file {
|
|
77
|
+
color: var(--muted);
|
|
78
|
+
font-family: var(--font-mono);
|
|
79
|
+
font-size: 12px;
|
|
80
|
+
}
|
|
81
|
+
header a {
|
|
82
|
+
margin-left: auto;
|
|
83
|
+
font-size: 13.5px;
|
|
84
|
+
}
|
|
85
|
+
.grid {
|
|
86
|
+
display: grid;
|
|
87
|
+
grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
|
|
88
|
+
container-type: inline-size;
|
|
89
|
+
}
|
|
90
|
+
/* Side by side, the output sets the height of the row and a longer input scrolls inside it,
|
|
91
|
+
so a large data set does not stretch the page. Stacked, the input gets a fixed cap. */
|
|
92
|
+
.input {
|
|
93
|
+
min-width: 0;
|
|
94
|
+
height: 0;
|
|
95
|
+
min-height: 100%;
|
|
96
|
+
border-right: 1px solid var(--border);
|
|
97
|
+
background: var(--code-bg);
|
|
98
|
+
}
|
|
99
|
+
.input :global(pre.astro-code) {
|
|
100
|
+
box-sizing: border-box;
|
|
101
|
+
height: 100%;
|
|
102
|
+
max-height: none;
|
|
103
|
+
margin: 0;
|
|
104
|
+
overflow: auto;
|
|
105
|
+
font-size: 12.5px;
|
|
106
|
+
}
|
|
107
|
+
@container (max-width: 579px) {
|
|
108
|
+
.input {
|
|
109
|
+
height: auto;
|
|
110
|
+
min-height: 0;
|
|
111
|
+
border-right: none;
|
|
112
|
+
border-bottom: 1px solid var(--border);
|
|
113
|
+
}
|
|
114
|
+
.input :global(pre.astro-code) {
|
|
115
|
+
max-height: 24rem;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
.output {
|
|
119
|
+
min-width: 0;
|
|
120
|
+
overflow: auto;
|
|
121
|
+
}
|
|
122
|
+
.output.terminal {
|
|
123
|
+
background: var(--term-bg);
|
|
124
|
+
color: var(--term-text);
|
|
125
|
+
}
|
|
126
|
+
.output.panel {
|
|
127
|
+
padding: 18px;
|
|
128
|
+
}
|
|
129
|
+
.output pre {
|
|
130
|
+
margin: 0;
|
|
131
|
+
padding: 18px;
|
|
132
|
+
overflow: auto;
|
|
133
|
+
font-size: 12.5px;
|
|
134
|
+
line-height: 1.8;
|
|
135
|
+
}
|
|
136
|
+
.tags {
|
|
137
|
+
display: flex;
|
|
138
|
+
flex-wrap: wrap;
|
|
139
|
+
gap: 8px;
|
|
140
|
+
margin: 0;
|
|
141
|
+
padding: 12px 20px;
|
|
142
|
+
border-top: 1px solid var(--border);
|
|
143
|
+
list-style: none;
|
|
144
|
+
}
|
|
145
|
+
.tags li {
|
|
146
|
+
padding: 2px 8px;
|
|
147
|
+
border: 1px solid var(--border);
|
|
148
|
+
border-radius: 6px;
|
|
149
|
+
color: var(--muted);
|
|
150
|
+
font-family: var(--font-mono);
|
|
151
|
+
font-size: 12px;
|
|
152
|
+
}
|
|
153
|
+
</style>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Verifiable key figures. Real numbers only.
|
|
4
|
+
* `layout="grid"` (default): a tile per fact, the value large. `layout="list"`: one card, a
|
|
5
|
+
* label/value row per fact — for a spec sheet (license, runtime, platforms) rather than a
|
|
6
|
+
* dashboard of numbers.
|
|
7
|
+
*/
|
|
8
|
+
import config from 'virtual:casoon-pages/config';
|
|
9
|
+
import { t } from '../lib/i18n';
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
items: { value: string; label: string }[];
|
|
13
|
+
layout?: 'grid' | 'list';
|
|
14
|
+
/**
|
|
15
|
+
* Region label. Default "Key facts" — override on a page that uses `Facts` more than once,
|
|
16
|
+
* so the two regions don't share one accessible name (axe: landmark-unique).
|
|
17
|
+
*/
|
|
18
|
+
label?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const { items, layout = 'grid', label } = Astro.props;
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<section class:list={['facts', `is-${layout}`]} aria-label={label ?? t(config.lang).keyFacts}>
|
|
25
|
+
<dl>
|
|
26
|
+
{
|
|
27
|
+
items.map((f) => (
|
|
28
|
+
<div>
|
|
29
|
+
<dt>{f.label}</dt>
|
|
30
|
+
<dd>{f.value}</dd>
|
|
31
|
+
</div>
|
|
32
|
+
))
|
|
33
|
+
}
|
|
34
|
+
</dl>
|
|
35
|
+
</section>
|
|
36
|
+
|
|
37
|
+
<style>
|
|
38
|
+
.facts {
|
|
39
|
+
max-width: var(--max);
|
|
40
|
+
margin: 0 auto;
|
|
41
|
+
padding: 40px 24px 80px;
|
|
42
|
+
}
|
|
43
|
+
dl {
|
|
44
|
+
margin: 0;
|
|
45
|
+
}
|
|
46
|
+
/* Sunken frame holding stat panels. */
|
|
47
|
+
.is-grid dl {
|
|
48
|
+
display: grid;
|
|
49
|
+
/* Two columns on phones instead of one tall card per fact. */
|
|
50
|
+
grid-template-columns: repeat(auto-fit, minmax(min(200px, calc(50% - 5px)), 1fr));
|
|
51
|
+
gap: 10px;
|
|
52
|
+
padding: 10px;
|
|
53
|
+
border-radius: var(--r-card);
|
|
54
|
+
background: var(--bg-sunken);
|
|
55
|
+
}
|
|
56
|
+
.is-grid div {
|
|
57
|
+
display: flex;
|
|
58
|
+
flex-direction: column-reverse;
|
|
59
|
+
justify-content: flex-end;
|
|
60
|
+
min-height: clamp(120px, 30vw, 170px);
|
|
61
|
+
padding: 24px;
|
|
62
|
+
border-radius: 12px;
|
|
63
|
+
background: var(--surface);
|
|
64
|
+
box-shadow: 0 2px 0 var(--shadow-hard);
|
|
65
|
+
}
|
|
66
|
+
.is-grid dd {
|
|
67
|
+
margin: auto 0 8px;
|
|
68
|
+
color: var(--heading);
|
|
69
|
+
font-size: clamp(34px, 3.4vw, 46px);
|
|
70
|
+
font-weight: 600;
|
|
71
|
+
letter-spacing: -0.02em;
|
|
72
|
+
line-height: 1;
|
|
73
|
+
}
|
|
74
|
+
.is-grid dt {
|
|
75
|
+
color: var(--muted);
|
|
76
|
+
font-size: 13px;
|
|
77
|
+
letter-spacing: 0.04em;
|
|
78
|
+
line-height: 1.5;
|
|
79
|
+
text-transform: uppercase;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Spec sheet: one card, a label/value row per fact. */
|
|
83
|
+
.is-list dl {
|
|
84
|
+
max-width: 440px;
|
|
85
|
+
margin-inline: auto;
|
|
86
|
+
padding: 4px 24px;
|
|
87
|
+
border-radius: var(--r-card);
|
|
88
|
+
background: var(--surface);
|
|
89
|
+
box-shadow: 2px 2px 0 var(--shadow-hard);
|
|
90
|
+
}
|
|
91
|
+
.is-list div {
|
|
92
|
+
display: flex;
|
|
93
|
+
align-items: baseline;
|
|
94
|
+
justify-content: space-between;
|
|
95
|
+
gap: 20px;
|
|
96
|
+
padding: 15px 0;
|
|
97
|
+
border-top: 1px solid var(--border);
|
|
98
|
+
}
|
|
99
|
+
.is-list div:first-child {
|
|
100
|
+
border-top: 0;
|
|
101
|
+
}
|
|
102
|
+
.is-list dt {
|
|
103
|
+
color: var(--muted);
|
|
104
|
+
font-size: 14.5px;
|
|
105
|
+
}
|
|
106
|
+
.is-list dd {
|
|
107
|
+
margin: 0;
|
|
108
|
+
color: var(--heading);
|
|
109
|
+
font-weight: 600;
|
|
110
|
+
text-align: right;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
/** Native <details> accordion, no JS. Entries stay independent (several may be open at once). */
|
|
3
|
+
import config from 'virtual:casoon-pages/config';
|
|
4
|
+
import { t } from '../lib/i18n';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
items: { q: string; a: string }[];
|
|
8
|
+
heading?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const s = t(config.lang);
|
|
12
|
+
const { items, heading = s.faqHeading } = Astro.props;
|
|
13
|
+
// Two columns, filled top to bottom.
|
|
14
|
+
const half = Math.ceil(items.length / 2);
|
|
15
|
+
const columns = [items.slice(0, half), items.slice(half)].filter((col) => col.length > 0);
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<section class="faq">
|
|
19
|
+
<h2>{heading}</h2>
|
|
20
|
+
<div class="frame">
|
|
21
|
+
{
|
|
22
|
+
columns.map((col) => (
|
|
23
|
+
<div class="list">
|
|
24
|
+
{col.map((item) => (
|
|
25
|
+
<details>
|
|
26
|
+
<summary>
|
|
27
|
+
<span>{item.q}</span>
|
|
28
|
+
<span class="icon" aria-hidden="true" />
|
|
29
|
+
</summary>
|
|
30
|
+
<p>{item.a}</p>
|
|
31
|
+
</details>
|
|
32
|
+
))}
|
|
33
|
+
</div>
|
|
34
|
+
))
|
|
35
|
+
}
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
38
|
+
|
|
39
|
+
<style>
|
|
40
|
+
.faq {
|
|
41
|
+
max-width: var(--max);
|
|
42
|
+
margin: 0 auto;
|
|
43
|
+
padding: 80px 24px;
|
|
44
|
+
}
|
|
45
|
+
h2 {
|
|
46
|
+
max-width: 12ch;
|
|
47
|
+
margin: 0 0 40px;
|
|
48
|
+
color: var(--heading);
|
|
49
|
+
font-size: clamp(34px, 4.4vw, 50px);
|
|
50
|
+
font-weight: 600;
|
|
51
|
+
letter-spacing: -0.02em;
|
|
52
|
+
line-height: 1.1;
|
|
53
|
+
}
|
|
54
|
+
.frame {
|
|
55
|
+
display: grid;
|
|
56
|
+
grid-template-columns: repeat(auto-fit, minmax(min(380px, 100%), 1fr));
|
|
57
|
+
gap: 10px;
|
|
58
|
+
align-items: start;
|
|
59
|
+
padding: 10px;
|
|
60
|
+
border-radius: var(--r-card);
|
|
61
|
+
background: var(--bg-sunken);
|
|
62
|
+
}
|
|
63
|
+
.list {
|
|
64
|
+
display: grid;
|
|
65
|
+
gap: 10px;
|
|
66
|
+
}
|
|
67
|
+
details {
|
|
68
|
+
border-radius: 12px;
|
|
69
|
+
background: var(--bg);
|
|
70
|
+
}
|
|
71
|
+
details[open] {
|
|
72
|
+
background: var(--surface);
|
|
73
|
+
}
|
|
74
|
+
summary {
|
|
75
|
+
display: flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
justify-content: space-between;
|
|
78
|
+
gap: 24px;
|
|
79
|
+
padding: 18px 20px;
|
|
80
|
+
color: var(--heading);
|
|
81
|
+
font-size: 18px;
|
|
82
|
+
letter-spacing: -0.02em;
|
|
83
|
+
line-height: 1.4;
|
|
84
|
+
cursor: pointer;
|
|
85
|
+
list-style: none;
|
|
86
|
+
}
|
|
87
|
+
summary::-webkit-details-marker {
|
|
88
|
+
display: none;
|
|
89
|
+
}
|
|
90
|
+
/* Plus that folds into a minus. */
|
|
91
|
+
.icon {
|
|
92
|
+
position: relative;
|
|
93
|
+
flex: none;
|
|
94
|
+
width: 14px;
|
|
95
|
+
height: 14px;
|
|
96
|
+
}
|
|
97
|
+
.icon::before,
|
|
98
|
+
.icon::after {
|
|
99
|
+
content: '';
|
|
100
|
+
position: absolute;
|
|
101
|
+
top: 50%;
|
|
102
|
+
left: 50%;
|
|
103
|
+
width: 14px;
|
|
104
|
+
height: 1.5px;
|
|
105
|
+
border-radius: 1px;
|
|
106
|
+
background: currentColor;
|
|
107
|
+
translate: -50% -50%;
|
|
108
|
+
transition: transform 0.36s var(--ease-roll);
|
|
109
|
+
}
|
|
110
|
+
.icon::after {
|
|
111
|
+
transform: rotate(90deg);
|
|
112
|
+
}
|
|
113
|
+
details[open] .icon::after {
|
|
114
|
+
transform: rotate(0deg);
|
|
115
|
+
}
|
|
116
|
+
details p {
|
|
117
|
+
margin: 0;
|
|
118
|
+
padding: 0 20px 20px;
|
|
119
|
+
color: var(--text);
|
|
120
|
+
font-size: 16px;
|
|
121
|
+
line-height: 1.56;
|
|
122
|
+
}
|
|
123
|
+
</style>
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Core points, each backed by something checkable.
|
|
4
|
+
* `layout="numbered"` (default, 3–5 items): a numbered list. `layout="grid"`: a denser catalog
|
|
5
|
+
* for more items — an icon tile per entry (`icon`, a short mono label) instead of the index.
|
|
6
|
+
*/
|
|
7
|
+
import config from 'virtual:casoon-pages/config';
|
|
8
|
+
import { t } from '../lib/i18n';
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
items: { title: string; body: string; icon?: string }[];
|
|
12
|
+
heading?: string;
|
|
13
|
+
layout?: 'numbered' | 'grid';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const { items, heading = t(config.lang).featuresHeading, layout = 'numbered' } = Astro.props;
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
<section class:list={['features', `is-${layout}`]}>
|
|
20
|
+
<h2 class="cp-label">{heading}</h2>
|
|
21
|
+
<ul>
|
|
22
|
+
{
|
|
23
|
+
items.map((ft, i) => (
|
|
24
|
+
<li>
|
|
25
|
+
{layout === 'numbered' ? (
|
|
26
|
+
<span class="n" aria-hidden="true">
|
|
27
|
+
{String(i + 1).padStart(2, '0')}
|
|
28
|
+
</span>
|
|
29
|
+
) : (
|
|
30
|
+
ft.icon && (
|
|
31
|
+
<span class="icon" aria-hidden="true">
|
|
32
|
+
{ft.icon}
|
|
33
|
+
</span>
|
|
34
|
+
)
|
|
35
|
+
)}
|
|
36
|
+
<div>
|
|
37
|
+
<h3>{ft.title}</h3>
|
|
38
|
+
<p>{ft.body}</p>
|
|
39
|
+
</div>
|
|
40
|
+
</li>
|
|
41
|
+
))
|
|
42
|
+
}
|
|
43
|
+
</ul>
|
|
44
|
+
</section>
|
|
45
|
+
|
|
46
|
+
<style>
|
|
47
|
+
.features {
|
|
48
|
+
max-width: var(--max);
|
|
49
|
+
margin: 0 auto;
|
|
50
|
+
padding: 80px 24px;
|
|
51
|
+
}
|
|
52
|
+
ul {
|
|
53
|
+
margin: 0;
|
|
54
|
+
padding: 0;
|
|
55
|
+
list-style: none;
|
|
56
|
+
}
|
|
57
|
+
/* Large light numerals. */
|
|
58
|
+
.is-numbered ul {
|
|
59
|
+
display: grid;
|
|
60
|
+
grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
|
|
61
|
+
gap: 10px;
|
|
62
|
+
}
|
|
63
|
+
.is-numbered li {
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column-reverse;
|
|
66
|
+
justify-content: flex-end;
|
|
67
|
+
gap: 28px;
|
|
68
|
+
padding: 30px 24px;
|
|
69
|
+
border-radius: var(--r-card);
|
|
70
|
+
background: var(--bg-deep);
|
|
71
|
+
}
|
|
72
|
+
.n {
|
|
73
|
+
margin-top: auto;
|
|
74
|
+
color: var(--heading);
|
|
75
|
+
font-size: 46px;
|
|
76
|
+
font-weight: 200;
|
|
77
|
+
letter-spacing: -0.02em;
|
|
78
|
+
line-height: 1;
|
|
79
|
+
}
|
|
80
|
+
h3 {
|
|
81
|
+
margin: 0 0 8px;
|
|
82
|
+
color: var(--heading);
|
|
83
|
+
font-size: 22px;
|
|
84
|
+
font-weight: 600;
|
|
85
|
+
line-height: 1.3;
|
|
86
|
+
}
|
|
87
|
+
p {
|
|
88
|
+
margin: 0;
|
|
89
|
+
font-size: 16px;
|
|
90
|
+
line-height: 1.56;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Catalog: cream, ink and accent cards in turn. */
|
|
94
|
+
.is-grid ul {
|
|
95
|
+
display: grid;
|
|
96
|
+
grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
|
|
97
|
+
gap: 10px;
|
|
98
|
+
}
|
|
99
|
+
.is-grid li {
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-direction: column;
|
|
102
|
+
gap: 30px;
|
|
103
|
+
min-height: 240px;
|
|
104
|
+
padding: 30px 24px;
|
|
105
|
+
border-radius: var(--r-card);
|
|
106
|
+
background: var(--bg-deep);
|
|
107
|
+
}
|
|
108
|
+
.is-grid li:nth-child(6n + 1),
|
|
109
|
+
.is-grid li:nth-child(6n + 6) {
|
|
110
|
+
background: #11100e;
|
|
111
|
+
color: #cbc9c5;
|
|
112
|
+
}
|
|
113
|
+
.is-grid li:nth-child(6n + 2) {
|
|
114
|
+
background: var(--accent-fill);
|
|
115
|
+
color: #fff;
|
|
116
|
+
}
|
|
117
|
+
.is-grid li:nth-child(6n + 1) h3,
|
|
118
|
+
.is-grid li:nth-child(6n + 6) h3,
|
|
119
|
+
.is-grid li:nth-child(6n + 2) h3 {
|
|
120
|
+
color: #fff;
|
|
121
|
+
}
|
|
122
|
+
.is-grid .icon {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
125
|
+
justify-content: center;
|
|
126
|
+
width: 56px;
|
|
127
|
+
height: 56px;
|
|
128
|
+
border-radius: 50%;
|
|
129
|
+
background: #fff;
|
|
130
|
+
color: #11100e;
|
|
131
|
+
font-family: var(--font-mono);
|
|
132
|
+
font-size: 15px;
|
|
133
|
+
font-weight: 500;
|
|
134
|
+
}
|
|
135
|
+
.is-grid li:nth-child(6n + 2) .icon {
|
|
136
|
+
background: #fff;
|
|
137
|
+
color: var(--accent-fill);
|
|
138
|
+
}
|
|
139
|
+
</style>
|