@abhivarde/svelte-drawer 1.0.5 → 1.0.6

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/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  A drawer component for Svelte 5, inspired by [Vaul](https://github.com/emilkowalski/vaul).
4
4
 
5
+ [![skills.sh](https://skills.sh/b/AbhiVarde/svelte-drawer)](https://skills.sh/AbhiVarde/svelte-drawer)
5
6
  [![](https://img.shields.io/badge/npm-@abhivarde/svelte--drawer-000?style=flat&logo=npm&logoColor=white)](https://www.npmjs.com/package/@abhivarde/svelte-drawer) [![](https://img.shields.io/badge/npmx-@abhivarde/svelte--drawer-000?style=flat&logo=node.js&logoColor=white)](https://npmx.dev/package/@abhivarde/svelte-drawer)
6
7
 
7
8
  ## Features
@@ -160,6 +161,24 @@ Add a premium blur effect to the overlay background:
160
161
  </Drawer>
161
162
  ```
162
163
 
164
+ ### Close Threshold
165
+
166
+ Control how far the user needs to drag before the drawer dismisses.
167
+
168
+ ```svelte
169
+ <!-- easier to dismiss (short drag) -->
170
+ <Drawer bind:open closeThreshold={0.15}>
171
+ ...
172
+ </Drawer>
173
+
174
+ <!-- harder to dismiss (long drag required) -->
175
+ <Drawer bind:open closeThreshold={0.5}>
176
+ ...
177
+ </Drawer>
178
+ ```
179
+
180
+ Values range from `0` to `1`. Default is `0.3` (30% of the viewport).
181
+
163
182
  ### Using Variants
164
183
 
165
184
  ```svelte
@@ -558,6 +577,7 @@ Main wrapper component that manages drawer state and animations.
558
577
  - `onOpenChange` (function, optional) - Callback when open state changes
559
578
  - `direction` ('bottom' | 'top' | 'left' | 'right', default: 'bottom') - Direction from which drawer slides
560
579
  - `closeOnEscape` (boolean, optional, default: true) - Whether Escape key closes the drawer
580
+ - `closeThreshold` (number, optional, default: 0.3) - How far the user must drag to dismiss (0–1). Lower = easier to close, higher = requires a longer drag.
561
581
  - `snapPoints` (number[], optional) - Array of snap positions between 0-1
562
582
  - `activeSnapPoint` (number, bindable, optional) - Current active snap point value
563
583
  - `onSnapPointChange` (function, optional) - Callback fired when snap changes
@@ -15,9 +15,10 @@
15
15
  onSnapPointChange = undefined,
16
16
  portal = false,
17
17
  portalContainer = undefined,
18
- persistState = false,
19
- persistKey = "default",
20
- persistSnapPoint = false,
18
+ persistState = false,
19
+ persistKey = "default",
20
+ persistSnapPoint = false,
21
+ closeThreshold = 0.3,
21
22
  children,
22
23
  } = $props();
23
24
 
@@ -34,7 +35,7 @@
34
35
  let previouslyFocusedElement: HTMLElement | null = null;
35
36
  let visible = false;
36
37
  let previousSnapPoint: number | undefined = undefined;
37
- let stateLoaded = false;
38
+ let stateLoaded = false;
38
39
 
39
40
  onMount(() => {
40
41
  if (persistState && !stateLoaded) {
@@ -67,7 +68,7 @@
67
68
  saveDrawerState(
68
69
  persistKey,
69
70
  open,
70
- persistSnapPoint ? activeSnapPoint : undefined
71
+ persistSnapPoint ? activeSnapPoint : undefined,
71
72
  );
72
73
  }
73
74
  });
@@ -171,6 +172,9 @@
171
172
  get activeSnapPoint() {
172
173
  return activeSnapPoint;
173
174
  },
175
+ get closeThreshold() {
176
+ return closeThreshold;
177
+ },
174
178
  setActiveSnapPoint(point: number) {
175
179
  activeSnapPoint = point;
176
180
  onSnapPointChange?.(point);
@@ -11,6 +11,7 @@ declare const Drawer: import("svelte").Component<{
11
11
  persistState?: boolean;
12
12
  persistKey?: string;
13
13
  persistSnapPoint?: boolean;
14
+ closeThreshold?: number;
14
15
  children: any;
15
16
  }, {}, "open" | "activeSnapPoint">;
16
17
  type Drawer = ReturnType<typeof Drawer>;
@@ -11,6 +11,7 @@
11
11
  snapPoints?: number[];
12
12
  activeSnapPoint?: number;
13
13
  setActiveSnapPoint?: (point: number) => void;
14
+ closeThreshold: number;
14
15
  };
15
16
 
16
17
  let {
@@ -134,6 +135,7 @@
134
135
  dragging = false;
135
136
 
136
137
  const pos = drawer.drawerPosition.current;
138
+ const threshold = drawer.closeThreshold * 100;
137
139
 
138
140
  if (drawer.snapPoints && drawer.snapPoints.length > 0) {
139
141
  const nearestSnapPoint = findNearestSnapPoint(pos);
@@ -142,14 +144,14 @@
142
144
  const lowestSnapPoint = Math.min(...drawer.snapPoints);
143
145
  const lowestSnapPos = snapPointToPosition(lowestSnapPoint);
144
146
 
145
- if (pos > lowestSnapPos + 30) {
147
+ if (pos > lowestSnapPos + threshold) {
146
148
  drawer.closeDrawer();
147
149
  } else {
148
150
  drawer.drawerPosition.set(snapPos);
149
151
  drawer.setActiveSnapPoint?.(nearestSnapPoint);
150
152
  }
151
153
  } else {
152
- if (pos > 30) {
154
+ if (pos > threshold) {
153
155
  drawer.closeDrawer();
154
156
  } else {
155
157
  drawer.drawerPosition.set(0);
package/dist/types.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface DrawerProps {
11
11
  persistState?: boolean;
12
12
  persistKey?: string;
13
13
  persistSnapPoint?: boolean;
14
+ closeThreshold?: number;
14
15
  }
15
16
  export interface DrawerContentProps {
16
17
  class?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abhivarde/svelte-drawer",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "A drawer component for Svelte 5, inspired by Vaul",
5
5
  "author": "Abhi Varde",
6
6
  "license": "MIT",