@vanduo-oss/framework 1.3.4 → 1.3.7

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.
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Vanduo Framework - Water Morph Effect
3
+ * Liquid wave content-swap animation on click
4
+ *
5
+ * Usage:
6
+ * Add `.vd-morph` (or `data-vd-morph`) to any element.
7
+ * Inside it, place:
8
+ * .vd-morph-wave — radial wave layer (auto-created by JS if missing)
9
+ * .vd-morph-shine — light-sweep layer (auto-created by JS if missing)
10
+ * .vd-morph-content.vd-morph-current — visible state
11
+ * .vd-morph-content.vd-morph-next — hidden next state
12
+ */
13
+
14
+ :root {
15
+ --morph-duration: 0.75s;
16
+ --morph-easing: cubic-bezier(0.2, 0.8, 0.35, 1);
17
+ --morph-blur-peak: 11px;
18
+ --morph-wave-color: var(--color-primary, #3b82f6);
19
+ }
20
+
21
+ /* ========== Base ========== */
22
+
23
+ .vd-morph,
24
+ [data-vd-morph] {
25
+ position: relative;
26
+ overflow: hidden;
27
+ cursor: pointer;
28
+ -webkit-tap-highlight-color: transparent;
29
+ }
30
+
31
+ /* ========== Wave Layer ========== */
32
+
33
+ .vd-morph-wave {
34
+ position: absolute;
35
+ border-radius: 50%;
36
+ background:
37
+ radial-gradient(circle at 32% 28%,
38
+ color-mix(in srgb, #fff 55%, transparent) 0%,
39
+ color-mix(in srgb, #fff 18%, transparent) 18%,
40
+ transparent 38%),
41
+ radial-gradient(circle at 68% 70%,
42
+ color-mix(in srgb, #fff 30%, transparent) 0%,
43
+ transparent 30%),
44
+ radial-gradient(circle at 50% 50%,
45
+ color-mix(in srgb, var(--morph-wave-color) 96%, #a8d8ff) 0%,
46
+ color-mix(in srgb, var(--morph-wave-color) 82%, #7ec8ff) 35%,
47
+ color-mix(in srgb, var(--morph-wave-color) 70%, #5ba4f5) 65%,
48
+ color-mix(in srgb, var(--morph-wave-color) 90%, #4478f0) 100%);
49
+ pointer-events: none;
50
+ opacity: 0;
51
+ transform: translate(-50%, -50%);
52
+ will-change: width, height, opacity, filter;
53
+ }
54
+
55
+ .vd-morph.is-morphing .vd-morph-wave {
56
+ animation: vd-morph-expand var(--morph-duration) var(--morph-easing) forwards;
57
+ }
58
+
59
+ .vd-morph.is-morphing .vd-morph-wave::after {
60
+ content: '';
61
+ position: absolute;
62
+ top: 50%;
63
+ left: 50%;
64
+ width: 0;
65
+ height: 0;
66
+ border-radius: 50%;
67
+ background:
68
+ radial-gradient(circle at 50% 50%,
69
+ color-mix(in srgb, var(--morph-wave-color) 70%, #b0e0ff) 0%,
70
+ color-mix(in srgb, var(--morph-wave-color) 50%, #88c0ff) 45%,
71
+ transparent 80%);
72
+ transform: translate(-50%, -50%);
73
+ opacity: 0;
74
+ animation: vd-morph-expand2 var(--morph-duration) var(--morph-easing) 0.08s forwards;
75
+ }
76
+
77
+ @keyframes vd-morph-expand {
78
+ 0% {
79
+ width: 0;
80
+ height: 0;
81
+ opacity: 0;
82
+ filter: blur(0px) saturate(2);
83
+ }
84
+ 6% {
85
+ opacity: 1;
86
+ filter: blur(1px) saturate(2.2);
87
+ }
88
+ 35% {
89
+ opacity: 0.92;
90
+ filter: blur(6px) saturate(1.7);
91
+ }
92
+ 68% {
93
+ width: 360%;
94
+ height: 360%;
95
+ opacity: 0.6;
96
+ filter: blur(var(--morph-blur-peak)) saturate(1.3);
97
+ }
98
+ 100% {
99
+ width: 360%;
100
+ height: 360%;
101
+ opacity: 0;
102
+ filter: blur(7px) saturate(1);
103
+ }
104
+ }
105
+
106
+ @keyframes vd-morph-expand2 {
107
+ 0% {
108
+ width: 0;
109
+ height: 0;
110
+ opacity: 0;
111
+ filter: blur(0px);
112
+ }
113
+ 10% {
114
+ opacity: 0.7;
115
+ filter: blur(3px);
116
+ }
117
+ 60% {
118
+ width: 280%;
119
+ height: 280%;
120
+ opacity: 0.38;
121
+ filter: blur(14px);
122
+ }
123
+ 100% {
124
+ width: 280%;
125
+ height: 280%;
126
+ opacity: 0;
127
+ filter: blur(10px);
128
+ }
129
+ }
130
+
131
+ /* ========== Shine Sweep ========== */
132
+
133
+ .vd-morph-shine {
134
+ position: absolute;
135
+ top: 0;
136
+ left: -110%;
137
+ width: 80%;
138
+ height: 100%;
139
+ background: linear-gradient(
140
+ 105deg,
141
+ transparent 0%,
142
+ color-mix(in srgb, #fff 10%, transparent) 35%,
143
+ color-mix(in srgb, #fff 52%, transparent) 50%,
144
+ color-mix(in srgb, #fff 10%, transparent) 65%,
145
+ transparent 100%
146
+ );
147
+ pointer-events: none;
148
+ opacity: 0;
149
+ transform: skewX(-12deg);
150
+ will-change: left, opacity;
151
+ }
152
+
153
+ .vd-morph.is-morphing .vd-morph-shine {
154
+ animation: vd-morph-shine 0.72s cubic-bezier(0.3, 0.65, 0.5, 1) 0.04s forwards;
155
+ }
156
+
157
+ @keyframes vd-morph-shine {
158
+ 0% {
159
+ left: -110%;
160
+ opacity: 0;
161
+ }
162
+ 15% {
163
+ opacity: 0.9;
164
+ }
165
+ 72% {
166
+ opacity: 0.4;
167
+ }
168
+ 100% {
169
+ left: 130%;
170
+ opacity: 0;
171
+ }
172
+ }
173
+
174
+ /* ========== Content Layers ========== */
175
+
176
+ .vd-morph-content {
177
+ position: absolute;
178
+ inset: 0;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ gap: 0.45rem;
183
+ pointer-events: none;
184
+ will-change: opacity, transform, filter;
185
+ }
186
+
187
+ .vd-morph-current {
188
+ opacity: 1;
189
+ transform: scale(1) translateY(0);
190
+ filter: blur(0px);
191
+ z-index: 2;
192
+ transition:
193
+ opacity 0.28s cubic-bezier(0.4, 0, 0.6, 1),
194
+ transform 0.28s cubic-bezier(0.4, 0, 0.6, 1),
195
+ filter 0.28s ease;
196
+ }
197
+
198
+ .vd-morph-next {
199
+ opacity: 0;
200
+ transform: scale(0.86) translateY(4px);
201
+ filter: blur(3px);
202
+ z-index: 1;
203
+ transition:
204
+ opacity 0.3s cubic-bezier(0, 0, 0.2, 1),
205
+ transform 0.3s cubic-bezier(0, 0, 0.2, 1),
206
+ filter 0.3s ease;
207
+ }
208
+
209
+ .vd-morph.is-morphing .vd-morph-current {
210
+ opacity: 0;
211
+ transform: scale(0.82) translateY(-4px);
212
+ filter: blur(4px);
213
+ transition-duration: 0.2s;
214
+ transition-delay: 0s;
215
+ }
216
+
217
+ .vd-morph.is-morphing .vd-morph-next {
218
+ opacity: 1;
219
+ transform: scale(1) translateY(0);
220
+ filter: blur(0px);
221
+ transition-duration: 0.3s;
222
+ transition-delay: 0.25s;
223
+ }
224
+
225
+ /* ========== Size Variants ========== */
226
+
227
+ .vd-morph-sm {
228
+ --morph-duration: 0.5s;
229
+ --morph-blur-peak: 7px;
230
+ }
231
+
232
+ .vd-morph-lg {
233
+ --morph-duration: 1s;
234
+ --morph-blur-peak: 16px;
235
+ }
236
+
237
+ /* ========== Accessibility ========== */
238
+
239
+ @media (prefers-reduced-motion: reduce) {
240
+ .vd-morph,
241
+ .vd-morph-content,
242
+ .vd-morph-wave,
243
+ .vd-morph-shine {
244
+ transition: none !important;
245
+ animation: none !important;
246
+ }
247
+ }
package/css/vanduo.css CHANGED
@@ -29,6 +29,7 @@
29
29
  @import url('components/buttons.css');
30
30
  @import url('components/forms.css');
31
31
  @import url('components/cards.css');
32
+ @import url('components/expanding-cards.css');
32
33
 
33
34
  /* Components - Phase 3 */
34
35
  @import url('components/navbar.css');
@@ -76,6 +77,7 @@
76
77
  /* Effects - Phase 7 */
77
78
  @import url('effects/parallax.css');
78
79
  @import url('effects/glass.css');
80
+ @import url('effects/morph.css');
79
81
 
80
82
  /* Components - Phase 9 (New) */
81
83
  @import url('components/draggable.css');
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.3.4",
3
- "builtAt": "2026-04-14T21:21:55.517Z",
4
- "commit": "73e3db5",
2
+ "version": "1.3.7",
3
+ "builtAt": "2026-04-18T12:05:32.603Z",
4
+ "commit": "20b2d08",
5
5
  "mode": "development+production"
6
6
  }