@surdeddd/bottom-sheet 0.6.1 → 0.8.0

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/dist/element.js CHANGED
@@ -2597,6 +2597,7 @@ var init_BottomSheetEngine = __esm({
2597
2597
  __publicField(this, "progressWriteSentinel", new WriteSentinel());
2598
2598
  __publicField(this, "isTopSheet", true);
2599
2599
  __publicField(this, "opening", false);
2600
+ __publicField(this, "allowOvershoot", false);
2600
2601
  __publicField(this, "progressPayload", {
2601
2602
  value: 0,
2602
2603
  size: 0
@@ -2887,8 +2888,8 @@ var init_BottomSheetEngine = __esm({
2887
2888
  this.updateAriaSlider();
2888
2889
  this.emit("snap", {
2889
2890
  id,
2890
- size: target.size,
2891
- progress: this.computeProgress(target.size)
2891
+ size: this.size,
2892
+ progress: this.computeProgress(this.size)
2892
2893
  });
2893
2894
  if (wasClosed && target.size > 0) {
2894
2895
  this.emit("open", { id });
@@ -2967,12 +2968,12 @@ var init_BottomSheetEngine = __esm({
2967
2968
  const value = typeof h === "number" ? `${h}px` : h;
2968
2969
  const axis = layoutAxis(this.mode);
2969
2970
  this.element.style.setProperty(
2970
- axis === "height" ? "maxHeight" : "maxWidth",
2971
+ axis === "height" ? "max-height" : "max-width",
2971
2972
  value
2972
2973
  );
2973
2974
  if (typeof h === "number") {
2974
2975
  this.maxHeightCap = h;
2975
- this.clampToMaxHeight();
2976
+ this.recompute();
2976
2977
  } else if (typeof window !== "undefined") {
2977
2978
  const probe2 = document.createElement("div");
2978
2979
  probe2.style.cssText = `position:absolute;visibility:hidden;pointer-events:none;${axis === "height" ? "height" : "width"}:${value};`;
@@ -2980,7 +2981,7 @@ var init_BottomSheetEngine = __esm({
2980
2981
  const measured = axis === "height" ? probe2.offsetHeight : probe2.offsetWidth;
2981
2982
  probe2.remove();
2982
2983
  this.maxHeightCap = measured > 0 ? measured : void 0;
2983
- this.clampToMaxHeight();
2984
+ this.recompute();
2984
2985
  }
2985
2986
  }
2986
2987
  clampToMaxHeight() {
@@ -2988,9 +2989,6 @@ var init_BottomSheetEngine = __esm({
2988
2989
  if (this.snaps.getMaxAxisSize() > this.maxHeightCap) {
2989
2990
  this.snaps.setMaxAxisSize(this.maxHeightCap);
2990
2991
  }
2991
- if (this.size > this.maxHeightCap && !this.gesture?.isDragging) {
2992
- this.applySize(this.maxHeightCap);
2993
- }
2994
2992
  }
2995
2993
  setAllowed(ids, snap) {
2996
2994
  if (this.destroyed) return;
@@ -3128,6 +3126,7 @@ var init_BottomSheetEngine = __esm({
3128
3126
  recompute() {
3129
3127
  if (this.destroyed) return;
3130
3128
  this.snaps.recompute();
3129
+ this.clampToMaxHeight();
3131
3130
  this.scrim.invalidateOpacityCache();
3132
3131
  if (this.gesture?.isDragging) return;
3133
3132
  const current = this.snaps.findById(this.activeId);
@@ -3151,43 +3150,36 @@ var init_BottomSheetEngine = __esm({
3151
3150
  }
3152
3151
  return out;
3153
3152
  }
3154
- measureContentExtent(vertical) {
3153
+ measureSheetNatural(vertical) {
3154
+ const el = this.element;
3155
3155
  const content = this.scrollContainer;
3156
- if (!content) return 0;
3157
- const targets = this.contentTargets();
3158
- if (targets.length === 0) {
3159
- return vertical ? content.scrollHeight : content.scrollWidth;
3160
- }
3161
- let min = Infinity;
3162
- let max = -Infinity;
3163
- for (const el of targets) {
3164
- const r = el.getBoundingClientRect();
3165
- if (vertical) {
3166
- if (r.top < min) min = r.top;
3167
- if (r.bottom > max) max = r.bottom;
3168
- } else {
3169
- if (r.left < min) min = r.left;
3170
- if (r.right > max) max = r.right;
3171
- }
3172
- }
3173
- if (!isFinite(min) || !isFinite(max) || max <= min) {
3174
- return vertical ? content.scrollHeight : content.scrollWidth;
3156
+ if (!content) {
3157
+ return vertical ? el.offsetHeight : el.offsetWidth;
3175
3158
  }
3176
- let pad = 0;
3177
- if (typeof getComputedStyle !== "undefined") {
3178
- const cs = getComputedStyle(content);
3179
- pad = vertical ? (parseFloat(cs.paddingTop) || 0) + (parseFloat(cs.paddingBottom) || 0) : (parseFloat(cs.paddingLeft) || 0) + (parseFloat(cs.paddingRight) || 0);
3180
- }
3181
- return max - min + pad;
3159
+ const axis = vertical ? "height" : "width";
3160
+ const sheetStyle = el.style;
3161
+ const cs = content.style;
3162
+ const prevSheet = sheetStyle[axis];
3163
+ const prevFlex = cs.flex;
3164
+ const prevContent = vertical ? cs.height : cs.width;
3165
+ sheetStyle[axis] = "auto";
3166
+ cs.flex = "none";
3167
+ if (vertical) cs.height = "auto";
3168
+ else cs.width = "auto";
3169
+ const natural = vertical ? el.offsetHeight : el.offsetWidth;
3170
+ sheetStyle[axis] = prevSheet;
3171
+ cs.flex = prevFlex;
3172
+ if (vertical) cs.height = prevContent;
3173
+ else cs.width = prevContent;
3174
+ return natural;
3182
3175
  }
3183
3176
  measureFitSize() {
3184
3177
  const vertical = layoutAxis(this.mode) === "height";
3185
- const handleSize = vertical ? this.handle.offsetHeight : this.handle.offsetWidth;
3186
- const content = this.scrollContainer;
3187
- const natural = content ? handleSize + this.measureContentExtent(vertical) : handleSize;
3188
- if (typeof window === "undefined") return natural;
3178
+ const natural = this.measureSheetNatural(vertical);
3179
+ const capped = this.maxHeightCap !== void 0 ? Math.min(natural, this.maxHeightCap) : natural;
3180
+ if (typeof window === "undefined") return capped;
3189
3181
  const viewport = vertical ? window.innerHeight : window.innerWidth;
3190
- return viewport > 0 ? Math.min(natural, viewport) : natural;
3182
+ return viewport > 0 ? Math.min(capped, viewport) : capped;
3191
3183
  }
3192
3184
  installFitObserver() {
3193
3185
  if (typeof ResizeObserver === "undefined") return;
@@ -3269,6 +3261,10 @@ var init_BottomSheetEngine = __esm({
3269
3261
  this.backdrop.style.opacity = "";
3270
3262
  this.backdrop.style.pointerEvents = "";
3271
3263
  }
3264
+ if (this.anchorHost) {
3265
+ this.anchorHost.style.removeProperty("--bs-size");
3266
+ this.anchorHost.style.removeProperty("--bs-progress");
3267
+ }
3272
3268
  if (this.screenComponent) {
3273
3269
  this.screenComponent.style.opacity = "";
3274
3270
  this.screenComponent.style.display = "";
@@ -3280,6 +3276,7 @@ var init_BottomSheetEngine = __esm({
3280
3276
  this.bus.emit(event, payload);
3281
3277
  }
3282
3278
  newCycle() {
3279
+ this.allowOvershoot = false;
3283
3280
  this.currentAbort.abort();
3284
3281
  this.currentAbort = new AbortController();
3285
3282
  return this.currentAbort.signal;
@@ -3345,6 +3342,7 @@ var init_BottomSheetEngine = __esm({
3345
3342
  seen.add(p.id);
3346
3343
  }
3347
3344
  this.snaps.setRaw(this.snapPointsRaw);
3345
+ this.clampToMaxHeight();
3348
3346
  this.scrim.invalidateOpacityCache();
3349
3347
  }
3350
3348
  getAllowedRange() {
@@ -3551,15 +3549,19 @@ var init_BottomSheetEngine = __esm({
3551
3549
  this.opening = true;
3552
3550
  sheetStack.promote(this.id);
3553
3551
  }
3554
- void this.animation.animateTo(target.size, velocity).then(() => {
3555
- this.opening = false;
3552
+ const settleCap = this.snaps.getMaxAxisSize();
3553
+ const settleSize = settleCap > 0 ? Math.min(target.size, settleCap) : target.size;
3554
+ this.allowOvershoot = true;
3555
+ void this.animation.animateTo(settleSize, velocity).then(() => {
3556
3556
  if (signal.aborted) return;
3557
+ this.allowOvershoot = false;
3558
+ this.opening = false;
3557
3559
  this.scrollCache.restore(target.id, previousSize, target.size);
3558
3560
  this.updateAriaSlider();
3559
3561
  this.emit("snap", {
3560
3562
  id: target.id,
3561
- size: target.size,
3562
- progress: this.computeProgress(target.size)
3563
+ size: this.size,
3564
+ progress: this.computeProgress(this.size)
3563
3565
  });
3564
3566
  this.haptic();
3565
3567
  if (previousSnapSize === 0 && target.size > 0) {
@@ -3584,23 +3586,25 @@ var init_BottomSheetEngine = __esm({
3584
3586
  }
3585
3587
  }
3586
3588
  applySize(size) {
3587
- this.size = size;
3588
- const offset = this.snaps.getMaxAxisSize() - size;
3589
+ const cap = this.snaps.getMaxAxisSize();
3590
+ const clamped = cap > 0 && size > cap && !this.gesture?.isDragging && !this.allowOvershoot ? cap : size;
3591
+ this.size = clamped;
3592
+ const offset = cap - clamped;
3589
3593
  const style = this.element.style;
3590
3594
  style.transform = this.transformTemplate(offset);
3591
- if (this.sizeWriteSentinel.shouldWrite(size, SIZE_WRITE_EPSILON)) {
3592
- style.setProperty("--bs-size", `${size}px`);
3595
+ if (this.sizeWriteSentinel.shouldWrite(clamped, SIZE_WRITE_EPSILON)) {
3596
+ style.setProperty("--bs-size", `${clamped}px`);
3593
3597
  if (this.scrimParent) {
3594
- this.scrimParent.style.setProperty("--bs-size", `${size}px`);
3598
+ this.scrimParent.style.setProperty("--bs-size", `${clamped}px`);
3595
3599
  }
3596
3600
  if (this.anchorHost && this.anchorHost !== this.scrimParent) {
3597
- this.anchorHost.style.setProperty("--bs-size", `${size}px`);
3601
+ this.anchorHost.style.setProperty("--bs-size", `${clamped}px`);
3598
3602
  }
3599
3603
  if (this.rootEl && this.rootEl !== this.scrimParent && this.rootEl !== this.anchorHost) {
3600
- this.rootEl.style.setProperty("--bs-size", `${size}px`);
3604
+ this.rootEl.style.setProperty("--bs-size", `${clamped}px`);
3601
3605
  }
3602
3606
  }
3603
- const progress = this.computeProgress(size);
3607
+ const progress = this.computeProgress(clamped);
3604
3608
  const progressChanged = this.progressWriteSentinel.shouldWrite(
3605
3609
  progress,
3606
3610
  OPACITY_WRITE_EPSILON
@@ -3617,14 +3621,15 @@ var init_BottomSheetEngine = __esm({
3617
3621
  this.scrim.applyOpacity(progress, progressChanged);
3618
3622
  if (progressChanged && this.bus.listenerCount("progress") > 0) {
3619
3623
  this.progressPayload.value = progress;
3620
- this.progressPayload.size = size;
3624
+ this.progressPayload.size = clamped;
3621
3625
  this.emit("progress", this.progressPayload);
3622
3626
  }
3623
3627
  }
3624
3628
  computeProgress(size) {
3625
3629
  const { min, max } = this.getAllowedRange();
3626
- if (max <= min) return 0;
3627
- return Math.min(Math.max((size - min) / (max - min), 0), 1);
3630
+ const reachableMax = Math.min(max, this.snaps.getMaxAxisSize());
3631
+ if (reachableMax <= min) return 0;
3632
+ return Math.min(Math.max((size - min) / (reachableMax - min), 0), 1);
3628
3633
  }
3629
3634
  handleOpen() {
3630
3635
  sheetStack.promote(this.id);
@@ -3648,8 +3653,8 @@ var init_BottomSheetEngine = __esm({
3648
3653
  this.updateAriaSlider();
3649
3654
  this.emit("snap", {
3650
3655
  id: target.id,
3651
- size: target.size,
3652
- progress: this.computeProgress(target.size)
3656
+ size: this.size,
3657
+ progress: this.computeProgress(this.size)
3653
3658
  });
3654
3659
  if (target.size > 0 && !this.lifecycle.isInstalled) {
3655
3660
  this.emit("open", { id: target.id });
@@ -3675,7 +3680,7 @@ var init_BottomSheetEngine = __esm({
3675
3680
  var baseStyles;
3676
3681
  var init_baseStyles = __esm({
3677
3682
  "src/web-component/baseStyles.ts"() {
3678
- baseStyles = `:where(.bs-root){--bs-surface-d:#ffffff;--bs-surface-border-d:rgba(225,227,237,1);--bs-radius-d:20px;--bs-handle-color-d:rgba(26,22,20,0.3);--bs-handle-width:40px;--bs-handle-height:5px;--bs-z-backdrop:90;--bs-z-sheet:100;--bs-header-min-height:80px;--bs-backdrop-color-d:rgba(0,0,0,0.5);--bs-scrim-color-d:transparent;--bs-scrim-blur:0px;--bs-z-scrim:calc(var(--bs-z-sheet) - 1);--bs-size:0px;--bs-progress:0}.bs-backdrop{position:fixed;inset:0;background:var(--bs-backdrop-color,var(--bs-backdrop-color-d));opacity:0;pointer-events:none;z-index:var(--bs-z-backdrop);transition:opacity 0.24s cubic-bezier(0.22,1,0.36,1);will-change:opacity}.bs-root[data-dragging="true"] .bs-backdrop,.bs-root[data-animating="true"] .bs-backdrop{transition:none}.bs-sheet{position:fixed;background:var(--bs-surface,var(--bs-surface-d));box-shadow:var(--bs-shadow,var(--bs-shadow-auto,none));z-index:var(--bs-z-sheet);pointer-events:auto;overflow:hidden;display:flex;flex-direction:column;-webkit-tap-highlight-color:transparent;user-select:none;overscroll-behavior:contain}.bs-sheet[data-mode="bottom"]{left:0;right:0;bottom:0;width:100%;border-top-left-radius:var(--bs-radius,var(--bs-radius-d));border-top-right-radius:var(--bs-radius,var(--bs-radius-d));border-top:1px solid var(--bs-surface-border,var(--bs-surface-border-d));padding-bottom:env(safe-area-inset-bottom);--bs-shadow-auto:0 calc(var(--bs-progress,0) * -2px - 3px) calc(var(--bs-progress,0) * 18px + 12px) rgba(0,0,0,calc(var(--bs-progress,0) * 0.15 + 0.12))}.bs-sheet[data-mode="top"]{left:0;right:0;top:0;width:100%;border-bottom-left-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-right-radius:var(--bs-radius,var(--bs-radius-d));border-bottom:1px solid var(--bs-surface-border,var(--bs-surface-border-d));flex-direction:column-reverse;--bs-shadow-auto:0 3px 12px rgba(0,0,0,0.12);padding-top:env(safe-area-inset-top)}.bs-sheet[data-mode="left"]{top:0;bottom:0;left:0;height:100%;border-top-right-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-right-radius:var(--bs-radius,var(--bs-radius-d));border-right:1px solid var(--bs-surface-border,var(--bs-surface-border-d));--bs-shadow-auto:3px 0 12px rgba(0,0,0,0.12)}.bs-sheet[data-mode="right"]{top:0;bottom:0;right:0;height:100%;border-top-left-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-left-radius:var(--bs-radius,var(--bs-radius-d));border-left:1px solid var(--bs-surface-border,var(--bs-surface-border-d));--bs-shadow-auto:-3px 0 12px rgba(0,0,0,0.12)}.bs-sheet[data-mode="left"] .bs-content{padding-right:36px}.bs-sheet[data-mode="right"] .bs-content{padding-left:36px}.bs-handle{flex-shrink:0;min-height:44px;display:flex;flex-direction:column;justify-content:center;padding:8px 16px 4px;cursor:grab;touch-action:none;user-select:none;background:var(--bs-surface,var(--bs-surface-d));-webkit-tap-highlight-color:transparent;outline:none;position:relative}.bs-handle:active{cursor:grabbing}.bs-handle:focus-visible{outline:2px solid currentColor;outline-offset:-2px;border-radius:var(--bs-radius,var(--bs-radius-d))}.bs-handle::before{content:"";display:block;width:var(--bs-handle-width);height:var(--bs-handle-height);background:var(--bs-handle-color,var(--bs-handle-color-d));border-radius:calc(var(--bs-handle-height) / 2);margin:0 auto 8px;transition:width 0.15s ease,background 0.15s ease,transform 0.15s ease;pointer-events:none}.bs-sheet[data-mode="left"] .bs-handle,.bs-sheet[data-mode="right"] .bs-handle{position:absolute;top:0;bottom:0;width:28px;min-width:0;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0;background:var(--bs-surface,var(--bs-surface-d));z-index:1;overflow:hidden}.bs-sheet[data-mode="left"] .bs-handle>*,.bs-sheet[data-mode="right"] .bs-handle>*{display:none}.bs-sheet[data-mode="left"] .bs-handle{right:0;border-left:1px solid var(--bs-surface-border,var(--bs-surface-border-d))}.bs-sheet[data-mode="right"] .bs-handle{left:0;border-right:1px solid var(--bs-surface-border,var(--bs-surface-border-d))}.bs-sheet[data-mode="left"] .bs-handle::before,.bs-sheet[data-mode="right"] .bs-handle::before{width:var(--bs-handle-height);height:var(--bs-handle-width);margin:0}.bs-sheet:hover .bs-handle::before{background:color-mix(in oklab,var(--bs-handle-color,var(--bs-handle-color-d)),#000 15%)}.bs-handle:active::before{background:color-mix(in oklab,var(--bs-handle-color,var(--bs-handle-color-d)),#000 35%);transform:scaleX(1.15)}.bs-handle.bs-handle--ticks::after{content:"";display:block;position:absolute;left:50%;bottom:6px;transform:translateX(-50%);width:calc(var(--bs-handle-width) * 2);height:3px;background-image:radial-gradient( circle,var(--bs-handle-color,var(--bs-handle-color-d)) 0 1.5px,transparent 1.6px );background-size:8px 3px;background-repeat:repeat-x;background-position:center;opacity:0;transition:opacity 0.18s ease-out;pointer-events:none}.bs-root[data-dragging="true"] .bs-handle.bs-handle--ticks::after{opacity:0.4}.bs-sheet[data-mode="top"] .bs-handle.bs-handle--ticks::after{bottom:auto;top:6px}.bs-sheet[data-mode="left"] .bs-handle.bs-handle--ticks::after,.bs-sheet[data-mode="right"] .bs-handle.bs-handle--ticks::after{left:50%;top:50%;bottom:auto;transform:translate(-50%,-50%);width:3px;height:calc(var(--bs-handle-width) * 2);background-size:3px 8px;background-repeat:repeat-y;margin-left:calc(var(--bs-handle-height) + 6px)}.bs-sheet[data-mode="right"] .bs-handle.bs-handle--ticks::after{margin-left:calc(-1 * (var(--bs-handle-height) + 6px))}.bs-header{flex:0 0 auto;padding:0 16px 8px;background:var(--bs-surface,var(--bs-surface-d))}.bs-content{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;user-select:text;padding:0 16px 16px}.bs-footer{flex:0 0 auto;padding:12px 16px calc(12px + env(safe-area-inset-bottom));border-top:1px solid var(--bs-surface-border,var(--bs-surface-border-d));background:var(--bs-surface,var(--bs-surface-d))}.bs-sheet[data-mode="bottom"]:has(.bs-footer:not([hidden]):has(*)){padding-bottom:0}.bs-header:not(:has(*)),.bs-footer:not(:has(*)),.bs-header[hidden],.bs-footer[hidden]{display:none}.bs-screen{position:absolute;inset:0;pointer-events:none;z-index:var(--bs-z-scrim);background:var(--bs-scrim-color,var(--bs-scrim-color-d));transition:opacity 0.24s cubic-bezier(0.22,1,0.36,1);will-change:opacity}.bs-root[data-dragging="true"] .bs-screen,.bs-root[data-animating="true"] .bs-screen{transition:none}.bs-scrim-overlay{z-index:calc(var(--bs-z-sheet) + 1);pointer-events:none}.bs-button-slot{position:fixed;z-index:calc(var(--bs-z-sheet) + 1);pointer-events:auto}.bs-button-slot[data-side="left"]{left:16px;bottom:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-side="right"]{right:16px;bottom:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-mode="top"]{bottom:auto;top:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-mode="left"]{left:calc(var(--bs-size,0px) + 12px);right:auto;bottom:auto;top:16px}.bs-button-slot[data-mode="right"]{right:calc(var(--bs-size,0px) + 12px);left:auto;bottom:auto;top:16px}@media (prefers-reduced-motion:reduce){.bs-backdrop,.bs-handle::before,.bs-button-slot[data-side="left"],.bs-button-slot[data-side="right"]{transition:none !important}}@media (prefers-color-scheme:dark){:where(.bs-root){--bs-surface-d:#1a1a1d;--bs-surface-border-d:rgba(255,255,255,0.08);--bs-handle-color-d:rgba(255,255,255,0.45);--bs-shadow-auto:0 -3px 16px rgba(0,0,0,0.5)}}.bs-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:where(.ovl-root){--ovl-surface:var(--bs-surface,var(--bs-surface-d,#ffffff));--ovl-surface-border:var(--bs-surface-border,var(--bs-surface-border-d,rgba(0,0,0,0.08)));--ovl-shadow:0 -8px 40px rgba(0,0,0,0.35);--ovl-radius:var(--bs-radius,var(--bs-radius-d,20px));--ovl-backdrop-color:rgba(0,0,0,0.5);--ovl-z-backdrop:200;--ovl-z-panel:201}.ovl-backdrop{position:fixed;inset:0;background:var(--ovl-backdrop-color);opacity:0;pointer-events:none;z-index:var(--ovl-z-backdrop)}.ovl-panel{position:fixed;background:var(--ovl-surface);box-shadow:var(--ovl-shadow);z-index:var(--ovl-z-panel);-webkit-tap-highlight-color:transparent;outline:none;transition:transform 0.32s cubic-bezier(0.29,1.24,0.84,0.99),opacity 0.32s ease-out}.ovl-panel[data-state="open"]{transform:translate3d(0,0,0);opacity:1}@starting-style{.ovl-panel[data-edge="bottom"][data-state="open"]{transform:translate3d(0,100%,0);opacity:0}.ovl-panel[data-edge="top"][data-state="open"]{transform:translate3d(0,-100%,0);opacity:0}.ovl-panel[data-edge="left"][data-state="open"]{transform:translate3d(-100%,0,0);opacity:0}.ovl-panel[data-edge="right"][data-state="open"]{transform:translate3d(100%,0,0);opacity:0}}.ovl-panel[data-edge="bottom"]{left:0;right:0;bottom:0;width:100%;border-top-left-radius:var(--ovl-radius);border-top-right-radius:var(--ovl-radius);border-top:1px solid var(--ovl-surface-border);padding-bottom:env(safe-area-inset-bottom)}.ovl-panel[data-edge="top"]{left:0;right:0;top:0;width:100%;border-bottom-left-radius:var(--ovl-radius);border-bottom-right-radius:var(--ovl-radius);border-bottom:1px solid var(--ovl-surface-border);padding-top:env(safe-area-inset-top)}.ovl-panel[data-edge="left"]{top:0;bottom:0;left:0;height:100%;border-top-right-radius:var(--ovl-radius);border-bottom-right-radius:var(--ovl-radius);border-right:1px solid var(--ovl-surface-border)}.ovl-panel[data-edge="right"]{top:0;bottom:0;right:0;height:100%;border-top-left-radius:var(--ovl-radius);border-bottom-left-radius:var(--ovl-radius);border-left:1px solid var(--ovl-surface-border)}@media (prefers-reduced-motion:reduce){.ovl-panel,.ovl-backdrop{transition:none !important}}`;
3683
+ baseStyles = `:where(.bs-root){--bs-surface-d:#ffffff;--bs-surface-border-d:rgba(225,227,237,1);--bs-radius-d:20px;--bs-handle-color-d:rgba(26,22,20,0.3);--bs-handle-width:40px;--bs-handle-height:5px;--bs-z-backdrop:90;--bs-z-sheet:100;--bs-header-min-height:80px;--bs-backdrop-color-d:rgba(0,0,0,0.5);--bs-scrim-color-d:transparent;--bs-scrim-blur:0px;--bs-z-scrim:calc(var(--bs-z-sheet) - 1);--bs-size:0px;--bs-progress:0}.bs-backdrop{position:fixed;inset:0;background:var(--bs-backdrop-color,var(--bs-backdrop-color-d));opacity:0;pointer-events:none;z-index:var(--bs-z-backdrop);transition:opacity 0.24s cubic-bezier(0.22,1,0.36,1);will-change:opacity}.bs-root[data-dragging="true"] .bs-backdrop,.bs-root[data-animating="true"] .bs-backdrop{transition:none}.bs-sheet{position:fixed;background:var(--bs-surface,var(--bs-surface-d));box-shadow:var(--bs-shadow,var(--bs-shadow-auto,none));z-index:var(--bs-z-sheet);pointer-events:auto;overflow:hidden;display:flex;flex-direction:column;-webkit-tap-highlight-color:transparent;user-select:none;overscroll-behavior:contain}.bs-sheet[data-mode="bottom"]{left:0;right:0;bottom:0;width:100%;border-top-left-radius:var(--bs-radius,var(--bs-radius-d));border-top-right-radius:var(--bs-radius,var(--bs-radius-d));border-top:1px solid var(--bs-surface-border,var(--bs-surface-border-d));padding-bottom:env(safe-area-inset-bottom);--bs-shadow-auto:0 calc(var(--bs-progress,0) * -2px - 3px) calc(var(--bs-progress,0) * 18px + 12px) rgba(0,0,0,calc(var(--bs-progress,0) * 0.15 + 0.12))}.bs-sheet[data-mode="top"]{left:0;right:0;top:0;width:100%;border-bottom-left-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-right-radius:var(--bs-radius,var(--bs-radius-d));border-bottom:1px solid var(--bs-surface-border,var(--bs-surface-border-d));flex-direction:column-reverse;--bs-shadow-auto:0 3px 12px rgba(0,0,0,0.12);padding-top:env(safe-area-inset-top)}.bs-sheet[data-mode="left"]{top:0;bottom:0;left:0;height:100%;border-top-right-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-right-radius:var(--bs-radius,var(--bs-radius-d));border-right:1px solid var(--bs-surface-border,var(--bs-surface-border-d));--bs-shadow-auto:3px 0 12px rgba(0,0,0,0.12)}.bs-sheet[data-mode="right"]{top:0;bottom:0;right:0;height:100%;border-top-left-radius:var(--bs-radius,var(--bs-radius-d));border-bottom-left-radius:var(--bs-radius,var(--bs-radius-d));border-left:1px solid var(--bs-surface-border,var(--bs-surface-border-d));--bs-shadow-auto:-3px 0 12px rgba(0,0,0,0.12)}.bs-sheet[data-mode="left"] .bs-content{padding-right:36px}.bs-sheet[data-mode="right"] .bs-content{padding-left:36px}.bs-handle{flex-shrink:0;min-height:44px;display:flex;flex-direction:column;justify-content:center;padding:var(--bs-handle-padding,8px 16px 4px);cursor:grab;touch-action:none;user-select:none;background:var(--bs-surface,var(--bs-surface-d));-webkit-tap-highlight-color:transparent;outline:none;position:relative}.bs-handle:active{cursor:grabbing}.bs-handle:focus-visible{outline:2px solid currentColor;outline-offset:-2px;border-radius:var(--bs-radius,var(--bs-radius-d))}.bs-handle::before{content:"";display:block;width:var(--bs-handle-width);height:var(--bs-handle-height);background:var(--bs-handle-color,var(--bs-handle-color-d));border-radius:calc(var(--bs-handle-height) / 2);margin:0 auto 8px;transition:width 0.15s ease,background 0.15s ease,transform 0.15s ease;pointer-events:none}.bs-sheet[data-mode="left"] .bs-handle,.bs-sheet[data-mode="right"] .bs-handle{position:absolute;top:0;bottom:0;width:28px;min-width:0;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0;background:var(--bs-surface,var(--bs-surface-d));z-index:1;overflow:hidden}.bs-sheet[data-mode="left"] .bs-handle>*,.bs-sheet[data-mode="right"] .bs-handle>*{display:none}.bs-sheet[data-mode="left"] .bs-handle{right:0;border-left:1px solid var(--bs-surface-border,var(--bs-surface-border-d))}.bs-sheet[data-mode="right"] .bs-handle{left:0;border-right:1px solid var(--bs-surface-border,var(--bs-surface-border-d))}.bs-sheet[data-mode="left"] .bs-handle::before,.bs-sheet[data-mode="right"] .bs-handle::before{width:var(--bs-handle-height);height:var(--bs-handle-width);margin:0}.bs-sheet:hover .bs-handle::before{background:color-mix(in oklab,var(--bs-handle-color,var(--bs-handle-color-d)),#000 15%)}.bs-handle:active::before{background:color-mix(in oklab,var(--bs-handle-color,var(--bs-handle-color-d)),#000 35%);transform:scaleX(1.15)}.bs-handle.bs-handle--ticks::after{content:"";display:block;position:absolute;left:50%;bottom:6px;transform:translateX(-50%);width:calc(var(--bs-handle-width) * 2);height:3px;background-image:radial-gradient( circle,var(--bs-handle-color,var(--bs-handle-color-d)) 0 1.5px,transparent 1.6px );background-size:8px 3px;background-repeat:repeat-x;background-position:center;opacity:0;transition:opacity 0.18s ease-out;pointer-events:none}.bs-root[data-dragging="true"] .bs-handle.bs-handle--ticks::after{opacity:0.4}.bs-sheet[data-mode="top"] .bs-handle.bs-handle--ticks::after{bottom:auto;top:6px}.bs-sheet[data-mode="left"] .bs-handle.bs-handle--ticks::after,.bs-sheet[data-mode="right"] .bs-handle.bs-handle--ticks::after{left:50%;top:50%;bottom:auto;transform:translate(-50%,-50%);width:3px;height:calc(var(--bs-handle-width) * 2);background-size:3px 8px;background-repeat:repeat-y;margin-left:calc(var(--bs-handle-height) + 6px)}.bs-sheet[data-mode="right"] .bs-handle.bs-handle--ticks::after{margin-left:calc(-1 * (var(--bs-handle-height) + 6px))}.bs-header{flex:0 0 auto;padding:var(--bs-header-padding,0 16px 8px);background:var(--bs-surface,var(--bs-surface-d))}.bs-content{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;user-select:text;padding:var(--bs-content-padding,0 16px 16px)}.bs-footer{flex:0 0 auto;padding:var(--bs-footer-padding,12px 16px calc(12px + env(safe-area-inset-bottom)));border-top:1px solid var(--bs-surface-border,var(--bs-surface-border-d));background:var(--bs-surface,var(--bs-surface-d))}.bs-sheet[data-mode="bottom"]:has(.bs-footer:not([hidden]):has(*)){padding-bottom:0}.bs-header:not(:has(*)),.bs-footer:not(:has(*)),.bs-header[hidden],.bs-footer[hidden]{display:none}.bs-screen{position:absolute;inset:0;pointer-events:none;z-index:var(--bs-z-scrim);background:var(--bs-scrim-color,var(--bs-scrim-color-d));transition:opacity 0.24s cubic-bezier(0.22,1,0.36,1);will-change:opacity}.bs-root[data-dragging="true"] .bs-screen,.bs-root[data-animating="true"] .bs-screen{transition:none}.bs-scrim-overlay{z-index:calc(var(--bs-z-sheet) + 1);pointer-events:none}.bs-button-slot{position:fixed;z-index:calc(var(--bs-z-sheet) + 1);pointer-events:auto}.bs-button-slot[data-side="left"]{left:16px;bottom:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-side="right"]{right:16px;bottom:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-mode="top"]{bottom:auto;top:calc(var(--bs-size,0px) + 12px)}.bs-button-slot[data-mode="left"]{left:calc(var(--bs-size,0px) + 12px);right:auto;bottom:auto;top:16px}.bs-button-slot[data-mode="right"]{right:calc(var(--bs-size,0px) + 12px);left:auto;bottom:auto;top:16px}@media (prefers-reduced-motion:reduce){.bs-backdrop,.bs-handle::before,.bs-button-slot[data-side="left"],.bs-button-slot[data-side="right"]{transition:none !important}}@media (prefers-color-scheme:dark){:where(.bs-root){--bs-surface-d:#1a1a1d;--bs-surface-border-d:rgba(255,255,255,0.08);--bs-handle-color-d:rgba(255,255,255,0.45);--bs-shadow-auto:0 -3px 16px rgba(0,0,0,0.5)}}.bs-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}:where(.ovl-root){--ovl-surface:var(--bs-surface,var(--bs-surface-d,#ffffff));--ovl-surface-border:var(--bs-surface-border,var(--bs-surface-border-d,rgba(0,0,0,0.08)));--ovl-shadow:0 -8px 40px rgba(0,0,0,0.35);--ovl-radius:var(--bs-radius,var(--bs-radius-d,20px));--ovl-backdrop-color:rgba(0,0,0,0.5);--ovl-z-backdrop:200;--ovl-z-panel:201}.ovl-backdrop{position:fixed;inset:0;background:var(--ovl-backdrop-color);opacity:0;pointer-events:none;z-index:var(--ovl-z-backdrop)}.ovl-panel{position:fixed;background:var(--ovl-surface);box-shadow:var(--ovl-shadow);z-index:var(--ovl-z-panel);-webkit-tap-highlight-color:transparent;outline:none;transition:transform 0.32s cubic-bezier(0.29,1.24,0.84,0.99),opacity 0.32s ease-out}.ovl-panel[data-state="open"]{transform:translate3d(0,0,0);opacity:1}@starting-style{.ovl-panel[data-edge="bottom"][data-state="open"]{transform:translate3d(0,100%,0);opacity:0}.ovl-panel[data-edge="top"][data-state="open"]{transform:translate3d(0,-100%,0);opacity:0}.ovl-panel[data-edge="left"][data-state="open"]{transform:translate3d(-100%,0,0);opacity:0}.ovl-panel[data-edge="right"][data-state="open"]{transform:translate3d(100%,0,0);opacity:0}}.ovl-panel[data-edge="bottom"]{left:0;right:0;bottom:0;width:100%;border-top-left-radius:var(--ovl-radius);border-top-right-radius:var(--ovl-radius);border-top:1px solid var(--ovl-surface-border);padding-bottom:env(safe-area-inset-bottom)}.ovl-panel[data-edge="top"]{left:0;right:0;top:0;width:100%;border-bottom-left-radius:var(--ovl-radius);border-bottom-right-radius:var(--ovl-radius);border-bottom:1px solid var(--ovl-surface-border);padding-top:env(safe-area-inset-top)}.ovl-panel[data-edge="left"]{top:0;bottom:0;left:0;height:100%;border-top-right-radius:var(--ovl-radius);border-bottom-right-radius:var(--ovl-radius);border-right:1px solid var(--ovl-surface-border)}.ovl-panel[data-edge="right"]{top:0;bottom:0;right:0;height:100%;border-top-left-radius:var(--ovl-radius);border-bottom-left-radius:var(--ovl-radius);border-left:1px solid var(--ovl-surface-border)}@media (prefers-reduced-motion:reduce){.ovl-panel,.ovl-backdrop{transition:none !important}}`;
3679
3684
  }
3680
3685
  });
3681
3686
 
package/dist/index.cjs CHANGED
@@ -2364,6 +2364,7 @@ var BottomSheetEngine = class {
2364
2364
  __publicField(this, "progressWriteSentinel", new WriteSentinel());
2365
2365
  __publicField(this, "isTopSheet", true);
2366
2366
  __publicField(this, "opening", false);
2367
+ __publicField(this, "allowOvershoot", false);
2367
2368
  __publicField(this, "progressPayload", {
2368
2369
  value: 0,
2369
2370
  size: 0
@@ -2654,8 +2655,8 @@ var BottomSheetEngine = class {
2654
2655
  this.updateAriaSlider();
2655
2656
  this.emit("snap", {
2656
2657
  id,
2657
- size: target.size,
2658
- progress: this.computeProgress(target.size)
2658
+ size: this.size,
2659
+ progress: this.computeProgress(this.size)
2659
2660
  });
2660
2661
  if (wasClosed && target.size > 0) {
2661
2662
  this.emit("open", { id });
@@ -2734,12 +2735,12 @@ var BottomSheetEngine = class {
2734
2735
  const value = typeof h === "number" ? `${h}px` : h;
2735
2736
  const axis = layoutAxis(this.mode);
2736
2737
  this.element.style.setProperty(
2737
- axis === "height" ? "maxHeight" : "maxWidth",
2738
+ axis === "height" ? "max-height" : "max-width",
2738
2739
  value
2739
2740
  );
2740
2741
  if (typeof h === "number") {
2741
2742
  this.maxHeightCap = h;
2742
- this.clampToMaxHeight();
2743
+ this.recompute();
2743
2744
  } else if (typeof window !== "undefined") {
2744
2745
  const probe2 = document.createElement("div");
2745
2746
  probe2.style.cssText = `position:absolute;visibility:hidden;pointer-events:none;${axis === "height" ? "height" : "width"}:${value};`;
@@ -2747,7 +2748,7 @@ var BottomSheetEngine = class {
2747
2748
  const measured = axis === "height" ? probe2.offsetHeight : probe2.offsetWidth;
2748
2749
  probe2.remove();
2749
2750
  this.maxHeightCap = measured > 0 ? measured : void 0;
2750
- this.clampToMaxHeight();
2751
+ this.recompute();
2751
2752
  }
2752
2753
  }
2753
2754
  clampToMaxHeight() {
@@ -2755,9 +2756,6 @@ var BottomSheetEngine = class {
2755
2756
  if (this.snaps.getMaxAxisSize() > this.maxHeightCap) {
2756
2757
  this.snaps.setMaxAxisSize(this.maxHeightCap);
2757
2758
  }
2758
- if (this.size > this.maxHeightCap && !this.gesture?.isDragging) {
2759
- this.applySize(this.maxHeightCap);
2760
- }
2761
2759
  }
2762
2760
  setAllowed(ids, snap) {
2763
2761
  if (this.destroyed) return;
@@ -2895,6 +2893,7 @@ var BottomSheetEngine = class {
2895
2893
  recompute() {
2896
2894
  if (this.destroyed) return;
2897
2895
  this.snaps.recompute();
2896
+ this.clampToMaxHeight();
2898
2897
  this.scrim.invalidateOpacityCache();
2899
2898
  if (this.gesture?.isDragging) return;
2900
2899
  const current = this.snaps.findById(this.activeId);
@@ -2918,43 +2917,36 @@ var BottomSheetEngine = class {
2918
2917
  }
2919
2918
  return out;
2920
2919
  }
2921
- measureContentExtent(vertical) {
2920
+ measureSheetNatural(vertical) {
2921
+ const el = this.element;
2922
2922
  const content = this.scrollContainer;
2923
- if (!content) return 0;
2924
- const targets = this.contentTargets();
2925
- if (targets.length === 0) {
2926
- return vertical ? content.scrollHeight : content.scrollWidth;
2927
- }
2928
- let min = Infinity;
2929
- let max = -Infinity;
2930
- for (const el of targets) {
2931
- const r = el.getBoundingClientRect();
2932
- if (vertical) {
2933
- if (r.top < min) min = r.top;
2934
- if (r.bottom > max) max = r.bottom;
2935
- } else {
2936
- if (r.left < min) min = r.left;
2937
- if (r.right > max) max = r.right;
2938
- }
2939
- }
2940
- if (!isFinite(min) || !isFinite(max) || max <= min) {
2941
- return vertical ? content.scrollHeight : content.scrollWidth;
2942
- }
2943
- let pad = 0;
2944
- if (typeof getComputedStyle !== "undefined") {
2945
- const cs = getComputedStyle(content);
2946
- pad = vertical ? (parseFloat(cs.paddingTop) || 0) + (parseFloat(cs.paddingBottom) || 0) : (parseFloat(cs.paddingLeft) || 0) + (parseFloat(cs.paddingRight) || 0);
2947
- }
2948
- return max - min + pad;
2923
+ if (!content) {
2924
+ return vertical ? el.offsetHeight : el.offsetWidth;
2925
+ }
2926
+ const axis = vertical ? "height" : "width";
2927
+ const sheetStyle = el.style;
2928
+ const cs = content.style;
2929
+ const prevSheet = sheetStyle[axis];
2930
+ const prevFlex = cs.flex;
2931
+ const prevContent = vertical ? cs.height : cs.width;
2932
+ sheetStyle[axis] = "auto";
2933
+ cs.flex = "none";
2934
+ if (vertical) cs.height = "auto";
2935
+ else cs.width = "auto";
2936
+ const natural = vertical ? el.offsetHeight : el.offsetWidth;
2937
+ sheetStyle[axis] = prevSheet;
2938
+ cs.flex = prevFlex;
2939
+ if (vertical) cs.height = prevContent;
2940
+ else cs.width = prevContent;
2941
+ return natural;
2949
2942
  }
2950
2943
  measureFitSize() {
2951
2944
  const vertical = layoutAxis(this.mode) === "height";
2952
- const handleSize = vertical ? this.handle.offsetHeight : this.handle.offsetWidth;
2953
- const content = this.scrollContainer;
2954
- const natural = content ? handleSize + this.measureContentExtent(vertical) : handleSize;
2955
- if (typeof window === "undefined") return natural;
2945
+ const natural = this.measureSheetNatural(vertical);
2946
+ const capped = this.maxHeightCap !== void 0 ? Math.min(natural, this.maxHeightCap) : natural;
2947
+ if (typeof window === "undefined") return capped;
2956
2948
  const viewport = vertical ? window.innerHeight : window.innerWidth;
2957
- return viewport > 0 ? Math.min(natural, viewport) : natural;
2949
+ return viewport > 0 ? Math.min(capped, viewport) : capped;
2958
2950
  }
2959
2951
  installFitObserver() {
2960
2952
  if (typeof ResizeObserver === "undefined") return;
@@ -3036,6 +3028,10 @@ var BottomSheetEngine = class {
3036
3028
  this.backdrop.style.opacity = "";
3037
3029
  this.backdrop.style.pointerEvents = "";
3038
3030
  }
3031
+ if (this.anchorHost) {
3032
+ this.anchorHost.style.removeProperty("--bs-size");
3033
+ this.anchorHost.style.removeProperty("--bs-progress");
3034
+ }
3039
3035
  if (this.screenComponent) {
3040
3036
  this.screenComponent.style.opacity = "";
3041
3037
  this.screenComponent.style.display = "";
@@ -3047,6 +3043,7 @@ var BottomSheetEngine = class {
3047
3043
  this.bus.emit(event, payload);
3048
3044
  }
3049
3045
  newCycle() {
3046
+ this.allowOvershoot = false;
3050
3047
  this.currentAbort.abort();
3051
3048
  this.currentAbort = new AbortController();
3052
3049
  return this.currentAbort.signal;
@@ -3112,6 +3109,7 @@ var BottomSheetEngine = class {
3112
3109
  seen.add(p.id);
3113
3110
  }
3114
3111
  this.snaps.setRaw(this.snapPointsRaw);
3112
+ this.clampToMaxHeight();
3115
3113
  this.scrim.invalidateOpacityCache();
3116
3114
  }
3117
3115
  getAllowedRange() {
@@ -3318,15 +3316,19 @@ var BottomSheetEngine = class {
3318
3316
  this.opening = true;
3319
3317
  sheetStack.promote(this.id);
3320
3318
  }
3321
- void this.animation.animateTo(target.size, velocity).then(() => {
3322
- this.opening = false;
3319
+ const settleCap = this.snaps.getMaxAxisSize();
3320
+ const settleSize = settleCap > 0 ? Math.min(target.size, settleCap) : target.size;
3321
+ this.allowOvershoot = true;
3322
+ void this.animation.animateTo(settleSize, velocity).then(() => {
3323
3323
  if (signal.aborted) return;
3324
+ this.allowOvershoot = false;
3325
+ this.opening = false;
3324
3326
  this.scrollCache.restore(target.id, previousSize, target.size);
3325
3327
  this.updateAriaSlider();
3326
3328
  this.emit("snap", {
3327
3329
  id: target.id,
3328
- size: target.size,
3329
- progress: this.computeProgress(target.size)
3330
+ size: this.size,
3331
+ progress: this.computeProgress(this.size)
3330
3332
  });
3331
3333
  this.haptic();
3332
3334
  if (previousSnapSize === 0 && target.size > 0) {
@@ -3351,23 +3353,25 @@ var BottomSheetEngine = class {
3351
3353
  }
3352
3354
  }
3353
3355
  applySize(size) {
3354
- this.size = size;
3355
- const offset = this.snaps.getMaxAxisSize() - size;
3356
+ const cap = this.snaps.getMaxAxisSize();
3357
+ const clamped = cap > 0 && size > cap && !this.gesture?.isDragging && !this.allowOvershoot ? cap : size;
3358
+ this.size = clamped;
3359
+ const offset = cap - clamped;
3356
3360
  const style = this.element.style;
3357
3361
  style.transform = this.transformTemplate(offset);
3358
- if (this.sizeWriteSentinel.shouldWrite(size, SIZE_WRITE_EPSILON)) {
3359
- style.setProperty("--bs-size", `${size}px`);
3362
+ if (this.sizeWriteSentinel.shouldWrite(clamped, SIZE_WRITE_EPSILON)) {
3363
+ style.setProperty("--bs-size", `${clamped}px`);
3360
3364
  if (this.scrimParent) {
3361
- this.scrimParent.style.setProperty("--bs-size", `${size}px`);
3365
+ this.scrimParent.style.setProperty("--bs-size", `${clamped}px`);
3362
3366
  }
3363
3367
  if (this.anchorHost && this.anchorHost !== this.scrimParent) {
3364
- this.anchorHost.style.setProperty("--bs-size", `${size}px`);
3368
+ this.anchorHost.style.setProperty("--bs-size", `${clamped}px`);
3365
3369
  }
3366
3370
  if (this.rootEl && this.rootEl !== this.scrimParent && this.rootEl !== this.anchorHost) {
3367
- this.rootEl.style.setProperty("--bs-size", `${size}px`);
3371
+ this.rootEl.style.setProperty("--bs-size", `${clamped}px`);
3368
3372
  }
3369
3373
  }
3370
- const progress = this.computeProgress(size);
3374
+ const progress = this.computeProgress(clamped);
3371
3375
  const progressChanged = this.progressWriteSentinel.shouldWrite(
3372
3376
  progress,
3373
3377
  OPACITY_WRITE_EPSILON
@@ -3384,14 +3388,15 @@ var BottomSheetEngine = class {
3384
3388
  this.scrim.applyOpacity(progress, progressChanged);
3385
3389
  if (progressChanged && this.bus.listenerCount("progress") > 0) {
3386
3390
  this.progressPayload.value = progress;
3387
- this.progressPayload.size = size;
3391
+ this.progressPayload.size = clamped;
3388
3392
  this.emit("progress", this.progressPayload);
3389
3393
  }
3390
3394
  }
3391
3395
  computeProgress(size) {
3392
3396
  const { min, max } = this.getAllowedRange();
3393
- if (max <= min) return 0;
3394
- return Math.min(Math.max((size - min) / (max - min), 0), 1);
3397
+ const reachableMax = Math.min(max, this.snaps.getMaxAxisSize());
3398
+ if (reachableMax <= min) return 0;
3399
+ return Math.min(Math.max((size - min) / (reachableMax - min), 0), 1);
3395
3400
  }
3396
3401
  handleOpen() {
3397
3402
  sheetStack.promote(this.id);
@@ -3415,8 +3420,8 @@ var BottomSheetEngine = class {
3415
3420
  this.updateAriaSlider();
3416
3421
  this.emit("snap", {
3417
3422
  id: target.id,
3418
- size: target.size,
3419
- progress: this.computeProgress(target.size)
3423
+ size: this.size,
3424
+ progress: this.computeProgress(this.size)
3420
3425
  });
3421
3426
  if (target.size > 0 && !this.lifecycle.isInstalled) {
3422
3427
  this.emit("open", { id: target.id });
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { d as SnapPoint, b as SheetMode, a as SnapPointDef, c as EngineOptions, f as ScrimOverlayPosition } from './BottomSheetEngine-CqiCz64W.cjs';
2
- export { g as AnchorAnimationPreset, h as AnchorAnimationSpec, i as AnchorHandle, A as AnchorOptions, j as AnchorPosition, k as AnchorState, B as BottomSheetEngine, C as CloseReason, E as EngineState, P as Plugin, l as SCRIM_PRESETS, m as ScrimOverlayOptions, n as ScrimPreset, o as ScrimPresetConfig, p as ScrimStageDef, S as ScrimStagesOptions, q as ScrimUpdate, e as SheetEventMap, r as SnapId, T as TeardownScope, s as runAnchorTransition } from './BottomSheetEngine-CqiCz64W.cjs';
1
+ import { d as SnapPoint, b as SheetMode, a as SnapPointDef, c as EngineOptions, f as ScrimOverlayPosition } from './BottomSheetEngine-BD1mSExI.cjs';
2
+ export { g as AnchorAnimationPreset, h as AnchorAnimationSpec, i as AnchorHandle, A as AnchorOptions, j as AnchorPosition, k as AnchorState, B as BottomSheetEngine, C as CloseReason, E as EngineState, P as Plugin, l as SCRIM_PRESETS, m as ScrimOverlayOptions, n as ScrimPreset, o as ScrimPresetConfig, p as ScrimStageDef, S as ScrimStagesOptions, q as ScrimUpdate, e as SheetEventMap, r as SnapId, T as TeardownScope, s as runAnchorTransition } from './BottomSheetEngine-BD1mSExI.cjs';
3
3
  export { OVERLAY_PRESETS, Overlay, OverlayAnimation, OverlayCloseReason, OverlayEdge, Overlay as OverlayEngine, OverlayEventMap, OverlayMountTarget, OverlayOptions, OverlayPreset, OverlayState, OverlayUpdate, SwipeToCloseConfig, createOverlay } from './overlay.cjs';
4
4
  import './transform-jVfAikE9.cjs';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { d as SnapPoint, b as SheetMode, a as SnapPointDef, c as EngineOptions, f as ScrimOverlayPosition } from './BottomSheetEngine-BHjKFtnM.js';
2
- export { g as AnchorAnimationPreset, h as AnchorAnimationSpec, i as AnchorHandle, A as AnchorOptions, j as AnchorPosition, k as AnchorState, B as BottomSheetEngine, C as CloseReason, E as EngineState, P as Plugin, l as SCRIM_PRESETS, m as ScrimOverlayOptions, n as ScrimPreset, o as ScrimPresetConfig, p as ScrimStageDef, S as ScrimStagesOptions, q as ScrimUpdate, e as SheetEventMap, r as SnapId, T as TeardownScope, s as runAnchorTransition } from './BottomSheetEngine-BHjKFtnM.js';
1
+ import { d as SnapPoint, b as SheetMode, a as SnapPointDef, c as EngineOptions, f as ScrimOverlayPosition } from './BottomSheetEngine-BDGRWa2i.js';
2
+ export { g as AnchorAnimationPreset, h as AnchorAnimationSpec, i as AnchorHandle, A as AnchorOptions, j as AnchorPosition, k as AnchorState, B as BottomSheetEngine, C as CloseReason, E as EngineState, P as Plugin, l as SCRIM_PRESETS, m as ScrimOverlayOptions, n as ScrimPreset, o as ScrimPresetConfig, p as ScrimStageDef, S as ScrimStagesOptions, q as ScrimUpdate, e as SheetEventMap, r as SnapId, T as TeardownScope, s as runAnchorTransition } from './BottomSheetEngine-BDGRWa2i.js';
3
3
  export { OVERLAY_PRESETS, Overlay, OverlayAnimation, OverlayCloseReason, OverlayEdge, Overlay as OverlayEngine, OverlayEventMap, OverlayMountTarget, OverlayOptions, OverlayPreset, OverlayState, OverlayUpdate, SwipeToCloseConfig, createOverlay } from './overlay.js';
4
4
  import './transform-jVfAikE9.js';
5
5