@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.
@@ -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
- dragging(true);
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 (!dragging()) return;
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
- const translate = dy >= 0 ? dy : dy / RUBBER_BAND_FACTOR;
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
- dragging(false);
185
- if (sheetEl) sheetEl.style.transform = "";
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 (!dragging()) return;
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 (!dragging()) return;
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
  }] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plastic-js/tsumiki",
3
- "version": "0.1.86",
3
+ "version": "0.1.88",
4
4
  "description": "A UI component library for Plastic JS.",
5
5
  "license": "MIT",
6
6
  "author": "tigre",