@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 +5 -4
- package/css/components/cards.css +11 -1
- package/css/components/datepicker.css +10 -1
- package/css/components/expanding-cards.css +215 -0
- package/css/components/spotlight.css +8 -3
- package/css/components/timeline.css +47 -0
- package/css/effects/morph.css +0 -12
- package/css/vanduo.css +1 -0
- package/dist/build-info.json +3 -3
- package/dist/vanduo.cjs.js +647 -63
- package/dist/vanduo.cjs.js.map +3 -3
- package/dist/vanduo.cjs.min.js +4 -4
- package/dist/vanduo.cjs.min.js.map +4 -4
- package/dist/vanduo.css +255 -24
- package/dist/vanduo.css.map +1 -1
- package/dist/vanduo.esm.js +647 -63
- package/dist/vanduo.esm.js.map +3 -3
- package/dist/vanduo.esm.min.js +4 -4
- package/dist/vanduo.esm.min.js.map +4 -4
- package/dist/vanduo.js +647 -63
- package/dist/vanduo.js.map +3 -3
- package/dist/vanduo.min.css +2 -2
- package/dist/vanduo.min.css.map +1 -1
- package/dist/vanduo.min.js +4 -4
- package/dist/vanduo.min.js.map +4 -4
- package/js/components/datepicker.js +392 -70
- package/js/components/expanding-cards.js +136 -0
- package/js/components/morph.js +0 -3
- package/js/components/timeline.js +226 -0
- package/js/index.js +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Vanduo Framework v1.3.
|
|
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
|
|
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.
|
|
33
|
-
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.3.
|
|
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
|
|
package/css/components/cards.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
/* Card Shadow */
|
|
25
25
|
--card-shadow: var(--shadow-sm);
|
|
26
|
-
--card-shadow-elevated: var(--shadow-
|
|
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
|
+
}
|
package/css/effects/morph.css
CHANGED
|
@@ -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
package/dist/build-info.json
CHANGED