@vanduo-oss/framework 1.5.0 → 1.5.1

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/CHANGELOG.md CHANGED
@@ -8,6 +8,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  Full release notes — covering the framework, the documentation site, and
9
9
  ecosystem packages side by side — live at <https://vanduo.dev/#changelog>.
10
10
 
11
+ ## [1.5.1] - 2026-06-20
12
+
13
+ ### Changed
14
+ - Opened `dev-v151` development branch for the v1.5.1 patch cycle.
15
+
16
+ ### Enhanced
17
+ - **Expanding Cards — mobile** — Below `768px`, panels stack vertically and expand in place using the same flex-grow redistribution as the desktop strip (replacing progressive hide and non-animatable `order` reorder). Inactive rows render as compact stripes with icon + title; labels and subtitles transition smoothly. `ArrowUp`/`ArrowDown` keyboard navigation added alongside left/right.
18
+
19
+ ### Fixed
20
+ - **Expanding Cards — photo backgrounds** — Active panels use `background-size: cover` and `background-repeat: no-repeat` so wide expanded cards no longer show tiled repeats on the sides.
21
+
11
22
  ## [1.5.0] - 2026-06-18
12
23
 
13
24
  ### Added
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Vanduo Framework v1.5.0
1
+ # Vanduo Framework v1.5.1
2
2
 
3
3
  <p align="center">
4
4
  <img src="vanduo-banner.svg" alt="Vanduo Framework Banner" width="100%">
@@ -25,7 +25,11 @@ Vanduo is a zero-dependency UI framework built with HTML, CSS, and vanilla JavaS
25
25
  - Theme Switcher menu variant for icon-only light/dark/system selection in navbars
26
26
  - Playwright-based browser coverage across Chromium, Firefox, and WebKit
27
27
 
28
- ## What's New in 1.5.0
28
+ ## What's New in 1.5.1
29
+
30
+ - Development branch opened for the v1.5.1 patch cycle (`dev-v151`).
31
+
32
+ ## Previous: 1.5.0
29
33
 
30
34
  - **Layout primitives** — new CSS-only layout containers — `.vd-box`, `.vd-stack`, `.vd-inline`, `.vd-center`, `.vd-frame` (golden-ratio aspect box), `.vd-cover`, and `.vd-switcher` (container-query-free responsive row→column) — with a `data-*` API (`data-pad`, `data-gap`, `data-align`, `data-justify`, `data-round`, `data-ratio`…) that consumes the existing Fibonacci spacing/radius and semantic tokens. They are the composition layer between utilities and components — *utilities style an element; primitives arrange elements*. Zero JS, zero new public tokens.
31
35
  - **Hex grid is now a standalone package** — `VdHexGrid` was never part of the bundle; its source has moved out of the framework tree. Install [`@vanduo-oss/hex-grid`](https://www.npmjs.com/package/@vanduo-oss/hex-grid) directly.
@@ -52,8 +56,8 @@ Vanduo is a zero-dependency UI framework built with HTML, CSS, and vanilla JavaS
52
56
  ### CDN
53
57
 
54
58
  ```html
55
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.5.0/dist/vanduo.min.css">
56
- <script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.5.0/dist/vanduo.min.js"></script>
59
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.5.1/dist/vanduo.min.css">
60
+ <script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.5.1/dist/vanduo.min.js"></script>
57
61
  <script>
58
62
  Vanduo.init();
59
63
  </script>
@@ -33,7 +33,8 @@
33
33
  border-radius: 30px;
34
34
  cursor: pointer;
35
35
  background: var(--vd-expanding-card-bg, var(--vd-expanding-card-bg-default, #e6e9ed));
36
- background-size: auto 120%;
36
+ background-repeat: no-repeat;
37
+ background-size: cover;
37
38
  background-position: center;
38
39
  transition: 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
39
40
  }
@@ -68,7 +69,6 @@
68
69
  max-width: 600px;
69
70
  margin: 0;
70
71
  border-radius: 40px;
71
- background-size: auto 100%;
72
72
  }
73
73
 
74
74
  .vd-expanding-card.is-active .vd-expanding-card-shadow {
@@ -164,44 +164,113 @@
164
164
  transition-delay: 0.1s;
165
165
  }
166
166
 
167
- /* Progressive hide: narrow viewports hide rightmost cards (matches original) */
168
- @media screen and (max-width: 718px) {
167
+ /* Mobile: vertical stack, expand in place (mirrors desktop flex-grow model) */
168
+ @media screen and (max-width: 767.98px) {
169
169
  .vd-expanding-cards {
170
- min-width: 520px;
170
+ --vd-expanding-card-mobile-stripe: 56px;
171
+ --vd-expanding-card-mobile-active: clamp(200px, 55vw, 280px);
172
+ --vd-expanding-card-mobile-gap: 8px;
173
+
174
+ flex-direction: column;
175
+ align-items: stretch;
176
+ overflow: hidden;
177
+ min-width: 0;
178
+ max-width: 100%;
179
+ width: 100%;
180
+ height: min(
181
+ 72vh,
182
+ calc(
183
+ var(--vd-expanding-card-mobile-active) +
184
+ 5 * (var(--vd-expanding-card-mobile-stripe) + var(--vd-expanding-card-mobile-gap))
185
+ )
186
+ );
187
+ gap: var(--vd-expanding-card-mobile-gap);
171
188
  }
172
189
 
173
- .vd-expanding-card:nth-child(5) {
174
- display: none;
190
+ .vd-expanding-card {
191
+ min-width: 0;
192
+ width: 100%;
193
+ margin: 0;
194
+ flex: 1 1 var(--vd-expanding-card-mobile-stripe);
195
+ min-height: var(--vd-expanding-card-mobile-stripe);
196
+ transition:
197
+ flex 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95),
198
+ min-height 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95),
199
+ border-radius 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95),
200
+ margin 0.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
175
201
  }
176
- }
177
202
 
178
- @media screen and (max-width: 638px) {
179
- .vd-expanding-cards {
180
- min-width: 440px;
203
+ .vd-expanding-card.is-active {
204
+ flex: 10000 1 var(--vd-expanding-card-mobile-active);
205
+ min-height: var(--vd-expanding-card-mobile-active);
206
+ max-width: none;
207
+ border-radius: 32px;
181
208
  }
182
209
 
183
- .vd-expanding-card:nth-child(4) {
184
- display: none;
210
+ .vd-expanding-card:not(.is-active) {
211
+ flex: 1 1 var(--vd-expanding-card-mobile-stripe);
212
+ min-height: var(--vd-expanding-card-mobile-stripe);
213
+ border-radius: 28px;
185
214
  }
186
- }
187
215
 
188
- @media screen and (max-width: 558px) {
189
- .vd-expanding-cards {
190
- min-width: 360px;
216
+ .vd-expanding-card.is-active .vd-expanding-card-shadow {
217
+ box-shadow:
218
+ inset 0 -120px 120px -120px black,
219
+ inset 0 -120px 120px -100px black;
191
220
  }
192
221
 
193
- .vd-expanding-card:nth-child(3) {
194
- display: none;
222
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-shadow {
223
+ bottom: 0;
224
+ height: 100%;
225
+ box-shadow: inset 0 0 80px 0 rgb(0 0 0 / 35%);
195
226
  }
196
- }
197
227
 
198
- @media screen and (max-width: 478px) {
199
- .vd-expanding-cards {
200
- min-width: 280px;
228
+ .vd-expanding-card.is-active .vd-expanding-card-label {
229
+ bottom: 20px;
230
+ left: 20px;
231
+ top: auto;
232
+ transform: none;
233
+ align-items: flex-end;
234
+ }
235
+
236
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-label {
237
+ bottom: 8px;
238
+ left: 12px;
239
+ top: auto;
240
+ right: auto;
241
+ height: 40px;
242
+ transform: none;
243
+ align-items: center;
244
+ }
245
+
246
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-info {
247
+ min-width: 0;
248
+ flex: 1;
249
+ white-space: nowrap;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ }
253
+
254
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-info > div {
255
+ left: 0;
256
+ opacity: 1;
257
+ }
258
+
259
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-subtitle {
260
+ opacity: 0;
261
+ max-height: 0;
262
+ overflow: hidden;
263
+ }
264
+
265
+ .vd-expanding-card.is-active .vd-expanding-card-subtitle {
266
+ opacity: 1;
267
+ max-height: 2em;
201
268
  }
202
269
 
203
- .vd-expanding-card:nth-child(2) {
204
- display: none;
270
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-title {
271
+ font-size: 1rem;
272
+ overflow: hidden;
273
+ text-overflow: ellipsis;
205
274
  }
206
275
  }
207
276
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.5.0",
3
- "builtAt": "2026-06-18T19:13:58.613Z",
4
- "commit": "8f0e1b5",
2
+ "version": "1.5.1",
3
+ "builtAt": "2026-06-20T15:00:18.257Z",
4
+ "commit": "baf8178",
5
5
  "mode": "development+production"
6
6
  }
@@ -1,4 +1,4 @@
1
- /*! Vanduo v1.5.0 | Built: 2026-06-18T19:13:58.613Z | git:8f0e1b5 | development */
1
+ /*! Vanduo v1.5.1 | Built: 2026-06-20T15:00:18.257Z | git:baf8178 | development */
2
2
  *, :before, :after {
3
3
  box-sizing: border-box;
4
4
  }
@@ -9874,7 +9874,8 @@ a.vd-card:active {
9874
9874
  cursor: pointer;
9875
9875
  background: var(--vd-expanding-card-bg, var(--vd-expanding-card-bg-default, #e6e9ed));
9876
9876
  background-position: center;
9877
- background-size: auto 120%;
9877
+ background-repeat: no-repeat;
9878
+ background-size: cover;
9878
9879
  border-radius: 30px;
9879
9880
  flex-grow: 1;
9880
9881
  min-width: 60px;
@@ -9909,7 +9910,6 @@ a.vd-card:active {
9909
9910
  }
9910
9911
 
9911
9912
  .vd-expanding-card.is-active {
9912
- background-size: auto 100%;
9913
9913
  border-radius: 40px;
9914
9914
  flex-grow: 10000;
9915
9915
  max-width: 600px;
@@ -10004,43 +10004,98 @@ a.vd-card:active {
10004
10004
  transition-delay: .1s;
10005
10005
  }
10006
10006
 
10007
- @media screen and (width <= 718px) {
10007
+ @media screen and (width <= 767.98px) {
10008
10008
  .vd-expanding-cards {
10009
- min-width: 520px;
10009
+ --vd-expanding-card-mobile-stripe: 56px;
10010
+ --vd-expanding-card-mobile-active: clamp(200px, 55vw, 280px);
10011
+ --vd-expanding-card-mobile-gap: 8px;
10012
+ width: 100%;
10013
+ min-width: 0;
10014
+ max-width: 100%;
10015
+ height: min(72vh,
10016
+ calc(var(--vd-expanding-card-mobile-active) +
10017
+ 5 * (var(--vd-expanding-card-mobile-stripe) + var(--vd-expanding-card-mobile-gap))));
10018
+ align-items: stretch;
10019
+ gap: var(--vd-expanding-card-mobile-gap);
10020
+ flex-direction: column;
10021
+ overflow: hidden;
10010
10022
  }
10011
10023
 
10012
- .vd-expanding-card:nth-child(5) {
10013
- display: none;
10024
+ .vd-expanding-card {
10025
+ flex: 1 1 var(--vd-expanding-card-mobile-stripe);
10026
+ width: 100%;
10027
+ min-width: 0;
10028
+ min-height: var(--vd-expanding-card-mobile-stripe);
10029
+ margin: 0;
10030
+ transition: flex .5s cubic-bezier(.05, .61, .41, .95), min-height .5s cubic-bezier(.05, .61, .41, .95), border-radius .5s cubic-bezier(.05, .61, .41, .95), margin .5s cubic-bezier(.05, .61, .41, .95);
10014
10031
  }
10015
- }
10016
10032
 
10017
- @media screen and (width <= 638px) {
10018
- .vd-expanding-cards {
10019
- min-width: 440px;
10033
+ .vd-expanding-card.is-active {
10034
+ flex: 10000 1 var(--vd-expanding-card-mobile-active);
10035
+ min-height: var(--vd-expanding-card-mobile-active);
10036
+ border-radius: 32px;
10037
+ max-width: none;
10020
10038
  }
10021
10039
 
10022
- .vd-expanding-card:nth-child(4) {
10023
- display: none;
10040
+ .vd-expanding-card:not(.is-active) {
10041
+ flex: 1 1 var(--vd-expanding-card-mobile-stripe);
10042
+ min-height: var(--vd-expanding-card-mobile-stripe);
10043
+ border-radius: 28px;
10024
10044
  }
10025
- }
10026
10045
 
10027
- @media screen and (width <= 558px) {
10028
- .vd-expanding-cards {
10029
- min-width: 360px;
10046
+ .vd-expanding-card.is-active .vd-expanding-card-shadow {
10047
+ box-shadow: inset 0 -120px 120px -120px #000, inset 0 -120px 120px -100px #000;
10030
10048
  }
10031
10049
 
10032
- .vd-expanding-card:nth-child(3) {
10033
- display: none;
10050
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-shadow {
10051
+ height: 100%;
10052
+ bottom: 0;
10053
+ box-shadow: inset 0 0 80px #00000059;
10034
10054
  }
10035
- }
10036
10055
 
10037
- @media screen and (width <= 478px) {
10038
- .vd-expanding-cards {
10039
- min-width: 280px;
10056
+ .vd-expanding-card.is-active .vd-expanding-card-label {
10057
+ align-items: flex-end;
10058
+ top: auto;
10059
+ bottom: 20px;
10060
+ left: 20px;
10061
+ transform: none;
10040
10062
  }
10041
10063
 
10042
- .vd-expanding-card:nth-child(2) {
10043
- display: none;
10064
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-label {
10065
+ align-items: center;
10066
+ height: 40px;
10067
+ inset: auto auto 8px 12px;
10068
+ transform: none;
10069
+ }
10070
+
10071
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-info {
10072
+ white-space: nowrap;
10073
+ text-overflow: ellipsis;
10074
+ flex: 1;
10075
+ min-width: 0;
10076
+ overflow: hidden;
10077
+ }
10078
+
10079
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-info > div {
10080
+ opacity: 1;
10081
+ left: 0;
10082
+ }
10083
+
10084
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-subtitle {
10085
+ opacity: 0;
10086
+ max-height: 0;
10087
+ overflow: hidden;
10088
+ }
10089
+
10090
+ .vd-expanding-card.is-active .vd-expanding-card-subtitle {
10091
+ opacity: 1;
10092
+ max-height: 2em;
10093
+ }
10094
+
10095
+ .vd-expanding-card:not(.is-active) .vd-expanding-card-title {
10096
+ text-overflow: ellipsis;
10097
+ font-size: 1rem;
10098
+ overflow: hidden;
10044
10099
  }
10045
10100
  }
10046
10101