@surdeddd/bottom-sheet 0.9.1 → 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.js CHANGED
@@ -213,15 +213,27 @@ var init_cssLength = __esm({
213
213
  }
214
214
  });
215
215
 
216
+ // src/core/primitives/devWarn.ts
217
+ function devWarn(...args) {
218
+ if (typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" && typeof console !== "undefined") {
219
+ console.warn(...args);
220
+ }
221
+ }
222
+ var init_devWarn = __esm({
223
+ "src/core/primitives/devWarn.ts"() {
224
+ }
225
+ });
226
+
216
227
  // src/core/primitives/snap-points.ts
217
228
  var resolveSnapList, VH_NOT_DVH, auditVhUsage, findNearest, allowedRange, findById, MOUSE_FLICK_VELOCITY, MOUSE_DRAG_THRESHOLD, DIRECTIONAL_INTENT_VELOCITY, findDragSettleTarget;
218
229
  var init_snap_points = __esm({
219
230
  "src/core/primitives/snap-points.ts"() {
220
231
  init_cssLength();
232
+ init_devWarn();
221
233
  resolveSnapList = (points, mode, measureFit) => points.map((p) => {
222
234
  const raw = resolveSnap(p.size, mode, measureFit);
223
235
  if (!Number.isFinite(raw) || raw < 0) {
224
- console.warn(
236
+ devWarn(
225
237
  `[BottomSheet] snap "${p.id}" resolved to invalid size (${String(p.size)} \u2192 ${raw}); clamped to 0.`
226
238
  );
227
239
  return { id: p.id, size: 0 };
@@ -233,7 +245,7 @@ var init_snap_points = __esm({
233
245
  for (const p of points) {
234
246
  if (typeof p.size !== "string") continue;
235
247
  if (!VH_NOT_DVH.test(p.size)) continue;
236
- console.warn(
248
+ devWarn(
237
249
  `[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`
238
250
  );
239
251
  }
@@ -289,6 +301,31 @@ var init_snap_points = __esm({
289
301
  }
290
302
  });
291
303
 
304
+ // src/core/primitives/cancelable-emit.ts
305
+ function emitCancelable(emit, base, warnLabel) {
306
+ let cancelled = false;
307
+ let frozen = false;
308
+ emit({
309
+ ...base,
310
+ cancel: () => {
311
+ if (frozen) {
312
+ devWarn(
313
+ `[BottomSheet] ${warnLabel}.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener.`
314
+ );
315
+ return;
316
+ }
317
+ cancelled = true;
318
+ }
319
+ });
320
+ frozen = true;
321
+ return cancelled;
322
+ }
323
+ var init_cancelable_emit = __esm({
324
+ "src/core/primitives/cancelable-emit.ts"() {
325
+ init_devWarn();
326
+ }
327
+ });
328
+
292
329
  // src/core/primitives/snap-resolver.ts
293
330
  var SnapResolver;
294
331
  var init_snap_resolver = __esm({
@@ -447,7 +484,9 @@ function notifyLinkedSheets(sheets, self) {
447
484
  try {
448
485
  if (linked.state.size === 0) continue;
449
486
  const ids = linked.getAllowedIds();
450
- const target = ids.find((id) => id !== "closed");
487
+ const resolved = linked.getResolvedSnaps();
488
+ const sizeOf = (id) => resolved.find((s) => s.id === id)?.size ?? 0;
489
+ const target = ids.find((id) => sizeOf(id) > 0);
451
490
  if (target && target !== linked.state.activeId) {
452
491
  void linked.snapTo(target);
453
492
  }
@@ -677,11 +716,15 @@ function installVisualViewport(deps) {
677
716
  if (clamp < deps.getMaxAxisSize()) {
678
717
  deps.setMaxAxisSize(clamp);
679
718
  }
719
+ const wasAnimating = deps.isAnimating?.() ?? false;
720
+ deps.cancelInFlight();
721
+ deps.newCycle();
680
722
  const max = deps.getMaxAxisSize();
681
723
  deps.setSize(Math.min(deps.getSize(), max));
682
724
  const current = deps.resolveActiveSnap();
683
725
  if (current && !deps.isDragging()) {
684
726
  deps.applySize(Math.min(current.size, max));
727
+ if (wasAnimating) deps.resyncAfterCancel?.();
685
728
  } else {
686
729
  deps.applySize(deps.getSize());
687
730
  }
@@ -837,6 +880,60 @@ var init_fit_observer = __esm({
837
880
  }
838
881
  });
839
882
 
883
+ // src/core/features/max-height-controller.ts
884
+ function createMaxHeightController(deps) {
885
+ let maxHeightCap;
886
+ let maxHeightRaw;
887
+ const resolveCap = () => {
888
+ const raw = maxHeightRaw;
889
+ if (raw === void 0) {
890
+ maxHeightCap = void 0;
891
+ return;
892
+ }
893
+ if (typeof raw === "number") {
894
+ maxHeightCap = raw;
895
+ return;
896
+ }
897
+ if (typeof window === "undefined") return;
898
+ const measured = resolveSnap(raw, deps.mode);
899
+ maxHeightCap = measured > 0 ? measured : void 0;
900
+ };
901
+ const clampTo = () => {
902
+ if (maxHeightCap === void 0) return;
903
+ if (deps.getMaxAxisSize() > maxHeightCap) {
904
+ deps.setMaxAxisSize(maxHeightCap);
905
+ }
906
+ };
907
+ return {
908
+ setRadius(r) {
909
+ deps.element.style.setProperty(
910
+ "--bs-radius",
911
+ typeof r === "number" ? `${r}px` : r
912
+ );
913
+ },
914
+ setMaxHeight(h) {
915
+ const value = typeof h === "number" ? `${h}px` : h;
916
+ const axis = layoutAxis(deps.mode);
917
+ deps.element.style.setProperty(
918
+ axis === "height" ? "max-height" : "max-width",
919
+ value
920
+ );
921
+ maxHeightRaw = h;
922
+ resolveCap();
923
+ deps.recompute();
924
+ },
925
+ resolveCap,
926
+ clampTo,
927
+ getCap: () => maxHeightCap
928
+ };
929
+ }
930
+ var init_max_height_controller = __esm({
931
+ "src/core/features/max-height-controller.ts"() {
932
+ init_snap_points();
933
+ init_transform();
934
+ }
935
+ });
936
+
840
937
  // src/core/features/fit-measurement.ts
841
938
  var measureSheetNatural, containingExtent, measureFitSize;
842
939
  var init_fit_measurement = __esm({
@@ -993,17 +1090,6 @@ var init_opacity_dedup = __esm({
993
1090
  }
994
1091
  });
995
1092
 
996
- // src/core/primitives/devWarn.ts
997
- function devWarn(...args) {
998
- if (typeof process !== "undefined" && process.env && process.env.NODE_ENV !== "production" && typeof console !== "undefined") {
999
- console.warn(...args);
1000
- }
1001
- }
1002
- var init_devWarn = __esm({
1003
- "src/core/primitives/devWarn.ts"() {
1004
- }
1005
- });
1006
-
1007
1093
  // src/core/primitives/overlay-position.ts
1008
1094
  function resolveSheetAnchoredStyle(mode, position, inset) {
1009
1095
  const sizeOffset = `calc(var(--bs-size, 0px) + ${inset})`;
@@ -2754,6 +2840,8 @@ var init_BottomSheetEngine = __esm({
2754
2840
  init_instance_id();
2755
2841
  init_event_bus();
2756
2842
  init_snap_points();
2843
+ init_cancelable_emit();
2844
+ init_devWarn();
2757
2845
  init_snap_resolver();
2758
2846
  init_persist();
2759
2847
  init_auto_collapse();
@@ -2763,6 +2851,7 @@ var init_BottomSheetEngine = __esm({
2763
2851
  init_visual_viewport();
2764
2852
  init_resize_observer();
2765
2853
  init_fit_observer();
2854
+ init_max_height_controller();
2766
2855
  init_fit_measurement();
2767
2856
  init_slider_keyboard();
2768
2857
  init_scrim_controller();
@@ -2801,8 +2890,7 @@ var init_BottomSheetEngine = __esm({
2801
2890
  __publicField(this, "disableCloseFlag");
2802
2891
  __publicField(this, "disableDragFlag");
2803
2892
  __publicField(this, "closeOnRouteChange");
2804
- __publicField(this, "maxHeightCap");
2805
- __publicField(this, "maxHeightRaw");
2893
+ __publicField(this, "maxHeight");
2806
2894
  __publicField(this, "snapPointsRaw");
2807
2895
  __publicField(this, "snaps");
2808
2896
  __publicField(this, "activeId");
@@ -2913,11 +3001,20 @@ var init_BottomSheetEngine = __esm({
2913
3001
  auditVhUsage(this.snapPointsRaw);
2914
3002
  this.auditDuplicateSnapIds(this.snapPointsRaw);
2915
3003
  this.rootEl = this.element.closest(".bs-root");
3004
+ this.maxHeight = createMaxHeightController({
3005
+ element: this.element,
3006
+ mode: this.mode,
3007
+ getMaxAxisSize: () => this.snaps.getMaxAxisSize(),
3008
+ setMaxAxisSize: (size) => {
3009
+ this.snaps.setMaxAxisSize(size);
3010
+ },
3011
+ recompute: () => this.recompute()
3012
+ });
2916
3013
  this.fitDeps = {
2917
3014
  element: this.element,
2918
3015
  scrollContainer: this.scrollContainer,
2919
3016
  mode: this.mode,
2920
- getMaxHeightCap: () => this.maxHeightCap
3017
+ getMaxHeightCap: () => this.maxHeight.getCap()
2921
3018
  };
2922
3019
  this.snaps = new SnapResolver(
2923
3020
  this.snapPointsRaw,
@@ -3028,7 +3125,7 @@ var init_BottomSheetEngine = __esm({
3028
3125
  }
3029
3126
  use(plugin) {
3030
3127
  if (this.destroyed) {
3031
- console.warn(
3128
+ devWarn(
3032
3129
  `[BottomSheet] use("${plugin.name}") called on destroyed engine \u2014 ignored.`
3033
3130
  );
3034
3131
  return this;
@@ -3070,6 +3167,9 @@ var init_BottomSheetEngine = __esm({
3070
3167
  getAllowedIds() {
3071
3168
  return this.snaps.getAllowedIds().slice();
3072
3169
  }
3170
+ getResolvedSnaps() {
3171
+ return this.snaps.getResolvedSnaps();
3172
+ }
3073
3173
  async snapTo(id, velocityOrOpts = 0, _skipBeforeSnap = false) {
3074
3174
  if (this.destroyed) return;
3075
3175
  const opts = typeof velocityOrOpts === "object" ? velocityOrOpts : { velocity: velocityOrOpts };
@@ -3078,11 +3178,11 @@ var init_BottomSheetEngine = __esm({
3078
3178
  if (externalSignal?.aborted) return;
3079
3179
  const target = this.snaps.findById(id);
3080
3180
  if (!target) {
3081
- console.warn(`[BottomSheet] unknown snap id: ${id}`);
3181
+ devWarn(`[BottomSheet] unknown snap id: ${id}`);
3082
3182
  return;
3083
3183
  }
3084
3184
  if (!this.snaps.getAllowedIds().includes(id)) {
3085
- console.warn(`[BottomSheet] snap "${id}" is not in allowed list`);
3185
+ devWarn(`[BottomSheet] snap "${id}" is not in allowed list`);
3086
3186
  return;
3087
3187
  }
3088
3188
  if (!_skipBeforeSnap && this.emitBeforeSnap(target, this.activeId)) {
@@ -3214,42 +3314,11 @@ var init_BottomSheetEngine = __esm({
3214
3314
  }
3215
3315
  setRadius(r) {
3216
3316
  if (this.destroyed) return;
3217
- this.element.style.setProperty(
3218
- "--bs-radius",
3219
- typeof r === "number" ? `${r}px` : r
3220
- );
3317
+ this.maxHeight.setRadius(r);
3221
3318
  }
3222
3319
  setMaxHeight(h) {
3223
3320
  if (this.destroyed) return;
3224
- const value = typeof h === "number" ? `${h}px` : h;
3225
- const axis = layoutAxis(this.mode);
3226
- this.element.style.setProperty(
3227
- axis === "height" ? "max-height" : "max-width",
3228
- value
3229
- );
3230
- this.maxHeightRaw = h;
3231
- this.resolveMaxHeightCap();
3232
- this.recompute();
3233
- }
3234
- resolveMaxHeightCap() {
3235
- const raw = this.maxHeightRaw;
3236
- if (raw === void 0) {
3237
- this.maxHeightCap = void 0;
3238
- return;
3239
- }
3240
- if (typeof raw === "number") {
3241
- this.maxHeightCap = raw;
3242
- return;
3243
- }
3244
- if (typeof window === "undefined") return;
3245
- const measured = resolveSnap(raw, this.mode);
3246
- this.maxHeightCap = measured > 0 ? measured : void 0;
3247
- }
3248
- clampToMaxHeight() {
3249
- if (this.maxHeightCap === void 0) return;
3250
- if (this.snaps.getMaxAxisSize() > this.maxHeightCap) {
3251
- this.snaps.setMaxAxisSize(this.maxHeightCap);
3252
- }
3321
+ this.maxHeight.setMaxHeight(h);
3253
3322
  }
3254
3323
  setAllowed(ids, snap) {
3255
3324
  if (this.destroyed) return;
@@ -3337,7 +3406,7 @@ var init_BottomSheetEngine = __esm({
3337
3406
  };
3338
3407
  const host = this.screenComponent?.parentElement;
3339
3408
  if (!host) {
3340
- console.warn(
3409
+ devWarn(
3341
3410
  "[BottomSheet] setScrimStages: no scrim element mounted \u2014 pass `scrim` to the engine first."
3342
3411
  );
3343
3412
  return () => {
@@ -3387,9 +3456,9 @@ var init_BottomSheetEngine = __esm({
3387
3456
  }
3388
3457
  recompute() {
3389
3458
  if (this.destroyed) return;
3390
- this.resolveMaxHeightCap();
3459
+ this.maxHeight.resolveCap();
3391
3460
  this.snaps.recompute();
3392
- this.clampToMaxHeight();
3461
+ this.maxHeight.clampTo();
3393
3462
  this.scrim.invalidateOpacityCache();
3394
3463
  if (this.gesture?.isDragging) return;
3395
3464
  const current = this.snaps.findById(this.activeId);
@@ -3439,42 +3508,18 @@ var init_BottomSheetEngine = __esm({
3439
3508
  return this.currentAbort.signal;
3440
3509
  }
3441
3510
  emitBeforeSnap(target, previousId) {
3442
- let cancelled = false;
3443
- let frozen = false;
3444
- this.emit("before-snap", {
3445
- id: target.id,
3446
- size: target.size,
3447
- previousId,
3448
- cancel: () => {
3449
- if (frozen) {
3450
- console.warn(
3451
- "[BottomSheet] before-snap.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener."
3452
- );
3453
- return;
3454
- }
3455
- cancelled = true;
3456
- }
3457
- });
3458
- frozen = true;
3459
- return cancelled;
3511
+ return emitCancelable(
3512
+ (payload) => this.emit("before-snap", payload),
3513
+ { id: target.id, size: target.size, previousId },
3514
+ "before-snap"
3515
+ );
3460
3516
  }
3461
3517
  emitBeforeClose(reason) {
3462
- let cancelled = false;
3463
- let frozen = false;
3464
- this.emit("before-close", {
3465
- reason,
3466
- cancel: () => {
3467
- if (frozen) {
3468
- console.warn(
3469
- "[BottomSheet] before-close.cancel() called asynchronously \u2014 ignored. cancel() must be invoked synchronously inside the listener."
3470
- );
3471
- return;
3472
- }
3473
- cancelled = true;
3474
- }
3475
- });
3476
- frozen = true;
3477
- return cancelled;
3518
+ return emitCancelable(
3519
+ (payload) => this.emit("before-close", payload),
3520
+ { reason },
3521
+ "before-close"
3522
+ );
3478
3523
  }
3479
3524
  applyAutoAriaLabelledBy() {
3480
3525
  if (typeof document === "undefined") return;
@@ -3489,16 +3534,16 @@ var init_BottomSheetEngine = __esm({
3489
3534
  this.element.setAttribute("aria-labelledby", titled.id);
3490
3535
  }
3491
3536
  recomputeSnaps() {
3492
- this.resolveMaxHeightCap();
3537
+ this.maxHeight.resolveCap();
3493
3538
  this.snaps.setRaw(this.snapPointsRaw);
3494
- this.clampToMaxHeight();
3539
+ this.maxHeight.clampTo();
3495
3540
  this.scrim.invalidateOpacityCache();
3496
3541
  }
3497
3542
  auditDuplicateSnapIds(points) {
3498
3543
  const seen = /* @__PURE__ */ new Set();
3499
3544
  for (const p of points) {
3500
3545
  if (seen.has(p.id)) {
3501
- console.warn(
3546
+ devWarn(
3502
3547
  `[BottomSheet] duplicate snap id "${p.id}" \u2014 only the first occurrence is reachable.`
3503
3548
  );
3504
3549
  }
@@ -3665,7 +3710,15 @@ var init_BottomSheetEngine = __esm({
3665
3710
  setSize: (size) => {
3666
3711
  this.size = size;
3667
3712
  },
3668
- applySize: (size) => this.applySize(size)
3713
+ applySize: (size) => this.applySize(size),
3714
+ cancelInFlight: () => {
3715
+ this.animation.cancel();
3716
+ },
3717
+ newCycle: () => {
3718
+ this.newCycle();
3719
+ },
3720
+ isAnimating: () => this.animation.isAnimating,
3721
+ resyncAfterCancel: () => this.resyncAfterResize()
3669
3722
  }));
3670
3723
  }
3671
3724
  this.teardowns.add(installSliderKeyboard({
@@ -3833,7 +3886,7 @@ var init_BottomSheetEngine = __esm({
3833
3886
  var baseStyles;
3834
3887
  var init_baseStyles = __esm({
3835
3888
  "src/web-component/baseStyles.ts"() {
3836
- 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}}`;
3889
+ 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}}`;
3837
3890
  }
3838
3891
  });
3839
3892
 
@@ -4276,10 +4329,15 @@ var init_BottomSheetElement = __esm({
4276
4329
  "progress",
4277
4330
  (payload) => this.dispatchEvent(new CustomEvent("progress", { detail: payload }))
4278
4331
  ),
4279
- this.engine.on(
4280
- "before-close",
4281
- (payload) => this.dispatchEvent(new CustomEvent("before-close", { detail: payload }))
4282
- ),
4332
+ this.engine.on("before-close", (payload) => {
4333
+ const accepted = this.dispatchEvent(
4334
+ new CustomEvent("before-close", {
4335
+ detail: payload,
4336
+ cancelable: true
4337
+ })
4338
+ );
4339
+ if (!accepted) payload.cancel();
4340
+ }),
4283
4341
  this.engine.on(
4284
4342
  "opened",
4285
4343
  (payload) => this.dispatchEvent(new CustomEvent("opened", { detail: payload }))
@@ -4295,6 +4353,10 @@ var init_BottomSheetElement = __esm({
4295
4353
  this.engine.on(
4296
4354
  "dragend",
4297
4355
  (payload) => this.dispatchEvent(new CustomEvent("drag-end", { detail: payload }))
4356
+ ),
4357
+ this.engine.on(
4358
+ "drag",
4359
+ (payload) => this.dispatchEvent(new CustomEvent("drag", { detail: payload }))
4298
4360
  )
4299
4361
  ];
4300
4362
  }