@conduction/docusaurus-preset 3.15.3 → 3.16.1
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/package.json +1 -1
- package/src/components/ContentCard/ContentCard.jsx +88 -29
- package/src/components/ContentCard/ContentCard.module.css +101 -1
- package/src/components/DownloadPanel/DownloadPanel.jsx +69 -0
- package/src/components/DownloadPanel/DownloadPanel.module.css +130 -0
- package/src/components/FeaturedCard/FeaturedCard.jsx +36 -0
- package/src/components/FeaturedCard/FeaturedCard.module.css +15 -0
- package/src/components/ModuleCard/ModuleCard.jsx +150 -0
- package/src/components/ModuleCard/ModuleCard.module.css +147 -0
- package/src/components/ModulePage/ModulePage.jsx +149 -0
- package/src/components/ModulePage/ModulePage.module.css +89 -0
- package/src/components/PlatformOverview/PlatformOverview.module.css +8 -2
- package/src/components/index.js +18 -0
- package/src/components/primitives/AuthorByline.module.css +4 -3
- package/src/data/audience.js +60 -0
- package/src/theme/ErrorPageContent/index.jsx +218 -0
- package/src/theme/ErrorPageContent/styles.module.css +203 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conduction-flavoured error page.
|
|
3
|
+
*
|
|
4
|
+
* A row of orange Amsterdam canal houses, bottoms half-sunken in a
|
|
5
|
+
* cobalt-900 canal, with a tall orange trapezoidal dyke on the right
|
|
6
|
+
* holding back the rising sea. The dyke has just sprung a leak — water
|
|
7
|
+
* gushes out of the breach into the canal — and the village pier is
|
|
8
|
+
* the "duct tape inbound" message dispatching the fix.
|
|
9
|
+
*
|
|
10
|
+
* Houses + canal waves are reused from the canal-footer pattern
|
|
11
|
+
* (design-system/docusaurus-preset/src/theme/Footer/index.jsx), so the
|
|
12
|
+
* error page lives in the same visual language as the rest of the
|
|
13
|
+
* site's footer. Pure-CSS animation, prefers-reduced-motion safe.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import React from 'react';
|
|
17
|
+
import {
|
|
18
|
+
ErrorBoundaryError,
|
|
19
|
+
ErrorBoundaryTryAgainButton,
|
|
20
|
+
} from '@docusaurus/theme-common';
|
|
21
|
+
import styles from './styles.module.css';
|
|
22
|
+
|
|
23
|
+
function DykeBreak() {
|
|
24
|
+
return (
|
|
25
|
+
<div className={styles.scene} aria-hidden="true">
|
|
26
|
+
<svg
|
|
27
|
+
viewBox="0 0 800 360"
|
|
28
|
+
preserveAspectRatio="xMidYMid slice"
|
|
29
|
+
className={styles.svg}
|
|
30
|
+
>
|
|
31
|
+
{/* sky */}
|
|
32
|
+
<rect x="0" y="0" width="800" height="200" fill="var(--c-cobalt-50)" />
|
|
33
|
+
|
|
34
|
+
{/* row of Dutch canal trapgevel houses, orange, simplified
|
|
35
|
+
silhouettes lifted from the canal-footer templates. House
|
|
36
|
+
bottoms sit at y=240 so they extend 40px below the canal
|
|
37
|
+
waterline (y=200) once the water rect covers them. */}
|
|
38
|
+
<g className={styles.houses} fill="var(--c-orange-knvb)">
|
|
39
|
+
{/* stepped-gable, narrow */}
|
|
40
|
+
<path d="M20,240 L20,80 L24,80 L24,72 L32,72 L32,64 L40,64 L40,60 L56,60 L56,64 L64,64 L64,72 L72,72 L72,80 L76,80 L76,240 Z" />
|
|
41
|
+
{/* bell-gable, medium */}
|
|
42
|
+
<path d="M86,240 L86,98 Q86,72 108,72 Q130,72 130,98 L130,240 Z" />
|
|
43
|
+
{/* stepped, tall */}
|
|
44
|
+
<path d="M140,240 L140,60 L146,60 L146,50 L154,50 L154,40 L162,40 L162,28 L178,28 L178,40 L186,40 L186,50 L194,50 L194,60 L200,60 L200,240 Z" />
|
|
45
|
+
{/* steep-gable house */}
|
|
46
|
+
<path d="M210,240 L210,100 L234,72 L258,100 L258,240 Z" />
|
|
47
|
+
{/* stepped, mid-height */}
|
|
48
|
+
<path d="M268,240 L268,96 L274,96 L274,86 L282,86 L282,76 L290,76 L290,68 L308,68 L308,76 L316,76 L316,86 L324,86 L324,96 L330,96 L330,240 Z" />
|
|
49
|
+
{/* church-style tower */}
|
|
50
|
+
<path d="M340,240 L340,80 L356,80 L356,68 L360,68 L360,46 L364,32 L368,46 L368,68 L372,68 L372,80 L388,80 L388,240 Z" />
|
|
51
|
+
</g>
|
|
52
|
+
|
|
53
|
+
{/* lit / dark windows so the silhouettes read as canal houses.
|
|
54
|
+
Light squares are warm cream, dark squares are see-through
|
|
55
|
+
inky panes. */}
|
|
56
|
+
<g className={styles.windows}>
|
|
57
|
+
<rect x="32" y="106" width="8" height="12" fill="rgba(255,247,210,0.92)" />
|
|
58
|
+
<rect x="56" y="106" width="8" height="12" fill="rgba(11,32,73,0.35)" />
|
|
59
|
+
<rect x="32" y="138" width="8" height="12" fill="rgba(11,32,73,0.35)" />
|
|
60
|
+
<rect x="56" y="138" width="8" height="12" fill="rgba(255,247,210,0.6)" />
|
|
61
|
+
<rect x="32" y="170" width="8" height="12" fill="rgba(11,32,73,0.35)" />
|
|
62
|
+
<rect x="56" y="170" width="8" height="12" fill="rgba(11,32,73,0.35)" />
|
|
63
|
+
<rect x="92" y="118" width="10" height="14" fill="rgba(255,247,210,0.85)" />
|
|
64
|
+
<rect x="114" y="118" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
65
|
+
<rect x="92" y="146" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
66
|
+
<rect x="114" y="146" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
67
|
+
<rect x="92" y="174" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
68
|
+
<rect x="114" y="174" width="10" height="14" fill="rgba(255,247,210,0.6)" />
|
|
69
|
+
<rect x="150" y="80" width="10" height="14" fill="rgba(255,247,210,0.85)" />
|
|
70
|
+
<rect x="178" y="80" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
71
|
+
<rect x="150" y="108" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
72
|
+
<rect x="178" y="108" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
73
|
+
<rect x="150" y="138" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
74
|
+
<rect x="178" y="138" width="10" height="14" fill="rgba(255,247,210,0.7)" />
|
|
75
|
+
<rect x="150" y="166" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
76
|
+
<rect x="178" y="166" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
77
|
+
<rect x="220" y="118" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
78
|
+
<rect x="240" y="118" width="10" height="14" fill="rgba(255,247,210,0.85)" />
|
|
79
|
+
<rect x="220" y="148" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
80
|
+
<rect x="240" y="148" width="10" height="14" fill="rgba(11,32,73,0.35)" />
|
|
81
|
+
<rect x="278" y="116" width="10" height="12" fill="rgba(11,32,73,0.35)" />
|
|
82
|
+
<rect x="296" y="116" width="10" height="12" fill="rgba(255,247,210,0.65)" />
|
|
83
|
+
<rect x="316" y="116" width="10" height="12" fill="rgba(11,32,73,0.35)" />
|
|
84
|
+
<rect x="278" y="146" width="10" height="12" fill="rgba(255,247,210,0.7)" />
|
|
85
|
+
<rect x="296" y="146" width="10" height="12" fill="rgba(11,32,73,0.35)" />
|
|
86
|
+
<rect x="316" y="146" width="10" height="12" fill="rgba(11,32,73,0.35)" />
|
|
87
|
+
<rect x="354" y="106" width="8" height="14" fill="rgba(255,247,210,0.85)" />
|
|
88
|
+
<rect x="354" y="138" width="8" height="14" fill="rgba(11,32,73,0.35)" />
|
|
89
|
+
<rect x="354" y="172" width="8" height="14" fill="rgba(255,247,210,0.55)" />
|
|
90
|
+
</g>
|
|
91
|
+
|
|
92
|
+
{/* THE ORANGE DYKE — proper trapezoidal cross-section on the
|
|
93
|
+
right side of the canvas, holding back the sea beyond the
|
|
94
|
+
right edge. Same orange as the houses (per the brief). */}
|
|
95
|
+
<path
|
|
96
|
+
d="M440,240 L560,40 L660,40 L800,240 L800,360 L440,360 Z"
|
|
97
|
+
fill="var(--c-orange-knvb)"
|
|
98
|
+
/>
|
|
99
|
+
{/* darker inner band so the trapezoid reads as packed earth,
|
|
100
|
+
not a flat orange block */}
|
|
101
|
+
<path
|
|
102
|
+
d="M452,240 L566,54 L654,54 L788,240 Z"
|
|
103
|
+
fill="var(--c-cobalt-900)"
|
|
104
|
+
opacity="0.12"
|
|
105
|
+
/>
|
|
106
|
+
|
|
107
|
+
{/* breach — punched through the LAND-facing (left) slope,
|
|
108
|
+
high enough above the canal that the falling stream is
|
|
109
|
+
visible. Drawn as a dark cobalt-900 hole. */}
|
|
110
|
+
<path
|
|
111
|
+
d="M482,162 Q496,140 516,138 Q536,140 542,160 Q540,178 524,184 L500,185 Q478,180 482,162 Z"
|
|
112
|
+
fill="var(--c-cobalt-900)"
|
|
113
|
+
/>
|
|
114
|
+
|
|
115
|
+
{/* the cascade — water falling from the breach into the canal
|
|
116
|
+
below. A loose teardrop shape that animates with a subtle
|
|
117
|
+
shimmer. */}
|
|
118
|
+
<g className={styles.gushGroup}>
|
|
119
|
+
<path
|
|
120
|
+
d="M500,184 Q495,200 502,200 Q510,200 522,184 Q514,182 500,184 Z"
|
|
121
|
+
fill="var(--c-cobalt-400)"
|
|
122
|
+
/>
|
|
123
|
+
<path
|
|
124
|
+
d="M502,200 Q495,212 487,225 L495,232 Q514,222 519,200 Q510,196 502,200 Z"
|
|
125
|
+
fill="var(--c-cobalt-400)"
|
|
126
|
+
opacity="0.85"
|
|
127
|
+
/>
|
|
128
|
+
</g>
|
|
129
|
+
|
|
130
|
+
{/* splash droplets where the cascade meets the canal */}
|
|
131
|
+
<g className={styles.droplets} fill="var(--c-cobalt-400)">
|
|
132
|
+
<circle cx="476" cy="222" r="2.5" className={styles.d1} />
|
|
133
|
+
<circle cx="464" cy="216" r="2" className={styles.d2} />
|
|
134
|
+
<circle cx="510" cy="226" r="2.5" className={styles.d3} />
|
|
135
|
+
<circle cx="528" cy="218" r="2" className={styles.d4} />
|
|
136
|
+
<circle cx="498" cy="228" r="3" className={styles.d5} />
|
|
137
|
+
</g>
|
|
138
|
+
|
|
139
|
+
{/* CANAL — drawn on top of the lower portions of houses + dyke
|
|
140
|
+
so the bottoms submerge below the waterline. Fills from
|
|
141
|
+
y=200 down to the bottom of the canvas. */}
|
|
142
|
+
<rect x="0" y="200" width="800" height="160" fill="var(--c-cobalt-900)" />
|
|
143
|
+
|
|
144
|
+
{/* dock / kade — a narrow gray strip on the canal surface,
|
|
145
|
+
barely above water, just visible enough to anchor the
|
|
146
|
+
village in the scene. */}
|
|
147
|
+
<rect x="0" y="200" width="430" height="4" fill="var(--c-cobalt-400)" opacity="0.6" />
|
|
148
|
+
|
|
149
|
+
{/* CANAL WAVES — three sawtooth lines lifted from the canal
|
|
150
|
+
footer (canal-footer.css .canal-waves), rescaled for the
|
|
151
|
+
error scene viewport. They sit on top of the canal water. */}
|
|
152
|
+
<g className={styles.waves} fill="none" stroke="rgba(67,118,252,0.30)" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round">
|
|
153
|
+
<path d="M0,224 L80,212 L160,224 L240,212 L320,224 L400,212 L480,224 L560,212 L640,224 L720,212 L800,224" />
|
|
154
|
+
<path d="M0,278 L100,260 L200,278 L300,260 L400,278 L500,260 L600,278 L700,260 L800,278" />
|
|
155
|
+
<path d="M0,332 L120,310 L240,332 L360,310 L480,332 L600,310 L720,332 L800,322" />
|
|
156
|
+
</g>
|
|
157
|
+
|
|
158
|
+
{/* worker hex on the dock in front of the dyke, leaning toward
|
|
159
|
+
the breach. The little orange life-vest stays orange — same
|
|
160
|
+
family as the houses + dyke. */}
|
|
161
|
+
<g transform="translate(410,196)">
|
|
162
|
+
<polygon
|
|
163
|
+
points="0,-12 10,-6 10,6 0,12 -10,6 -10,-6"
|
|
164
|
+
fill="var(--c-cobalt-900)"
|
|
165
|
+
/>
|
|
166
|
+
<rect x="-9" y="8" width="18" height="14" rx="3" fill="var(--c-orange-knvb)" />
|
|
167
|
+
</g>
|
|
168
|
+
|
|
169
|
+
{/* "duct tape inbound" tag — widened so the text fits inside
|
|
170
|
+
the rounded rect with breathing room. The previous 88px-wide
|
|
171
|
+
pill was clipping the letters at both ends. */}
|
|
172
|
+
<g className={styles.tag} transform="translate(420,150)">
|
|
173
|
+
<rect x="-72" y="-13" width="144" height="26" rx="13" fill="white" stroke="var(--c-cobalt-200)" />
|
|
174
|
+
<text
|
|
175
|
+
x="0"
|
|
176
|
+
y="4"
|
|
177
|
+
textAnchor="middle"
|
|
178
|
+
fontFamily="var(--conduction-typography-font-family-code)"
|
|
179
|
+
fontSize="11"
|
|
180
|
+
fill="var(--c-cobalt-700)"
|
|
181
|
+
>duct tape inbound</text>
|
|
182
|
+
</g>
|
|
183
|
+
</svg>
|
|
184
|
+
</div>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export default function ErrorPageContent({error, tryAgain}) {
|
|
189
|
+
return (
|
|
190
|
+
<main className={styles.page}>
|
|
191
|
+
<DykeBreak />
|
|
192
|
+
|
|
193
|
+
<div className={styles.copy}>
|
|
194
|
+
<p className={styles.eyebrow}>Finger in the dyke</p>
|
|
195
|
+
<h1 className={styles.title}>Oh, no. Something broke.</h1>
|
|
196
|
+
<p className={styles.lede}>
|
|
197
|
+
We are dispatching a team with duct tape right now. Please try again
|
|
198
|
+
in a moment, or take a different route.
|
|
199
|
+
</p>
|
|
200
|
+
|
|
201
|
+
<div className={styles.actions}>
|
|
202
|
+
<ErrorBoundaryTryAgainButton
|
|
203
|
+
onClick={tryAgain}
|
|
204
|
+
className={styles.tryButton}
|
|
205
|
+
/>
|
|
206
|
+
<a href="/" className={styles.homeLink}>Or back to Conduction.nl →</a>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<details className={styles.details}>
|
|
210
|
+
<summary>What technically went wrong</summary>
|
|
211
|
+
<div className={styles.detailsBody}>
|
|
212
|
+
<ErrorBoundaryError error={error} />
|
|
213
|
+
</div>
|
|
214
|
+
</details>
|
|
215
|
+
</div>
|
|
216
|
+
</main>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conduction error-page styles. The dyke-break SVG and its supporting
|
|
3
|
+
* keyframes live here; the page itself uses brand tokens for spacing
|
|
4
|
+
* + type so it sits next to the rest of the marketing pages without
|
|
5
|
+
* looking like a borrowed template.
|
|
6
|
+
*
|
|
7
|
+
* The water uses an x-translate loop so the gushing reads as constant
|
|
8
|
+
* flow rather than a single splash. Droplets each have their own
|
|
9
|
+
* delay so they don't pop together. Everything respects
|
|
10
|
+
* prefers-reduced-motion.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
.page {
|
|
14
|
+
padding: 0 0 96px;
|
|
15
|
+
background: var(--c-cobalt-50);
|
|
16
|
+
min-height: calc(100vh - 200px);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.scene {
|
|
20
|
+
position: relative;
|
|
21
|
+
width: 100%;
|
|
22
|
+
aspect-ratio: 800 / 360;
|
|
23
|
+
background: var(--c-cobalt-50);
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.houses {
|
|
28
|
+
/* solid silhouettes; no animation — they're the static village */
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.windows {
|
|
32
|
+
/* tiny lit windows; static */
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.svg {
|
|
36
|
+
width: 100%;
|
|
37
|
+
height: 100%;
|
|
38
|
+
display: block;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* the cascade falling from the breach into the canal — a gentle
|
|
42
|
+
shimmer + scale loop so the stream reads as moving water, not a
|
|
43
|
+
frozen splash */
|
|
44
|
+
.gushGroup {
|
|
45
|
+
transform-origin: 510px 190px;
|
|
46
|
+
animation: gush 2.4s ease-in-out infinite;
|
|
47
|
+
}
|
|
48
|
+
@keyframes gush {
|
|
49
|
+
0% { transform: scaleY(1) translateY(0); opacity: 1; }
|
|
50
|
+
50% { transform: scaleY(1.06) translateY(1px); opacity: 0.92; }
|
|
51
|
+
100% { transform: scaleY(1) translateY(0); opacity: 1; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* canal waves drift sideways for a slow flowing-water feel */
|
|
55
|
+
.waves path {
|
|
56
|
+
animation: drift 7s ease-in-out infinite;
|
|
57
|
+
transform-origin: center;
|
|
58
|
+
}
|
|
59
|
+
.waves path:nth-child(2) { animation-duration: 9s; animation-delay: -2s; }
|
|
60
|
+
.waves path:nth-child(3) { animation-duration: 11s; animation-delay: -4s; }
|
|
61
|
+
@keyframes drift {
|
|
62
|
+
0%, 100% { transform: translateX(0); }
|
|
63
|
+
50% { transform: translateX(-6px); }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* droplets where the cascade meets the canal — each on its own beat
|
|
67
|
+
so they don't pop in sync */
|
|
68
|
+
.droplets circle { opacity: 0; }
|
|
69
|
+
.d1 { animation: drop 1.6s ease-out infinite; animation-delay: 0.0s; }
|
|
70
|
+
.d2 { animation: drop 1.6s ease-out infinite; animation-delay: 0.3s; }
|
|
71
|
+
.d3 { animation: drop 1.6s ease-out infinite; animation-delay: 0.6s; }
|
|
72
|
+
.d4 { animation: drop 1.6s ease-out infinite; animation-delay: 0.9s; }
|
|
73
|
+
.d5 { animation: drop 1.6s ease-out infinite; animation-delay: 1.2s; }
|
|
74
|
+
@keyframes drop {
|
|
75
|
+
0% { transform: translate(0, 0); opacity: 0; }
|
|
76
|
+
20% { opacity: 1; }
|
|
77
|
+
100% { transform: translate(0, 14px); opacity: 0; }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* the "duct tape inbound" tag wobbles like a paper sign on a string */
|
|
81
|
+
.tag {
|
|
82
|
+
transform-origin: 420px 150px;
|
|
83
|
+
animation: wobble 3.5s ease-in-out infinite;
|
|
84
|
+
}
|
|
85
|
+
@keyframes wobble {
|
|
86
|
+
0%, 100% { transform: rotate(-3deg) translate(420px, 150px); }
|
|
87
|
+
50% { transform: rotate(3deg) translate(420px, 150px); }
|
|
88
|
+
}
|
|
89
|
+
.svg .tag {
|
|
90
|
+
transform: translate(420px, 150px);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@media (prefers-reduced-motion: reduce) {
|
|
94
|
+
.gushGroup, .droplets circle, .tag, .waves path {
|
|
95
|
+
animation: none;
|
|
96
|
+
}
|
|
97
|
+
.droplets circle { opacity: 0.6; }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* copy block under the scene */
|
|
101
|
+
.copy {
|
|
102
|
+
padding: 48px 24px 48px;
|
|
103
|
+
max-width: 640px;
|
|
104
|
+
margin: 0 auto;
|
|
105
|
+
font-family: var(--conduction-typography-font-family-body);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@media (max-width: 640px) {
|
|
109
|
+
.copy { padding: 32px 24px 36px; }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.eyebrow {
|
|
113
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
114
|
+
font-size: 12px;
|
|
115
|
+
letter-spacing: 0.08em;
|
|
116
|
+
text-transform: uppercase;
|
|
117
|
+
color: var(--c-orange-knvb);
|
|
118
|
+
margin: 0 0 12px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.title {
|
|
122
|
+
font-size: 32px;
|
|
123
|
+
font-weight: 700;
|
|
124
|
+
letter-spacing: -0.015em;
|
|
125
|
+
color: var(--c-cobalt-900);
|
|
126
|
+
line-height: 1.15;
|
|
127
|
+
margin: 0 0 16px;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.lede {
|
|
131
|
+
font-size: 17px;
|
|
132
|
+
color: var(--c-cobalt-700);
|
|
133
|
+
line-height: 1.55;
|
|
134
|
+
margin: 0 0 24px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.actions {
|
|
138
|
+
display: flex;
|
|
139
|
+
align-items: center;
|
|
140
|
+
gap: 24px;
|
|
141
|
+
flex-wrap: wrap;
|
|
142
|
+
margin-bottom: 32px;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.tryButton {
|
|
146
|
+
background: var(--c-cobalt-900);
|
|
147
|
+
color: white;
|
|
148
|
+
border: none;
|
|
149
|
+
padding: 12px 24px;
|
|
150
|
+
border-radius: var(--radius-pill);
|
|
151
|
+
font-family: var(--conduction-typography-font-family-body);
|
|
152
|
+
font-size: 15px;
|
|
153
|
+
font-weight: 600;
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
transition: background 160ms ease;
|
|
156
|
+
}
|
|
157
|
+
.tryButton:hover { background: var(--c-blue-cobalt); }
|
|
158
|
+
|
|
159
|
+
.homeLink {
|
|
160
|
+
color: var(--c-cobalt-700);
|
|
161
|
+
font-size: 14px;
|
|
162
|
+
text-decoration: none;
|
|
163
|
+
}
|
|
164
|
+
.homeLink:hover { color: var(--c-cobalt-900); text-decoration: underline; }
|
|
165
|
+
|
|
166
|
+
.details {
|
|
167
|
+
border-top: 1px solid var(--c-cobalt-100);
|
|
168
|
+
padding-top: 16px;
|
|
169
|
+
}
|
|
170
|
+
.details summary {
|
|
171
|
+
cursor: pointer;
|
|
172
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
173
|
+
font-size: 12px;
|
|
174
|
+
letter-spacing: 0.04em;
|
|
175
|
+
text-transform: uppercase;
|
|
176
|
+
color: var(--c-cobalt-400);
|
|
177
|
+
list-style: none;
|
|
178
|
+
}
|
|
179
|
+
.details summary::-webkit-details-marker { display: none; }
|
|
180
|
+
.details summary::before {
|
|
181
|
+
content: '▸';
|
|
182
|
+
margin-right: 8px;
|
|
183
|
+
display: inline-block;
|
|
184
|
+
transition: transform 160ms ease;
|
|
185
|
+
}
|
|
186
|
+
.details[open] summary::before { transform: rotate(90deg); }
|
|
187
|
+
|
|
188
|
+
.detailsBody {
|
|
189
|
+
margin-top: 12px;
|
|
190
|
+
font-family: var(--conduction-typography-font-family-code);
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
color: var(--c-cobalt-700);
|
|
193
|
+
background: var(--c-cobalt-50);
|
|
194
|
+
padding: 16px;
|
|
195
|
+
border-radius: var(--radius-md);
|
|
196
|
+
overflow-x: auto;
|
|
197
|
+
}
|
|
198
|
+
.detailsBody :global(pre) {
|
|
199
|
+
margin: 0;
|
|
200
|
+
background: transparent;
|
|
201
|
+
padding: 0;
|
|
202
|
+
font-size: 12px;
|
|
203
|
+
}
|