@vanduo-oss/framework 1.4.0 → 1.4.2

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 (89) hide show
  1. package/README.md +11 -9
  2. package/css/components/affix.css +11 -11
  3. package/css/components/alerts.css +55 -55
  4. package/css/components/avatar.css +62 -62
  5. package/css/components/badges.css +25 -25
  6. package/css/components/breadcrumbs.css +31 -31
  7. package/css/components/bubble.css +40 -40
  8. package/css/components/button-group.css +2 -2
  9. package/css/components/buttons.css +33 -33
  10. package/css/components/cards.css +76 -76
  11. package/css/components/chips.css +27 -27
  12. package/css/components/code-snippet.css +132 -132
  13. package/css/components/collapsible.css +60 -60
  14. package/css/components/collections.css +58 -58
  15. package/css/components/datepicker.css +55 -53
  16. package/css/components/doc-search.css +63 -63
  17. package/css/components/doc-tabs.css +1 -1
  18. package/css/components/draggable.css +69 -69
  19. package/css/components/dropdown.css +48 -48
  20. package/css/components/fab.css +60 -60
  21. package/css/components/flow.css +55 -55
  22. package/css/components/footer.css +52 -52
  23. package/css/components/forms.css +373 -373
  24. package/css/components/image-box.css +39 -39
  25. package/css/components/modals.css +53 -49
  26. package/css/components/music-player.css +150 -150
  27. package/css/components/navbar.css +71 -71
  28. package/css/components/pagination.css +50 -50
  29. package/css/components/preloader.css +18 -18
  30. package/css/components/progress.css +16 -16
  31. package/css/components/rating.css +18 -18
  32. package/css/components/ripple.css +10 -10
  33. package/css/components/sidenav.css +67 -67
  34. package/css/components/skeleton.css +13 -13
  35. package/css/components/spinner.css +30 -30
  36. package/css/components/spotlight.css +27 -27
  37. package/css/components/stepper.css +36 -36
  38. package/css/components/suggest.css +35 -35
  39. package/css/components/tabs.css +46 -46
  40. package/css/components/theme-customizer.css +73 -73
  41. package/css/components/timeline.css +43 -43
  42. package/css/components/timepicker.css +32 -30
  43. package/css/components/toast.css +27 -27
  44. package/css/components/tooltips.css +77 -77
  45. package/css/components/transfer.css +35 -35
  46. package/css/components/tree.css +25 -25
  47. package/css/components/waypoint.css +12 -12
  48. package/css/core/colors.css +610 -610
  49. package/css/core/grid.css +127 -127
  50. package/css/core/helpers.css +338 -338
  51. package/css/core/tokens.css +69 -81
  52. package/css/core/typography.css +91 -91
  53. package/css/effects/morph.css +17 -17
  54. package/css/effects/parallax.css +6 -6
  55. package/css/utilities/color-utilities.css +273 -273
  56. package/css/utilities/media.css +2 -2
  57. package/css/utilities/shadow.css +75 -75
  58. package/css/utilities/table.css +40 -40
  59. package/css/utilities/transitions.css +38 -38
  60. package/css/vanduo.css +1 -2
  61. package/dist/build-info.json +3 -3
  62. package/dist/vanduo.cjs.js +104 -29
  63. package/dist/vanduo.cjs.js.map +2 -2
  64. package/dist/vanduo.cjs.min.js +5 -5
  65. package/dist/vanduo.cjs.min.js.map +3 -3
  66. package/dist/vanduo.css +4042 -4133
  67. package/dist/vanduo.css.map +1 -1
  68. package/dist/vanduo.esm.js +104 -29
  69. package/dist/vanduo.esm.js.map +2 -2
  70. package/dist/vanduo.esm.min.js +5 -5
  71. package/dist/vanduo.esm.min.js.map +3 -3
  72. package/dist/vanduo.js +104 -29
  73. package/dist/vanduo.js.map +2 -2
  74. package/dist/vanduo.min.css +2 -2
  75. package/dist/vanduo.min.css.map +1 -1
  76. package/dist/vanduo.min.js +5 -5
  77. package/dist/vanduo.min.js.map +3 -3
  78. package/js/components/affix.js +2 -2
  79. package/js/components/datepicker.js +51 -4
  80. package/js/components/image-box.js +2 -2
  81. package/js/components/morph.js +1 -1
  82. package/js/components/music-player.js +11 -11
  83. package/js/components/navbar.js +1 -1
  84. package/js/components/preloader.js +1 -1
  85. package/js/components/theme-customizer.js +4 -4
  86. package/js/components/timepicker.js +48 -6
  87. package/js/components/vd-hex.js +8 -10
  88. package/package.json +1 -1
  89. package/css/core/vd-aliases.css +0 -108
package/dist/vanduo.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! Vanduo v1.4.0 | Built: 2026-05-20T14:51:00.085Z | git:46420b0 | development */
1
+ /*! Vanduo v1.4.2 | Built: 2026-05-23T19:59:36.731Z | git:adbe750 | development */
2
2
  (() => {
3
3
  // js/utils/lifecycle.js
4
4
  (function() {
@@ -176,7 +176,7 @@
176
176
  // js/vanduo.js
177
177
  (function() {
178
178
  "use strict";
179
- const VANDUO_VERSION = true ? "1.4.0" : "0.0.0-dev";
179
+ const VANDUO_VERSION = true ? "1.4.2" : "0.0.0-dev";
180
180
  const hasOwn = Object.prototype.hasOwnProperty;
181
181
  const Vanduo2 = {
182
182
  version: VANDUO_VERSION,
@@ -2094,7 +2094,7 @@
2094
2094
  this.caption.style.display = "none";
2095
2095
  }
2096
2096
  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
2097
- document.body.style.setProperty("--scrollbar-width", `${scrollbarWidth}px`);
2097
+ document.body.style.setProperty("--vd-scrollbar-width", `${scrollbarWidth}px`);
2098
2098
  document.body.classList.add("body-image-box-open");
2099
2099
  this.backdrop.classList.add("is-visible");
2100
2100
  this.backdrop.focus();
@@ -2118,7 +2118,7 @@
2118
2118
  this.isOpen = false;
2119
2119
  this.backdrop.classList.remove("is-visible");
2120
2120
  document.body.classList.remove("body-image-box-open");
2121
- document.body.style.removeProperty("--scrollbar-width");
2121
+ document.body.style.removeProperty("--vd-scrollbar-width");
2122
2122
  if (this.currentTrigger) {
2123
2123
  this.currentTrigger.focus();
2124
2124
  this.currentTrigger.dispatchEvent(new CustomEvent("imageBox:close", { bubbles: true }));
@@ -2553,7 +2553,7 @@
2553
2553
  */
2554
2554
  getBreakpoint: function() {
2555
2555
  const root = getComputedStyle(document.documentElement);
2556
- const breakpointValue = root.getPropertyValue("--breakpoint-lg").trim();
2556
+ const breakpointValue = root.getPropertyValue("--vd-breakpoint-lg").trim();
2557
2557
  const parsed = parseInt(breakpointValue, 10);
2558
2558
  return isNaN(parsed) ? 992 : parsed;
2559
2559
  },
@@ -3202,7 +3202,7 @@
3202
3202
  }
3203
3203
  value = Math.max(0, Math.min(100, value));
3204
3204
  if (animate) {
3205
- el.style.transition = "width var(--transition-duration-slow) var(--transition-ease)";
3205
+ el.style.transition = "width var(--vd-transition-duration-slow) var(--vd-transition-ease)";
3206
3206
  } else {
3207
3207
  el.style.transition = "none";
3208
3208
  setTimeout(() => {
@@ -4478,7 +4478,7 @@
4478
4478
  }
4479
4479
  this.state.radius = radius;
4480
4480
  document.documentElement.setAttribute("data-radius", radius);
4481
- document.documentElement.style.setProperty("--radius-scale", radius);
4481
+ document.documentElement.style.setProperty("--vd-radius-scale", radius);
4482
4482
  this.savePreference(this.STORAGE_KEYS.RADIUS, radius);
4483
4483
  this.dispatchEvent("radius-change", { radius });
4484
4484
  },
@@ -4708,11 +4708,11 @@
4708
4708
  };
4709
4709
  let primarySwatches = "";
4710
4710
  for (const [key, value] of Object.entries(this.PRIMARY_COLORS)) {
4711
- primarySwatches += `<button class="tc-color-swatch${key === this.state.primary ? " is-active" : ""}" data-color="${esc(key)}" style="--swatch-color: ${safeColor(value.color)}" title="${esc(value.name)}"></button>`;
4711
+ primarySwatches += `<button class="tc-color-swatch${key === this.state.primary ? " is-active" : ""}" data-color="${esc(key)}" style="--vd-swatch-color: ${safeColor(value.color)}" title="${esc(value.name)}"></button>`;
4712
4712
  }
4713
4713
  let neutralSwatches = "";
4714
4714
  for (const [key, value] of Object.entries(this.NEUTRAL_COLORS)) {
4715
- neutralSwatches += `<button class="tc-neutral-swatch${key === this.state.neutral ? " is-active" : ""}" data-neutral="${esc(key)}" style="--swatch-color: ${safeColor(value.color)}" title="${esc(value.name)}"><span>${esc(value.name)}</span></button>`;
4715
+ neutralSwatches += `<button class="tc-neutral-swatch${key === this.state.neutral ? " is-active" : ""}" data-neutral="${esc(key)}" style="--vd-swatch-color: ${safeColor(value.color)}" title="${esc(value.name)}"><span>${esc(value.name)}</span></button>`;
4716
4716
  }
4717
4717
  let radiusButtons = "";
4718
4718
  this.RADIUS_OPTIONS.forEach((r) => {
@@ -7440,7 +7440,7 @@
7440
7440
  }
7441
7441
  el.classList.add("is-morphing");
7442
7442
  let duration = MORPH_DURATION_MS;
7443
- const custom = getComputedStyle(el).getPropertyValue("--morph-duration");
7443
+ const custom = getComputedStyle(el).getPropertyValue("--vd-morph-duration");
7444
7444
  if (custom) {
7445
7445
  const parsed = parseFloat(custom);
7446
7446
  if (!isNaN(parsed)) duration = parsed * (custom.indexOf("ms") !== -1 ? 1 : 1e3);
@@ -8360,7 +8360,7 @@
8360
8360
  const sentinel = document.createElement("div");
8361
8361
  sentinel.style.cssText = "display:block;height:1px;margin-bottom:-1px;visibility:hidden;pointer-events:none;";
8362
8362
  el.parentNode.insertBefore(sentinel, el);
8363
- el.style.setProperty("--affix-top-offset", offset + "px");
8363
+ el.style.setProperty("--vd-affix-top-offset", offset + "px");
8364
8364
  function stick() {
8365
8365
  if (isStuck) return;
8366
8366
  isStuck = true;
@@ -8406,7 +8406,7 @@
8406
8406
  },
8407
8407
  () => {
8408
8408
  el.classList.remove("is-stuck");
8409
- el.style.removeProperty("--affix-top-offset");
8409
+ el.style.removeProperty("--vd-affix-top-offset");
8410
8410
  }
8411
8411
  );
8412
8412
  this.instances.set(el, { cleanup, observer, sentinel, scrollParent });
@@ -8934,6 +8934,27 @@
8934
8934
  x.setDate(x.getDate() + (6 - day));
8935
8935
  return x;
8936
8936
  }
8937
+ function positionAnchoredPopup(anchor, popup, gap) {
8938
+ const padding = 8;
8939
+ const offset = gap != null ? gap : 4;
8940
+ const rect = anchor.getBoundingClientRect();
8941
+ popup.style.minWidth = Math.max(rect.width, 0) + "px";
8942
+ let top = rect.bottom + offset;
8943
+ let left = rect.left;
8944
+ popup.style.top = top + "px";
8945
+ popup.style.left = left + "px";
8946
+ const popRect = popup.getBoundingClientRect();
8947
+ if (popRect.bottom > window.innerHeight - padding && rect.top - popRect.height > padding) {
8948
+ top = rect.top - popRect.height - offset;
8949
+ popup.style.top = top + "px";
8950
+ }
8951
+ const alignedRect = popup.getBoundingClientRect();
8952
+ left = rect.left;
8953
+ if (left + alignedRect.width > window.innerWidth - padding) {
8954
+ left = window.innerWidth - alignedRect.width - padding;
8955
+ }
8956
+ popup.style.left = Math.max(padding, left) + "px";
8957
+ }
8937
8958
  const Datepicker = {
8938
8959
  instances: /* @__PURE__ */ new Map(),
8939
8960
  init: function(root) {
@@ -9015,7 +9036,7 @@
9015
9036
  wrapper.style.display = "inline-block";
9016
9037
  input.parentNode.insertBefore(wrapper, input);
9017
9038
  wrapper.appendChild(input);
9018
- wrapper.appendChild(popup);
9039
+ document.body.appendChild(popup);
9019
9040
  const isSameDay = (a, b) => a && b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
9020
9041
  const selectDate = (date) => {
9021
9042
  selectedDate = date;
@@ -9245,6 +9266,9 @@
9245
9266
  }
9246
9267
  popup.appendChild(grid);
9247
9268
  }
9269
+ if (popup.classList.contains("is-open")) {
9270
+ requestAnimationFrame(positionPopup);
9271
+ }
9248
9272
  };
9249
9273
  const handleGridKeydown = (e) => {
9250
9274
  if (!popup.classList.contains("is-open") || viewMode !== "days") return;
@@ -9312,6 +9336,13 @@
9312
9336
  render();
9313
9337
  requestAnimationFrame(focusFocusedDay);
9314
9338
  };
9339
+ const positionPopup = () => {
9340
+ if (!popup.classList.contains("is-open")) return;
9341
+ positionAnchoredPopup(input, popup);
9342
+ };
9343
+ const repositionHandler = () => {
9344
+ positionPopup();
9345
+ };
9315
9346
  const open = () => {
9316
9347
  viewMode = "days";
9317
9348
  if (selectedDate) {
@@ -9329,7 +9360,10 @@
9329
9360
  render();
9330
9361
  popup.classList.add("is-open");
9331
9362
  input.setAttribute("aria-expanded", "true");
9332
- requestAnimationFrame(focusFocusedDay);
9363
+ requestAnimationFrame(() => {
9364
+ positionPopup();
9365
+ focusFocusedDay();
9366
+ });
9333
9367
  };
9334
9368
  const close = () => {
9335
9369
  popup.classList.remove("is-open");
@@ -9344,7 +9378,7 @@
9344
9378
  open();
9345
9379
  };
9346
9380
  const outsideHandler = (e) => {
9347
- if (!wrapper.contains(e.target)) close();
9381
+ if (!input.contains(e.target) && !popup.contains(e.target)) close();
9348
9382
  };
9349
9383
  const escHandler = (e) => {
9350
9384
  if (e.key === "Escape" && popup.classList.contains("is-open")) {
@@ -9357,6 +9391,8 @@
9357
9391
  document.addEventListener("click", outsideHandler, true);
9358
9392
  document.addEventListener("keydown", escHandler);
9359
9393
  popup.addEventListener("keydown", handleGridKeydown);
9394
+ window.addEventListener("resize", repositionHandler);
9395
+ window.addEventListener("scroll", repositionHandler, true);
9360
9396
  input.setAttribute("aria-haspopup", "dialog");
9361
9397
  input.setAttribute("aria-expanded", "false");
9362
9398
  input.setAttribute("autocomplete", "off");
@@ -9364,7 +9400,10 @@
9364
9400
  () => input.removeEventListener("focus", focusHandler),
9365
9401
  () => document.removeEventListener("click", outsideHandler, true),
9366
9402
  () => document.removeEventListener("keydown", escHandler),
9367
- () => popup.removeEventListener("keydown", handleGridKeydown)
9403
+ () => popup.removeEventListener("keydown", handleGridKeydown),
9404
+ () => window.removeEventListener("resize", repositionHandler),
9405
+ () => window.removeEventListener("scroll", repositionHandler, true),
9406
+ () => popup.remove()
9368
9407
  );
9369
9408
  this.instances.set(input, { cleanup, open, close, popup });
9370
9409
  },
@@ -9387,6 +9426,27 @@
9387
9426
  // js/components/timepicker.js
9388
9427
  (function() {
9389
9428
  "use strict";
9429
+ function positionAnchoredPopup(anchor, popup, gap) {
9430
+ const padding = 8;
9431
+ const offset = gap != null ? gap : 4;
9432
+ const rect = anchor.getBoundingClientRect();
9433
+ popup.style.minWidth = Math.max(rect.width, 0) + "px";
9434
+ let top = rect.bottom + offset;
9435
+ let left = rect.left;
9436
+ popup.style.top = top + "px";
9437
+ popup.style.left = left + "px";
9438
+ const popRect = popup.getBoundingClientRect();
9439
+ if (popRect.bottom > window.innerHeight - padding && rect.top - popRect.height > padding) {
9440
+ top = rect.top - popRect.height - offset;
9441
+ popup.style.top = top + "px";
9442
+ }
9443
+ const alignedRect = popup.getBoundingClientRect();
9444
+ left = rect.left;
9445
+ if (left + alignedRect.width > window.innerWidth - padding) {
9446
+ left = window.innerWidth - alignedRect.width - padding;
9447
+ }
9448
+ popup.style.left = Math.max(padding, left) + "px";
9449
+ }
9390
9450
  const Timepicker = {
9391
9451
  instances: /* @__PURE__ */ new Map(),
9392
9452
  init: function(root) {
@@ -9411,7 +9471,7 @@
9411
9471
  const popup = document.createElement("div");
9412
9472
  popup.className = "vd-timepicker-popup";
9413
9473
  popup.setAttribute("role", "listbox");
9414
- wrapper.appendChild(popup);
9474
+ document.body.appendChild(popup);
9415
9475
  const times = [];
9416
9476
  for (let h = 0; h < 24; h++) {
9417
9477
  for (let m = 0; m < 60; m += step) {
@@ -9451,12 +9511,22 @@
9451
9511
  popup.appendChild(item);
9452
9512
  });
9453
9513
  };
9514
+ const positionPopup = () => {
9515
+ if (!popup.classList.contains("is-open")) return;
9516
+ positionAnchoredPopup(input, popup);
9517
+ };
9518
+ const repositionHandler = () => {
9519
+ positionPopup();
9520
+ };
9454
9521
  const open = () => {
9455
9522
  render();
9456
9523
  popup.classList.add("is-open");
9457
9524
  input.setAttribute("aria-expanded", "true");
9458
- const selected = popup.querySelector(".is-selected");
9459
- if (selected) selected.scrollIntoView({ block: "center" });
9525
+ requestAnimationFrame(() => {
9526
+ positionPopup();
9527
+ const selected = popup.querySelector(".is-selected");
9528
+ if (selected) selected.scrollIntoView({ block: "center" });
9529
+ });
9460
9530
  };
9461
9531
  const close = () => {
9462
9532
  popup.classList.remove("is-open");
@@ -9464,7 +9534,7 @@
9464
9534
  };
9465
9535
  const focusHandler = () => open();
9466
9536
  const outsideHandler = (e) => {
9467
- if (!wrapper.contains(e.target)) close();
9537
+ if (!input.contains(e.target) && !popup.contains(e.target)) close();
9468
9538
  };
9469
9539
  const escHandler = (e) => {
9470
9540
  if (e.key === "Escape") close();
@@ -9472,6 +9542,8 @@
9472
9542
  input.addEventListener("focus", focusHandler);
9473
9543
  document.addEventListener("click", outsideHandler, true);
9474
9544
  document.addEventListener("keydown", escHandler);
9545
+ window.addEventListener("resize", repositionHandler);
9546
+ window.addEventListener("scroll", repositionHandler, true);
9475
9547
  input.setAttribute("aria-haspopup", "listbox");
9476
9548
  input.setAttribute("aria-expanded", "false");
9477
9549
  input.setAttribute("autocomplete", "off");
@@ -9479,7 +9551,10 @@
9479
9551
  cleanup.push(
9480
9552
  () => input.removeEventListener("focus", focusHandler),
9481
9553
  () => document.removeEventListener("click", outsideHandler, true),
9482
- () => document.removeEventListener("keydown", escHandler)
9554
+ () => document.removeEventListener("keydown", escHandler),
9555
+ () => window.removeEventListener("resize", repositionHandler),
9556
+ () => window.removeEventListener("scroll", repositionHandler, true),
9557
+ () => popup.remove()
9483
9558
  );
9484
9559
  this.instances.set(input, { cleanup, open, close });
9485
9560
  },
@@ -10282,8 +10357,8 @@
10282
10357
  const max = parseFloat(input.max) || 1;
10283
10358
  const val = parseFloat(input.value) || 0;
10284
10359
  const pct = (val - min) / (max - min) * 100;
10285
- input.style.setProperty("--fill", pct + "%");
10286
- input.style.backgroundImage = "linear-gradient(to right, var(--music-player-track-fill, currentColor) 0%, var(--music-player-track-fill, currentColor) " + pct + "%, var(--music-player-track-bg, #ccc) " + pct + "%, var(--music-player-track-bg, #ccc) 100%)";
10360
+ input.style.setProperty("--vd-fill", pct + "%");
10361
+ input.style.backgroundImage = "linear-gradient(to right, var(--vd-music-player-track-fill, currentColor) 0%, var(--vd-music-player-track-fill, currentColor) " + pct + "%, var(--vd-music-player-track-bg, #ccc) " + pct + "%, var(--vd-music-player-track-bg, #ccc) 100%)";
10287
10362
  }
10288
10363
  function icon(name) {
10289
10364
  const el = document.createElement("i");
@@ -10968,8 +11043,8 @@
10968
11043
  "vd-music-player-floating-bottom-right",
10969
11044
  "is-position-custom"
10970
11045
  );
10971
- container.style.removeProperty("--music-player-floating-top");
10972
- container.style.removeProperty("--music-player-floating-left");
11046
+ container.style.removeProperty("--vd-music-player-floating-top");
11047
+ container.style.removeProperty("--vd-music-player-floating-left");
10973
11048
  if (r && r.parent && r.parent.isConnected) {
10974
11049
  r.parent.insertBefore(container, r.next);
10975
11050
  }
@@ -11061,8 +11136,8 @@
11061
11136
  */
11062
11137
  _setCornerPosition: function(container, which) {
11063
11138
  container.classList.remove("is-position-custom", "vd-music-player-floating-bottom-left", "vd-music-player-floating-bottom-right");
11064
- container.style.removeProperty("--music-player-floating-top");
11065
- container.style.removeProperty("--music-player-floating-left");
11139
+ container.style.removeProperty("--vd-music-player-floating-top");
11140
+ container.style.removeProperty("--vd-music-player-floating-left");
11066
11141
  if (which === "bottom-left") {
11067
11142
  container.classList.add("vd-music-player-floating-bottom-left");
11068
11143
  } else {
@@ -11077,8 +11152,8 @@
11077
11152
  _setCustomPositionFromRect: function(container, left, top) {
11078
11153
  container.classList.remove("vd-music-player-floating-bottom-left", "vd-music-player-floating-bottom-right");
11079
11154
  container.classList.add("is-position-custom");
11080
- container.style.setProperty("--music-player-floating-left", left + "px");
11081
- container.style.setProperty("--music-player-floating-top", top + "px");
11155
+ container.style.setProperty("--vd-music-player-floating-left", left + "px");
11156
+ container.style.setProperty("--vd-music-player-floating-top", top + "px");
11082
11157
  },
11083
11158
  /**
11084
11159
  * @param {HTMLElement} container