@plastic-js/tsumiki 0.1.86 → 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.
@@ -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,10 +66,6 @@ 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",
@@ -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
- dragging(true);
190
+ dragActive = true;
191
+ if (sheetEl) sheetEl.dataset.dragging = "";
171
192
  };
172
193
  const onGrabberPointerMove = (e) => {
173
- if (!dragging()) return;
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
- const translate = dy >= 0 ? dy : dy / RUBBER_BAND_FACTOR;
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
- dragging(false);
185
- if (sheetEl) sheetEl.style.transform = "";
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 (!dragging()) return;
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 (!dragging()) return;
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
  }] });
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.87",
4
4
  "description": "A UI component library for Plastic JS.",
5
5
  "license": "MIT",
6
6
  "author": "tigre",