@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,104 @@
1
+ /**
2
+ * Scroll Progress Indicator
3
+ *
4
+ * A thin bar showing page scroll position.
5
+ * Position and animation direction matches the motion style.
6
+ *
7
+ * Usage: Add {% include scroll-progress.html %} to your layout
8
+ *
9
+ * Data attributes:
10
+ * data-position="top" | "bottom" | "left" | "right"
11
+ * data-hidden - Hide the indicator
12
+ */
13
+
14
+ @layer components {
15
+ .scroll-progress {
16
+ --_progress: 0;
17
+ --_size: 3px;
18
+
19
+ position: fixed;
20
+ z-index: var(--z-sticky);
21
+ background-color: var(--accent);
22
+ pointer-events: none;
23
+ opacity: 0.8;
24
+ transition: opacity var(--duration-normal) var(--ease-fluid);
25
+ }
26
+
27
+ /* Hide when at top of page or when disabled */
28
+ .scroll-progress[data-hidden],
29
+ .scroll-progress[data-progress="0"] {
30
+ opacity: 0;
31
+ }
32
+
33
+ /* Top position (default) - horizontal bar */
34
+ .scroll-progress,
35
+ .scroll-progress[data-position="top"] {
36
+ inset-block-start: 0;
37
+ inset-inline-start: 0;
38
+ block-size: var(--_size);
39
+ inline-size: calc(var(--_progress) * 100%);
40
+ }
41
+
42
+ /* Bottom position - horizontal bar */
43
+ .scroll-progress[data-position="bottom"] {
44
+ inset-block-end: 0;
45
+ inset-block-start: auto;
46
+ inset-inline-start: 0;
47
+ block-size: var(--_size);
48
+ inline-size: calc(var(--_progress) * 100%);
49
+ }
50
+
51
+ /* Left position - vertical bar */
52
+ .scroll-progress[data-position="left"] {
53
+ inset-block-start: 0;
54
+ inset-inline-start: 0;
55
+ inline-size: var(--_size);
56
+ block-size: calc(var(--_progress) * 100%);
57
+ }
58
+
59
+ /* Right position - vertical bar */
60
+ .scroll-progress[data-position="right"] {
61
+ inset-block-start: 0;
62
+ inset-inline-end: 0;
63
+ inset-inline-start: auto;
64
+ inline-size: var(--_size);
65
+ block-size: calc(var(--_progress) * 100%);
66
+ }
67
+
68
+ /* Motion style adjustments */
69
+ /* Still: No progress bar by default */
70
+ [data-motion="still"] .scroll-progress {
71
+ display: none;
72
+ }
73
+
74
+ /* Serene/Stream: Very thin, subtle */
75
+ [data-motion="serene"] .scroll-progress,
76
+ [data-motion="stream"] .scroll-progress {
77
+ --_size: 2px;
78
+ opacity: 0.5;
79
+ }
80
+
81
+ /* Flowing: Standard */
82
+ [data-motion="flowing"] .scroll-progress {
83
+ --_size: 3px;
84
+ }
85
+
86
+ /* Cascade: Slightly thicker */
87
+ [data-motion="cascade"] .scroll-progress {
88
+ --_size: 4px;
89
+ }
90
+
91
+ /* Rapids/Tsunami: Bold */
92
+ [data-motion="rapids"] .scroll-progress,
93
+ [data-motion="tsunami"] .scroll-progress {
94
+ --_size: 5px;
95
+ opacity: 0.9;
96
+ }
97
+
98
+ /* Reduced motion: instant updates */
99
+ @media (prefers-reduced-motion: reduce) {
100
+ .scroll-progress {
101
+ transition: none;
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Fluid Framework - Search Input Component
3
+ * @layer components
4
+ *
5
+ * Styled search input with embedded clear button.
6
+ *
7
+ * Usage:
8
+ * <div class="search-input">
9
+ * <svg class="search-input__icon">...</svg>
10
+ * <input type="search" class="search-input__field" placeholder="Search...">
11
+ * <button class="search-input__clear" aria-label="Clear search" hidden>&times;</button>
12
+ * </div>
13
+ *
14
+ * The clear button should be shown/hidden via JS when the input has a value.
15
+ * Sizes: data-size="sm|lg"
16
+ */
17
+
18
+ @layer components {
19
+ .search-input {
20
+ position: relative;
21
+ display: flex;
22
+ align-items: center;
23
+ }
24
+
25
+ .search-input__icon {
26
+ position: absolute;
27
+ inset-inline-start: var(--space-3);
28
+ inline-size: 1.25rem;
29
+ block-size: 1.25rem;
30
+ color: var(--color-text-muted);
31
+ pointer-events: none;
32
+ z-index: var(--z-raised);
33
+ }
34
+
35
+ .search-input__field {
36
+ inline-size: 100%;
37
+ padding-inline-start: var(--space-10);
38
+ padding-inline-end: var(--space-10);
39
+ }
40
+
41
+ /* Hide native search cancel button (webkit) */
42
+ .search-input__field::-webkit-search-cancel-button {
43
+ display: none;
44
+ }
45
+
46
+ .search-input__clear {
47
+ --_btn-bg: transparent;
48
+ --_btn-shadow: none;
49
+
50
+ position: absolute;
51
+ inset-inline-end: var(--space-2);
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ inline-size: 1.75rem;
56
+ block-size: 1.75rem;
57
+ padding: 0;
58
+ border-radius: var(--radius-full);
59
+ font-size: var(--font-size-lg);
60
+ color: var(--color-text-muted);
61
+ cursor: pointer;
62
+ z-index: var(--z-raised);
63
+ transition: color var(--duration-fast) var(--ease-fluid),
64
+ background-color var(--duration-fast) var(--ease-fluid);
65
+ }
66
+
67
+ .search-input__clear:hover {
68
+ color: var(--color-text);
69
+ background-color: var(--color-surface);
70
+ }
71
+
72
+ .search-input__clear:focus-visible {
73
+ color: var(--color-text);
74
+ box-shadow: var(--shadow-glow);
75
+ }
76
+
77
+ /* Hidden by default, shown via JS when input has value */
78
+ .search-input__clear[hidden] {
79
+ display: none;
80
+ }
81
+
82
+
83
+ /* ========================================
84
+ SIZE VARIANTS
85
+ ======================================== */
86
+
87
+ .search-input[data-size="sm"] .search-input__icon {
88
+ inset-inline-start: var(--space-2);
89
+ inline-size: 1rem;
90
+ block-size: 1rem;
91
+ }
92
+
93
+ .search-input[data-size="sm"] .search-input__field {
94
+ padding-inline-start: var(--space-8);
95
+ padding-inline-end: var(--space-8);
96
+ }
97
+
98
+ .search-input[data-size="sm"] .search-input__clear {
99
+ inline-size: 1.5rem;
100
+ block-size: 1.5rem;
101
+ font-size: var(--font-size-base);
102
+ }
103
+
104
+ .search-input[data-size="lg"] .search-input__field {
105
+ padding-inline-start: var(--space-12);
106
+ padding-inline-end: var(--space-12);
107
+ }
108
+
109
+ .search-input[data-size="lg"] .search-input__icon {
110
+ inset-inline-start: var(--space-4);
111
+ inline-size: 1.5rem;
112
+ block-size: 1.5rem;
113
+ }
114
+
115
+
116
+ /* ========================================
117
+ REDUCED MOTION
118
+ ======================================== */
119
+
120
+ @media (prefers-reduced-motion: reduce) {
121
+ .search-input__clear {
122
+ transition: none;
123
+ }
124
+ }
125
+ }