@pinnacle0/web-ui 0.4.16 → 0.4.18

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,10 @@
1
+ /// <reference types="react" />
2
+ import type { DragHandler } from "../../hooks/useDrag/type";
3
+ interface Props {
4
+ onResizeStart: DragHandler;
5
+ onResize: DragHandler;
6
+ gap?: number;
7
+ className?: string;
8
+ }
9
+ export declare const Resizer: ({ onResizeStart, onResize, gap, className }: Props) => JSX.Element;
10
+ export {};
@@ -0,0 +1,22 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import React from "react";
13
+ import { useDraggable } from "../../hooks/useDraggable";
14
+ import { classNames } from "../../util/ClassNames";
15
+ import { ReactUtil } from "../../util/ReactUtil";
16
+ export var Resizer = ReactUtil.memo("Resizer", function (_a) {
17
+ var onResizeStart = _a.onResizeStart, onResize = _a.onResize, gap = _a.gap, className = _a.className;
18
+ var ref = React.useRef(null);
19
+ var bind = useDraggable({ target: ref, onDragStart: onResizeStart, onDrag: onResize, disabled: true, gap: gap });
20
+ return React.createElement("div", __assign({ className: classNames("resizer", className), ref: ref }, bind));
21
+ });
22
+ //# sourceMappingURL=Resizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resizer.js","sourceRoot":"","sources":["../../../src/core/Resizable/Resizer.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAS/C,MAAM,CAAC,IAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAC,EAAgD;QAA/C,aAAa,mBAAA,EAAE,QAAQ,cAAA,EAAE,GAAG,SAAA,EAAE,SAAS,eAAA;IACtF,IAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAwB,IAAI,CAAC,CAAC;IACtD,IAAM,IAAI,GAAG,YAAY,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAA,EAAC,CAAC,CAAC;IAE5G,OAAO,sCAAK,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,IAAM,IAAI,EAAI,CAAC;AACpF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import "./index.less";
3
+ interface Props {
4
+ height: number;
5
+ width: number;
6
+ id?: string;
7
+ className?: string;
8
+ minHeight?: number;
9
+ minWidth?: number;
10
+ gap?: number;
11
+ children?: React.ReactNode;
12
+ }
13
+ export declare const Resizable: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLDivElement>>;
14
+ export {};
@@ -0,0 +1,90 @@
1
+ import React from "react";
2
+ import { Resizer } from "./Resizer";
3
+ import { classNames } from "../../util/ClassNames";
4
+ import "./index.less";
5
+ export var Resizable = React.forwardRef(function (_a, ref) {
6
+ var height = _a.height, width = _a.width, className = _a.className, id = _a.id, gap = _a.gap, children = _a.children, _b = _a.minHeight, minHeight = _b === void 0 ? 0 : _b, _c = _a.minWidth, minWidth = _c === void 0 ? 0 : _c;
7
+ var resizableDivRef = React.useRef(null);
8
+ var startRect = React.useRef({ top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 });
9
+ var combineRef = function (node) {
10
+ if (node) {
11
+ if (ref) {
12
+ typeof ref === "function" ? ref(node) : (ref.current = node);
13
+ }
14
+ resizableDivRef.current = node;
15
+ }
16
+ };
17
+ var onResizeStart = function () {
18
+ if (resizableDivRef.current) {
19
+ var _a = resizableDivRef.current.getBoundingClientRect(), top_1 = _a.top, right = _a.right, bottom = _a.bottom, left = _a.left, width_1 = _a.width, height_1 = _a.height;
20
+ startRect.current = { top: top_1, right: right, bottom: bottom, left: left, width: width_1, height: height_1 };
21
+ }
22
+ };
23
+ var onResizeTop = function (state) {
24
+ if (resizableDivRef.current) {
25
+ var _a = startRect.current, top_2 = _a.top, height_2 = _a.height;
26
+ var deltaY = state.delta[1];
27
+ var transformedHeight = height_2 - deltaY;
28
+ if (transformedHeight < minHeight) {
29
+ return;
30
+ }
31
+ resizableDivRef.current.style.top = "".concat(top_2 + deltaY, "px");
32
+ resizableDivRef.current.style.height = "".concat(transformedHeight, "px");
33
+ }
34
+ };
35
+ var onResizeRight = function (state) {
36
+ if (resizableDivRef.current) {
37
+ var width_2 = startRect.current.width;
38
+ var transformedWidth = width_2 + state.delta[0];
39
+ if (transformedWidth < minWidth) {
40
+ return;
41
+ }
42
+ resizableDivRef.current.style.width = "".concat(transformedWidth, "px");
43
+ }
44
+ };
45
+ var onResizeBottom = function (state) {
46
+ if (resizableDivRef.current) {
47
+ var height_3 = startRect.current.height;
48
+ var transformedHeight = height_3 + state.delta[1];
49
+ if (transformedHeight < minHeight) {
50
+ return;
51
+ }
52
+ resizableDivRef.current.style.height = "".concat(transformedHeight, "px");
53
+ }
54
+ };
55
+ var onResizeLeft = function (state) {
56
+ if (resizableDivRef.current) {
57
+ var _a = startRect.current, left = _a.left, width_3 = _a.width;
58
+ var deltaX = state.delta[0];
59
+ var transformedWidth = width_3 - deltaX;
60
+ if (transformedWidth < minWidth) {
61
+ return;
62
+ }
63
+ resizableDivRef.current.style.left = "".concat(left + deltaX, "px");
64
+ resizableDivRef.current.style.width = "".concat(transformedWidth, "px");
65
+ }
66
+ };
67
+ return (React.createElement("div", { className: classNames("resizable", className), id: id, ref: combineRef, style: { height: height, width: width } },
68
+ React.createElement(Resizer, { className: "top", onResizeStart: onResizeStart, onResize: onResizeTop, gap: gap }),
69
+ React.createElement(Resizer, { className: "top-right", gap: gap, onResizeStart: onResizeStart, onResize: function (state) {
70
+ onResizeTop(state);
71
+ onResizeRight(state);
72
+ } }),
73
+ React.createElement(Resizer, { className: "right", gap: gap, onResizeStart: onResizeStart, onResize: onResizeRight }),
74
+ React.createElement(Resizer, { className: "bottom-right", gap: gap, onResizeStart: onResizeStart, onResize: function (state) {
75
+ onResizeRight(state);
76
+ onResizeBottom(state);
77
+ } }),
78
+ React.createElement(Resizer, { className: "bottom", gap: gap, onResizeStart: onResizeStart, onResize: onResizeBottom }),
79
+ React.createElement(Resizer, { className: "bottom-left", gap: gap, onResizeStart: onResizeStart, onResize: function (state) {
80
+ onResizeBottom(state);
81
+ onResizeLeft(state);
82
+ } }),
83
+ React.createElement(Resizer, { className: "left", gap: gap, onResizeStart: onResizeStart, onResize: onResizeLeft }),
84
+ React.createElement(Resizer, { className: "top-left", gap: gap, onResizeStart: onResizeStart, onResize: function (state) {
85
+ onResizeTop(state);
86
+ onResizeLeft(state);
87
+ } }),
88
+ children));
89
+ });
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/Resizable/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ @thickness: 12px;
2
+ @half-thickness: 6px;
3
+
4
+ .resizable {
5
+ position: fixed;
6
+ z-index: 99;
7
+ border: 1px solid #333;
8
+
9
+ .resizer {
10
+ position: absolute;
11
+ z-index: 100;
12
+
13
+ &.top {
14
+ cursor: ns-resize;
15
+ top: -@half-thickness;
16
+ left: @half-thickness;
17
+ width: calc(100% - @thickness);
18
+ height: @thickness;
19
+ }
20
+
21
+ &.top-right {
22
+ cursor: nesw-resize;
23
+ width: @thickness;
24
+ height: @thickness;
25
+ top: -@half-thickness;
26
+ left: calc(100% - @half-thickness);
27
+ }
28
+
29
+ &.right {
30
+ cursor: ew-resize;
31
+ top: @half-thickness;
32
+ left: calc(100% - @half-thickness);
33
+ width: @thickness;
34
+ height: calc(100% - @thickness);
35
+ }
36
+
37
+ &.bottom-right {
38
+ cursor: nwse-resize;
39
+ width: @thickness;
40
+ height: @thickness;
41
+ top: calc(100% - @half-thickness);
42
+ left: calc(100% - @half-thickness);
43
+ }
44
+
45
+ &.bottom {
46
+ cursor: ns-resize;
47
+ top: calc(100% - @half-thickness);
48
+ left: @half-thickness;
49
+ width: calc(100% - @thickness);
50
+ height: @thickness;
51
+ }
52
+
53
+ &.bottom-left {
54
+ cursor: nesw-resize;
55
+ width: @thickness;
56
+ height: @thickness;
57
+ top: calc(100% - @half-thickness);
58
+ left: -@half-thickness;
59
+ }
60
+
61
+ &.left {
62
+ cursor: ew-resize;
63
+ top: @half-thickness;
64
+ left: -@half-thickness;
65
+ width: @thickness;
66
+ height: calc(100% - @thickness);
67
+ }
68
+
69
+ &.top-left {
70
+ cursor: nwse-resize;
71
+ width: @thickness;
72
+ height: @thickness;
73
+ top: -@half-thickness;
74
+ left: -@half-thickness;
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import type { DragConfig } from "./type";
3
+ export declare class DragController {
4
+ private dragStarted;
5
+ private startPosition;
6
+ private config;
7
+ private createState;
8
+ private setStartPosition;
9
+ onDrag: (event: MouseEvent) => void;
10
+ onDragStart: React.MouseEventHandler;
11
+ onDragEnd: (event: MouseEvent) => void;
12
+ updateHandlers: (config: DragConfig) => void;
13
+ }
@@ -0,0 +1,47 @@
1
+ var DragController = /** @class */ (function () {
2
+ function DragController() {
3
+ var _this = this;
4
+ this.dragStarted = false;
5
+ this.startPosition = [0, 0];
6
+ this.config = {};
7
+ this.createState = function (event) {
8
+ return {
9
+ delta: [event.clientX - _this.startPosition[0], event.clientY - _this.startPosition[1]],
10
+ event: event,
11
+ };
12
+ };
13
+ this.setStartPosition = function (x, y) {
14
+ _this.startPosition[0] = x;
15
+ _this.startPosition[1] = y;
16
+ };
17
+ this.onDrag = function (event) {
18
+ var _a, _b;
19
+ _this.dragStarted && ((_b = (_a = _this.config).onDrag) === null || _b === void 0 ? void 0 : _b.call(_a, _this.createState(event)));
20
+ };
21
+ this.onDragStart = function (event) {
22
+ var _a, _b;
23
+ // disable right click event
24
+ if (event.nativeEvent.button !== 0)
25
+ return;
26
+ if (event.currentTarget !== event.target)
27
+ return;
28
+ event.preventDefault();
29
+ _this.setStartPosition(event.clientX, event.clientY);
30
+ _this.dragStarted = true;
31
+ (_b = (_a = _this.config).onDragStart) === null || _b === void 0 ? void 0 : _b.call(_a, _this.createState(event.nativeEvent));
32
+ };
33
+ this.onDragEnd = function (event) {
34
+ var _a, _b;
35
+ if (_this.dragStarted) {
36
+ _this.dragStarted = false;
37
+ (_b = (_a = _this.config).onDragEnd) === null || _b === void 0 ? void 0 : _b.call(_a, _this.createState(event));
38
+ }
39
+ };
40
+ this.updateHandlers = function (config) {
41
+ _this.config = config;
42
+ };
43
+ }
44
+ return DragController;
45
+ }());
46
+ export { DragController };
47
+ //# sourceMappingURL=DragController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DragController.js","sourceRoot":"","sources":["../../../src/hooks/useDrag/DragController.ts"],"names":[],"mappings":"AAEA;IAAA;QAAA,iBA0CC;QAzCW,gBAAW,GAAY,KAAK,CAAC;QAC7B,kBAAa,GAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,WAAM,GAAe,EAAE,CAAC;QAExB,gBAAW,GAAG,UAAC,KAAiB;YACpC,OAAO;gBACH,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,KAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,KAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACrF,KAAK,OAAA;aACR,CAAC;QACN,CAAC,CAAC;QAEM,qBAAgB,GAAG,UAAC,CAAS,EAAE,CAAS;YAC5C,KAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,WAAM,GAAG,UAAC,KAAiB;;YACvB,KAAI,CAAC,WAAW,KAAI,MAAA,MAAA,KAAI,CAAC,MAAM,EAAC,MAAM,mDAAG,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC;QACtE,CAAC,CAAC;QAEF,gBAAW,GAA4B,UAAA,KAAK;;YACxC,4BAA4B;YAC5B,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC3C,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAO;YAEjD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,KAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,MAAA,MAAA,KAAI,CAAC,MAAM,EAAC,WAAW,mDAAG,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF,cAAS,GAAG,UAAC,KAAiB;;YAC1B,IAAI,KAAI,CAAC,WAAW,EAAE;gBAClB,KAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,MAAA,MAAA,KAAI,CAAC,MAAM,EAAC,SAAS,mDAAG,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;aACpD;QACL,CAAC,CAAC;QAEF,mBAAc,GAAG,UAAC,MAAkB;YAChC,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC,CAAC;IACN,CAAC;IAAD,qBAAC;AAAD,CAAC,AA1CD,IA0CC"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ import type { DragConfig } from "./type";
3
+ export declare const useDrag: (config: DragConfig) => {
4
+ onMouseDown: React.MouseEventHandler<Element>;
5
+ };
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { DragController } from "./DragController";
3
+ export var useDrag = function (config) {
4
+ var controller = React.useMemo(function () { return new DragController(); }, []);
5
+ React.useEffect(function () {
6
+ controller.updateHandlers(config);
7
+ }, [config, controller]);
8
+ React.useEffect(function () {
9
+ document.addEventListener("mousemove", controller.onDrag);
10
+ document.addEventListener("mouseup", controller.onDragEnd);
11
+ return function () {
12
+ document.removeEventListener("mousemove", controller.onDrag);
13
+ document.removeEventListener("mouseup", controller.onDragEnd);
14
+ };
15
+ }, [config, controller]);
16
+ return {
17
+ onMouseDown: controller.onDragStart.bind(controller),
18
+ };
19
+ };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/useDrag/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAGhD,MAAM,CAAC,IAAM,OAAO,GAAG,UAAC,MAAkB;IACtC,IAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,cAAM,OAAA,IAAI,cAAc,EAAE,EAApB,CAAoB,EAAE,EAAE,CAAC,CAAC;IAEjE,KAAK,CAAC,SAAS,CAAC;QACZ,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEzB,KAAK,CAAC,SAAS,CAAC;QACZ,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAE3D,OAAO;YACH,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEzB,OAAO;QACH,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;KACvD,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type Vector = [number, number];
2
+ export interface DragState {
3
+ delta: Vector;
4
+ event: MouseEvent;
5
+ }
6
+ export type DragHandler = (state: DragState) => void;
7
+ export interface DragConfig {
8
+ onDragStart?: DragHandler;
9
+ onDrag?: DragHandler;
10
+ onDragEnd?: DragHandler;
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/hooks/useDrag/type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import type { DragState } from "./useDrag/type";
3
+ interface Config {
4
+ target: React.RefObject<HTMLElement>;
5
+ disabled?: boolean;
6
+ gap?: number;
7
+ onDragStart?: (state: DragState) => void;
8
+ onDrag?: (state: DragState) => void;
9
+ onDragEnd?: (state: DragState) => void;
10
+ }
11
+ export declare const useDraggable: ({ target, disabled, onDragStart, onDrag, onDragEnd, gap }: Config) => {
12
+ onMouseDown: React.MouseEventHandler<Element>;
13
+ };
14
+ export {};
@@ -0,0 +1,73 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __read = (this && this.__read) || function (o, n) {
13
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
14
+ if (!m) return o;
15
+ var i = m.call(o), r, ar = [], e;
16
+ try {
17
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
18
+ }
19
+ catch (error) { e = { error: error }; }
20
+ finally {
21
+ try {
22
+ if (r && !r.done && (m = i["return"])) m.call(i);
23
+ }
24
+ finally { if (e) throw e.error; }
25
+ }
26
+ return ar;
27
+ };
28
+ import React from "react";
29
+ import { NumberUtil } from "../internal/NumberUtil";
30
+ import { useDrag } from "./useDrag";
31
+ import { useTransform } from "./useTransform";
32
+ export var useDraggable = function (_a) {
33
+ var target = _a.target, disabled = _a.disabled, onDragStart = _a.onDragStart, onDrag = _a.onDrag, onDragEnd = _a.onDragEnd, _b = _a.gap, gap = _b === void 0 ? 0 : _b;
34
+ var start = React.useRef([0, 0]);
35
+ var bounds = React.useRef({ x: [0, 0], y: [0, 0] });
36
+ var transit = useTransform(target);
37
+ var boundedDelta = function (delta) {
38
+ var _a = __read(delta, 2), deltaX = _a[0], deltaY = _a[1];
39
+ var _b = __read(bounds.current.x, 2), minX = _b[0], maxX = _b[1];
40
+ var _c = __read(bounds.current.y, 2), minY = _c[0], maxY = _c[1];
41
+ return [NumberUtil.clamp(deltaX, minX, maxX), NumberUtil.clamp(deltaY, minY, maxY)];
42
+ };
43
+ var bind = useDrag({
44
+ onDragStart: function (state) {
45
+ if (target.current) {
46
+ var _a = target.current.getBoundingClientRect(), left = _a.left, right = _a.right, bottom = _a.bottom, top_1 = _a.top;
47
+ start.current = [left, top_1];
48
+ bounds.current = { x: [-left + gap, window.innerWidth - right - gap], y: [-top_1 + gap, window.innerHeight - bottom - gap] };
49
+ onDragStart === null || onDragStart === void 0 ? void 0 : onDragStart(state);
50
+ }
51
+ },
52
+ onDrag: function (state) {
53
+ if (target.current) {
54
+ var delta = boundedDelta(state.delta);
55
+ !disabled && transit.to({ x: delta[0], y: delta[1], immediate: false });
56
+ onDrag === null || onDrag === void 0 ? void 0 : onDrag(__assign(__assign({}, state), { delta: delta }));
57
+ }
58
+ },
59
+ onDragEnd: function (state) {
60
+ if (target.current) {
61
+ var delta = boundedDelta(state.delta);
62
+ if (!disabled) {
63
+ target.current.style.left = "".concat(start.current[0] + delta[0], "px");
64
+ target.current.style.top = "".concat(start.current[1] + delta[1], "px");
65
+ }
66
+ transit.to({ x: 0, y: 0, immediate: true });
67
+ onDragEnd === null || onDragEnd === void 0 ? void 0 : onDragEnd(__assign(__assign({}, state), { delta: delta }));
68
+ }
69
+ },
70
+ });
71
+ return bind;
72
+ };
73
+ //# sourceMappingURL=useDraggable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDraggable.js","sourceRoot":"","sources":["../../src/hooks/useDraggable.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  declare function rounding(value: number, algorithm: "round" | "ceil" | "floor", maxScale: number): number;
2
2
  declare function roundingToString(value: number, algorithm: "round" | "ceil" | "floor", scale: number): string;
3
+ declare function clamp(value: number, min: number, max: number): number;
3
4
  export declare const NumberUtil: Readonly<{
4
5
  rounding: typeof rounding;
5
6
  roundingToString: typeof roundingToString;
7
+ clamp: typeof clamp;
6
8
  }>;
7
9
  export {};
@@ -31,8 +31,15 @@ function rounding(value, algorithm, maxScale) {
31
31
  function roundingToString(value, algorithm, scale) {
32
32
  return rounding(value, algorithm, scale).toFixed(scale);
33
33
  }
34
+ function clamp(value, min, max) {
35
+ if (min > max) {
36
+ throw new Error("[util] NumberUtil.clamp min(".concat(min, ") must be <= max(").concat(max, ")"));
37
+ }
38
+ return Math.max(min, Math.min(max, value));
39
+ }
34
40
  export var NumberUtil = Object.freeze({
35
41
  rounding: rounding,
36
42
  roundingToString: roundingToString,
43
+ clamp: clamp,
37
44
  });
38
45
  //# sourceMappingURL=NumberUtil.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberUtil.js","sourceRoot":"","sources":["../../src/internal/NumberUtil.ts"],"names":[],"mappings":"AAAA,SAAS,QAAQ,CAAC,KAAa,EAAE,SAAqC,EAAE,QAAgB;IACpF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE;QAC9D,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;KAChG;IACD;;;;;;;;;;;;OAYG;IACH,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,IAAM,eAAe,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,IAAM,mBAAmB,GAAG,SAAA,EAAE,EAAI,eAAe,CAAA,CAAC;IAClD,IAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,IAAI,MAAM,CAAC,gBAAgB,CAAC;IACxF,IAAM,SAAS,GAAG,SAAA,EAAE,EAAI,QAAQ,CAAA,CAAC;IACjC,IAAI,eAAe,GAAG,QAAQ,IAAI,gBAAgB,EAAE;QAChD,IAAM,aAAa,GAAG,SAAA,EAAE,EAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAA,CAAC;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAC,GAAG,aAAa,CAAC,GAAG,SAAS,CAAC;KACrF;SAAM;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;KACzD;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAqC,EAAE,KAAa;IACzF,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,IAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,QAAQ,UAAA;IACR,gBAAgB,kBAAA;CACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"NumberUtil.js","sourceRoot":"","sources":["../../src/internal/NumberUtil.ts"],"names":[],"mappings":"AAAA,SAAS,QAAQ,CAAC,KAAa,EAAE,SAAqC,EAAE,QAAgB;IACpF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE;QAC9D,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;KAChG;IACD;;;;;;;;;;;;OAYG;IACH,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,IAAM,eAAe,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,IAAM,mBAAmB,GAAG,SAAA,EAAE,EAAI,eAAe,CAAA,CAAC;IAClD,IAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,mBAAmB,IAAI,MAAM,CAAC,gBAAgB,CAAC;IACxF,IAAM,SAAS,GAAG,SAAA,EAAE,EAAI,QAAQ,CAAA,CAAC;IACjC,IAAI,eAAe,GAAG,QAAQ,IAAI,gBAAgB,EAAE;QAChD,IAAM,aAAa,GAAG,SAAA,EAAE,EAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAA,CAAC;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAC,GAAG,aAAa,CAAC,GAAG,SAAS,CAAC;KACrF;SAAM;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;KACzD;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAqC,EAAE,KAAa;IACzF,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAClD,IAAI,GAAG,GAAG,GAAG,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,sCAA+B,GAAG,8BAAoB,GAAG,MAAG,CAAC,CAAC;KACjF;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,IAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,QAAQ,UAAA;IACR,gBAAgB,kBAAA;IAChB,KAAK,OAAA;CACR,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pinnacle0/web-ui",
3
- "version": "0.4.16",
3
+ "version": "0.4.18",
4
4
  "author": "Pinnacle",
5
5
  "license": "MIT",
6
6
  "sideEffects": [