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