@fluid-theme/core 0.4.3 → 2.0.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.
Files changed (80) hide show
  1. package/AGENTS.md +6 -29
  2. package/CHANGELOG.md +543 -2
  3. package/CLAUDE.md +193 -14
  4. package/GEMINI.md +6 -45
  5. package/README.md +17 -8
  6. package/assets/js/compare.js +77 -0
  7. package/assets/js/fit-text.js +103 -0
  8. package/assets/js/lightbox.js +153 -0
  9. package/assets/js/scroll-reveal.js +72 -0
  10. package/assets/js/toc-build.mjs +86 -0
  11. package/assets/js/toc.js +384 -0
  12. package/dist/fluid-1x.min.css +4 -0
  13. package/dist/fluid-fonts.min.css +2 -0
  14. package/dist/fluid-legacy-1x.css +3 -0
  15. package/dist/fluid-nav.min.css +3 -0
  16. package/dist/fluid-toc.min.css +3 -0
  17. package/dist/fluid-zero.min.css +3 -0
  18. package/dist/fluid.min.css +3 -2
  19. package/dist/fonts/OFL-newsreader.txt +93 -0
  20. package/dist/fonts/OFL-schibsted-grotesk.txt +93 -0
  21. package/dist/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  22. package/dist/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  23. package/dist/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  24. package/dist/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  25. package/fluid-agent-kit/README.md +1 -0
  26. package/fluid-agent-kit/skills/accessibility.md +3 -1
  27. package/fluid-agent-kit/skills/css-conventions.md +22 -5
  28. package/fluid-agent-kit/skills/image-optimization.md +2 -0
  29. package/fluid-agent-kit/skills/preset-composition.md +108 -0
  30. package/package.json +29 -3
  31. package/src/animations/scroll-reveal.css +75 -193
  32. package/src/components/accordion.css +6 -47
  33. package/src/components/alert.css +47 -88
  34. package/src/components/avatar.css +4 -20
  35. package/src/components/badge.css +25 -48
  36. package/src/components/button.css +69 -175
  37. package/src/components/card.css +146 -481
  38. package/src/components/chip.css +46 -12
  39. package/src/components/compare.css +234 -0
  40. package/src/components/dropdown.css +10 -67
  41. package/src/components/empty-state.css +4 -0
  42. package/src/components/form.css +113 -81
  43. package/src/components/gallery.css +252 -0
  44. package/src/components/hero.css +203 -88
  45. package/src/components/indicator.css +23 -117
  46. package/src/components/loading.css +7 -29
  47. package/src/components/modal.css +12 -65
  48. package/src/components/nav-modes.css +261 -0
  49. package/src/components/nav.css +324 -392
  50. package/src/components/search-input.css +4 -2
  51. package/src/components/step-indicator.css +26 -27
  52. package/src/components/table.css +64 -171
  53. package/src/components/toc.css +254 -0
  54. package/src/components/tooltip.css +5 -46
  55. package/src/core/base.css +393 -547
  56. package/src/core/reset.css +17 -5
  57. package/src/core/tokens.css +426 -2276
  58. package/src/fluid.css +258 -17
  59. package/src/fonts/OFL-newsreader.txt +93 -0
  60. package/src/fonts/OFL-schibsted-grotesk.txt +93 -0
  61. package/src/fonts/fluid-fonts.css +55 -0
  62. package/src/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
  63. package/src/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
  64. package/src/fonts/schibsted-grotesk-latin-wght-italic.woff2 +0 -0
  65. package/src/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  66. package/src/layouts/positioning.css +6 -3
  67. package/src/legacy-1x.css +61 -0
  68. package/src/sections/cta.css +33 -101
  69. package/src/sections/features.css +42 -219
  70. package/src/sections/footer.css +53 -134
  71. package/src/sections/stats.css +40 -153
  72. package/src/sections/team.css +24 -113
  73. package/src/sections/testimonials.css +34 -148
  74. package/src/zero/base.css +166 -0
  75. package/src/zero/tokens.css +64 -0
  76. package/src/zero.css +20 -0
  77. package/src/components/scroll-progress.css +0 -104
  78. package/src/components/settings-panel.css +0 -603
  79. package/src/components/themed-images.css +0 -229
  80. 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
+ }
@@ -51,103 +51,80 @@
51
51
  @layer components {
52
52
 
53
53
  /* ========================================
54
- BASE CTA
55
- Full-width banner (default)
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: center;
67
- gap: var(--space-5);
68
- padding-block: var(--_cta-padding-block);
69
- padding-inline: var(--_cta-padding-inline);
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-size: var(--font-size-3xl);
79
- font-weight: var(--weight-bold);
80
- color: var(--color-text);
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(--font-size-lg);
83
+ font-size: var(--step-1);
87
84
  color: var(--color-text-muted);
88
- line-height: var(--leading-relaxed);
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
- gap: var(--space-3);
97
- justify-content: center;
98
- margin-block-start: var(--space-3);
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-10);
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-4);
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-lg);
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-3);
125
+ gap: var(--space-2);
148
126
  inline-size: 100%;
149
- max-inline-size: 28rem;
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
- 3-4 column responsive grid of feature cards
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-8);
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-3);
117
- padding: var(--_feat-padding);
118
- background-color: var(--_feat-bg);
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
- align-items: center;
134
- justify-content: center;
135
- inline-size: var(--space-12);
136
- block-size: var(--space-12);
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: 1.5em;
146
- block-size: 1.5em;
96
+ inline-size: 100%;
97
+ block-size: 100%;
147
98
  stroke: currentColor;
148
- stroke-width: 2;
99
+ stroke-width: 1.5;
149
100
  }
150
101
 
151
102
  .feature__title {
152
- font-size: var(--font-size-lg);
153
- font-weight: var(--weight-semibold, 600);
154
- color: var(--color-text);
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-16);
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-10);
127
+ gap: var(--space-l);
181
128
  align-items: center;
182
129
  padding: 0;
183
- background: none;
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-4);
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"] .feature__description {
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 img {
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
- grid-template-columns: 1fr;
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
- CENTERED SHOWCASE
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"] .feature__media {
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
- inline-size: 100%;
285
- border-collapse: collapse;
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: color-mix(in oklch, var(--accent) 8%, transparent);
322
- font-weight: var(--weight-semibold, 600);
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
  }