@fluid-theme/core 0.4.3 → 2.1.0
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/AGENTS.md +6 -29
- package/CHANGELOG.md +564 -2
- package/CLAUDE.md +201 -14
- package/GEMINI.md +6 -45
- package/README.md +17 -8
- package/assets/js/compare.js +77 -0
- package/assets/js/fit-text.js +103 -0
- package/assets/js/lightbox.js +153 -0
- package/assets/js/scroll-reveal.js +72 -0
- package/assets/js/toc-build.mjs +86 -0
- package/assets/js/toc.js +384 -0
- package/dist/fluid-1x.min.css +4 -0
- package/dist/fluid-fonts-archivo.min.css +2 -0
- package/dist/fluid-fonts-bodoni.min.css +2 -0
- package/dist/fluid-fonts.min.css +2 -0
- package/dist/fluid-legacy-1x.css +3 -0
- package/dist/fluid-nav.min.css +3 -0
- package/dist/fluid-toc.min.css +3 -0
- package/dist/fluid-zero.min.css +3 -0
- package/dist/fluid.min.css +3 -2
- package/dist/fonts/OFL-archivo.txt +93 -0
- package/dist/fonts/OFL-bodoni-moda.txt +93 -0
- package/dist/fonts/OFL-hanken-grotesk.txt +93 -0
- package/dist/fonts/OFL-newsreader.txt +93 -0
- package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/dist/fonts/archivo-latin-wdth-italic.woff2 +0 -0
- package/dist/fonts/archivo-latin-wdth-normal.woff2 +0 -0
- package/dist/fonts/bodoni-moda-latin-opsz-italic.woff2 +0 -0
- package/dist/fonts/bodoni-moda-latin-opsz-normal.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-latin-wght-italic.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/fluid-agent-kit/README.md +1 -0
- package/fluid-agent-kit/skills/accessibility.md +3 -1
- package/fluid-agent-kit/skills/css-conventions.md +22 -5
- package/fluid-agent-kit/skills/image-optimization.md +2 -0
- package/fluid-agent-kit/skills/preset-composition.md +108 -0
- package/package.json +36 -11
- package/src/animations/scroll-reveal.css +75 -193
- package/src/components/accordion.css +6 -47
- package/src/components/alert.css +47 -88
- package/src/components/avatar.css +4 -20
- package/src/components/badge.css +25 -48
- package/src/components/button.css +69 -175
- package/src/components/card.css +146 -481
- package/src/components/chip.css +46 -12
- package/src/components/compare.css +234 -0
- package/src/components/dropdown.css +10 -67
- package/src/components/empty-state.css +4 -0
- package/src/components/form.css +113 -81
- package/src/components/gallery.css +252 -0
- package/src/components/hero.css +203 -88
- package/src/components/indicator.css +23 -117
- package/src/components/loading.css +7 -29
- package/src/components/modal.css +12 -65
- package/src/components/nav-modes.css +261 -0
- package/src/components/nav.css +324 -392
- package/src/components/search-input.css +4 -2
- package/src/components/step-indicator.css +26 -27
- package/src/components/table.css +64 -171
- package/src/components/toc.css +254 -0
- package/src/components/tooltip.css +5 -46
- package/src/core/base.css +393 -547
- package/src/core/reset.css +17 -5
- package/src/core/tokens.css +426 -2276
- package/src/fluid.css +258 -17
- package/src/fonts/OFL-newsreader.txt +93 -0
- package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
- package/src/fonts/fluid-fonts.css +55 -0
- package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
- package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
- package/src/layouts/positioning.css +6 -3
- package/src/legacy-1x.css +61 -0
- package/src/sections/cta.css +33 -101
- package/src/sections/features.css +42 -219
- package/src/sections/footer.css +53 -134
- package/src/sections/stats.css +40 -153
- package/src/sections/team.css +24 -113
- package/src/sections/testimonials.css +34 -148
- package/src/zero/base.css +166 -0
- package/src/zero/tokens.css +64 -0
- package/src/zero.css +20 -0
- package/starters/workflows/README.md +40 -0
- package/starters/workflows/dependabot.yml +21 -0
- package/starters/workflows/update-fluid-theme.yml +296 -0
- package/themes/fonts/OFL-archivo.txt +93 -0
- package/themes/fonts/OFL-bodoni-moda.txt +93 -0
- package/themes/fonts/OFL-hanken-grotesk.txt +93 -0
- package/themes/fonts/archivo-latin-wdth-italic.woff2 +0 -0
- package/themes/fonts/archivo-latin-wdth-normal.woff2 +0 -0
- package/themes/fonts/archivo.css +20 -0
- package/themes/fonts/bodoni-moda-latin-opsz-italic.woff2 +0 -0
- package/themes/fonts/bodoni-moda-latin-opsz-normal.woff2 +0 -0
- package/themes/fonts/bodoni.css +35 -0
- package/themes/fonts/hanken-grotesk-latin-wght-italic.woff2 +0 -0
- package/themes/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
- package/themes/gallery.css +105 -0
- package/themes/swiss.css +53 -0
- package/src/components/scroll-progress.css +0 -104
- package/src/components/settings-panel.css +0 -603
- package/src/components/themed-images.css +0 -229
- package/src/components/version-badge.css +0 -70
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluid Theme - the 1.x look, as knob values (dist/fluid-legacy-1x.css)
|
|
3
|
+
*
|
|
4
|
+
* Link it after fluid.min.css and before the site's own stylesheet:
|
|
5
|
+
* <link rel="stylesheet" href="/fluid.min.css">
|
|
6
|
+
* <link rel="stylesheet" href="/fluid-legacy-1x.css">
|
|
7
|
+
* <link rel="stylesheet" href="/site.css">
|
|
8
|
+
* Or link dist/fluid-1x.min.css alone: core and this file in one, for a
|
|
9
|
+
* consumer that serves exactly one theme stylesheet.
|
|
10
|
+
*
|
|
11
|
+
* It brings back the 1.x type sizes and weights, shape, spacing, motion and
|
|
12
|
+
* system fonts. It does not bring back the 1.x role lightness (a small shift) or the 1.x
|
|
13
|
+
* component styles (open cards, square badges, the nav): those are what
|
|
14
|
+
* v2 is. Values only, on :root, in the themes layer: knobs, not variations.
|
|
15
|
+
* Every value here is a documented knob or role (_docs/STATUS.md), never a
|
|
16
|
+
* scale step, so a consumer that inlines its knobs (the stack's brand.ts)
|
|
17
|
+
* can copy them as they are.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
@layer themes {
|
|
21
|
+
:root {
|
|
22
|
+
--accent: oklch(52% 0.16 245);
|
|
23
|
+
--neutral-tint: oklch(50% 0.008 230);
|
|
24
|
+
--font-heading: var(--font-system);
|
|
25
|
+
--font-body: var(--font-system);
|
|
26
|
+
/* 1.x headings: h1 700, h2 and h3 600 (--weight-heading). */
|
|
27
|
+
--weight-display: 700;
|
|
28
|
+
--weight-heading: 600;
|
|
29
|
+
--type-ratio: 1.25;
|
|
30
|
+
--display-max: 3.5rem;
|
|
31
|
+
--measure: 65ch;
|
|
32
|
+
--hero-headline-size: clamp(2rem, 1rem + 5vw, 3.5rem);
|
|
33
|
+
/* The 1.x type: body 16 → 18 (--text-min, --text-max) and the 1.x
|
|
34
|
+
heading clamps through the heading-size knobs, so the steps (the nav
|
|
35
|
+
brand, lede, card title, blockquote) keep their own values. */
|
|
36
|
+
--text-min: 1;
|
|
37
|
+
--text-max: 1.125;
|
|
38
|
+
--h1-size: clamp(1.75rem, 1rem + 4vw, 3.75rem);
|
|
39
|
+
--h2-size: clamp(1.75rem, 1.43rem + 1.61vw, 2.375rem);
|
|
40
|
+
--h3-size: clamp(1.5rem, 1.29rem + 1.04vw, 1.875rem);
|
|
41
|
+
--radius-card: 16px;
|
|
42
|
+
--radius-control: 10px;
|
|
43
|
+
/* In v2 --shadow-style reaches only the elevated card (--shadow-md);
|
|
44
|
+
the 1.x resting and hover shadows on buttons and cards are gone. */
|
|
45
|
+
--shadow-style: 1;
|
|
46
|
+
--space-section: 5rem;
|
|
47
|
+
/* The 1.x gutter, both sides together (12px a side). The per-side edge
|
|
48
|
+
never drops below 3vi, so on a desktop the 1.x 12px is not restored. */
|
|
49
|
+
--space-gutter: 1.5rem;
|
|
50
|
+
--motion-base: 467ms;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* 1.x buttons are the accent in both schemes, with its own text; on the
|
|
54
|
+
nav too, which declares its own (flipped) fills. */
|
|
55
|
+
:root,
|
|
56
|
+
.nav:not([data-bg="plain"], [data-variant="transparent"]), .nav[data-bg="inverse"] {
|
|
57
|
+
--accent-fill: var(--accent);
|
|
58
|
+
--on-accent-fill: var(--on-accent);
|
|
59
|
+
--accent-fill-hover: var(--accent-hover);
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/sections/cta.css
CHANGED
|
@@ -51,103 +51,80 @@
|
|
|
51
51
|
@layer components {
|
|
52
52
|
|
|
53
53
|
/* ========================================
|
|
54
|
-
BASE CTA
|
|
55
|
-
|
|
54
|
+
BASE CTA: a tinted band, start-aligned, a big serif line and actions.
|
|
55
|
+
data-bg on a <section class="cta"> (inverse, accent-strong) repaints it.
|
|
56
56
|
======================================== */
|
|
57
57
|
|
|
58
58
|
.cta {
|
|
59
|
-
--_cta-bg: color-mix(in oklch, var(--accent) 8%, var(--color-surface));
|
|
60
|
-
--_cta-padding-block: var(--space-16);
|
|
61
|
-
--_cta-padding-inline: var(--space-5);
|
|
62
|
-
--_cta-radius: var(--radius-xl);
|
|
63
|
-
|
|
64
59
|
display: flex;
|
|
65
60
|
flex-direction: column;
|
|
66
|
-
align-items:
|
|
67
|
-
gap: var(--space-
|
|
68
|
-
padding-block: var(--
|
|
69
|
-
padding-inline: var(--
|
|
70
|
-
background-color: var(--_cta-bg);
|
|
71
|
-
border-radius: var(--_cta-radius);
|
|
72
|
-
text-align: center;
|
|
73
|
-
max-inline-size: var(--container-xl);
|
|
74
|
-
margin-inline: auto;
|
|
61
|
+
align-items: flex-start;
|
|
62
|
+
gap: var(--space-m);
|
|
63
|
+
padding-block: var(--space-section);
|
|
64
|
+
padding-inline: max(var(--page-edge), (100% - var(--container-content)) / 2);
|
|
75
65
|
}
|
|
76
66
|
|
|
67
|
+
/* A band (data-bg, layouts layer) sets --_band-bg; without one the CTA
|
|
68
|
+
is a surface band. */
|
|
69
|
+
.cta { background-color: var(--_band-bg, var(--color-surface)); }
|
|
70
|
+
|
|
77
71
|
.cta__title {
|
|
78
|
-
font-
|
|
79
|
-
font-
|
|
80
|
-
|
|
72
|
+
font-family: var(--font-heading);
|
|
73
|
+
font-size: var(--step-3);
|
|
74
|
+
font-weight: calc(var(--weight-display) + var(--_dark-weight));
|
|
75
|
+
line-height: var(--leading-heading);
|
|
76
|
+
letter-spacing: var(--tracking-heading);
|
|
77
|
+
text-wrap: balance;
|
|
78
|
+
max-inline-size: 18em;
|
|
81
79
|
margin: 0;
|
|
82
|
-
max-inline-size: var(--container-sm);
|
|
83
80
|
}
|
|
84
81
|
|
|
85
82
|
.cta__description {
|
|
86
|
-
font-size: var(--
|
|
83
|
+
font-size: var(--step-1);
|
|
87
84
|
color: var(--color-text-muted);
|
|
88
|
-
|
|
85
|
+
max-inline-size: 36em;
|
|
89
86
|
margin: 0;
|
|
90
|
-
max-inline-size: var(--container-sm);
|
|
91
87
|
}
|
|
92
88
|
|
|
93
89
|
.cta__actions {
|
|
94
90
|
display: flex;
|
|
95
91
|
flex-wrap: wrap;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
margin-block-start: var(--space-
|
|
92
|
+
align-items: center;
|
|
93
|
+
gap: var(--space-s) var(--space-m);
|
|
94
|
+
margin-block-start: var(--space-xs);
|
|
99
95
|
}
|
|
100
96
|
|
|
101
|
-
|
|
102
|
-
/* ========================================
|
|
103
|
-
SPLIT
|
|
104
|
-
Text + image/form side by side
|
|
105
|
-
======================================== */
|
|
106
|
-
|
|
97
|
+
/* Split: text and an image or form side by side. */
|
|
107
98
|
.cta[data-type="split"] {
|
|
108
99
|
display: grid;
|
|
109
100
|
grid-template-columns: 1fr 1fr;
|
|
110
|
-
gap: var(--space-
|
|
111
|
-
text-align: start;
|
|
101
|
+
gap: var(--space-l);
|
|
112
102
|
align-items: center;
|
|
113
103
|
}
|
|
114
104
|
|
|
115
105
|
.cta[data-type="split"] .cta__content {
|
|
116
106
|
display: flex;
|
|
117
107
|
flex-direction: column;
|
|
118
|
-
gap: var(--space-
|
|
108
|
+
gap: var(--space-m);
|
|
119
109
|
}
|
|
120
110
|
|
|
121
111
|
.cta[data-type="split"] .cta__aside img {
|
|
122
112
|
inline-size: 100%;
|
|
123
113
|
block-size: auto;
|
|
124
|
-
border-radius: var(--radius-
|
|
114
|
+
border-radius: var(--radius-card);
|
|
125
115
|
object-fit: cover;
|
|
126
116
|
}
|
|
127
117
|
|
|
128
118
|
@media (max-width: 48rem) {
|
|
129
|
-
.cta[data-type="split"] {
|
|
130
|
-
grid-template-columns: 1fr;
|
|
131
|
-
text-align: center;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.cta[data-type="split"] .cta__content {
|
|
135
|
-
align-items: center;
|
|
136
|
-
}
|
|
119
|
+
.cta[data-type="split"] { grid-template-columns: 1fr; }
|
|
137
120
|
}
|
|
138
121
|
|
|
139
|
-
|
|
140
|
-
/* ========================================
|
|
141
|
-
NEWSLETTER
|
|
142
|
-
Inline email + submit form
|
|
143
|
-
======================================== */
|
|
144
|
-
|
|
122
|
+
/* Newsletter: inline email + submit. */
|
|
145
123
|
.cta__form {
|
|
146
124
|
display: flex;
|
|
147
|
-
gap: var(--space-
|
|
125
|
+
gap: var(--space-2);
|
|
148
126
|
inline-size: 100%;
|
|
149
|
-
max-inline-size:
|
|
150
|
-
margin-block-start: var(--space-3);
|
|
127
|
+
max-inline-size: 32rem;
|
|
151
128
|
}
|
|
152
129
|
|
|
153
130
|
.cta__form input[type="email"] {
|
|
@@ -155,56 +132,11 @@
|
|
|
155
132
|
min-inline-size: 0;
|
|
156
133
|
}
|
|
157
134
|
|
|
158
|
-
.cta__form .button {
|
|
159
|
-
flex-shrink: 0;
|
|
160
|
-
}
|
|
135
|
+
.cta__form :is(button, .button) { flex-shrink: 0; }
|
|
161
136
|
|
|
162
137
|
@media (max-width: 30rem) {
|
|
163
|
-
.cta__form {
|
|
164
|
-
flex-direction: column;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
/* ========================================
|
|
170
|
-
DOWNLOAD
|
|
171
|
-
App store badges / download buttons
|
|
172
|
-
======================================== */
|
|
173
|
-
|
|
174
|
-
.cta[data-type="download"] .cta__actions {
|
|
175
|
-
gap: var(--space-4);
|
|
138
|
+
.cta__form { flex-direction: column; }
|
|
176
139
|
}
|
|
177
140
|
|
|
178
|
-
.cta[data-type="download"] .cta__actions .button {
|
|
179
|
-
min-inline-size: 10rem;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
/* ========================================
|
|
184
|
-
ACCENT VARIANT
|
|
185
|
-
Stronger background for emphasis
|
|
186
|
-
======================================== */
|
|
187
|
-
|
|
188
|
-
.cta[data-accent] {
|
|
189
|
-
--_cta-bg: var(--accent);
|
|
190
|
-
color: var(--white);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
.cta[data-accent] .cta__title {
|
|
194
|
-
color: var(--white);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.cta[data-accent] .cta__description {
|
|
198
|
-
color: color-mix(in oklch, var(--white) 80%, transparent);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
.cta[data-accent] .button:not([data-variant]) {
|
|
202
|
-
background-color: var(--white);
|
|
203
|
-
color: var(--accent);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
.cta[data-accent] .button[data-variant="outline"] {
|
|
207
|
-
border-color: var(--white);
|
|
208
|
-
color: var(--white);
|
|
209
|
-
}
|
|
141
|
+
.cta[data-type="download"] .cta__actions .button { min-inline-size: 10rem; }
|
|
210
142
|
}
|
|
@@ -58,109 +58,56 @@
|
|
|
58
58
|
*/
|
|
59
59
|
|
|
60
60
|
@layer components {
|
|
61
|
+
/* The band's padding and edges, and the header (a section head), are in
|
|
62
|
+
src/fluid.css (layouts). */
|
|
61
63
|
|
|
62
|
-
/*
|
|
63
|
-
BASE FEATURES SECTION
|
|
64
|
-
======================================== */
|
|
65
|
-
|
|
66
|
-
.features {
|
|
67
|
-
padding-block: var(--space-16);
|
|
68
|
-
padding-inline: var(--space-5);
|
|
69
|
-
max-inline-size: var(--container-xl);
|
|
70
|
-
margin-inline: auto;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.features__header {
|
|
74
|
-
text-align: center;
|
|
75
|
-
max-inline-size: var(--container-md);
|
|
76
|
-
margin-inline: auto;
|
|
77
|
-
margin-block-end: var(--space-12);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.features__header h2 {
|
|
81
|
-
font-size: var(--font-size-3xl);
|
|
82
|
-
font-weight: var(--weight-bold);
|
|
83
|
-
color: var(--color-text);
|
|
84
|
-
margin-block-end: var(--space-3);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.features__header p {
|
|
88
|
-
font-size: var(--font-size-lg);
|
|
89
|
-
color: var(--color-text-muted);
|
|
90
|
-
line-height: var(--leading-relaxed);
|
|
91
|
-
}
|
|
64
|
+
.features__header p:not(.eyebrow, .lede) { color: var(--color-text-muted); } /* the label voice owns the eyebrow's colour */
|
|
92
65
|
|
|
93
66
|
|
|
94
67
|
/* ========================================
|
|
95
68
|
ICON GRID (default)
|
|
96
|
-
|
|
69
|
+
Open items under an ink hairline, like cards; the hairlines line up.
|
|
97
70
|
======================================== */
|
|
98
71
|
|
|
99
72
|
.features__grid {
|
|
100
73
|
display: grid;
|
|
101
|
-
gap: var(--space-
|
|
102
|
-
grid-template-columns: repeat(
|
|
103
|
-
auto-fit,
|
|
104
|
-
minmax(min(100%, 16rem), 1fr)
|
|
105
|
-
);
|
|
74
|
+
gap: var(--features-gap, var(--space-l) var(--space-m));
|
|
75
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--features-min, 16rem)), 1fr));
|
|
106
76
|
}
|
|
107
77
|
|
|
108
78
|
.feature {
|
|
109
|
-
--_feat-padding: var(--space-6);
|
|
110
|
-
--_feat-radius: var(--radius-lg);
|
|
111
|
-
--_feat-bg: var(--color-surface);
|
|
112
|
-
--_feat-border: var(--color-border-subtle);
|
|
113
|
-
|
|
114
79
|
display: flex;
|
|
115
80
|
flex-direction: column;
|
|
116
|
-
gap: var(--space-
|
|
117
|
-
padding: var(--
|
|
118
|
-
|
|
119
|
-
border: var(--border-width) solid var(--_feat-border);
|
|
120
|
-
border-radius: var(--_feat-radius);
|
|
121
|
-
transition:
|
|
122
|
-
box-shadow var(--duration-normal) var(--ease-fluid),
|
|
123
|
-
transform var(--duration-normal) var(--ease-settle);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.feature:hover {
|
|
127
|
-
box-shadow: var(--shadow-md);
|
|
128
|
-
transform: translateY(-2px);
|
|
81
|
+
gap: var(--space-xs);
|
|
82
|
+
padding-block-start: var(--space-s);
|
|
83
|
+
border-block-start: var(--border-width) solid var(--color-border-strong);
|
|
129
84
|
}
|
|
130
85
|
|
|
131
86
|
.feature__icon {
|
|
132
87
|
display: flex;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
border-radius: var(--radius-md);
|
|
138
|
-
background-color: color-mix(in oklch, var(--accent) 12%, transparent);
|
|
139
|
-
color: var(--accent);
|
|
140
|
-
font-size: var(--font-size-xl);
|
|
88
|
+
inline-size: 2.5rem;
|
|
89
|
+
block-size: 2.5rem;
|
|
90
|
+
margin-block-end: var(--space-xs);
|
|
91
|
+
color: var(--accent-ink);
|
|
141
92
|
flex-shrink: 0;
|
|
142
93
|
}
|
|
143
94
|
|
|
144
95
|
.feature__icon svg {
|
|
145
|
-
inline-size:
|
|
146
|
-
block-size:
|
|
96
|
+
inline-size: 100%;
|
|
97
|
+
block-size: 100%;
|
|
147
98
|
stroke: currentColor;
|
|
148
|
-
stroke-width:
|
|
99
|
+
stroke-width: 1.5;
|
|
149
100
|
}
|
|
150
101
|
|
|
151
102
|
.feature__title {
|
|
152
|
-
font-
|
|
153
|
-
font-
|
|
154
|
-
|
|
103
|
+
font-family: var(--font-heading);
|
|
104
|
+
font-size: var(--step-1);
|
|
105
|
+
font-weight: calc(500 + var(--_dark-weight));
|
|
106
|
+
line-height: var(--leading-heading);
|
|
155
107
|
margin: 0;
|
|
156
108
|
}
|
|
157
109
|
|
|
158
|
-
.feature__description {
|
|
159
|
-
font-size: var(--font-size-sm);
|
|
160
|
-
color: var(--color-text-muted);
|
|
161
|
-
line-height: var(--leading-relaxed);
|
|
162
|
-
margin: 0;
|
|
163
|
-
}
|
|
110
|
+
.feature__description { margin: 0; }
|
|
164
111
|
|
|
165
112
|
|
|
166
113
|
/* ========================================
|
|
@@ -171,186 +118,62 @@
|
|
|
171
118
|
.features[data-type="alternating"] .features__grid {
|
|
172
119
|
display: flex;
|
|
173
120
|
flex-direction: column;
|
|
174
|
-
gap: var(--space-
|
|
121
|
+
gap: var(--space-2xl);
|
|
175
122
|
}
|
|
176
123
|
|
|
177
124
|
.features[data-type="alternating"] .feature {
|
|
178
125
|
display: grid;
|
|
179
126
|
grid-template-columns: 1fr 1fr;
|
|
180
|
-
gap: var(--space-
|
|
127
|
+
gap: var(--space-l);
|
|
181
128
|
align-items: center;
|
|
182
129
|
padding: 0;
|
|
183
|
-
|
|
184
|
-
border: none;
|
|
185
|
-
border-radius: 0;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
.features[data-type="alternating"] .feature:hover {
|
|
189
|
-
box-shadow: none;
|
|
190
|
-
transform: none;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
.features[data-type="alternating"] .feature:nth-child(even) {
|
|
194
|
-
direction: rtl;
|
|
130
|
+
border: 0;
|
|
195
131
|
}
|
|
196
132
|
|
|
197
|
-
.features[data-type="alternating"] .feature:nth-child(even) >
|
|
198
|
-
direction: ltr;
|
|
199
|
-
}
|
|
133
|
+
.features[data-type="alternating"] .feature:nth-child(even) > :first-child { order: 2; }
|
|
200
134
|
|
|
201
135
|
.features[data-type="alternating"] .feature__content {
|
|
202
136
|
display: flex;
|
|
203
137
|
flex-direction: column;
|
|
204
|
-
gap: var(--space-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
.features[data-type="alternating"] .feature__title {
|
|
208
|
-
font-size: var(--font-size-2xl);
|
|
138
|
+
gap: var(--space-s);
|
|
209
139
|
}
|
|
210
140
|
|
|
211
|
-
.features[data-type="alternating"] .
|
|
212
|
-
font-size: var(--font-size-base);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.features[data-type="alternating"] .feature__media {
|
|
216
|
-
margin: 0;
|
|
217
|
-
}
|
|
141
|
+
.features[data-type="alternating"] .feature__title { font-size: var(--step-2); }
|
|
218
142
|
|
|
219
|
-
.features[data-type="alternating"] .feature__media
|
|
220
|
-
inline-size: 100%;
|
|
221
|
-
block-size: auto;
|
|
222
|
-
border-radius: var(--radius-lg);
|
|
223
|
-
object-fit: cover;
|
|
224
|
-
}
|
|
143
|
+
.features[data-type="alternating"] .feature__media { margin: 0; }
|
|
225
144
|
|
|
226
145
|
@media (max-width: 48rem) {
|
|
227
|
-
.features[data-type="alternating"] .feature {
|
|
228
|
-
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
.features[data-type="alternating"] .feature:nth-child(even) {
|
|
232
|
-
direction: ltr;
|
|
233
|
-
}
|
|
146
|
+
.features[data-type="alternating"] .feature { grid-template-columns: 1fr; }
|
|
147
|
+
.features[data-type="alternating"] .feature:nth-child(even) > :first-child { order: 0; }
|
|
234
148
|
}
|
|
235
149
|
|
|
236
150
|
|
|
237
151
|
/* ========================================
|
|
238
|
-
|
|
152
|
+
SHOWCASE
|
|
239
153
|
Single feature highlight with large image
|
|
240
154
|
======================================== */
|
|
241
155
|
|
|
242
|
-
.features[data-type="showcase"] {
|
|
243
|
-
text-align: center;
|
|
244
|
-
}
|
|
156
|
+
.features[data-type="showcase"] .feature__media { margin: 0; margin-block-end: var(--space-l); }
|
|
245
157
|
|
|
246
|
-
.features[data-type="showcase"] .
|
|
247
|
-
margin-inline: auto;
|
|
248
|
-
margin-block-end: var(--space-8);
|
|
249
|
-
max-inline-size: var(--container-lg);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
.features[data-type="showcase"] .feature__media img {
|
|
253
|
-
inline-size: 100%;
|
|
254
|
-
block-size: auto;
|
|
255
|
-
border-radius: var(--radius-xl);
|
|
256
|
-
box-shadow: var(--shadow-lg);
|
|
257
|
-
}
|
|
158
|
+
.features[data-type="showcase"] .feature__content { max-inline-size: var(--container-md); }
|
|
258
159
|
|
|
259
|
-
.features[data-type="showcase"] .feature__content {
|
|
260
|
-
max-inline-size: var(--container-md);
|
|
261
|
-
margin-inline: auto;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
.features[data-type="showcase"] .feature__content h2,
|
|
265
|
-
.features[data-type="showcase"] .feature__content h3 {
|
|
266
|
-
font-size: var(--font-size-3xl);
|
|
267
|
-
font-weight: var(--weight-bold);
|
|
268
|
-
margin-block-end: var(--space-4);
|
|
269
|
-
}
|
|
160
|
+
.features[data-type="showcase"] .feature__content :is(h2, h3) { font-size: var(--step-3); }
|
|
270
161
|
|
|
271
|
-
.features[data-type="showcase"] .feature__content p {
|
|
272
|
-
font-size: var(--font-size-lg);
|
|
273
|
-
color: var(--color-text-muted);
|
|
274
|
-
line-height: var(--leading-relaxed);
|
|
275
|
-
}
|
|
162
|
+
.features[data-type="showcase"] .feature__content p { font-size: var(--step-1); }
|
|
276
163
|
|
|
277
164
|
|
|
278
165
|
/* ========================================
|
|
279
|
-
COMPARISON TABLE
|
|
280
|
-
Feature comparison grid
|
|
166
|
+
COMPARISON TABLE (the base table, centred figures)
|
|
281
167
|
======================================== */
|
|
282
168
|
|
|
283
|
-
.features__table {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
text-align: center;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
.features__table th,
|
|
290
|
-
.features__table td {
|
|
291
|
-
padding: var(--space-4) var(--space-5);
|
|
292
|
-
border-block-end: var(--border-width) solid var(--color-border-subtle);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
.features__table thead th {
|
|
296
|
-
font-size: var(--font-size-sm);
|
|
297
|
-
font-weight: var(--weight-semibold, 600);
|
|
298
|
-
color: var(--color-text-muted);
|
|
299
|
-
text-transform: uppercase;
|
|
300
|
-
letter-spacing: var(--tracking-wider);
|
|
301
|
-
padding-block-end: var(--space-4);
|
|
302
|
-
border-block-end-width: 2px;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
.features__table tbody td:first-child {
|
|
306
|
-
text-align: start;
|
|
307
|
-
font-weight: var(--weight-medium, 500);
|
|
308
|
-
color: var(--color-text);
|
|
309
|
-
}
|
|
169
|
+
.features__table { text-align: center; }
|
|
170
|
+
.features__table :is(th, td) { padding-inline: var(--space-s); }
|
|
171
|
+
.features__table :is(th, td):first-child { text-align: start; padding-inline-start: 0; }
|
|
310
172
|
|
|
311
|
-
.features__table tbody td {
|
|
312
|
-
color: var(--color-text-muted);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
.features__table tbody tr:hover {
|
|
316
|
-
background-color: var(--color-surface);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/* Highlighted column */
|
|
320
173
|
.features__table [data-featured] {
|
|
321
|
-
background-color:
|
|
322
|
-
font-weight:
|
|
323
|
-
color: var(--accent);
|
|
174
|
+
background-color: var(--accent-subtle);
|
|
175
|
+
font-weight: 600;
|
|
324
176
|
}
|
|
325
177
|
|
|
326
|
-
.features__table thead [data-featured] {
|
|
327
|
-
color: var(--accent);
|
|
328
|
-
border-block-end-color: var(--accent);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
@media (max-width: 40rem) {
|
|
332
|
-
.features__table {
|
|
333
|
-
font-size: var(--font-size-sm);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
.features__table th,
|
|
337
|
-
.features__table td {
|
|
338
|
-
padding: var(--space-3) var(--space-3);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
/* ========================================
|
|
344
|
-
ACCESSIBILITY
|
|
345
|
-
======================================== */
|
|
346
|
-
|
|
347
|
-
@media (prefers-reduced-motion: reduce) {
|
|
348
|
-
.feature {
|
|
349
|
-
transition: none;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
.feature:hover {
|
|
353
|
-
transform: none;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
178
|
+
.features__table thead [data-featured] { border-block-end-color: var(--accent); }
|
|
356
179
|
}
|