@fluid-theme/core 0.4.3

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 (48) hide show
  1. package/AGENTS.md +32 -0
  2. package/CHANGELOG.md +159 -0
  3. package/CLAUDE.md +104 -0
  4. package/GEMINI.md +48 -0
  5. package/LICENSE +21 -0
  6. package/README.md +253 -0
  7. package/dist/fluid.min.css +2 -0
  8. package/fluid-agent-kit/README.md +57 -0
  9. package/fluid-agent-kit/skills/accessibility.md +41 -0
  10. package/fluid-agent-kit/skills/css-conventions.md +51 -0
  11. package/fluid-agent-kit/skills/image-optimization.md +115 -0
  12. package/fluid-agent-kit/skills/ux-rules.md +43 -0
  13. package/package.json +68 -0
  14. package/src/animations/scroll-reveal.css +224 -0
  15. package/src/components/accordion.css +250 -0
  16. package/src/components/alert.css +453 -0
  17. package/src/components/avatar.css +192 -0
  18. package/src/components/badge.css +182 -0
  19. package/src/components/button.css +387 -0
  20. package/src/components/card.css +650 -0
  21. package/src/components/chip.css +143 -0
  22. package/src/components/dropdown.css +335 -0
  23. package/src/components/empty-state.css +105 -0
  24. package/src/components/form.css +508 -0
  25. package/src/components/hero.css +293 -0
  26. package/src/components/indicator.css +455 -0
  27. package/src/components/loading.css +274 -0
  28. package/src/components/modal.css +364 -0
  29. package/src/components/nav.css +726 -0
  30. package/src/components/scroll-progress.css +104 -0
  31. package/src/components/search-input.css +125 -0
  32. package/src/components/settings-panel.css +603 -0
  33. package/src/components/step-indicator.css +188 -0
  34. package/src/components/table.css +350 -0
  35. package/src/components/themed-images.css +229 -0
  36. package/src/components/tooltip.css +247 -0
  37. package/src/components/version-badge.css +70 -0
  38. package/src/core/base.css +884 -0
  39. package/src/core/reset.css +159 -0
  40. package/src/core/tokens.css +2416 -0
  41. package/src/fluid.css +242 -0
  42. package/src/layouts/positioning.css +626 -0
  43. package/src/sections/cta.css +210 -0
  44. package/src/sections/features.css +356 -0
  45. package/src/sections/footer.css +283 -0
  46. package/src/sections/stats.css +234 -0
  47. package/src/sections/team.css +181 -0
  48. package/src/sections/testimonials.css +251 -0
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Fluid Framework - Call-to-Action Sections
3
+ * @layer components
4
+ *
5
+ * Conversion-focused sections for signups, downloads, and engagement.
6
+ * Four layout variants via data-type attribute.
7
+ *
8
+ * Usage:
9
+ * <!-- Full-width banner (default) -->
10
+ * <section class="cta" aria-label="Call to action">
11
+ * <h2 class="cta__title">Ready to get started?</h2>
12
+ * <p class="cta__description">Join thousands of happy users today.</p>
13
+ * <div class="cta__actions">
14
+ * <a href="#" class="button" data-variant="primary">Start Free</a>
15
+ * <a href="#" class="button" data-variant="outline">Learn More</a>
16
+ * </div>
17
+ * </section>
18
+ *
19
+ * <!-- Split layout -->
20
+ * <section class="cta" data-type="split" aria-label="Call to action">
21
+ * <div class="cta__content">
22
+ * <h2 class="cta__title">Title</h2>
23
+ * <p class="cta__description">Description</p>
24
+ * </div>
25
+ * <div class="cta__aside">
26
+ * <img src="..." alt="...">
27
+ * </div>
28
+ * </section>
29
+ *
30
+ * <!-- Newsletter -->
31
+ * <section class="cta" data-type="newsletter" aria-label="Newsletter signup">
32
+ * <h2 class="cta__title">Stay in the loop</h2>
33
+ * <p class="cta__description">Get updates straight to your inbox.</p>
34
+ * <form class="cta__form">
35
+ * <input type="email" placeholder="you@example.com" required>
36
+ * <button type="submit" class="button">Subscribe</button>
37
+ * </form>
38
+ * </section>
39
+ *
40
+ * <!-- App download -->
41
+ * <section class="cta" data-type="download" aria-label="Download app">
42
+ * <h2 class="cta__title">Get the app</h2>
43
+ * <p class="cta__description">Available on all platforms.</p>
44
+ * <div class="cta__actions">
45
+ * <a href="#" class="button" data-size="lg">App Store</a>
46
+ * <a href="#" class="button" data-size="lg" data-variant="outline">Google Play</a>
47
+ * </div>
48
+ * </section>
49
+ */
50
+
51
+ @layer components {
52
+
53
+ /* ========================================
54
+ BASE CTA
55
+ Full-width banner (default)
56
+ ======================================== */
57
+
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
+ display: flex;
65
+ 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;
75
+ }
76
+
77
+ .cta__title {
78
+ font-size: var(--font-size-3xl);
79
+ font-weight: var(--weight-bold);
80
+ color: var(--color-text);
81
+ margin: 0;
82
+ max-inline-size: var(--container-sm);
83
+ }
84
+
85
+ .cta__description {
86
+ font-size: var(--font-size-lg);
87
+ color: var(--color-text-muted);
88
+ line-height: var(--leading-relaxed);
89
+ margin: 0;
90
+ max-inline-size: var(--container-sm);
91
+ }
92
+
93
+ .cta__actions {
94
+ display: flex;
95
+ flex-wrap: wrap;
96
+ gap: var(--space-3);
97
+ justify-content: center;
98
+ margin-block-start: var(--space-3);
99
+ }
100
+
101
+
102
+ /* ========================================
103
+ SPLIT
104
+ Text + image/form side by side
105
+ ======================================== */
106
+
107
+ .cta[data-type="split"] {
108
+ display: grid;
109
+ grid-template-columns: 1fr 1fr;
110
+ gap: var(--space-10);
111
+ text-align: start;
112
+ align-items: center;
113
+ }
114
+
115
+ .cta[data-type="split"] .cta__content {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: var(--space-4);
119
+ }
120
+
121
+ .cta[data-type="split"] .cta__aside img {
122
+ inline-size: 100%;
123
+ block-size: auto;
124
+ border-radius: var(--radius-lg);
125
+ object-fit: cover;
126
+ }
127
+
128
+ @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
+ }
137
+ }
138
+
139
+
140
+ /* ========================================
141
+ NEWSLETTER
142
+ Inline email + submit form
143
+ ======================================== */
144
+
145
+ .cta__form {
146
+ display: flex;
147
+ gap: var(--space-3);
148
+ inline-size: 100%;
149
+ max-inline-size: 28rem;
150
+ margin-block-start: var(--space-3);
151
+ }
152
+
153
+ .cta__form input[type="email"] {
154
+ flex: 1;
155
+ min-inline-size: 0;
156
+ }
157
+
158
+ .cta__form .button {
159
+ flex-shrink: 0;
160
+ }
161
+
162
+ @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);
176
+ }
177
+
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
+ }
210
+ }
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Fluid Framework - Feature Sections
3
+ * @layer components
4
+ *
5
+ * Pre-built layouts for showcasing product features, service offerings,
6
+ * and key benefits. Four layout variants via data-type attribute.
7
+ *
8
+ * Usage:
9
+ * <!-- Icon Grid (default) -->
10
+ * <section class="features">
11
+ * <header class="features__header">
12
+ * <h2>Features</h2>
13
+ * <p>Why teams choose us</p>
14
+ * </header>
15
+ * <div class="features__grid">
16
+ * <article class="feature">
17
+ * <div class="feature__icon"><svg>...</svg></div>
18
+ * <h3 class="feature__title">Fast</h3>
19
+ * <p class="feature__description">Loads in milliseconds.</p>
20
+ * </article>
21
+ * </div>
22
+ * </section>
23
+ *
24
+ * <!-- Alternating rows -->
25
+ * <section class="features" data-type="alternating">
26
+ * <article class="feature">
27
+ * <div class="feature__content">
28
+ * <h3 class="feature__title">Title</h3>
29
+ * <p class="feature__description">Description</p>
30
+ * </div>
31
+ * <figure class="feature__media">
32
+ * <img src="..." alt="...">
33
+ * </figure>
34
+ * </article>
35
+ * </section>
36
+ *
37
+ * <!-- Centered showcase -->
38
+ * <section class="features" data-type="showcase">
39
+ * <figure class="feature__media">
40
+ * <img src="..." alt="...">
41
+ * </figure>
42
+ * <div class="feature__content">
43
+ * <h2>Feature Name</h2>
44
+ * <p>Details about the feature.</p>
45
+ * </div>
46
+ * </section>
47
+ *
48
+ * <!-- Comparison table -->
49
+ * <section class="features" data-type="comparison">
50
+ * <header class="features__header">
51
+ * <h2>Compare Plans</h2>
52
+ * </header>
53
+ * <table class="features__table">
54
+ * <thead><tr><th>Feature</th><th>Basic</th><th>Pro</th></tr></thead>
55
+ * <tbody><tr><td>Storage</td><td>5 GB</td><td>100 GB</td></tr></tbody>
56
+ * </table>
57
+ * </section>
58
+ */
59
+
60
+ @layer components {
61
+
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
+ }
92
+
93
+
94
+ /* ========================================
95
+ ICON GRID (default)
96
+ 3-4 column responsive grid of feature cards
97
+ ======================================== */
98
+
99
+ .features__grid {
100
+ display: grid;
101
+ gap: var(--space-8);
102
+ grid-template-columns: repeat(
103
+ auto-fit,
104
+ minmax(min(100%, 16rem), 1fr)
105
+ );
106
+ }
107
+
108
+ .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
+ display: flex;
115
+ 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);
129
+ }
130
+
131
+ .feature__icon {
132
+ 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);
141
+ flex-shrink: 0;
142
+ }
143
+
144
+ .feature__icon svg {
145
+ inline-size: 1.5em;
146
+ block-size: 1.5em;
147
+ stroke: currentColor;
148
+ stroke-width: 2;
149
+ }
150
+
151
+ .feature__title {
152
+ font-size: var(--font-size-lg);
153
+ font-weight: var(--weight-semibold, 600);
154
+ color: var(--color-text);
155
+ margin: 0;
156
+ }
157
+
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
+ }
164
+
165
+
166
+ /* ========================================
167
+ ALTERNATING
168
+ Image/text rows that swap sides
169
+ ======================================== */
170
+
171
+ .features[data-type="alternating"] .features__grid {
172
+ display: flex;
173
+ flex-direction: column;
174
+ gap: var(--space-16);
175
+ }
176
+
177
+ .features[data-type="alternating"] .feature {
178
+ display: grid;
179
+ grid-template-columns: 1fr 1fr;
180
+ gap: var(--space-10);
181
+ align-items: center;
182
+ 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;
195
+ }
196
+
197
+ .features[data-type="alternating"] .feature:nth-child(even) > * {
198
+ direction: ltr;
199
+ }
200
+
201
+ .features[data-type="alternating"] .feature__content {
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: var(--space-4);
205
+ }
206
+
207
+ .features[data-type="alternating"] .feature__title {
208
+ font-size: var(--font-size-2xl);
209
+ }
210
+
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
+ }
218
+
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
+ }
225
+
226
+ @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
+ }
234
+ }
235
+
236
+
237
+ /* ========================================
238
+ CENTERED SHOWCASE
239
+ Single feature highlight with large image
240
+ ======================================== */
241
+
242
+ .features[data-type="showcase"] {
243
+ text-align: center;
244
+ }
245
+
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
+ }
258
+
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
+ }
270
+
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
+ }
276
+
277
+
278
+ /* ========================================
279
+ COMPARISON TABLE
280
+ Feature comparison grid
281
+ ======================================== */
282
+
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
+ }
310
+
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
+ .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);
324
+ }
325
+
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
+ }
356
+ }