ferst-core 0.7.2 → 0.7.5
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/bin/ferst-update.mjs +33 -2
- package/cms/config.template.yml +214 -206
- package/components/BlockRenderer.astro +10 -0
- package/components/Pagination.astro +51 -0
- package/components/SiteFooter.astro +274 -270
- package/components/SiteHeader.astro +1243 -1183
- package/components/blocks/Heading.astro +51 -46
- package/components/blocks/Prose.astro +10 -2
- package/components/blocks/Quote.astro +40 -38
- package/components/recipes/Accordion.astro +91 -84
- package/components/recipes/Contacts.astro +139 -0
- package/components/recipes/Document.astro +157 -0
- package/components/recipes/FeatureCards.astro +112 -111
- package/components/recipes/Hero.astro +52 -4
- package/components/recipes/LinkRow.astro +91 -0
- package/components/recipes/MediaCards.astro +213 -212
- package/components/recipes/MediaText.astro +92 -0
- package/components/recipes/Notice.astro +90 -89
- package/components/recipes/Stats.astro +152 -145
- package/components/recipes/Table.astro +101 -97
- package/components/recipes/Tabs.astro +134 -133
- package/components/recipes/Tiles.astro +4 -2
- package/components/recipes/Timetable.astro +189 -0
- package/components/recipes/Video.astro +177 -157
- package/content/blocks.ts +113 -1
- package/content/cookies.ts +10 -0
- package/content/schemas.ts +167 -161
- package/examples/primitives.ts +2 -0
- package/examples/recipes.ts +7 -0
- package/integration.mjs +83 -64
- package/layouts/Base.astro +483 -475
- package/lib/documents.ts +68 -62
- package/lib/embed-consent.ts +78 -73
- package/lib/inline-markdown.ts +6 -0
- package/lib/links.ts +22 -0
- package/lib/paginate.ts +23 -0
- package/lib/posts.ts +20 -2
- package/lib/siteSettings.ts +61 -60
- package/lib/slug.ts +32 -0
- package/lib/table.ts +10 -0
- package/lib/timetable.ts +27 -0
- package/lib/video.ts +101 -75
- package/package.json +1 -1
- package/routes/cookie-policy.astro +27 -0
- package/routes/posts/index.astro +36 -31
- package/routes/posts/page/[page].astro +36 -0
- package/routes/posts/tag/[...tag].astro +41 -37
|
@@ -1,212 +1,213 @@
|
|
|
1
|
-
---
|
|
2
|
-
/**
|
|
3
|
-
* MediaCards — a Level-2 recipe: a grid of rich content cards with the IMAGE as a
|
|
4
|
-
* header on top (cover-cropped to a uniform ratio, like PostCard), then an optional
|
|
5
|
-
* icon badge, a title, a meta line (e.g. "Sundays 10:45 · Main hall"), a description, and
|
|
6
|
-
* an optional CTA link. The image-HEADER pattern (distinct from `tiles`, which puts
|
|
7
|
-
* the image BEHIND the text): use it for groups, team members, services or events —
|
|
8
|
-
* anywhere the photo and the copy both need to be fully legible. Whole card links
|
|
9
|
-
* when `href` is set. Token-driven, equal-height.
|
|
10
|
-
*/
|
|
11
|
-
import Icon from '../Icon.astro';
|
|
12
|
-
import { isIconKey } from '../../lib/icons';
|
|
13
|
-
import Heading from '../blocks/Heading.astro';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
{card.
|
|
64
|
-
{
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
</
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.b-media-cards__grid[data-cols='
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
margin-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
.b-media-cards__title a { color: var(--
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
.b-media-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
font-
|
|
186
|
-
font-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
font-
|
|
199
|
-
font-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
.
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
font-
|
|
208
|
-
font-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* MediaCards — a Level-2 recipe: a grid of rich content cards with the IMAGE as a
|
|
4
|
+
* header on top (cover-cropped to a uniform ratio, like PostCard), then an optional
|
|
5
|
+
* icon badge, a title, a meta line (e.g. "Sundays 10:45 · Main hall"), a description, and
|
|
6
|
+
* an optional CTA link. The image-HEADER pattern (distinct from `tiles`, which puts
|
|
7
|
+
* the image BEHIND the text): use it for groups, team members, services or events —
|
|
8
|
+
* anywhere the photo and the copy both need to be fully legible. Whole card links
|
|
9
|
+
* when `href` is set. Token-driven, equal-height.
|
|
10
|
+
*/
|
|
11
|
+
import Icon from '../Icon.astro';
|
|
12
|
+
import { isIconKey } from '../../lib/icons';
|
|
13
|
+
import Heading from '../blocks/Heading.astro';
|
|
14
|
+
|
|
15
|
+
import { inlineMarkdown, inlineMarkdownNoLinks } from '../../lib/inline-markdown';
|
|
16
|
+
interface Card {
|
|
17
|
+
image?: { src: string; alt?: string };
|
|
18
|
+
icon?: string;
|
|
19
|
+
title: string;
|
|
20
|
+
meta?: string;
|
|
21
|
+
text?: string;
|
|
22
|
+
href?: string;
|
|
23
|
+
linkLabel?: string;
|
|
24
|
+
}
|
|
25
|
+
interface Props {
|
|
26
|
+
title?: string;
|
|
27
|
+
intro?: string;
|
|
28
|
+
columns?: 2 | 3;
|
|
29
|
+
cards?: Card[];
|
|
30
|
+
}
|
|
31
|
+
const { title, intro, columns = 3, cards = [] } = Astro.props;
|
|
32
|
+
// Never reserve more columns than there are cards; `data-single` centres a lone one.
|
|
33
|
+
const cols = Math.min(columns, Math.max(cards.length, 1)) as 1 | 2 | 3;
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
<section class="b-media-cards">
|
|
37
|
+
{(title || intro) && (
|
|
38
|
+
<div class="b-media-cards__head">
|
|
39
|
+
{title && <Heading text={title} level={2} />}
|
|
40
|
+
{intro && <p class="b-media-cards__intro" set:html={inlineMarkdown(intro)} />}
|
|
41
|
+
</div>
|
|
42
|
+
)}
|
|
43
|
+
<div class="b-media-cards__grid" data-cols={cols} data-single={cards.length === 1 ? 'true' : undefined}>
|
|
44
|
+
{cards.map((card) => {
|
|
45
|
+
// Surface a mailto:/tel: as visible, copyable text — a plain mailto does
|
|
46
|
+
// nothing on a device with no mail app, so the address must be readable too.
|
|
47
|
+
const email = card.href?.startsWith('mailto:') ? card.href.slice(7).split('?')[0] : null;
|
|
48
|
+
const phone = card.href?.startsWith('tel:') ? card.href.slice(4) : null;
|
|
49
|
+
return (
|
|
50
|
+
<article class:list={['b-media-cards__card', 'ferst-tile', 'ferst-tile--sm', card.href && 'is-link']}>
|
|
51
|
+
{card.image && (
|
|
52
|
+
<div class="b-media-cards__media">
|
|
53
|
+
<img src={card.image.src} alt={card.image.alt ?? ''} loading="lazy" />
|
|
54
|
+
</div>
|
|
55
|
+
)}
|
|
56
|
+
<div class="b-media-cards__body">
|
|
57
|
+
{card.icon && isIconKey(card.icon) && (
|
|
58
|
+
<span class="b-media-cards__badge" aria-hidden="true"><Icon name={card.icon} size={20} /></span>
|
|
59
|
+
)}
|
|
60
|
+
<h3 class="b-media-cards__title">
|
|
61
|
+
{card.href ? <a href={card.href}>{card.title}</a> : card.title}
|
|
62
|
+
</h3>
|
|
63
|
+
{card.meta && <p class="b-media-cards__meta">{card.meta}</p>}
|
|
64
|
+
{card.text && <p class="b-media-cards__text" set:html={card.href ? inlineMarkdownNoLinks(card.text) : inlineMarkdown(card.text)} />}
|
|
65
|
+
{(email || phone) && (
|
|
66
|
+
<span class="b-media-cards__contact">{email ?? phone}</span>
|
|
67
|
+
)}
|
|
68
|
+
{card.href && !email && !phone && (
|
|
69
|
+
<span class="b-media-cards__cta" aria-hidden="true">{card.linkLabel ?? 'Learn more'} →</span>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
72
|
+
</article>
|
|
73
|
+
);
|
|
74
|
+
})}
|
|
75
|
+
</div>
|
|
76
|
+
</section>
|
|
77
|
+
|
|
78
|
+
<style>
|
|
79
|
+
.b-media-cards {
|
|
80
|
+
display: flex;
|
|
81
|
+
flex-direction: column;
|
|
82
|
+
gap: 2rem;
|
|
83
|
+
max-width: 72rem;
|
|
84
|
+
margin-inline: auto;
|
|
85
|
+
padding-inline: 1rem;
|
|
86
|
+
}
|
|
87
|
+
.b-media-cards__head {
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
gap: 0.75rem;
|
|
91
|
+
}
|
|
92
|
+
.b-media-cards__intro {
|
|
93
|
+
margin: 0;
|
|
94
|
+
color: var(--muted);
|
|
95
|
+
font-size: 1.0625rem;
|
|
96
|
+
line-height: 1.6;
|
|
97
|
+
max-width: var(--max);
|
|
98
|
+
}
|
|
99
|
+
.b-media-cards__grid {
|
|
100
|
+
display: grid;
|
|
101
|
+
grid-template-columns: 1fr;
|
|
102
|
+
gap: 1.5rem;
|
|
103
|
+
}
|
|
104
|
+
/* A solitary card is a centred feature, not a full-width slab. */
|
|
105
|
+
.b-media-cards__grid[data-single] { max-width: 28rem; margin-inline: auto; }
|
|
106
|
+
@media (min-width: 40em) {
|
|
107
|
+
.b-media-cards__grid[data-cols='2'] { grid-template-columns: repeat(2, 1fr); }
|
|
108
|
+
.b-media-cards__grid[data-cols='3'] { grid-template-columns: repeat(2, 1fr); }
|
|
109
|
+
}
|
|
110
|
+
@media (min-width: 60em) {
|
|
111
|
+
.b-media-cards__grid[data-cols='3'] { grid-template-columns: repeat(3, 1fr); }
|
|
112
|
+
}
|
|
113
|
+
.b-media-cards__card {
|
|
114
|
+
position: relative;
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
/* surface comes from .ferst-tile .ferst-tile--sm (bg/border/radius/shadow-sm) */
|
|
118
|
+
overflow: hidden;
|
|
119
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
|
|
120
|
+
}
|
|
121
|
+
.b-media-cards__card.is-link:hover {
|
|
122
|
+
transform: translateY(-2px);
|
|
123
|
+
box-shadow: var(--shadow-md);
|
|
124
|
+
border-color: var(--gold);
|
|
125
|
+
}
|
|
126
|
+
/* Image header — cover-cropped to a uniform 16:9 so any source ratio fits (the
|
|
127
|
+
PostCard technique; also out-specifies the global img{height:auto}). */
|
|
128
|
+
.b-media-cards__media {
|
|
129
|
+
position: relative;
|
|
130
|
+
aspect-ratio: 16 / 9;
|
|
131
|
+
overflow: hidden;
|
|
132
|
+
background: var(--bg-section);
|
|
133
|
+
}
|
|
134
|
+
.b-media-cards .b-media-cards__media img {
|
|
135
|
+
position: absolute;
|
|
136
|
+
inset: 0;
|
|
137
|
+
width: 100%;
|
|
138
|
+
height: 100%;
|
|
139
|
+
object-fit: cover;
|
|
140
|
+
display: block;
|
|
141
|
+
}
|
|
142
|
+
.b-media-cards__body {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
gap: 0.5rem;
|
|
146
|
+
padding: 1.1rem 1.2rem 1.3rem;
|
|
147
|
+
flex: 1;
|
|
148
|
+
}
|
|
149
|
+
/* Icon badge — a small brand chip; slightly lifted over the image edge when an
|
|
150
|
+
image is present (the negative margin only bites inside a card with a header). */
|
|
151
|
+
.b-media-cards__badge {
|
|
152
|
+
display: inline-flex;
|
|
153
|
+
align-items: center;
|
|
154
|
+
justify-content: center;
|
|
155
|
+
width: 2.25rem;
|
|
156
|
+
height: 2.25rem;
|
|
157
|
+
border-radius: 999px;
|
|
158
|
+
background: var(--gold-light);
|
|
159
|
+
color: var(--gold);
|
|
160
|
+
margin-top: -2.3rem;
|
|
161
|
+
margin-bottom: 0.2rem;
|
|
162
|
+
border: 3px solid var(--bg-surface);
|
|
163
|
+
}
|
|
164
|
+
/* No image → the badge sits normally at the top of the body. */
|
|
165
|
+
.b-media-cards__card:not(:has(.b-media-cards__media)) .b-media-cards__badge {
|
|
166
|
+
margin-top: 0;
|
|
167
|
+
border: none;
|
|
168
|
+
}
|
|
169
|
+
.b-media-cards__title {
|
|
170
|
+
margin: 0;
|
|
171
|
+
font-size: 1.2rem;
|
|
172
|
+
color: var(--fg);
|
|
173
|
+
}
|
|
174
|
+
.b-media-cards__card.is-link:hover .b-media-cards__title a { color: var(--gold); }
|
|
175
|
+
.b-media-cards__title a { color: var(--fg); }
|
|
176
|
+
/* Stretch the title link over the whole card so it's clickable. */
|
|
177
|
+
.b-media-cards__title a::after { content: ''; position: absolute; inset: 0; }
|
|
178
|
+
.b-media-cards__meta {
|
|
179
|
+
margin: 0;
|
|
180
|
+
align-self: flex-start;
|
|
181
|
+
padding: 0.2rem 0.6rem;
|
|
182
|
+
border-radius: 999px;
|
|
183
|
+
background: var(--bg-section);
|
|
184
|
+
color: var(--muted);
|
|
185
|
+
font-family: var(--font-heading);
|
|
186
|
+
font-size: 0.72rem;
|
|
187
|
+
font-weight: 600;
|
|
188
|
+
letter-spacing: 0.03em;
|
|
189
|
+
}
|
|
190
|
+
.b-media-cards__text {
|
|
191
|
+
margin: 0;
|
|
192
|
+
color: var(--muted);
|
|
193
|
+
line-height: 1.6;
|
|
194
|
+
}
|
|
195
|
+
.b-media-cards__cta {
|
|
196
|
+
margin-top: auto;
|
|
197
|
+
padding-top: 0.5rem;
|
|
198
|
+
font-family: var(--font-heading);
|
|
199
|
+
font-size: 0.85rem;
|
|
200
|
+
font-weight: 600;
|
|
201
|
+
color: var(--gold);
|
|
202
|
+
}
|
|
203
|
+
/* A mailto/tel shown as visible, copyable text (below any description). */
|
|
204
|
+
.b-media-cards__contact {
|
|
205
|
+
margin-top: auto;
|
|
206
|
+
padding-top: 0.5rem;
|
|
207
|
+
font-family: var(--font-heading);
|
|
208
|
+
font-size: 0.85rem;
|
|
209
|
+
font-weight: 600;
|
|
210
|
+
color: var(--gold);
|
|
211
|
+
overflow-wrap: anywhere;
|
|
212
|
+
}
|
|
213
|
+
</style>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* MediaText — an image beside its text, on the start or end side; stacks (text, then image)
|
|
4
|
+
* on a phone. The text takes prose formatting (paragraphs, lists, links); the image keeps
|
|
5
|
+
* its own shape unless `ratio` sets one (cropped to fill). An optional button follows the
|
|
6
|
+
* text.
|
|
7
|
+
*/
|
|
8
|
+
import Heading from '../blocks/Heading.astro';
|
|
9
|
+
import Button from '../Button.astro';
|
|
10
|
+
import { proseParts } from '../../lib/prose';
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
title?: string;
|
|
14
|
+
text: string;
|
|
15
|
+
image: { src: string; alt?: string; caption?: string };
|
|
16
|
+
imageSide?: 'start' | 'end';
|
|
17
|
+
ratio?: 'auto' | '1/1' | '4/3' | '3/2' | '16/9';
|
|
18
|
+
cta?: { label: string; href: string };
|
|
19
|
+
}
|
|
20
|
+
const { title, text, image, imageSide = 'end', ratio = 'auto', cta } = Astro.props;
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<section class="b-mediatext" data-side={imageSide}>
|
|
24
|
+
<div class="b-mediatext__text">
|
|
25
|
+
{title && <Heading text={title} level={2} />}
|
|
26
|
+
{proseParts(text).map((part) =>
|
|
27
|
+
part.kind === 'p' ? <p set:html={part.html} />
|
|
28
|
+
: part.kind === 'ul' ? <ul>{part.items.map((x) => <li set:html={x} />)}</ul>
|
|
29
|
+
: <ol>{part.items.map((x) => <li set:html={x} />)}</ol>
|
|
30
|
+
)}
|
|
31
|
+
{cta && <div class="b-mediatext__cta"><Button href={cta.href} variant="primary">{cta.label}</Button></div>}
|
|
32
|
+
</div>
|
|
33
|
+
<figure class="b-mediatext__media">
|
|
34
|
+
<img src={image.src} alt={image.alt ?? ''} loading="lazy" decoding="async" style={ratio !== 'auto' ? `aspect-ratio: ${ratio}; object-fit: cover` : undefined} />
|
|
35
|
+
{image.caption && <figcaption>{image.caption}</figcaption>}
|
|
36
|
+
</figure>
|
|
37
|
+
</section>
|
|
38
|
+
|
|
39
|
+
<style>
|
|
40
|
+
.b-mediatext {
|
|
41
|
+
display: grid;
|
|
42
|
+
gap: clamp(1.5rem, 4vw, 3rem);
|
|
43
|
+
align-items: center;
|
|
44
|
+
width: 100%;
|
|
45
|
+
max-width: 72rem;
|
|
46
|
+
}
|
|
47
|
+
@media (min-width: 48em) {
|
|
48
|
+
.b-mediatext {
|
|
49
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
|
50
|
+
}
|
|
51
|
+
.b-mediatext[data-side='start'] .b-mediatext__media {
|
|
52
|
+
order: -1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
.b-mediatext__text {
|
|
56
|
+
display: flex;
|
|
57
|
+
flex-direction: column;
|
|
58
|
+
gap: 0.9rem;
|
|
59
|
+
}
|
|
60
|
+
.b-mediatext__text p,
|
|
61
|
+
.b-mediatext__text ul,
|
|
62
|
+
.b-mediatext__text ol {
|
|
63
|
+
margin: 0;
|
|
64
|
+
line-height: 1.7;
|
|
65
|
+
}
|
|
66
|
+
.b-mediatext__text ul,
|
|
67
|
+
.b-mediatext__text ol {
|
|
68
|
+
padding-inline-start: 1.4em;
|
|
69
|
+
}
|
|
70
|
+
.b-mediatext__text :global(a:not(.btn)) {
|
|
71
|
+
color: var(--accent);
|
|
72
|
+
text-decoration: underline;
|
|
73
|
+
text-underline-offset: 0.15em;
|
|
74
|
+
}
|
|
75
|
+
.b-mediatext__cta {
|
|
76
|
+
margin-top: 0.4rem;
|
|
77
|
+
}
|
|
78
|
+
.b-mediatext__media {
|
|
79
|
+
margin: 0;
|
|
80
|
+
}
|
|
81
|
+
.b-mediatext__media img {
|
|
82
|
+
display: block;
|
|
83
|
+
width: 100%;
|
|
84
|
+
height: auto;
|
|
85
|
+
border-radius: var(--radius);
|
|
86
|
+
}
|
|
87
|
+
.b-mediatext__media figcaption {
|
|
88
|
+
margin-top: 0.5rem;
|
|
89
|
+
font-size: 0.875rem;
|
|
90
|
+
color: var(--muted);
|
|
91
|
+
}
|
|
92
|
+
</style>
|