@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,626 @@
1
+ /**
2
+ * Fluid Framework - Positioning System
3
+ * @layer layouts
4
+ *
5
+ * A simple, flexible system for positioning content within containers.
6
+ * Same HTML, different layouts - just change a data attribute.
7
+ *
8
+ * Philosophy:
9
+ * - Finite options, not infinite (left/center/right, start/center/end)
10
+ * - Data attributes for easy editor/CMS integration
11
+ * - Works on any container (sections, cards, divs)
12
+ * - Composable - combine alignment options as needed
13
+ *
14
+ * Usage:
15
+ * <section data-align="center">Centered text</section>
16
+ * <section data-layout="center">Centered content block</section>
17
+ * <section data-layout="split">Two columns</section>
18
+ */
19
+
20
+ @layer layouts {
21
+
22
+ /* ========================================
23
+ TEXT ALIGNMENT
24
+ Controls text-align within the element
25
+ ======================================== */
26
+
27
+ [data-align="start"] {
28
+ text-align: start;
29
+ }
30
+
31
+ [data-align="center"] {
32
+ text-align: center;
33
+ }
34
+
35
+ [data-align="end"] {
36
+ text-align: end;
37
+ }
38
+
39
+
40
+ /* ========================================
41
+ CONTENT POSITIONING
42
+ For block-level content positioning
43
+ Uses flexbox for vertical centering
44
+ ======================================== */
45
+
46
+ /* Horizontal content position within flex/grid containers */
47
+ [data-items="start"] {
48
+ align-items: flex-start;
49
+ }
50
+
51
+ [data-items="center"] {
52
+ align-items: center;
53
+ }
54
+
55
+ [data-items="end"] {
56
+ align-items: flex-end;
57
+ }
58
+
59
+ /* Justify content (main axis) */
60
+ [data-justify="start"] {
61
+ justify-content: flex-start;
62
+ }
63
+
64
+ [data-justify="center"] {
65
+ justify-content: center;
66
+ }
67
+
68
+ [data-justify="end"] {
69
+ justify-content: flex-end;
70
+ }
71
+
72
+ [data-justify="between"] {
73
+ justify-content: space-between;
74
+ }
75
+
76
+
77
+ /* ========================================
78
+ PLACE - Combined alignment (Grid shorthand)
79
+ For simple center-center type layouts
80
+ ======================================== */
81
+
82
+ [data-place="center"] {
83
+ display: grid;
84
+ place-items: center;
85
+ }
86
+
87
+ [data-place="start"] {
88
+ display: grid;
89
+ place-items: start;
90
+ }
91
+
92
+ [data-place="end"] {
93
+ display: grid;
94
+ place-items: end;
95
+ }
96
+
97
+
98
+ /* ========================================
99
+ SECTION LAYOUTS
100
+ Common content arrangement patterns
101
+ These turn any element into a layout container
102
+ ======================================== */
103
+
104
+ /*
105
+ * LAYOUT: center
106
+ * Content block centered horizontally
107
+ * Good for: hero headlines, centered sections
108
+ */
109
+ [data-layout="center"] {
110
+ display: flex;
111
+ flex-direction: column;
112
+ align-items: center;
113
+ text-align: center;
114
+ }
115
+
116
+ [data-layout="center"] > * {
117
+ max-inline-size: var(--content-width, var(--container-md));
118
+ }
119
+
120
+ /*
121
+ * LAYOUT: left
122
+ * Content aligned to start (left in LTR)
123
+ * Good for: standard content, articles
124
+ */
125
+ [data-layout="left"] {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ text-align: start;
130
+ }
131
+
132
+ [data-layout="left"] > * {
133
+ max-inline-size: var(--content-width, var(--container-md));
134
+ }
135
+
136
+ /*
137
+ * LAYOUT: right
138
+ * Content aligned to end (right in LTR)
139
+ * Good for: alternate sections, variation
140
+ */
141
+ [data-layout="right"] {
142
+ display: flex;
143
+ flex-direction: column;
144
+ align-items: flex-end;
145
+ text-align: start; /* Text still reads left-to-right */
146
+ }
147
+
148
+ [data-layout="right"] > * {
149
+ max-inline-size: var(--content-width, var(--container-md));
150
+ }
151
+
152
+ /*
153
+ * LAYOUT: split
154
+ * Two-column layout: content | media (or any two children)
155
+ * Good for: hero with image, feature sections
156
+ */
157
+ [data-layout="split"] {
158
+ display: grid;
159
+ grid-template-columns: 1fr 1fr;
160
+ gap: var(--split-gap, var(--space-8));
161
+ align-items: center;
162
+ }
163
+
164
+ /*
165
+ * LAYOUT: split-reverse
166
+ * Two-column layout: media | content (reversed)
167
+ * Good for: alternating sections
168
+ */
169
+ [data-layout="split-reverse"] {
170
+ display: grid;
171
+ grid-template-columns: 1fr 1fr;
172
+ gap: var(--split-gap, var(--space-8));
173
+ align-items: center;
174
+ }
175
+
176
+ [data-layout="split-reverse"] > :first-child {
177
+ order: 2;
178
+ }
179
+
180
+ [data-layout="split-reverse"] > :last-child {
181
+ order: 1;
182
+ }
183
+
184
+ /*
185
+ * LAYOUT: stack
186
+ * Vertical stack with controlled gap
187
+ * Good for: any vertical content flow
188
+ */
189
+ [data-layout="stack"] {
190
+ display: flex;
191
+ flex-direction: column;
192
+ gap: var(--stack-gap, var(--space-5));
193
+ }
194
+
195
+ /*
196
+ * LAYOUT: overlay
197
+ * Content positioned over background (for heroes with bg images)
198
+ * Requires a background to be set separately
199
+ */
200
+ [data-layout="overlay"] {
201
+ display: grid;
202
+ place-items: center;
203
+ text-align: center;
204
+ position: relative;
205
+ isolation: isolate;
206
+ }
207
+
208
+ [data-layout="overlay"]::before {
209
+ content: "";
210
+ position: absolute;
211
+ inset: 0;
212
+ background: var(--overlay-color, oklch(0% 0 0 / 0.4));
213
+ z-index: -1;
214
+ }
215
+
216
+
217
+ /* ========================================
218
+ RESPONSIVE LAYOUTS
219
+ Split layouts stack on narrow containers
220
+ ======================================== */
221
+
222
+ @container (max-width: 40rem) {
223
+ [data-layout="split"],
224
+ [data-layout="split-reverse"] {
225
+ grid-template-columns: 1fr;
226
+ }
227
+
228
+ [data-layout="split-reverse"] > :first-child {
229
+ order: 1;
230
+ }
231
+
232
+ [data-layout="split-reverse"] > :last-child {
233
+ order: 2;
234
+ }
235
+ }
236
+
237
+ /* Media query fallback for when container-type is not set on ancestor */
238
+ @media (max-width: 40rem) {
239
+ [data-layout="split"],
240
+ [data-layout="split-reverse"] {
241
+ grid-template-columns: 1fr;
242
+ }
243
+
244
+ [data-layout="split-reverse"] > :first-child {
245
+ order: 1;
246
+ }
247
+
248
+ [data-layout="split-reverse"] > :last-child {
249
+ order: 2;
250
+ }
251
+ }
252
+
253
+
254
+ /* ========================================
255
+ CONTENT WIDTH CONTROL
256
+ Constrain content width within layouts
257
+ ======================================== */
258
+
259
+ [data-width="narrow"] {
260
+ --content-width: var(--container-sm);
261
+ }
262
+
263
+ [data-width="default"] {
264
+ --content-width: var(--container-md);
265
+ }
266
+
267
+ [data-width="wide"] {
268
+ --content-width: var(--container-lg);
269
+ }
270
+
271
+ [data-width="full"] {
272
+ --content-width: 100%;
273
+ }
274
+
275
+
276
+ /* ========================================
277
+ VERTICAL ALIGNMENT (within containers)
278
+ For positioning content vertically
279
+ ======================================== */
280
+
281
+ [data-valign="start"] {
282
+ align-content: start;
283
+ align-items: flex-start;
284
+ }
285
+
286
+ [data-valign="center"] {
287
+ align-content: center;
288
+ align-items: center;
289
+ }
290
+
291
+ [data-valign="end"] {
292
+ align-content: end;
293
+ align-items: flex-end;
294
+ }
295
+
296
+
297
+ /* ========================================
298
+ GAP CONTROL
299
+ Override default gaps
300
+ ======================================== */
301
+
302
+ [data-gap="none"] {
303
+ gap: 0;
304
+ }
305
+
306
+ [data-gap="sm"] {
307
+ gap: var(--space-3);
308
+ }
309
+
310
+ [data-gap="md"] {
311
+ gap: var(--space-5);
312
+ }
313
+
314
+ [data-gap="lg"] {
315
+ gap: var(--space-8);
316
+ }
317
+
318
+ [data-gap="xl"] {
319
+ gap: var(--space-12);
320
+ }
321
+
322
+
323
+ /* ========================================
324
+ PADDING CONTROL
325
+ Section padding variations
326
+ ======================================== */
327
+
328
+ [data-padding="none"] {
329
+ padding-block: 0;
330
+ }
331
+
332
+ [data-padding="sm"] {
333
+ padding-block: var(--space-8);
334
+ }
335
+
336
+ [data-padding="md"] {
337
+ padding-block: var(--space-12);
338
+ }
339
+
340
+ [data-padding="lg"] {
341
+ padding-block: var(--space-16);
342
+ }
343
+
344
+ [data-padding="xl"] {
345
+ padding-block: var(--space-24);
346
+ }
347
+
348
+ /* Reduce vertical padding on mobile — large values waste screen space */
349
+ @media (max-width: 40rem) {
350
+ [data-padding="lg"] {
351
+ padding-block: var(--space-10);
352
+ }
353
+
354
+ [data-padding="xl"] {
355
+ padding-block: var(--space-12);
356
+ }
357
+ }
358
+
359
+
360
+ /* ========================================
361
+ INLINE PADDING CONTROL
362
+ Horizontal padding for content spacing from edges
363
+ ======================================== */
364
+
365
+ [data-padding-inline="none"] {
366
+ padding-inline: 0;
367
+ }
368
+
369
+ [data-padding-inline="sm"] {
370
+ padding-inline: var(--space-4);
371
+ }
372
+
373
+ [data-padding-inline="md"] {
374
+ padding-inline: var(--space-6);
375
+ }
376
+
377
+ [data-padding-inline="lg"] {
378
+ padding-inline: var(--space-8);
379
+ }
380
+
381
+ [data-padding-inline="xl"] {
382
+ padding-inline: var(--space-12);
383
+ }
384
+
385
+
386
+ /* ========================================
387
+ FLEX UTILITIES
388
+ Composable flex layout controls
389
+ ======================================== */
390
+
391
+ /* Flex direction */
392
+ [data-flex] {
393
+ display: flex;
394
+ }
395
+
396
+ [data-flex="row"] {
397
+ display: flex;
398
+ flex-direction: row;
399
+ }
400
+
401
+ [data-flex="col"] {
402
+ display: flex;
403
+ flex-direction: column;
404
+ }
405
+
406
+ [data-flex="row-reverse"] {
407
+ display: flex;
408
+ flex-direction: row-reverse;
409
+ }
410
+
411
+ [data-flex="col-reverse"] {
412
+ display: flex;
413
+ flex-direction: column-reverse;
414
+ }
415
+
416
+ /* Flex wrap */
417
+ [data-wrap] {
418
+ flex-wrap: wrap;
419
+ }
420
+
421
+ [data-wrap="nowrap"] {
422
+ flex-wrap: nowrap;
423
+ }
424
+
425
+ /* Flex child: grow/shrink */
426
+ [data-grow] {
427
+ flex-grow: 1;
428
+ }
429
+
430
+ [data-shrink="0"] {
431
+ flex-shrink: 0;
432
+ }
433
+
434
+ /* Flex basis shortcuts */
435
+ [data-basis="full"] { flex-basis: 100%; }
436
+ [data-basis="half"] { flex-basis: 50%; }
437
+ [data-basis="third"] { flex-basis: 33.333%; }
438
+ [data-basis="quarter"] { flex-basis: 25%; }
439
+
440
+
441
+ /* ========================================
442
+ GRID UTILITIES
443
+ Composable grid layout controls
444
+ ======================================== */
445
+
446
+ /* Explicit column grids */
447
+ [data-grid] {
448
+ display: grid;
449
+ }
450
+
451
+ [data-grid="2"] {
452
+ display: grid;
453
+ grid-template-columns: repeat(2, 1fr);
454
+ gap: var(--grid-gap, var(--space-5));
455
+ }
456
+
457
+ [data-grid="3"] {
458
+ display: grid;
459
+ grid-template-columns: repeat(3, 1fr);
460
+ gap: var(--grid-gap, var(--space-5));
461
+ }
462
+
463
+ [data-grid="4"] {
464
+ display: grid;
465
+ grid-template-columns: repeat(4, 1fr);
466
+ gap: var(--grid-gap, var(--space-5));
467
+ }
468
+
469
+ /* Auto-fit responsive grids */
470
+ [data-grid="auto-sm"] {
471
+ display: grid;
472
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr));
473
+ gap: var(--grid-gap, var(--space-5));
474
+ }
475
+
476
+ [data-grid="auto"] {
477
+ display: grid;
478
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
479
+ gap: var(--grid-gap, var(--space-5));
480
+ }
481
+
482
+ [data-grid="auto-lg"] {
483
+ display: grid;
484
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
485
+ gap: var(--grid-gap, var(--space-5));
486
+ }
487
+
488
+ /* Grid span */
489
+ [data-span="2"] { grid-column: span 2; }
490
+ [data-span="3"] { grid-column: span 3; }
491
+ [data-span="full"] { grid-column: 1 / -1; }
492
+
493
+ /* Responsive: multi-column grids collapse on mobile */
494
+ @media (max-width: 40rem) {
495
+ [data-grid="2"],
496
+ [data-grid="3"],
497
+ [data-grid="4"] {
498
+ grid-template-columns: 1fr;
499
+ }
500
+
501
+ [data-span="2"],
502
+ [data-span="3"],
503
+ [data-span="full"] {
504
+ grid-column: auto;
505
+ }
506
+ }
507
+
508
+ @media (min-width: 40rem) and (max-width: 64rem) {
509
+ [data-grid="3"],
510
+ [data-grid="4"] {
511
+ grid-template-columns: repeat(2, 1fr);
512
+ }
513
+ }
514
+
515
+
516
+ /* ========================================
517
+ COMMON LAYOUT PATTERNS
518
+ Pre-built structural layouts
519
+ ======================================== */
520
+
521
+ /*
522
+ * LAYOUT: sidebar
523
+ * Content with a fixed-width sidebar
524
+ * Sidebar is first child, content is second
525
+ */
526
+ [data-layout="sidebar"] {
527
+ display: grid;
528
+ grid-template-columns: minmax(12rem, 16rem) 1fr;
529
+ gap: var(--space-6);
530
+ align-items: start;
531
+ }
532
+
533
+ [data-layout="sidebar-right"] {
534
+ display: grid;
535
+ grid-template-columns: 1fr minmax(12rem, 16rem);
536
+ gap: var(--space-6);
537
+ align-items: start;
538
+ }
539
+
540
+ /* Responsive: sidebar stacks on narrow screens */
541
+ @media (max-width: 48rem) {
542
+ [data-layout="sidebar"],
543
+ [data-layout="sidebar-right"] {
544
+ grid-template-columns: 1fr;
545
+ }
546
+ }
547
+
548
+ /*
549
+ * LAYOUT: holy-grail
550
+ * Classic 3-column layout: sidebar | content | sidebar
551
+ */
552
+ [data-layout="holy-grail"] {
553
+ display: grid;
554
+ grid-template-columns: minmax(10rem, 14rem) 1fr minmax(10rem, 14rem);
555
+ gap: var(--space-6);
556
+ align-items: start;
557
+ }
558
+
559
+ @media (max-width: 64rem) {
560
+ [data-layout="holy-grail"] {
561
+ grid-template-columns: 1fr;
562
+ }
563
+ }
564
+
565
+ /*
566
+ * LAYOUT: dashboard
567
+ * Dense auto-fill grid for dashboard cards/widgets
568
+ */
569
+ [data-layout="dashboard"] {
570
+ display: grid;
571
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 18rem), 1fr));
572
+ gap: var(--space-5);
573
+ align-items: start;
574
+ }
575
+
576
+
577
+ /* ========================================
578
+ POSITION UTILITIES
579
+ Static positioning helpers
580
+ ======================================== */
581
+
582
+ [data-position="sticky"] {
583
+ position: sticky;
584
+ inset-block-start: 0;
585
+ z-index: var(--z-sticky);
586
+ }
587
+
588
+ [data-position="relative"] {
589
+ position: relative;
590
+ }
591
+
592
+ /* Overflow control */
593
+ [data-overflow="hidden"] { overflow: hidden; }
594
+ [data-overflow="auto"] { overflow: auto; }
595
+ [data-overflow="scroll"] { overflow: scroll; }
596
+
597
+ /* Z-index layers */
598
+ [data-z="base"] { z-index: var(--z-base); }
599
+ [data-z="raised"] { z-index: var(--z-raised); }
600
+ [data-z="dropdown"] { z-index: var(--z-dropdown); }
601
+ [data-z="overlay"] { z-index: var(--z-overlay); }
602
+
603
+
604
+ /* ========================================
605
+ DISPLAY UTILITIES
606
+ ======================================== */
607
+
608
+ [data-display="none"] { display: none; }
609
+ [data-display="block"] { display: block; }
610
+ [data-display="inline"] { display: inline; }
611
+ [data-display="inline-flex"] { display: inline-flex; }
612
+ [data-display="inline-block"] { display: inline-block; }
613
+
614
+ /* Responsive visibility */
615
+ @media (max-width: 40rem) {
616
+ [data-hide="mobile"] { display: none; }
617
+ }
618
+
619
+ @media (min-width: 40rem) and (max-width: 64rem) {
620
+ [data-hide="tablet"] { display: none; }
621
+ }
622
+
623
+ @media (min-width: 64rem) {
624
+ [data-hide="desktop"] { display: none; }
625
+ }
626
+ }