@cites/react-hooks 0.0.2 → 0.0.4

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.
@@ -0,0 +1,27 @@
1
+ export interface DragDelta {
2
+ deltaX: number;
3
+ deltaY: number;
4
+ }
5
+ export interface HitArea {
6
+ top: number;
7
+ right: number;
8
+ bottom: number;
9
+ left: number;
10
+ }
11
+ export interface DragGestureOptions {
12
+ onDragStart?: (event: PointerEvent) => void;
13
+ onDrag?: (state: DragDelta) => void;
14
+ onDragEnd?: (event: PointerEvent) => void;
15
+ hitArea?: number | Partial<HitArea>;
16
+ shouldPreventDrag?: (event: React.PointerEvent) => boolean | void;
17
+ }
18
+ export interface DragHandleProps {
19
+ onPointerDown: (event: React.PointerEvent) => void;
20
+ }
21
+ export declare function useDragGesture(options: DragGestureOptions): {
22
+ isDragging: boolean;
23
+ getDragHandleProps: () => {
24
+ onPointerDown: (event: React.PointerEvent) => void;
25
+ };
26
+ };
27
+ //# sourceMappingURL=useDragGesture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDragGesture.d.ts","sourceRoot":"","sources":["../../src/core/useDragGesture.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,GAAG,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;CACtD;AAmBD,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB;;;+BA0ER,KAAK,CAAC,YAAY;;EAuCnE"}
@@ -0,0 +1,113 @@
1
+ import { useRef, useState, useCallback, useEffect } from "react";
2
+ import { useEventCallback } from "./useEventCallback.js"; // 根据你的实际路径调整
3
+ function normalizeHitArea(input) {
4
+ if (typeof input === "number") {
5
+ return {
6
+ top: input,
7
+ right: input,
8
+ bottom: input,
9
+ left: input,
10
+ };
11
+ }
12
+ return {
13
+ top: input?.top ?? 0,
14
+ right: input?.right ?? 0,
15
+ bottom: input?.bottom ?? 0,
16
+ left: input?.left ?? 0,
17
+ };
18
+ }
19
+ export function useDragGesture(options) {
20
+ const [isDragging, setIsDragging] = useState(false);
21
+ const startPositionRef = useRef({ x: 0, y: 0 });
22
+ const dragTargetRef = useRef(null);
23
+ const latestDeltaRef = useRef(null);
24
+ const rafIdRef = useRef(null);
25
+ const handleDragStart = useEventCallback((event) => {
26
+ options.onDragStart?.(event);
27
+ });
28
+ const handleDrag = useEventCallback((delta) => {
29
+ options.onDrag?.(delta);
30
+ });
31
+ const handleDragEnd = useEventCallback((event) => {
32
+ options.onDragEnd?.(event);
33
+ });
34
+ const handlePointerMove = useEventCallback((event) => {
35
+ if (!isDragging)
36
+ return;
37
+ latestDeltaRef.current = {
38
+ deltaX: event.clientX - startPositionRef.current.x,
39
+ deltaY: event.clientY - startPositionRef.current.y,
40
+ };
41
+ if (rafIdRef.current === null) {
42
+ rafIdRef.current = requestAnimationFrame(() => {
43
+ if (latestDeltaRef.current) {
44
+ handleDrag(latestDeltaRef.current);
45
+ latestDeltaRef.current = null;
46
+ }
47
+ rafIdRef.current = null;
48
+ });
49
+ }
50
+ });
51
+ const handlePointerUp = useEventCallback((event) => {
52
+ setIsDragging(false);
53
+ if (dragTargetRef.current) {
54
+ dragTargetRef.current.releasePointerCapture(event.pointerId);
55
+ }
56
+ handleDragEnd(event);
57
+ window.removeEventListener("pointermove", handlePointerMove);
58
+ window.removeEventListener("pointerup", handlePointerUp);
59
+ dragTargetRef.current = null;
60
+ if (rafIdRef.current !== null) {
61
+ cancelAnimationFrame(rafIdRef.current);
62
+ rafIdRef.current = null;
63
+ }
64
+ });
65
+ const onHitTest = useEventCallback((event) => {
66
+ const el = event.currentTarget;
67
+ const rect = el.getBoundingClientRect();
68
+ const hit = normalizeHitArea(options.hitArea);
69
+ const within = event.clientX >= rect.left - hit.left &&
70
+ event.clientX <= rect.right + hit.right &&
71
+ event.clientY >= rect.top - hit.top &&
72
+ event.clientY <= rect.bottom + hit.bottom;
73
+ return within;
74
+ });
75
+ const onStartingDragTest = useEventCallback((event) => {
76
+ return options.shouldPreventDrag?.(event);
77
+ });
78
+ const handlePointerDown = useCallback((event) => {
79
+ if (onStartingDragTest(event) === true)
80
+ return;
81
+ const within = onHitTest(event);
82
+ if (!within)
83
+ return;
84
+ event.preventDefault();
85
+ event.stopPropagation();
86
+ setIsDragging(true);
87
+ startPositionRef.current = { x: event.clientX, y: event.clientY };
88
+ const target = event.currentTarget;
89
+ dragTargetRef.current = target;
90
+ target.setPointerCapture(event.pointerId);
91
+ handleDragStart(event.nativeEvent);
92
+ window.addEventListener("pointermove", handlePointerMove);
93
+ window.addEventListener("pointerup", handlePointerUp);
94
+ }, [onStartingDragTest, onHitTest, handleDragStart, handlePointerMove, handlePointerUp]); // 这些引用是稳定的
95
+ useEffect(() => {
96
+ return () => {
97
+ window.removeEventListener("pointermove", handlePointerMove);
98
+ window.removeEventListener("pointerup", handlePointerUp);
99
+ if (rafIdRef.current !== null) {
100
+ cancelAnimationFrame(rafIdRef.current);
101
+ rafIdRef.current = null;
102
+ }
103
+ };
104
+ }, [handlePointerMove, handlePointerUp]);
105
+ return {
106
+ isDragging,
107
+ getDragHandleProps: () => ({
108
+ onPointerDown: handlePointerDown,
109
+ }),
110
+ };
111
+ }
112
+ ;
113
+ //# sourceMappingURL=useDragGesture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDragGesture.js","sourceRoot":"","sources":["../../src/core/useDragGesture.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,31 @@
1
- import React from "react";
2
- export interface Point {
1
+ import { type DragHandleProps } from "./useDragGesture.js";
2
+ export interface Position {
3
3
  x: number;
4
4
  y: number;
5
5
  }
6
- export interface Bounds {
6
+ interface Bounds {
7
7
  left: number;
8
- top: number;
9
8
  right: number;
9
+ top: number;
10
10
  bottom: number;
11
11
  }
12
- export interface DragInfo<T extends HTMLElement> extends Point {
13
- ref: React.Ref<T>;
12
+ export interface DraggableInfo {
13
+ position: Position;
14
14
  isDragging: boolean;
15
+ draggableProps: DragHandleProps;
15
16
  }
16
17
  export interface DraggableOptions {
17
- mode?: "object" | "slider";
18
- initialPosition?: Point;
18
+ position?: Position;
19
+ onPositionChange?: (pos: Position) => void;
20
+ initialPosition?: Position;
19
21
  bounds?: Bounds;
22
+ gridSize?: number;
23
+ lockAxis?: "x" | "y";
24
+ onDragStart?: (pos: Position) => void;
25
+ onDragEnd?: (pos: Position) => void;
26
+ updatePositionOnDragStart?: boolean;
27
+ shouldPreventDrag?: (event: React.PointerEvent) => boolean | undefined;
20
28
  }
21
- export declare const useDraggable: <T extends HTMLElement>(options?: DraggableOptions) => DragInfo<T>;
29
+ export declare function useDraggable(options?: DraggableOptions): DraggableInfo;
30
+ export {};
22
31
  //# sourceMappingURL=useDraggable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDraggable.d.ts","sourceRoot":"","sources":["../../src/core/useDraggable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,MAAM,WAAW,KAAK;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,WAAW,CAAE,SAAQ,KAAK;IAC1D,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,WAAW,EAAE,UAAS,gBAAqB,KAAG,QAAQ,CAAC,CAAC,CAmG9F,CAAC"}
1
+ {"version":3,"file":"useDraggable.d.ts","sourceRoot":"","sources":["../../src/core/useDraggable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3E,MAAM,WAAW,QAAQ;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,UAAU,MAAM;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,GAAG,SAAS,CAAC;CAC1E;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAuF1E"}
@@ -1,82 +1,76 @@
1
- import { useState, useEffect, useRef, useCallback } from "react";
1
+ import { useState, useRef } from "react";
2
2
  import { useEventCallback } from "./useEventCallback.js";
3
- export const useDraggable = (options = {}) => {
4
- const { initialPosition, bounds, mode = "object" } = options;
5
- const [position, setPosition] = useState(null);
6
- const [isDragging, setIsDragging] = useState(false);
7
- const animationFrameId = useRef(null);
8
- const currentPosition = position ?? initialPosition ?? { x: 0, y: 0 };
9
- const [handleNode, setHandleNode] = useState(null);
10
- const handleRefCallback = useCallback((node) => {
11
- setHandleNode(node);
12
- return () => {
13
- setHandleNode(null);
3
+ import { useDragGesture } from "./useDragGesture.js";
4
+ import { clamp } from "../utils/index.js";
5
+ export function useDraggable(options = {}) {
6
+ const { position: controlledPosition, onPositionChange, initialPosition = { x: 0, y: 0 }, bounds, gridSize, lockAxis, onDragStart, onDragEnd, updatePositionOnDragStart, shouldPreventDrag, } = options;
7
+ const [uncontrolledPosition, setUncontrolledPosition] = useState(initialPosition);
8
+ const isControlled = controlledPosition !== undefined && typeof onPositionChange === "function";
9
+ const position = isControlled ? controlledPosition : uncontrolledPosition;
10
+ const dragStartPosRef = useRef({ x: 0, y: 0 });
11
+ const clampPosition = (pos) => {
12
+ if (!bounds)
13
+ return pos;
14
+ return {
15
+ x: clamp(pos.x, bounds.left, bounds.right),
16
+ y: clamp(pos.y, bounds.top, bounds.bottom),
14
17
  };
15
- }, []);
16
- const dragInfo = useRef(null);
17
- const animate = useEventCallback(() => {
18
- if (!dragInfo.current)
19
- return;
20
- const newPosition = {
21
- x: dragInfo.current.initialPosition.x + (dragInfo.current.lastPoint.x - dragInfo.current.startPoint.x),
22
- y: dragInfo.current.initialPosition.y + (dragInfo.current.lastPoint.y - dragInfo.current.startPoint.y),
18
+ };
19
+ const snapToGrid = (pos) => {
20
+ if (!gridSize || gridSize <= 1)
21
+ return pos;
22
+ return {
23
+ x: Math.round(pos.x / gridSize) * gridSize,
24
+ y: Math.round(pos.y / gridSize) * gridSize,
23
25
  };
24
- if (bounds) {
25
- newPosition.x = Math.max(bounds.left, Math.min(newPosition.x, bounds.right));
26
- newPosition.y = Math.max(bounds.top, Math.min(newPosition.y, bounds.bottom));
26
+ };
27
+ const updatePosition = useEventCallback((nextPos) => {
28
+ let pos = snapToGrid(clampPosition(nextPos));
29
+ if (lockAxis === "x") {
30
+ pos.y = position.y;
27
31
  }
28
- setPosition(newPosition);
29
- animationFrameId.current = requestAnimationFrame(animate);
30
- });
31
- const handlePointerMove = useEventCallback((event) => {
32
- if (dragInfo.current) {
33
- dragInfo.current.lastPoint = { x: event.clientX, y: event.clientY };
32
+ else if (lockAxis === "y") {
33
+ pos.x = position.x;
34
34
  }
35
- });
36
- const handlePointerUp = useEventCallback(() => {
37
- window.removeEventListener("pointermove", handlePointerMove);
38
- window.removeEventListener("pointerup", handlePointerUp);
39
- if (animationFrameId.current) {
40
- cancelAnimationFrame(animationFrameId.current);
35
+ if (isControlled) {
36
+ onPositionChange(pos);
37
+ }
38
+ else {
39
+ setUncontrolledPosition(pos);
41
40
  }
42
- dragInfo.current = null;
43
- setIsDragging(false);
44
41
  });
45
- const handlePointerDown = useEventCallback((event) => {
46
- if (event.button !== 0)
47
- return;
48
- event.preventDefault();
49
- const isSliderMode = mode === "slider";
50
- const startPosition = isSliderMode
51
- ? { x: event.clientX, y: event.clientY }
52
- : { ...currentPosition };
53
- dragInfo.current = {
54
- initialPosition: startPosition,
55
- startPoint: { x: event.clientX, y: event.clientY },
56
- lastPoint: { x: event.clientX, y: event.clientY },
57
- };
58
- window.addEventListener("pointermove", handlePointerMove);
59
- window.addEventListener("pointerup", handlePointerUp);
60
- animationFrameId.current = requestAnimationFrame(animate);
61
- setIsDragging(true);
42
+ // Use our perfected, underlying drag gesture hook.
43
+ const { isDragging, getDragHandleProps } = useDragGesture({
44
+ onDragStart: (event) => {
45
+ // When the drag starts, lock in the current position.
46
+ const startPosition = updatePositionOnDragStart ? {
47
+ x: event.clientX,
48
+ y: event.clientY,
49
+ } : {
50
+ ...position,
51
+ };
52
+ dragStartPosRef.current = startPosition;
53
+ onDragStart?.(startPosition);
54
+ updatePositionOnDragStart && updatePosition(startPosition);
55
+ },
56
+ onDrag: ({ deltaX, deltaY }) => {
57
+ let nextPos = {
58
+ x: dragStartPosRef.current.x + deltaX,
59
+ y: dragStartPosRef.current.y + deltaY,
60
+ };
61
+ updatePosition(nextPos);
62
+ },
63
+ onDragEnd: () => {
64
+ onDragEnd?.(position);
65
+ },
66
+ shouldPreventDrag,
62
67
  });
63
- useEffect(() => {
64
- if (!handleNode)
65
- return;
66
- handleNode.addEventListener("pointerdown", handlePointerDown);
67
- return () => {
68
- handleNode.removeEventListener("pointerdown", handlePointerDown);
69
- window.removeEventListener("pointermove", handlePointerMove);
70
- window.removeEventListener("pointerup", handlePointerUp);
71
- if (animationFrameId.current) {
72
- cancelAnimationFrame(animationFrameId.current);
73
- if (animationFrameId) {
74
- animationFrameId.current = null;
75
- }
76
- }
77
- dragInfo.current = null;
78
- };
79
- }, [handleNode]);
80
- return { ...currentPosition, isDragging, ref: handleRefCallback };
81
- };
68
+ // Return the current state and the props getter for the component to use.
69
+ return {
70
+ position,
71
+ isDragging,
72
+ draggableProps: getDragHandleProps(),
73
+ };
74
+ }
75
+ ;
82
76
  //# sourceMappingURL=useDraggable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDraggable.js","sourceRoot":"","sources":["../../src/core/useDraggable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDraggable.js","sourceRoot":"","sources":["../../src/core/useDraggable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type DragHandleProps, type HitArea } from "./useDragGesture.js";
2
+ export interface Size {
3
+ width: number;
4
+ height: number;
5
+ }
6
+ export interface ResizableInfo {
7
+ size: Size;
8
+ isResizing: boolean;
9
+ getResizeHandleProps: (direction?: ResizeDirection, hitArea?: number | Partial<HitArea>) => DragHandleProps;
10
+ }
11
+ export interface ResizableOptions {
12
+ size?: Size;
13
+ onSizeChange?: (size: Size) => void;
14
+ initialSize?: Size;
15
+ minWidth?: number;
16
+ maxWidth?: number;
17
+ minHeight?: number;
18
+ maxHeight?: number;
19
+ axis?: "both" | "x" | "y";
20
+ lockAspectRatio?: boolean;
21
+ disabled?: boolean;
22
+ }
23
+ export type ResizeDirection = "right" | "bottom" | "bottom-right";
24
+ export declare function useResizable(options?: ResizableOptions): ResizableInfo;
25
+ //# sourceMappingURL=useResizable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizable.d.ts","sourceRoot":"","sources":["../../src/core/useResizable.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAIzF,MAAM,WAAW,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,oBAAoB,EAAE,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,eAAe,CAAC;CAC/G;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,cAAc,CAAC;AAElE,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CA0F1E"}
@@ -0,0 +1,79 @@
1
+ import { useState, useRef } from "react";
2
+ import { useDragGesture } from "./useDragGesture.js";
3
+ import { useEventCallback } from "./useEventCallback.js";
4
+ import { clamp } from "../utils/index.js";
5
+ export function useResizable(options = {}) {
6
+ const { size: controlledSize, onSizeChange, initialSize = { width: 100, height: 100 }, minWidth = 0, maxWidth = Infinity, minHeight = 0, maxHeight = Infinity, axis = "both", lockAspectRatio = false, disabled = false, } = options;
7
+ const [uncontrolledSize, setUncontrolledSize] = useState(initialSize);
8
+ const dragStartSizeRef = useRef({ width: 0, height: 0 });
9
+ const isControlled = controlledSize !== undefined && typeof onSizeChange === "function";
10
+ const size = isControlled ? controlledSize : uncontrolledSize;
11
+ const updateSize = useEventCallback((newSize) => {
12
+ const clampedSize = {
13
+ width: clamp(newSize.width, minWidth, maxWidth),
14
+ height: clamp(newSize.height, minHeight, maxHeight),
15
+ };
16
+ if (isControlled) {
17
+ onSizeChange?.(clampedSize);
18
+ }
19
+ else {
20
+ setUncontrolledSize(clampedSize);
21
+ }
22
+ });
23
+ function createResizeHandler(direction, hitArea) {
24
+ return useDragGesture({
25
+ hitArea,
26
+ onDragStart: () => {
27
+ if (disabled)
28
+ return;
29
+ dragStartSizeRef.current = size;
30
+ },
31
+ onDrag: ({ deltaX, deltaY }) => {
32
+ if (disabled)
33
+ return;
34
+ let width = dragStartSizeRef.current.width;
35
+ let height = dragStartSizeRef.current.height;
36
+ if (direction === "right" || direction === "bottom-right") {
37
+ width += deltaX;
38
+ }
39
+ if (direction === "bottom" || direction === "bottom-right") {
40
+ height += deltaY;
41
+ }
42
+ if (axis === "x") {
43
+ height = dragStartSizeRef.current.height;
44
+ }
45
+ else if (axis === "y") {
46
+ width = dragStartSizeRef.current.width;
47
+ }
48
+ if (lockAspectRatio) {
49
+ const aspect = dragStartSizeRef.current.width / dragStartSizeRef.current.height;
50
+ if (direction === "right") {
51
+ height = width / aspect;
52
+ }
53
+ else if (direction === "bottom") {
54
+ width = height * aspect;
55
+ }
56
+ else {
57
+ const avgDelta = (deltaX + deltaY) / 2;
58
+ width = dragStartSizeRef.current.width + avgDelta;
59
+ height = width / aspect;
60
+ }
61
+ }
62
+ updateSize({ width, height });
63
+ },
64
+ });
65
+ }
66
+ const handlers = {
67
+ right: (hitArea) => createResizeHandler("right", hitArea),
68
+ bottom: (hitArea) => createResizeHandler("bottom", hitArea),
69
+ "bottom-right": (hitArea) => createResizeHandler("bottom-right", hitArea),
70
+ };
71
+ return {
72
+ size,
73
+ isResizing: handlers.right().isDragging || handlers.bottom().isDragging || handlers["bottom-right"]().isDragging,
74
+ getResizeHandleProps: (direction = "bottom-right", hitArea) => {
75
+ return handlers[direction](hitArea).getDragHandleProps();
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=useResizable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizable.js","sourceRoot":"","sources":["../../src/core/useResizable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface SliderInfo {
2
+ value: number;
3
+ isDragging: boolean;
4
+ trackProps: React.HTMLAttributes<HTMLDivElement> & {
5
+ ref: React.Ref<HTMLDivElement>;
6
+ };
7
+ handleProps: React.HTMLAttributes<HTMLElement>;
8
+ axis: "horizontal" | "vertical";
9
+ direction: "ltr" | "rtl";
10
+ }
11
+ export interface SliderOptions {
12
+ value?: number;
13
+ onChange?: (value: number) => void;
14
+ initialValue?: number;
15
+ min?: number;
16
+ max?: number;
17
+ step?: number;
18
+ axis?: "horizontal" | "vertical";
19
+ direction?: "ltr" | "rtl";
20
+ }
21
+ export declare function useSlider(options?: SliderOptions): SliderInfo;
22
+ //# sourceMappingURL=useSlider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlider.d.ts","sourceRoot":"","sources":["../../src/core/useSlider.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;QAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;KAAE,CAAC;IACtF,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,UAAU,CA0EjE"}
@@ -0,0 +1,66 @@
1
+ import { useState, useRef, useMemo } from "react";
2
+ import { useDragGesture } from "./useDragGesture.js";
3
+ import { useEventCallback } from "./useEventCallback.js";
4
+ import { clamp } from "../utils/index.js";
5
+ export function useSlider(options = {}) {
6
+ const { value: controlledValue, onChange, initialValue = 0, min = 0, max = 100, step = 1, axis = "horizontal", direction = "ltr", } = options;
7
+ const [uncontrolledValue, setUncontrolledValue] = useState(initialValue);
8
+ const trackRef = useRef(null);
9
+ const isControlled = controlledValue !== undefined && typeof onChange === "function";
10
+ const value = isControlled ? controlledValue : uncontrolledValue;
11
+ const updateValue = useEventCallback((rawValue) => {
12
+ const clamped = clamp(rawValue, min, max);
13
+ const stepped = Math.round((clamped - min) / step) * step + min;
14
+ const final = clamp(Number(stepped.toFixed(6)), min, max);
15
+ if (isControlled) {
16
+ onChange(final);
17
+ }
18
+ else {
19
+ setUncontrolledValue(final);
20
+ }
21
+ });
22
+ const { isDragging, getDragHandleProps } = useDragGesture({
23
+ onDrag: ({ deltaX, deltaY }) => {
24
+ if (!trackRef.current)
25
+ return;
26
+ const rect = trackRef.current.getBoundingClientRect();
27
+ const trackLength = axis === "horizontal" ? rect.width : rect.height;
28
+ const range = max - min;
29
+ let delta = axis === "horizontal" ? deltaX : deltaY;
30
+ if (axis === "horizontal" && direction === "rtl")
31
+ delta = -delta;
32
+ const deltaValue = (delta / trackLength) * range;
33
+ updateValue(value + deltaValue);
34
+ },
35
+ });
36
+ const handleTrackClick = useEventCallback((event) => {
37
+ if (!trackRef.current)
38
+ return;
39
+ const rect = trackRef.current.getBoundingClientRect();
40
+ let clickOffset = axis === "horizontal"
41
+ ? event.clientX - rect.left
42
+ : event.clientY - rect.top;
43
+ if (axis === "horizontal" && direction === "rtl") {
44
+ clickOffset = rect.width - clickOffset;
45
+ }
46
+ const ratio = clamp(clickOffset / (axis === "horizontal" ? rect.width : rect.height), 0, 1);
47
+ const newValue = min + ratio * (max - min);
48
+ updateValue(newValue);
49
+ });
50
+ const trackProps = useMemo(() => ({
51
+ ref: trackRef,
52
+ onClick: handleTrackClick,
53
+ "aria-orientation": axis,
54
+ "data-direction": direction,
55
+ }), [handleTrackClick, axis, direction]);
56
+ const handleProps = useMemo(() => getDragHandleProps(), [getDragHandleProps]);
57
+ return {
58
+ value,
59
+ isDragging,
60
+ trackProps,
61
+ handleProps,
62
+ axis,
63
+ direction,
64
+ };
65
+ }
66
+ //# sourceMappingURL=useSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlider.js","sourceRoot":"","sources":["../../src/core/useSlider.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export * from "./core/useBoundingClientRect.js";
2
2
  export * from "./core/useComposedRefs.js";
3
+ export * from "./core/useDragGesture.js";
3
4
  export * from "./core/useDraggable.js";
5
+ export * from "./core/useSlider.js";
6
+ export * from "./core/useResizable.js";
4
7
  export * from "./core/useEventCallback.js";
5
8
  export * from "./core/useIsomorphicLayoutEffect.js";
6
9
  export * from "./core/useCustomScroller.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  export * from "./core/useBoundingClientRect.js";
2
2
  export * from "./core/useComposedRefs.js";
3
+ export * from "./core/useDragGesture.js";
3
4
  export * from "./core/useDraggable.js";
5
+ export * from "./core/useSlider.js";
6
+ export * from "./core/useResizable.js";
4
7
  export * from "./core/useEventCallback.js";
5
8
  export * from "./core/useIsomorphicLayoutEffect.js";
6
9
  export * from "./core/useCustomScroller.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AAEpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function ensureNotNull<T>(value: T | null | undefined): T;
2
+ export declare const clamp: (value: number, min: number, max: number) => number;
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAK/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAK/D;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,WAAwC,CAAC"}
@@ -4,4 +4,5 @@ export function ensureNotNull(value) {
4
4
  }
5
5
  return value;
6
6
  }
7
+ export const clamp = (value, min, max) => Math.max(min, Math.min(value, max));
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAI,KAA2B;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAI,KAA2B;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cites/react-hooks",
3
3
  "description": "React hooks",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "rm -rf dist && rm -rf .cache",