@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
|
+
[](https://skills.sh/AbhiVarde/svelte-drawer)
|
|
5
6
|
[](https://www.npmjs.com/package/@abhivarde/svelte-drawer) [](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 @@
|
|
|
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 +
|
|
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 >
|
|
154
|
+
if (pos > threshold) {
|
|
153
155
|
drawer.closeDrawer();
|
|
154
156
|
} else {
|
|
155
157
|
drawer.drawerPosition.set(0);
|
package/dist/types.d.ts
CHANGED