@plastic-js/tsumiki 0.1.86 → 0.1.88
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/components/BottomSheet.js +42 -18
- package/package.json +1 -1
|
@@ -51,6 +51,10 @@ var sheetClass = css({
|
|
|
51
51
|
to: { transform: "translateY(0)" }
|
|
52
52
|
})} var(--tsu-duration-overlay-enter) var(--tsu-ease-out)`
|
|
53
53
|
},
|
|
54
|
+
"&[data-dragging]": {
|
|
55
|
+
transition: "none",
|
|
56
|
+
willChange: "transform"
|
|
57
|
+
},
|
|
54
58
|
"&::after": {
|
|
55
59
|
content: "\"\"",
|
|
56
60
|
position: "absolute",
|
|
@@ -61,10 +65,6 @@ var sheetClass = css({
|
|
|
61
65
|
background: "var(--tsu-surface)"
|
|
62
66
|
}
|
|
63
67
|
});
|
|
64
|
-
var draggingClass = css({
|
|
65
|
-
transition: "none",
|
|
66
|
-
animation: "none"
|
|
67
|
-
});
|
|
68
68
|
var grabberAreaClass = css({
|
|
69
69
|
display: "flex",
|
|
70
70
|
alignItems: "center",
|
|
@@ -121,7 +121,6 @@ var BottomSheet = (props) => {
|
|
|
121
121
|
"class",
|
|
122
122
|
"children"
|
|
123
123
|
]);
|
|
124
|
-
const dragging = createSignal(false);
|
|
125
124
|
const isOpen = () => read(local.open);
|
|
126
125
|
const render = createSignal(!local.lazyMount || isOpen());
|
|
127
126
|
let exitTimer = null;
|
|
@@ -133,11 +132,30 @@ var BottomSheet = (props) => {
|
|
|
133
132
|
return ms > 0 ? ms : DEFAULT_EXIT_MS;
|
|
134
133
|
};
|
|
135
134
|
let sheetEl = null;
|
|
135
|
+
let dragActive = false;
|
|
136
136
|
let startY = 0;
|
|
137
137
|
let currentDy = 0;
|
|
138
138
|
let lastY = 0;
|
|
139
139
|
let lastT = 0;
|
|
140
140
|
let velocity = 0;
|
|
141
|
+
let rafId = 0;
|
|
142
|
+
let pendingTranslate = null;
|
|
143
|
+
const flushTransform = () => {
|
|
144
|
+
rafId = 0;
|
|
145
|
+
if (pendingTranslate === null || !sheetEl) return;
|
|
146
|
+
sheetEl.style.transform = `translate3d(0, ${pendingTranslate}px, 0)`;
|
|
147
|
+
};
|
|
148
|
+
const scheduleTransform = (px) => {
|
|
149
|
+
pendingTranslate = px;
|
|
150
|
+
if (!rafId) rafId = requestAnimationFrame(flushTransform);
|
|
151
|
+
};
|
|
152
|
+
const cancelTransform = () => {
|
|
153
|
+
if (rafId) {
|
|
154
|
+
cancelAnimationFrame(rafId);
|
|
155
|
+
rafId = 0;
|
|
156
|
+
}
|
|
157
|
+
pendingTranslate = null;
|
|
158
|
+
};
|
|
141
159
|
const handleOpenChange = (detail) => {
|
|
142
160
|
if (!detail.open) local.onClose?.();
|
|
143
161
|
local.onOpenChange?.(detail);
|
|
@@ -157,6 +175,7 @@ var BottomSheet = (props) => {
|
|
|
157
175
|
});
|
|
158
176
|
onCleanup(() => {
|
|
159
177
|
if (exitTimer) clearTimeout(exitTimer);
|
|
178
|
+
cancelTransform();
|
|
160
179
|
});
|
|
161
180
|
const handleBackdropClick = () => {
|
|
162
181
|
if (read(local.dismissible)) handleOpenChange({ open: false });
|
|
@@ -167,31 +186,40 @@ var BottomSheet = (props) => {
|
|
|
167
186
|
lastT = e.timeStamp;
|
|
168
187
|
velocity = 0;
|
|
169
188
|
currentDy = 0;
|
|
170
|
-
|
|
189
|
+
dragActive = true;
|
|
190
|
+
if (sheetEl) {
|
|
191
|
+
sheetEl.getAnimations().forEach((a) => {
|
|
192
|
+
a.cancel();
|
|
193
|
+
});
|
|
194
|
+
sheetEl.dataset.dragging = "";
|
|
195
|
+
}
|
|
171
196
|
};
|
|
172
197
|
const onGrabberPointerMove = (e) => {
|
|
173
|
-
if (!
|
|
198
|
+
if (!dragActive) return;
|
|
174
199
|
const dy = e.clientY - startY;
|
|
175
200
|
const dt = e.timeStamp - lastT;
|
|
176
201
|
if (dt > 0) velocity = (e.clientY - lastY) / dt;
|
|
177
202
|
lastY = e.clientY;
|
|
178
203
|
lastT = e.timeStamp;
|
|
179
204
|
currentDy = dy;
|
|
180
|
-
|
|
181
|
-
if (sheetEl) sheetEl.style.transform = `translateY(${translate}px)`;
|
|
205
|
+
scheduleTransform(dy >= 0 ? dy : dy / RUBBER_BAND_FACTOR);
|
|
182
206
|
};
|
|
183
207
|
const settle = (shouldClose) => {
|
|
184
|
-
|
|
185
|
-
|
|
208
|
+
dragActive = false;
|
|
209
|
+
cancelTransform();
|
|
210
|
+
if (sheetEl) {
|
|
211
|
+
delete sheetEl.dataset.dragging;
|
|
212
|
+
sheetEl.style.transform = "";
|
|
213
|
+
}
|
|
186
214
|
if (shouldClose && read(local.dismissible)) handleOpenChange({ open: false });
|
|
187
215
|
};
|
|
188
216
|
const onGrabberPointerUp = () => {
|
|
189
|
-
if (!
|
|
217
|
+
if (!dragActive) return;
|
|
190
218
|
const sheetHeight = sheetEl?.offsetHeight || 1;
|
|
191
219
|
settle(currentDy > sheetHeight * CLOSE_DISTANCE_RATIO || currentDy > 0 && velocity > CLOSE_VELOCITY);
|
|
192
220
|
};
|
|
193
221
|
const onGrabberPointerCancel = () => {
|
|
194
|
-
if (!
|
|
222
|
+
if (!dragActive) return;
|
|
195
223
|
settle(false);
|
|
196
224
|
};
|
|
197
225
|
const showGrabber = read(local.draggable);
|
|
@@ -226,11 +254,7 @@ var BottomSheet = (props) => {
|
|
|
226
254
|
setProp(_el0, "ref", (el) => {
|
|
227
255
|
sheetEl = el;
|
|
228
256
|
});
|
|
229
|
-
setProp(_el0, "className", () => [
|
|
230
|
-
sheetClass,
|
|
231
|
-
dragging() && draggingClass,
|
|
232
|
-
local.class
|
|
233
|
-
].filter(Boolean).join(" "));
|
|
257
|
+
setProp(_el0, "className", () => [sheetClass, local.class].filter(Boolean).join(" "));
|
|
234
258
|
setProp(_el0, "data-open", () => read(local.open) ? "" : void 0);
|
|
235
259
|
return _el0;
|
|
236
260
|
}] });
|