@ceale/util 1.8.0 → 1.9.0

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
@@ -1,3 +1,41 @@
1
1
  # @ceale/util
2
2
 
3
- 小工具集
3
+ 小工具集
4
+
5
+ 提供了
6
+ - String.prototype
7
+ - removePrefix()
8
+ - removeSuffix()
9
+ - removeAllPrefixes()
10
+ - removeAllSuffixes()
11
+ - toCamelCase()
12
+ - toKebabCase()
13
+ - Function.prototype
14
+ - isDirectSubclass()
15
+ - isSubclass()
16
+ - isDirectInstance()
17
+ - isInstance()
18
+ - namespace: `uri`
19
+ - join()
20
+ - namespace: `css`
21
+ - rule()
22
+ - selector()
23
+ - at()
24
+ - join()
25
+ - `time.ts`
26
+ - wait() `# Alias: sleepAsync()`
27
+ - sleep() `# Alias: waitSync()`
28
+ - `task.ts`
29
+ - debounce()
30
+ - throttle()
31
+ - `bezier.ts`
32
+ - namespace `quadraticCurve`
33
+ - solveX()
34
+ - solveY()
35
+ - solveTForX()
36
+ - namespace `cubicCurve`
37
+ - solveX()
38
+ - solveY()
39
+ - solveTForX()
40
+ - class `QuadraticBezier`
41
+ - class `CubicBezier`
package/dist/cjs/index.js CHANGED
@@ -35,8 +35,12 @@ __export(exports_src, {
35
35
  throttle: () => throttle,
36
36
  sleepAsync: () => sleepAsync,
37
37
  sleep: () => sleep,
38
+ quadraticCurve: () => quadraticCurve,
38
39
  debounce: () => debounce,
39
- css: () => css
40
+ cubicCurve: () => cubicCurve,
41
+ css: () => css,
42
+ QuadraticBezier: () => QuadraticBezier,
43
+ CubicBezier: () => CubicBezier
40
44
  });
41
45
  module.exports = __toCommonJS(exports_src);
42
46
 
@@ -249,3 +253,115 @@ var throttle = (func, delay) => {
249
253
  }, delay);
250
254
  };
251
255
  };
256
+ // src/bezier.ts
257
+ class BezierError extends Error {
258
+ constructor(message) {
259
+ super(message);
260
+ this.name = "BezierError";
261
+ }
262
+ }
263
+ var quadraticCurve;
264
+ ((quadraticCurve) => {
265
+ quadraticCurve.solveX = (p1, t) => {
266
+ const [p1x, p1y] = p1;
267
+ const oneMinusT = 1 - t;
268
+ return 2 * oneMinusT * t * p1x + t * t;
269
+ };
270
+ quadraticCurve.solveY = (p1, t) => {
271
+ const [p1x, p1y] = p1;
272
+ const oneMinusT = 1 - t;
273
+ return 2 * oneMinusT * t * p1y + t * t;
274
+ };
275
+ quadraticCurve.solveTForX = (p1, x, iterations = 8) => {
276
+ let tMin = 0;
277
+ let tMax = 1;
278
+ let tGuess;
279
+ for (let i = 0;i < iterations; i++) {
280
+ tGuess = (tMin + tMax) / 2;
281
+ const xGuess = quadraticCurve.solveX(p1, tGuess);
282
+ if (xGuess < x) {
283
+ tMin = tGuess;
284
+ } else {
285
+ tMax = tGuess;
286
+ }
287
+ }
288
+ return (tMin + tMax) / 2;
289
+ };
290
+ })(quadraticCurve ||= {});
291
+ var cubicCurve;
292
+ ((cubicCurve) => {
293
+ cubicCurve.solveX = ([p1, p2], t) => {
294
+ const [p1x, p1y] = p1;
295
+ const [p2x, p2y] = p2;
296
+ const oneMinusT = 1 - t;
297
+ const t2 = t * t;
298
+ return 3 * oneMinusT * oneMinusT * t * p1x + 3 * oneMinusT * t2 * p2x + t2 * t;
299
+ };
300
+ cubicCurve.solveY = ([p1, p2], t) => {
301
+ const [p1x, p1y] = p1;
302
+ const [p2x, p2y] = p2;
303
+ const oneMinusT = 1 - t;
304
+ const t2 = t * t;
305
+ return 3 * oneMinusT * oneMinusT * t * p1y + 3 * oneMinusT * t2 * p2y + t2 * t;
306
+ };
307
+ cubicCurve.solveTForX = ([p1, p2], x, iterations = 12) => {
308
+ let tMin = 0;
309
+ let tMax = 1;
310
+ let tGuess;
311
+ for (let i = 0;i < iterations; i++) {
312
+ tGuess = (tMin + tMax) / 2;
313
+ const xGuess = cubicCurve.solveX([p1, p2], tGuess);
314
+ if (xGuess < x) {
315
+ tMin = tGuess;
316
+ } else {
317
+ tMax = tGuess;
318
+ }
319
+ }
320
+ return (tMin + tMax) / 2;
321
+ };
322
+ })(cubicCurve ||= {});
323
+
324
+ class QuadraticBezier {
325
+ p1;
326
+ constructor(p1) {
327
+ this.p1 = p1;
328
+ if (this.p1[0] < 0 || this.p1[0] > 1) {
329
+ throw new BezierError("控制点P1的x坐标必须在[0, 1]之间");
330
+ }
331
+ }
332
+ solveX(t) {
333
+ return quadraticCurve.solveX(this.p1, t);
334
+ }
335
+ solveY(t) {
336
+ return quadraticCurve.solveY(this.p1, t);
337
+ }
338
+ solveYForX(x) {
339
+ const t = quadraticCurve.solveTForX(this.p1, x);
340
+ return this.solveY(t);
341
+ }
342
+ }
343
+
344
+ class CubicBezier {
345
+ p1;
346
+ p2;
347
+ constructor(p1, p2) {
348
+ this.p1 = p1;
349
+ this.p2 = p2;
350
+ if (this.p1[0] < 0 || this.p1[0] > 1) {
351
+ throw new BezierError("控制点P1的x坐标必须在[0, 1]之间");
352
+ }
353
+ if (this.p2[0] < 0 || this.p2[0] > 1) {
354
+ throw new BezierError("控制点P2的x坐标必须在[0, 1]之间");
355
+ }
356
+ }
357
+ solveX(t) {
358
+ return cubicCurve.solveX([this.p1, this.p2], t);
359
+ }
360
+ solveY(t) {
361
+ return cubicCurve.solveY([this.p1, this.p2], t);
362
+ }
363
+ solveYForX(x) {
364
+ const t = cubicCurve.solveTForX([this.p1, this.p2], x);
365
+ return this.solveY(t);
366
+ }
367
+ }
package/dist/esm/index.js CHANGED
@@ -207,6 +207,118 @@ var throttle = (func, delay) => {
207
207
  }, delay);
208
208
  };
209
209
  };
210
+ // src/bezier.ts
211
+ class BezierError extends Error {
212
+ constructor(message) {
213
+ super(message);
214
+ this.name = "BezierError";
215
+ }
216
+ }
217
+ var quadraticCurve;
218
+ ((quadraticCurve) => {
219
+ quadraticCurve.solveX = (p1, t) => {
220
+ const [p1x, p1y] = p1;
221
+ const oneMinusT = 1 - t;
222
+ return 2 * oneMinusT * t * p1x + t * t;
223
+ };
224
+ quadraticCurve.solveY = (p1, t) => {
225
+ const [p1x, p1y] = p1;
226
+ const oneMinusT = 1 - t;
227
+ return 2 * oneMinusT * t * p1y + t * t;
228
+ };
229
+ quadraticCurve.solveTForX = (p1, x, iterations = 8) => {
230
+ let tMin = 0;
231
+ let tMax = 1;
232
+ let tGuess;
233
+ for (let i = 0;i < iterations; i++) {
234
+ tGuess = (tMin + tMax) / 2;
235
+ const xGuess = quadraticCurve.solveX(p1, tGuess);
236
+ if (xGuess < x) {
237
+ tMin = tGuess;
238
+ } else {
239
+ tMax = tGuess;
240
+ }
241
+ }
242
+ return (tMin + tMax) / 2;
243
+ };
244
+ })(quadraticCurve ||= {});
245
+ var cubicCurve;
246
+ ((cubicCurve) => {
247
+ cubicCurve.solveX = ([p1, p2], t) => {
248
+ const [p1x, p1y] = p1;
249
+ const [p2x, p2y] = p2;
250
+ const oneMinusT = 1 - t;
251
+ const t2 = t * t;
252
+ return 3 * oneMinusT * oneMinusT * t * p1x + 3 * oneMinusT * t2 * p2x + t2 * t;
253
+ };
254
+ cubicCurve.solveY = ([p1, p2], t) => {
255
+ const [p1x, p1y] = p1;
256
+ const [p2x, p2y] = p2;
257
+ const oneMinusT = 1 - t;
258
+ const t2 = t * t;
259
+ return 3 * oneMinusT * oneMinusT * t * p1y + 3 * oneMinusT * t2 * p2y + t2 * t;
260
+ };
261
+ cubicCurve.solveTForX = ([p1, p2], x, iterations = 12) => {
262
+ let tMin = 0;
263
+ let tMax = 1;
264
+ let tGuess;
265
+ for (let i = 0;i < iterations; i++) {
266
+ tGuess = (tMin + tMax) / 2;
267
+ const xGuess = cubicCurve.solveX([p1, p2], tGuess);
268
+ if (xGuess < x) {
269
+ tMin = tGuess;
270
+ } else {
271
+ tMax = tGuess;
272
+ }
273
+ }
274
+ return (tMin + tMax) / 2;
275
+ };
276
+ })(cubicCurve ||= {});
277
+
278
+ class QuadraticBezier {
279
+ p1;
280
+ constructor(p1) {
281
+ this.p1 = p1;
282
+ if (this.p1[0] < 0 || this.p1[0] > 1) {
283
+ throw new BezierError("控制点P1的x坐标必须在[0, 1]之间");
284
+ }
285
+ }
286
+ solveX(t) {
287
+ return quadraticCurve.solveX(this.p1, t);
288
+ }
289
+ solveY(t) {
290
+ return quadraticCurve.solveY(this.p1, t);
291
+ }
292
+ solveYForX(x) {
293
+ const t = quadraticCurve.solveTForX(this.p1, x);
294
+ return this.solveY(t);
295
+ }
296
+ }
297
+
298
+ class CubicBezier {
299
+ p1;
300
+ p2;
301
+ constructor(p1, p2) {
302
+ this.p1 = p1;
303
+ this.p2 = p2;
304
+ if (this.p1[0] < 0 || this.p1[0] > 1) {
305
+ throw new BezierError("控制点P1的x坐标必须在[0, 1]之间");
306
+ }
307
+ if (this.p2[0] < 0 || this.p2[0] > 1) {
308
+ throw new BezierError("控制点P2的x坐标必须在[0, 1]之间");
309
+ }
310
+ }
311
+ solveX(t) {
312
+ return cubicCurve.solveX([this.p1, this.p2], t);
313
+ }
314
+ solveY(t) {
315
+ return cubicCurve.solveY([this.p1, this.p2], t);
316
+ }
317
+ solveYForX(x) {
318
+ const t = cubicCurve.solveTForX([this.p1, this.p2], x);
319
+ return this.solveY(t);
320
+ }
321
+ }
210
322
  export {
211
323
  waitSync,
212
324
  wait,
@@ -214,6 +326,10 @@ export {
214
326
  throttle,
215
327
  sleepAsync,
216
328
  sleep,
329
+ quadraticCurve,
217
330
  debounce,
218
- css
331
+ cubicCurve,
332
+ css,
333
+ QuadraticBezier,
334
+ CubicBezier
219
335
  };
@@ -0,0 +1,96 @@
1
+ type Point = [number, number];
2
+ export declare namespace quadraticCurve {
3
+ /**
4
+ * [二次] 给定控制点 P1 和 t (时间),计算 x 坐标
5
+ * @param p1 控制点1 的坐标
6
+ * @param t 时间比例 [0, 1]
7
+ * @returns x 坐标
8
+ */
9
+ const solveX: (p1: Point, t: number) => number;
10
+ /**
11
+ * [二次] 给定控制点 P1 和 t (时间),计算 y 坐标
12
+ * @param p1 控制点1 坐标
13
+ * @param t 时间比例 [0, 1]
14
+ * @returns y 坐标
15
+ */
16
+ const solveY: (p1: Point, t: number) => number;
17
+ /**
18
+ * [二次] 给定控制点 P1 和 x (坐标),反向求解 t (时间)
19
+ * 使用二分查找法
20
+ * @param p1 控制点1 坐标
21
+ * @param x 目标 x 坐标 [0, 1]
22
+ * @returns 对应的时间 t
23
+ */
24
+ const solveTForX: (p1: Point, x: number, iterations?: number) => number;
25
+ }
26
+ export declare namespace cubicCurve {
27
+ /**
28
+ * [三次] 给定控制点 P1, P2 和 t (时间),计算 x 坐标
29
+ * @param \[p1, p2] 控制点1 控制点2 的坐标
30
+ * @param t 时间比例 [0, 1]
31
+ * @returns x 坐标
32
+ */
33
+ const solveX: ([p1, p2]: [Point, Point], t: number) => number;
34
+ /**
35
+ * [三次] 给定控制点 P1, P2 和 t (时间),计算 y 坐标
36
+ * @param \[p1, p2] 控制点1 控制点2 的坐标
37
+ * @param t 时间比例 [0, 1]
38
+ * @returns y 坐标
39
+ */
40
+ const solveY: ([p1, p2]: [Point, Point], t: number) => number;
41
+ /**
42
+ * [三次] 给定控制点 P1, P2 和 x (坐标),反向求解 t (时间)
43
+ * 使用二分查找法
44
+ * @param \[p1, p2] 控制点1 控制点2 的坐标
45
+ * @param x 目标 x 坐标 [0, 1]
46
+ * @returns 对应的时间 t
47
+ */
48
+ const solveTForX: ([p1, p2]: [Point, Point], x: number, iterations?: number) => number;
49
+ }
50
+ /**
51
+ * 代表一个二次贝塞尔缓动曲线
52
+ */
53
+ export declare class QuadraticBezier {
54
+ private readonly p1;
55
+ /**
56
+ * @param p1 控制点 P1
57
+ */
58
+ constructor(p1: Point);
59
+ /**
60
+ * 根据时间 t [0, 1],计算 x 坐标
61
+ */
62
+ solveX(t: number): number;
63
+ /**
64
+ * 根据时间 t [0, 1],计算 y 坐标
65
+ */
66
+ solveY(t: number): number;
67
+ /**
68
+ * 根据 x 坐标 [0, 1],计算 y 坐标
69
+ */
70
+ solveYForX(x: number): number;
71
+ }
72
+ /**
73
+ * 代表一个三次贝塞尔缓动曲线
74
+ */
75
+ export declare class CubicBezier {
76
+ private readonly p1;
77
+ private readonly p2;
78
+ /**
79
+ * @param p1 控制点 P1
80
+ * @param p2 控制点 P2
81
+ */
82
+ constructor(p1: Point, p2: Point);
83
+ /**
84
+ * 根据时间 t [0, 1],计算 x 坐标
85
+ */
86
+ solveX(t: number): number;
87
+ /**
88
+ * 根据时间 t [0, 1],计算 y 坐标
89
+ */
90
+ solveY(t: number): number;
91
+ /**
92
+ * 根据 x 坐标 [0, 1],计算 y 坐标
93
+ */
94
+ solveYForX(x: number): number;
95
+ }
96
+ export {};
@@ -4,3 +4,4 @@ export * from "./class";
4
4
  export * from "./css";
5
5
  export * from "./time";
6
6
  export * from "./task";
7
+ export * from "./bezier";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ceale/util",
3
3
  "author": "Ceale",
4
- "version": "1.8.0",
4
+ "version": "1.9.0",
5
5
  "module": "index.ts",
6
6
  "type": "module",
7
7
  "main": "dist/esm/index.js",
@@ -31,7 +31,7 @@
31
31
  "typescript": "^5"
32
32
  },
33
33
  "dependencies": {
34
- "@types/vue": "^2.0.0",
35
- "csstype": "^3.1.3"
34
+ "csstype": "^3.1.3",
35
+ "vue": "^3.5.21"
36
36
  }
37
37
  }