@vanduo-oss/framework 1.3.5 → 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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Vanduo Framework v1.3.5
1
+ # Vanduo Framework v1.3.7
2
2
 
3
3
  <p align="center">
4
4
  <img src="vanduo-banner.svg" alt="Vanduo Framework Banner" width="100%">
@@ -12,7 +12,7 @@
12
12
 
13
13
  **Essential just like water is.**
14
14
 
15
- Vanduo is a lightweight, zero-dependency UI framework built with pure HTML, CSS, and JavaScript. It ships 46+ components, responsive utilities, dark mode support, and a flexible theming system.
15
+ Vanduo is a lightweight, zero-dependency UI framework built with pure HTML, CSS, and JavaScript. It ships 47+ components, responsive utilities, dark mode support, and a flexible theming system.
16
16
 
17
17
  [Browse Docs](https://vanduo.dev/#docs)
18
18
 
@@ -20,6 +20,7 @@ Vanduo is a lightweight, zero-dependency UI framework built with pure HTML, CSS,
20
20
 
21
21
  - Pure CSS/JS with no runtime dependencies
22
22
  - Modular architecture with optional per-component imports
23
+ - 47+ components, including Expanding Cards and animated Timeline controls in v1.3.7
23
24
  - Built-in dark/light/system theme switching
24
25
  - Runtime Theme Customizer for color, font, and radius tokens
25
26
  - Accessibility-focused components and utilities
@@ -29,8 +30,8 @@ Vanduo is a lightweight, zero-dependency UI framework built with pure HTML, CSS,
29
30
  ### CDN (recommended)
30
31
 
31
32
  ```html
32
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.5/dist/vanduo.min.css">
33
- <script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.5/dist/vanduo.min.js"></script>
33
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.7/dist/vanduo.min.css">
34
+ <script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.7/dist/vanduo.min.js"></script>
34
35
  <script>Vanduo.init();</script>
35
36
  ```
36
37
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  /* Card Shadow */
25
25
  --card-shadow: var(--shadow-sm);
26
- --card-shadow-elevated: var(--shadow-sm);
26
+ --card-shadow-elevated: var(--shadow-md);
27
27
 
28
28
  /* Card Glow Effect - uses primary color scale */
29
29
  --card-glow-color: var(--primary-2);
@@ -34,6 +34,8 @@
34
34
  [data-theme="dark"] {
35
35
  --card-bg: var(--bg-secondary);
36
36
  --card-bg-filled: var(--bg-primary);
37
+ /* Stronger elevation on dark surfaces */
38
+ --card-shadow-elevated: var(--shadow-lg);
37
39
  /* Glow uses lighter primary shades for dark mode visibility */
38
40
  --card-glow-color: var(--primary-3);
39
41
  --card-glow-border-color: var(--primary-4);
@@ -43,6 +45,7 @@
43
45
  :root:not([data-theme]) {
44
46
  --card-bg: var(--bg-secondary);
45
47
  --card-bg-filled: var(--bg-primary);
48
+ --card-shadow-elevated: var(--shadow-lg);
46
49
  /* Glow uses lighter primary shades for dark mode visibility */
47
50
  --card-glow-color: var(--primary-3);
48
51
  --card-glow-border-color: var(--primary-4);
@@ -75,6 +78,13 @@
75
78
  .vd-card-elevated,
76
79
  .vd-card {
77
80
  box-shadow: var(--card-shadow-elevated);
81
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
82
+ }
83
+
84
+ /* Subtle lift on hover — skip links (they have their own hover) and non-elevated variants */
85
+ .vd-card:not(a):not(.vd-card-outlined):not(.vd-card-filled):not(.vd-card-glass):not(.vd-card-glow):hover {
86
+ box-shadow: var(--shadow-lg);
87
+ transform: translateY(-1px);
78
88
  }
79
89
 
80
90
  /* Card Variants - Outlined */
@@ -103,6 +103,14 @@
103
103
  background: var(--dp-day-hover-bg);
104
104
  }
105
105
 
106
+ /* ========== Calendar grid (weekday row + week rows) ========== */
107
+
108
+ .vd-datepicker-grid {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: var(--dp-gap);
112
+ }
113
+
106
114
  /* ========== Weekday Headers ========== */
107
115
 
108
116
  .vd-datepicker-weekdays {
@@ -118,7 +126,8 @@
118
126
 
119
127
  /* ========== Days Grid ========== */
120
128
 
121
- .vd-datepicker-days {
129
+ .vd-datepicker-days,
130
+ .vd-datepicker-row {
122
131
  display: grid;
123
132
  grid-template-columns: repeat(7, 1fr);
124
133
  gap: var(--dp-gap);
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Vanduo Framework — Expanding flex cards
3
+ *
4
+ * Adapted from MIT-licensed CodePen "Expanding flex cards" by Zed Dash:
5
+ * https://codepen.io/z-/pen/OBPJKK
6
+ *
7
+ * Usage:
8
+ * <div class="vd-expanding-cards" data-vd-expanding-cards>
9
+ * <div class="vd-expanding-card is-active" style="--vd-expanding-card-bg: url(...)">
10
+ * <div class="vd-expanding-card-shadow"></div>
11
+ * <div class="vd-expanding-card-label">...</div>
12
+ * </div>
13
+ * </div>
14
+ */
15
+
16
+ .vd-expanding-cards {
17
+ display: flex;
18
+ flex-direction: row;
19
+ align-items: stretch;
20
+ overflow: hidden;
21
+ min-width: 600px;
22
+ max-width: 900px;
23
+ width: calc(100% - 100px);
24
+ height: 400px;
25
+ }
26
+
27
+ .vd-expanding-card {
28
+ position: relative;
29
+ overflow: hidden;
30
+ min-width: 60px;
31
+ margin: 10px;
32
+ flex-grow: 1;
33
+ border-radius: 30px;
34
+ cursor: pointer;
35
+ background: var(--vd-expanding-card-bg, var(--vd-expanding-card-bg-default, #e6e9ed));
36
+ background-size: auto 120%;
37
+ background-position: center;
38
+ transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
39
+ }
40
+
41
+ .vd-expanding-card:nth-child(1) {
42
+ --vd-expanding-card-bg-default: #ed5565;
43
+ }
44
+
45
+ .vd-expanding-card:nth-child(2) {
46
+ --vd-expanding-card-bg-default: #fc6e51;
47
+ }
48
+
49
+ .vd-expanding-card:nth-child(3) {
50
+ --vd-expanding-card-bg-default: #ffce54;
51
+ }
52
+
53
+ .vd-expanding-card:nth-child(4) {
54
+ --vd-expanding-card-bg-default: #2ecc71;
55
+ }
56
+
57
+ .vd-expanding-card:nth-child(5) {
58
+ --vd-expanding-card-bg-default: #5d9cec;
59
+ }
60
+
61
+ .vd-expanding-card:nth-child(6) {
62
+ --vd-expanding-card-bg-default: #ac92ec;
63
+ }
64
+
65
+ .vd-expanding-card.is-active {
66
+ flex-grow: 10000;
67
+ transform: scale(1);
68
+ max-width: 600px;
69
+ margin: 0;
70
+ border-radius: 40px;
71
+ background-size: auto 100%;
72
+ }
73
+
74
+ .vd-expanding-card.is-active .vd-expanding-card-shadow {
75
+ box-shadow:
76
+ inset 0 -120px 120px -120px black,
77
+ inset 0 -120px 120px -100px black;
78
+ }
79
+
80
+ .vd-expanding-card.is-active .vd-expanding-card-label {
81
+ bottom: 20px;
82
+ left: 20px;
83
+ }
84
+
85
+ .vd-expanding-card.is-active .vd-expanding-card-info > div {
86
+ left: 0;
87
+ opacity: 1;
88
+ }
89
+
90
+ .vd-expanding-card:not(.is-active) {
91
+ flex-grow: 1;
92
+ border-radius: 30px;
93
+ }
94
+
95
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-shadow {
96
+ bottom: -40px;
97
+ box-shadow:
98
+ inset 0 -120px 0 -120px black,
99
+ inset 0 -120px 0 -100px black;
100
+ }
101
+
102
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-label {
103
+ bottom: 10px;
104
+ left: 10px;
105
+ }
106
+
107
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-info > div {
108
+ left: 20px;
109
+ opacity: 0;
110
+ }
111
+
112
+ .vd-expanding-card-shadow {
113
+ position: absolute;
114
+ bottom: 0;
115
+ left: 0;
116
+ right: 0;
117
+ height: 120px;
118
+ transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
119
+ }
120
+
121
+ .vd-expanding-card-label {
122
+ display: flex;
123
+ position: absolute;
124
+ right: 0;
125
+ height: 40px;
126
+ transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
127
+ }
128
+
129
+ .vd-expanding-card-icon {
130
+ display: flex;
131
+ flex-direction: row;
132
+ justify-content: center;
133
+ align-items: center;
134
+ min-width: 40px;
135
+ max-width: 40px;
136
+ height: 40px;
137
+ border-radius: 100%;
138
+ background-color: #fff;
139
+ color: var(--vd-expanding-card-bg-default, var(--color-primary, #3b82f6));
140
+ }
141
+
142
+ .vd-expanding-card-info {
143
+ display: flex;
144
+ flex-direction: column;
145
+ justify-content: center;
146
+ margin-left: 10px;
147
+ color: #fff;
148
+ white-space: pre;
149
+ }
150
+
151
+ .vd-expanding-card-info > div {
152
+ position: relative;
153
+ transition:
154
+ 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95),
155
+ opacity 0.5s ease-out;
156
+ }
157
+
158
+ .vd-expanding-card-title {
159
+ font-weight: bold;
160
+ font-size: 1.2rem;
161
+ }
162
+
163
+ .vd-expanding-card-subtitle {
164
+ transition-delay: 0.1s;
165
+ }
166
+
167
+ /* Progressive hide: narrow viewports hide rightmost cards (matches original) */
168
+ @media screen and (max-width: 718px) {
169
+ .vd-expanding-cards {
170
+ min-width: 520px;
171
+ }
172
+
173
+ .vd-expanding-card:nth-child(5) {
174
+ display: none;
175
+ }
176
+ }
177
+
178
+ @media screen and (max-width: 638px) {
179
+ .vd-expanding-cards {
180
+ min-width: 440px;
181
+ }
182
+
183
+ .vd-expanding-card:nth-child(4) {
184
+ display: none;
185
+ }
186
+ }
187
+
188
+ @media screen and (max-width: 558px) {
189
+ .vd-expanding-cards {
190
+ min-width: 360px;
191
+ }
192
+
193
+ .vd-expanding-card:nth-child(3) {
194
+ display: none;
195
+ }
196
+ }
197
+
198
+ @media screen and (max-width: 478px) {
199
+ .vd-expanding-cards {
200
+ min-width: 280px;
201
+ }
202
+
203
+ .vd-expanding-card:nth-child(2) {
204
+ display: none;
205
+ }
206
+ }
207
+
208
+ @media (prefers-reduced-motion: reduce) {
209
+ .vd-expanding-card,
210
+ .vd-expanding-card-shadow,
211
+ .vd-expanding-card-label,
212
+ .vd-expanding-card-info > div {
213
+ transition: none !important;
214
+ }
215
+ }
@@ -9,9 +9,11 @@
9
9
  --spotlight-tooltip-color: var(--text-primary, #212529);
10
10
  --spotlight-tooltip-shadow: 0 0.5rem 1.3125rem rgba(0, 0, 0, 0.15);
11
11
  --spotlight-tooltip-padding: 1.3125rem; /* 21px - fib */
12
- --spotlight-tooltip-radius: var(--border-radius, 0.5rem);
12
+ --spotlight-tooltip-radius: var(--card-border-radius, var(--btn-border-radius-lg, 0.5rem));
13
13
  --spotlight-tooltip-max-width: 21rem; /* 336px - fib×16 */
14
14
  --spotlight-highlight-padding: 0.5rem; /* 8px - fib */
15
+ /* Match card/modal surfaces so the cutout reads like other rounded UI (not the smaller base button token). */
16
+ --spotlight-target-radius: var(--card-border-radius, var(--btn-border-radius-lg, var(--btn-border-radius, 0.25rem)));
15
17
  --spotlight-z-index: 1080;
16
18
  }
17
19
 
@@ -87,7 +89,7 @@
87
89
  .vd-spotlight-btn {
88
90
  padding: 0.3125rem 0.8125rem; /* 5px 13px - fib */
89
91
  border: 1px solid var(--border-color, #dee2e6);
90
- border-radius: 0.25rem;
92
+ border-radius: var(--btn-border-radius-sm, 0.25rem);
91
93
  background: transparent;
92
94
  cursor: pointer;
93
95
  font-size: 0.8125rem;
@@ -113,7 +115,10 @@
113
115
  .vd-spotlight-target {
114
116
  position: relative;
115
117
  z-index: calc(var(--spotlight-z-index) + 1);
118
+ isolation: isolate;
119
+ overflow: visible;
120
+ /* box-shadow cutout follows border-radius; !important wins over consumer utilities (e.g. docs demos) */
121
+ border-radius: var(--spotlight-target-radius) !important;
116
122
  box-shadow: 0 0 0 var(--spotlight-highlight-padding) rgba(13, 110, 253, 0.25),
117
123
  0 0 0 9999px var(--spotlight-overlay-bg);
118
- border-radius: 0.25rem;
119
124
  }
@@ -199,3 +199,50 @@
199
199
  right: auto;
200
200
  }
201
201
  }
202
+
203
+ /* ========== Animated reveal (opt-in) ========== */
204
+
205
+ .vd-timeline-animated .vd-timeline-item {
206
+ opacity: 0;
207
+ transform: translateY(12px);
208
+ transition:
209
+ opacity 0.55s ease,
210
+ transform 0.55s cubic-bezier(0.2, 0.8, 0.35, 1);
211
+ transition-delay: var(--vd-timeline-reveal-delay, 0s);
212
+ }
213
+
214
+ .vd-timeline-animated .vd-timeline-item .vd-timeline-marker {
215
+ transform: scale(0.4);
216
+ transform-origin: center center;
217
+ transition: transform 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
218
+ transition-delay: calc(var(--vd-timeline-reveal-delay, 0s) + 0.12s);
219
+ }
220
+
221
+ .vd-timeline-animated .vd-timeline-item.is-revealed {
222
+ opacity: 1;
223
+ transform: none;
224
+ }
225
+
226
+ .vd-timeline-animated .vd-timeline-item.is-revealed .vd-timeline-marker {
227
+ transform: scale(1);
228
+ }
229
+
230
+ /* Alternating + animated: entrance from each side (desktop only; narrow uses base vertical slide) */
231
+ @media (min-width: 769px) {
232
+ .vd-timeline-alternating.vd-timeline-animated .vd-timeline-item:nth-child(odd):not(.is-revealed) {
233
+ transform: translate(-12px, 12px);
234
+ }
235
+
236
+ .vd-timeline-alternating.vd-timeline-animated .vd-timeline-item:nth-child(even):not(.is-revealed) {
237
+ transform: translate(12px, 12px);
238
+ }
239
+ }
240
+
241
+ @media (prefers-reduced-motion: reduce) {
242
+ .vd-timeline-animated .vd-timeline-item,
243
+ .vd-timeline-animated .vd-timeline-item .vd-timeline-marker {
244
+ opacity: 1;
245
+ transform: none;
246
+ transition: none;
247
+ }
248
+ }
@@ -171,18 +171,6 @@
171
171
  }
172
172
  }
173
173
 
174
- /* ========== Completion Bounce ========== */
175
-
176
- .vd-morph.morph-done {
177
- animation: vd-morph-bounce 0.32s cubic-bezier(0.34, 1.56, 0.64, 1);
178
- }
179
-
180
- @keyframes vd-morph-bounce {
181
- 0% { transform: scale(0.97); }
182
- 60% { transform: scale(1.025); }
183
- 100% { transform: scale(1); }
184
- }
185
-
186
174
  /* ========== Content Layers ========== */
187
175
 
188
176
  .vd-morph-content {
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');
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.3.5",
3
- "builtAt": "2026-04-15T18:39:53.955Z",
4
- "commit": "3ca4f62",
2
+ "version": "1.3.7",
3
+ "builtAt": "2026-04-18T12:05:32.603Z",
4
+ "commit": "20b2d08",
5
5
  "mode": "development+production"
6
6
  }