@surdeddd/bottom-sheet 0.9.0 → 0.10.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.
Files changed (50) hide show
  1. package/README.md +108 -66
  2. package/dist/{BottomSheetEngine-CBRcBwV-.d.ts → BottomSheetEngine-DRjCU73e.d.ts} +6 -5
  3. package/dist/{BottomSheetEngine-BcyruNP1.d.cts → BottomSheetEngine-DzsIwD28.d.cts} +6 -5
  4. package/dist/element.cjs +161 -99
  5. package/dist/element.d.cts +1 -1
  6. package/dist/element.d.ts +1 -1
  7. package/dist/element.iife.global.js +2 -2
  8. package/dist/element.js +161 -99
  9. package/dist/index.cjs +155 -115
  10. package/dist/index.d.cts +2 -2
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.js +155 -115
  13. package/dist/integrations/formik.d.cts +1 -1
  14. package/dist/integrations/formik.d.ts +1 -1
  15. package/dist/integrations/react-hook-form.d.cts +1 -1
  16. package/dist/integrations/react-hook-form.d.ts +1 -1
  17. package/dist/overlay.cjs +34 -25
  18. package/dist/overlay.d.cts +3 -0
  19. package/dist/overlay.d.ts +3 -0
  20. package/dist/overlay.js +34 -25
  21. package/dist/preact.d.cts +2 -1
  22. package/dist/preact.d.ts +2 -1
  23. package/dist/qwik.cjs +179 -93
  24. package/dist/qwik.d.cts +11 -2
  25. package/dist/qwik.d.ts +11 -2
  26. package/dist/qwik.js +179 -93
  27. package/dist/react.cjs +266 -181
  28. package/dist/react.d.cts +26 -4
  29. package/dist/react.d.ts +26 -4
  30. package/dist/react.js +266 -181
  31. package/dist/solid.cjs +145 -92
  32. package/dist/solid.d.cts +14 -4
  33. package/dist/solid.d.ts +14 -4
  34. package/dist/solid.js +145 -92
  35. package/dist/solid.source.jsx +145 -92
  36. package/dist/styles.css +17 -1
  37. package/dist/svelte-core.cjs +128 -90
  38. package/dist/svelte-core.js +128 -90
  39. package/dist/svelte-src/BottomSheet.svelte +6 -0
  40. package/dist/svelte.cjs +130 -90
  41. package/dist/svelte.d.cts +2 -0
  42. package/dist/svelte.d.ts +2 -0
  43. package/dist/svelte.js +130 -90
  44. package/dist/teleport-7uYNiEAT.d.cts +3 -0
  45. package/dist/teleport-7uYNiEAT.d.ts +3 -0
  46. package/dist/vue.cjs +136 -91
  47. package/dist/vue.d.cts +3 -1
  48. package/dist/vue.d.ts +3 -1
  49. package/dist/vue.js +136 -91
  50. package/package.json +6 -6
package/dist/element.cjs CHANGED
@@ -215,15 +215,27 @@ var init_cssLength = __esm({
215
215
  }
216
216
  });
217
217
 
218
+ // src/core/primitives/devWarn.ts
219
+ function devWarn(...args) {
220
+ if (typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" && typeof console !== "undefined") {
221
+ console.warn(...args);
222
+ }
223
+ }
224
+ var init_devWarn = __esm({
225
+ "src/core/primitives/devWarn.ts"() {
226
+ }
227
+ });
228
+
218
229
  // src/core/primitives/snap-points.ts
219
230
  var resolveSnapList, VH_NOT_DVH, auditVhUsage, findNearest, allowedRange, findById, MOUSE_FLICK_VELOCITY, MOUSE_DRAG_THRESHOLD, DIRECTIONAL_INTENT_VELOCITY, findDragSettleTarget;
220
231
  var init_snap_points = __esm({
221
232
  "src/core/primitives/snap-points.ts"() {
222
233
  init_cssLength();
234
+ init_devWarn();
223
235
  resolveSnapList = (points, mode, measureFit) => points.map((p) => {
224
236
  const raw = resolveSnap(p.size, mode, measureFit);
225
237
  if (!Number.isFinite(raw) || raw < 0) {
226
- console.warn(
238
+ devWarn(
227
239
  `[BottomSheet] snap "${p.id}" resolved to invalid size (${String(p.size)} \u2192 ${raw}); clamped to 0.`
228
240
  );
229
241
  return { id: p.id, size: 0 };
@@ -235,7 +247,7 @@ var init_snap_points = __esm({
235
247
  for (const p of points) {
236
248
  if (typeof p.size !== "string") continue;
237
249
  if (!VH_NOT_DVH.test(p.size)) continue;
238
- console.warn(
250
+ devWarn(
239
251
  `[BottomSheet] snap "${p.id}" uses "vh" \u2014 prefer "dvh" on mobile (iOS Safari URL bar makes vh unstable). See https://web.dev/blog/viewport-units`
240
252
  );
241
253
  }
@@ -291,6 +303,31 @@ var init_snap_points = __esm({
291
303
  }
292
304
  });
293
305
 
306
+ // src/core/primitives/cancelable-emit.ts
307
+ function emitCancelable(emit, base, warnLabel) {
308
+ let cancelled = false;
309
+ let frozen = false;
310
+ emit({
311
+ ...base,
312
+ cancel: () => {
313
+ if (frozen) {
314
+ devWarn(
315
+ `[BottomSheet] ${warnLabel}.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener.`
316
+ );
317
+ return;
318
+ }
319
+ cancelled = true;
320
+ }
321
+ });
322
+ frozen = true;
323
+ return cancelled;
324
+ }
325
+ var init_cancelable_emit = __esm({
326
+ "src/core/primitives/cancelable-emit.ts"() {
327
+ init_devWarn();
328
+ }
329
+ });
330
+
294
331
  // src/core/primitives/snap-resolver.ts
295
332
  var SnapResolver;
296
333
  var init_snap_resolver = __esm({
@@ -449,7 +486,9 @@ function notifyLinkedSheets(sheets, self) {
449
486
  try {
450
487
  if (linked.state.size === 0) continue;
451
488
  const ids = linked.getAllowedIds();
452
- const target = ids.find((id) => id !== "closed");
489
+ const resolved = linked.getResolvedSnaps();
490
+ const sizeOf = (id) => resolved.find((s) => s.id === id)?.size ?? 0;
491
+ const target = ids.find((id) => sizeOf(id) > 0);
453
492
  if (target && target !== linked.state.activeId) {
454
493
  void linked.snapTo(target);
455
494
  }
@@ -679,11 +718,15 @@ function installVisualViewport(deps) {
679
718
  if (clamp < deps.getMaxAxisSize()) {
680
719
  deps.setMaxAxisSize(clamp);
681
720
  }
721
+ const wasAnimating = deps.isAnimating?.() ?? false;
722
+ deps.cancelInFlight();
723
+ deps.newCycle();
682
724
  const max = deps.getMaxAxisSize();
683
725
  deps.setSize(Math.min(deps.getSize(), max));
684
726
  const current = deps.resolveActiveSnap();
685
727
  if (current && !deps.isDragging()) {
686
728
  deps.applySize(Math.min(current.size, max));
729
+ if (wasAnimating) deps.resyncAfterCancel?.();
687
730
  } else {
688
731
  deps.applySize(deps.getSize());
689
732
  }
@@ -839,6 +882,60 @@ var init_fit_observer = __esm({
839
882
  }
840
883
  });
841
884
 
885
+ // src/core/features/max-height-controller.ts
886
+ function createMaxHeightController(deps) {
887
+ let maxHeightCap;
888
+ let maxHeightRaw;
889
+ const resolveCap = () => {
890
+ const raw = maxHeightRaw;
891
+ if (raw === void 0) {
892
+ maxHeightCap = void 0;
893
+ return;
894
+ }
895
+ if (typeof raw === "number") {
896
+ maxHeightCap = raw;
897
+ return;
898
+ }
899
+ if (typeof window === "undefined") return;
900
+ const measured = resolveSnap(raw, deps.mode);
901
+ maxHeightCap = measured > 0 ? measured : void 0;
902
+ };
903
+ const clampTo = () => {
904
+ if (maxHeightCap === void 0) return;
905
+ if (deps.getMaxAxisSize() > maxHeightCap) {
906
+ deps.setMaxAxisSize(maxHeightCap);
907
+ }
908
+ };
909
+ return {
910
+ setRadius(r) {
911
+ deps.element.style.setProperty(
912
+ "--bs-radius",
913
+ typeof r === "number" ? `${r}px` : r
914
+ );
915
+ },
916
+ setMaxHeight(h) {
917
+ const value = typeof h === "number" ? `${h}px` : h;
918
+ const axis = layoutAxis(deps.mode);
919
+ deps.element.style.setProperty(
920
+ axis === "height" ? "max-height" : "max-width",
921
+ value
922
+ );
923
+ maxHeightRaw = h;
924
+ resolveCap();
925
+ deps.recompute();
926
+ },
927
+ resolveCap,
928
+ clampTo,
929
+ getCap: () => maxHeightCap
930
+ };
931
+ }
932
+ var init_max_height_controller = __esm({
933
+ "src/core/features/max-height-controller.ts"() {
934
+ init_snap_points();
935
+ init_transform();
936
+ }
937
+ });
938
+
842
939
  // src/core/features/fit-measurement.ts
843
940
  var measureSheetNatural, containingExtent, measureFitSize;
844
941
  var init_fit_measurement = __esm({
@@ -995,17 +1092,6 @@ var init_opacity_dedup = __esm({
995
1092
  }
996
1093
  });
997
1094
 
998
- // src/core/primitives/devWarn.ts
999
- function devWarn(...args) {
1000
- if (typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" && typeof console !== "undefined") {
1001
- console.warn(...args);
1002
- }
1003
- }
1004
- var init_devWarn = __esm({
1005
- "src/core/primitives/devWarn.ts"() {
1006
- }
1007
- });
1008
-
1009
1095
  // src/core/primitives/overlay-position.ts
1010
1096
  function resolveSheetAnchoredStyle(mode, position, inset) {
1011
1097
  const sizeOffset = `calc(var(--bs-size, 0px) + ${inset})`;
@@ -2756,6 +2842,8 @@ var init_BottomSheetEngine = __esm({
2756
2842
  init_instance_id();
2757
2843
  init_event_bus();
2758
2844
  init_snap_points();
2845
+ init_cancelable_emit();
2846
+ init_devWarn();
2759
2847
  init_snap_resolver();
2760
2848
  init_persist();
2761
2849
  init_auto_collapse();
@@ -2765,6 +2853,7 @@ var init_BottomSheetEngine = __esm({
2765
2853
  init_visual_viewport();
2766
2854
  init_resize_observer();
2767
2855
  init_fit_observer();
2856
+ init_max_height_controller();
2768
2857
  init_fit_measurement();
2769
2858
  init_slider_keyboard();
2770
2859
  init_scrim_controller();
@@ -2803,8 +2892,7 @@ var init_BottomSheetEngine = __esm({
2803
2892
  __publicField(this, "disableCloseFlag");
2804
2893
  __publicField(this, "disableDragFlag");
2805
2894
  __publicField(this, "closeOnRouteChange");
2806
- __publicField(this, "maxHeightCap");
2807
- __publicField(this, "maxHeightRaw");
2895
+ __publicField(this, "maxHeight");
2808
2896
  __publicField(this, "snapPointsRaw");
2809
2897
  __publicField(this, "snaps");
2810
2898
  __publicField(this, "activeId");
@@ -2915,11 +3003,20 @@ var init_BottomSheetEngine = __esm({
2915
3003
  auditVhUsage(this.snapPointsRaw);
2916
3004
  this.auditDuplicateSnapIds(this.snapPointsRaw);
2917
3005
  this.rootEl = this.element.closest(".bs-root");
3006
+ this.maxHeight = createMaxHeightController({
3007
+ element: this.element,
3008
+ mode: this.mode,
3009
+ getMaxAxisSize: () => this.snaps.getMaxAxisSize(),
3010
+ setMaxAxisSize: (size) => {
3011
+ this.snaps.setMaxAxisSize(size);
3012
+ },
3013
+ recompute: () => this.recompute()
3014
+ });
2918
3015
  this.fitDeps = {
2919
3016
  element: this.element,
2920
3017
  scrollContainer: this.scrollContainer,
2921
3018
  mode: this.mode,
2922
- getMaxHeightCap: () => this.maxHeightCap
3019
+ getMaxHeightCap: () => this.maxHeight.getCap()
2923
3020
  };
2924
3021
  this.snaps = new SnapResolver(
2925
3022
  this.snapPointsRaw,
@@ -3030,7 +3127,7 @@ var init_BottomSheetEngine = __esm({
3030
3127
  }
3031
3128
  use(plugin) {
3032
3129
  if (this.destroyed) {
3033
- console.warn(
3130
+ devWarn(
3034
3131
  `[BottomSheet] use("${plugin.name}") called on destroyed engine \u2014 ignored.`
3035
3132
  );
3036
3133
  return this;
@@ -3072,6 +3169,9 @@ var init_BottomSheetEngine = __esm({
3072
3169
  getAllowedIds() {
3073
3170
  return this.snaps.getAllowedIds().slice();
3074
3171
  }
3172
+ getResolvedSnaps() {
3173
+ return this.snaps.getResolvedSnaps();
3174
+ }
3075
3175
  async snapTo(id, velocityOrOpts = 0, _skipBeforeSnap = false) {
3076
3176
  if (this.destroyed) return;
3077
3177
  const opts = typeof velocityOrOpts === "object" ? velocityOrOpts : { velocity: velocityOrOpts };
@@ -3080,11 +3180,11 @@ var init_BottomSheetEngine = __esm({
3080
3180
  if (externalSignal?.aborted) return;
3081
3181
  const target = this.snaps.findById(id);
3082
3182
  if (!target) {
3083
- console.warn(`[BottomSheet] unknown snap id: ${id}`);
3183
+ devWarn(`[BottomSheet] unknown snap id: ${id}`);
3084
3184
  return;
3085
3185
  }
3086
3186
  if (!this.snaps.getAllowedIds().includes(id)) {
3087
- console.warn(`[BottomSheet] snap "${id}" is not in allowed list`);
3187
+ devWarn(`[BottomSheet] snap "${id}" is not in allowed list`);
3088
3188
  return;
3089
3189
  }
3090
3190
  if (!_skipBeforeSnap && this.emitBeforeSnap(target, this.activeId)) {
@@ -3216,42 +3316,11 @@ var init_BottomSheetEngine = __esm({
3216
3316
  }
3217
3317
  setRadius(r) {
3218
3318
  if (this.destroyed) return;
3219
- this.element.style.setProperty(
3220
- "--bs-radius",
3221
- typeof r === "number" ? `${r}px` : r
3222
- );
3319
+ this.maxHeight.setRadius(r);
3223
3320
  }
3224
3321
  setMaxHeight(h) {
3225
3322
  if (this.destroyed) return;
3226
- const value = typeof h === "number" ? `${h}px` : h;
3227
- const axis = layoutAxis(this.mode);
3228
- this.element.style.setProperty(
3229
- axis === "height" ? "max-height" : "max-width",
3230
- value
3231
- );
3232
- this.maxHeightRaw = h;
3233
- this.resolveMaxHeightCap();
3234
- this.recompute();
3235
- }
3236
- resolveMaxHeightCap() {
3237
- const raw = this.maxHeightRaw;
3238
- if (raw === void 0) {
3239
- this.maxHeightCap = void 0;
3240
- return;
3241
- }
3242
- if (typeof raw === "number") {
3243
- this.maxHeightCap = raw;
3244
- return;
3245
- }
3246
- if (typeof window === "undefined") return;
3247
- const measured = resolveSnap(raw, this.mode);
3248
- this.maxHeightCap = measured > 0 ? measured : void 0;
3249
- }
3250
- clampToMaxHeight() {
3251
- if (this.maxHeightCap === void 0) return;
3252
- if (this.snaps.getMaxAxisSize() > this.maxHeightCap) {
3253
- this.snaps.setMaxAxisSize(this.maxHeightCap);
3254
- }
3323
+ this.maxHeight.setMaxHeight(h);
3255
3324
  }
3256
3325
  setAllowed(ids, snap) {
3257
3326
  if (this.destroyed) return;
@@ -3339,7 +3408,7 @@ var init_BottomSheetEngine = __esm({
3339
3408
  };
3340
3409
  const host = this.screenComponent?.parentElement;
3341
3410
  if (!host) {
3342
- console.warn(
3411
+ devWarn(
3343
3412
  "[BottomSheet] setScrimStages: no scrim element mounted \u2014 pass `scrim` to the engine first."
3344
3413
  );
3345
3414
  return () => {
@@ -3389,9 +3458,9 @@ var init_BottomSheetEngine = __esm({
3389
3458
  }
3390
3459
  recompute() {
3391
3460
  if (this.destroyed) return;
3392
- this.resolveMaxHeightCap();
3461
+ this.maxHeight.resolveCap();
3393
3462
  this.snaps.recompute();
3394
- this.clampToMaxHeight();
3463
+ this.maxHeight.clampTo();
3395
3464
  this.scrim.invalidateOpacityCache();
3396
3465
  if (this.gesture?.isDragging) return;
3397
3466
  const current = this.snaps.findById(this.activeId);
@@ -3441,42 +3510,18 @@ var init_BottomSheetEngine = __esm({
3441
3510
  return this.currentAbort.signal;
3442
3511
  }
3443
3512
  emitBeforeSnap(target, previousId) {
3444
- let cancelled = false;
3445
- let frozen = false;
3446
- this.emit("before-snap", {
3447
- id: target.id,
3448
- size: target.size,
3449
- previousId,
3450
- cancel: () => {
3451
- if (frozen) {
3452
- console.warn(
3453
- "[BottomSheet] before-snap.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener."
3454
- );
3455
- return;
3456
- }
3457
- cancelled = true;
3458
- }
3459
- });
3460
- frozen = true;
3461
- return cancelled;
3513
+ return emitCancelable(
3514
+ (payload) => this.emit("before-snap", payload),
3515
+ { id: target.id, size: target.size, previousId },
3516
+ "before-snap"
3517
+ );
3462
3518
  }
3463
3519
  emitBeforeClose(reason) {
3464
- let cancelled = false;
3465
- let frozen = false;
3466
- this.emit("before-close", {
3467
- reason,
3468
- cancel: () => {
3469
- if (frozen) {
3470
- console.warn(
3471
- "[BottomSheet] before-close.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener."
3472
- );
3473
- return;
3474
- }
3475
- cancelled = true;
3476
- }
3477
- });
3478
- frozen = true;
3479
- return cancelled;
3520
+ return emitCancelable(
3521
+ (payload) => this.emit("before-close", payload),
3522
+ { reason },
3523
+ "before-close"
3524
+ );
3480
3525
  }
3481
3526
  applyAutoAriaLabelledBy() {
3482
3527
  if (typeof document === "undefined") return;
@@ -3491,16 +3536,16 @@ var init_BottomSheetEngine = __esm({
3491
3536
  this.element.setAttribute("aria-labelledby", titled.id);
3492
3537
  }
3493
3538
  recomputeSnaps() {
3494
- this.resolveMaxHeightCap();
3539
+ this.maxHeight.resolveCap();
3495
3540
  this.snaps.setRaw(this.snapPointsRaw);
3496
- this.clampToMaxHeight();
3541
+ this.maxHeight.clampTo();
3497
3542
  this.scrim.invalidateOpacityCache();
3498
3543
  }
3499
3544
  auditDuplicateSnapIds(points) {
3500
3545
  const seen = /* @__PURE__ */ new Set();
3501
3546
  for (const p of points) {
3502
3547
  if (seen.has(p.id)) {
3503
- console.warn(
3548
+ devWarn(
3504
3549
  `[BottomSheet] duplicate snap id "${p.id}" \u2014 only the first occurrence is reachable.`
3505
3550
  );
3506
3551
  }
@@ -3667,7 +3712,15 @@ var init_BottomSheetEngine = __esm({
3667
3712
  setSize: (size) => {
3668
3713
  this.size = size;
3669
3714
  },
3670
- applySize: (size) => this.applySize(size)
3715
+ applySize: (size) => this.applySize(size),
3716
+ cancelInFlight: () => {
3717
+ this.animation.cancel();
3718
+ },
3719
+ newCycle: () => {
3720
+ this.newCycle();
3721
+ },
3722
+ isAnimating: () => this.animation.isAnimating,
3723
+ resyncAfterCancel: () => this.resyncAfterResize()
3671
3724
  }));
3672
3725
  }
3673
3726
  this.teardowns.add(installSliderKeyboard({
@@ -3835,7 +3888,7 @@ var init_BottomSheetEngine = __esm({
3835
3888
  var baseStyles;
3836
3889
  var init_baseStyles = __esm({
3837
3890
  "src/web-component/baseStyles.ts"() {
3838
- 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}}`;
3891
+ 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-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;min-height:var(--bs-header-min-height,0px);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));backdrop-filter:blur(var(--bs-scrim-blur,0px));-webkit-backdrop-filter:blur(var(--bs-scrim-blur,0px));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)}}@media (forced-colors:active){.bs-sheet{border:1px solid CanvasText}.bs-handle::before{background:CanvasText;forced-color-adjust:none}.bs-backdrop,.bs-screen{forced-color-adjust:none}}.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}}`;
3839
3892
  }
3840
3893
  });
3841
3894
 
@@ -4278,10 +4331,15 @@ var init_BottomSheetElement = __esm({
4278
4331
  "progress",
4279
4332
  (payload) => this.dispatchEvent(new CustomEvent("progress", { detail: payload }))
4280
4333
  ),
4281
- this.engine.on(
4282
- "before-close",
4283
- (payload) => this.dispatchEvent(new CustomEvent("before-close", { detail: payload }))
4284
- ),
4334
+ this.engine.on("before-close", (payload) => {
4335
+ const accepted = this.dispatchEvent(
4336
+ new CustomEvent("before-close", {
4337
+ detail: payload,
4338
+ cancelable: true
4339
+ })
4340
+ );
4341
+ if (!accepted) payload.cancel();
4342
+ }),
4285
4343
  this.engine.on(
4286
4344
  "opened",
4287
4345
  (payload) => this.dispatchEvent(new CustomEvent("opened", { detail: payload }))
@@ -4297,6 +4355,10 @@ var init_BottomSheetElement = __esm({
4297
4355
  this.engine.on(
4298
4356
  "dragend",
4299
4357
  (payload) => this.dispatchEvent(new CustomEvent("drag-end", { detail: payload }))
4358
+ ),
4359
+ this.engine.on(
4360
+ "drag",
4361
+ (payload) => this.dispatchEvent(new CustomEvent("drag", { detail: payload }))
4300
4362
  )
4301
4363
  ];
4302
4364
  }
@@ -1,4 +1,4 @@
1
- import { B as BottomSheetEngine, C as CloseReason, A as AnchorOptions, S as ScrimStagesOptions, E as EngineState } from './BottomSheetEngine-BcyruNP1.cjs';
1
+ import { B as BottomSheetEngine, C as CloseReason, A as AnchorOptions, S as ScrimStagesOptions, E as EngineState } from './BottomSheetEngine-DzsIwD28.cjs';
2
2
  import './transform-jVfAikE9.cjs';
3
3
 
4
4
  declare const BaseHTMLElement: typeof HTMLElement;
package/dist/element.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { B as BottomSheetEngine, C as CloseReason, A as AnchorOptions, S as ScrimStagesOptions, E as EngineState } from './BottomSheetEngine-CBRcBwV-.js';
1
+ import { B as BottomSheetEngine, C as CloseReason, A as AnchorOptions, S as ScrimStagesOptions, E as EngineState } from './BottomSheetEngine-DRjCU73e.js';
2
2
  import './transform-jVfAikE9.js';
3
3
 
4
4
  declare const BaseHTMLElement: typeof HTMLElement;