@bioturing/components 0.17.1 → 0.19.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/dist/components/Button/component.js +34 -24
- package/dist/components/Button/component.js.map +1 -1
- package/dist/components/Button/style.css +1 -1
- package/dist/components/ColorSelect/component.js +198 -109
- package/dist/components/ColorSelect/component.js.map +1 -1
- package/dist/components/ColorSelect/style.css +1 -1
- package/dist/components/DragDrop/draggable.js +21 -20
- package/dist/components/DragDrop/draggable.js.map +1 -1
- package/dist/components/DragDrop/droppable.js +69 -37
- package/dist/components/DragDrop/droppable.js.map +1 -1
- package/dist/components/DragDrop/hooks.js +61 -55
- package/dist/components/DragDrop/hooks.js.map +1 -1
- package/dist/components/DragDrop/index.js +23 -18
- package/dist/components/DragDrop/index.js.map +1 -1
- package/dist/components/DragDrop/style.css +1 -1
- package/dist/components/DragDrop/value.js +84 -0
- package/dist/components/DragDrop/value.js.map +1 -0
- package/dist/components/Nav/item.js +28 -27
- package/dist/components/Nav/item.js.map +1 -1
- package/dist/components/Stack/StackChild.js +37 -37
- package/dist/components/Stack/StackChild.js.map +1 -1
- package/dist/components/Tag/component.js +55 -47
- package/dist/components/Tag/component.js.map +1 -1
- package/dist/components/Tag/style.css +1 -1
- package/dist/components/Toast/component.js +13 -13
- package/dist/components/Toast/component.js.map +1 -1
- package/dist/components/Toast/style.css +1 -1
- package/dist/components/hooks/useCSSVariables.js +12 -0
- package/dist/components/hooks/useCSSVariables.js.map +1 -0
- package/dist/components/hooks/useCharts.js.map +1 -1
- package/dist/components/utils/selectionRange.js +9 -0
- package/dist/components/utils/selectionRange.js.map +1 -0
- package/dist/components/utils/theme.js +22 -0
- package/dist/components/utils/theme.js.map +1 -0
- package/dist/index.d.ts +65 -9
- package/dist/index.js +153 -147
- package/dist/index.js.map +1 -1
- package/dist/tokens/and-theme/tokens.js +12 -12
- package/dist/tokens/and-theme/tokens.js.map +1 -1
- package/package.json +5 -2
|
@@ -1,48 +1,80 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsxs as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
import { jsxs as P, jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { memo as W, useCallback as x, useMemo as b } from "react";
|
|
4
|
+
import { useDroppable as h } from "./hooks.js";
|
|
5
|
+
import { ArrowsOutCardinalIcon as y } from "@bioturing/assets";
|
|
6
|
+
import { useRender as B } from "@base-ui-components/react/use-render";
|
|
7
|
+
import { Value as F } from "./value.js";
|
|
8
|
+
import { uniqWith as G, isEqual as H } from "es-toolkit";
|
|
9
|
+
import { useCls as J } from "../utils/antdUtils.js";
|
|
10
|
+
import { clsx as K } from "../utils/cn.js";
|
|
11
|
+
const Q = ({
|
|
12
|
+
id: d,
|
|
13
|
+
children: m,
|
|
14
|
+
className: D,
|
|
15
|
+
disabled: E = !1,
|
|
16
|
+
placeholder: i = "Drop items here",
|
|
17
|
+
icon: f = /* @__PURE__ */ n(y, { size: 24 }),
|
|
18
|
+
render: O,
|
|
16
19
|
onDrop: c,
|
|
17
|
-
validate:
|
|
18
|
-
|
|
20
|
+
validate: R,
|
|
21
|
+
multiple: s,
|
|
22
|
+
value: r,
|
|
23
|
+
onChange: o,
|
|
24
|
+
renderValueLabel: p,
|
|
25
|
+
renderValueIcon: a,
|
|
26
|
+
...j
|
|
19
27
|
}) => {
|
|
20
|
-
const e =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const e = J(), q = x(
|
|
29
|
+
(t) => {
|
|
30
|
+
c && c(t), o && o(
|
|
31
|
+
s ? G([...r, t.data], H) : t.data
|
|
32
|
+
);
|
|
33
|
+
},
|
|
34
|
+
[c, o, s, r]
|
|
35
|
+
), { isOver: k, setNodeRef: w, attributes: A, listeners: I } = h({
|
|
36
|
+
id: d,
|
|
37
|
+
disabled: E,
|
|
38
|
+
onDrop: q,
|
|
39
|
+
validate: R
|
|
40
|
+
}), z = b(
|
|
41
|
+
() => ({ value: r, onChange: o, multiple: s, renderValueLabel: p, renderValueIcon: a }),
|
|
42
|
+
[r, o, s, p, a]
|
|
43
|
+
), N = b(
|
|
44
|
+
() => m || /* @__PURE__ */ P("div", { className: e("drop-zone-content"), children: [
|
|
45
|
+
/* @__PURE__ */ n("div", { className: e("drop-zone-icon"), children: f }),
|
|
46
|
+
/* @__PURE__ */ n("div", { className: e("drop-zone-text"), children: i })
|
|
47
|
+
] }),
|
|
48
|
+
[m, e, f, i]
|
|
49
|
+
), M = x(
|
|
50
|
+
({ className: t, ...l }) => !s && r || s && r.length ? /* @__PURE__ */ n(
|
|
51
|
+
F,
|
|
52
|
+
{
|
|
53
|
+
...z,
|
|
54
|
+
className: t,
|
|
55
|
+
...l
|
|
56
|
+
}
|
|
57
|
+
) : /* @__PURE__ */ n("div", { className: K(e("drop-zone"), t), ...l, children: N }),
|
|
58
|
+
[r, s, z, N, e]
|
|
59
|
+
);
|
|
60
|
+
return B({
|
|
61
|
+
render: O ?? M,
|
|
62
|
+
ref: w,
|
|
32
63
|
props: {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
...
|
|
36
|
-
...
|
|
37
|
-
...p
|
|
64
|
+
className: D,
|
|
65
|
+
...A,
|
|
66
|
+
...I,
|
|
67
|
+
...j
|
|
38
68
|
},
|
|
39
69
|
state: {
|
|
40
|
-
isOver:
|
|
41
|
-
|
|
70
|
+
isOver: k,
|
|
71
|
+
value: r,
|
|
72
|
+
onChange: o,
|
|
73
|
+
id: d
|
|
42
74
|
}
|
|
43
75
|
});
|
|
44
|
-
};
|
|
76
|
+
}, L = W(Q);
|
|
45
77
|
export {
|
|
46
|
-
|
|
78
|
+
L as Droppable
|
|
47
79
|
};
|
|
48
80
|
//# sourceMappingURL=droppable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"droppable.js","sources":["../../../src/components/DragDrop/droppable.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDroppable } from \"./hooks\";\nimport { clsx, useCls } from \"../utils\";\nimport { ArrowsOutCardinalIcon } from \"@bioturing/assets\";\nimport { useRender } from \"@base-ui-components/react/use-render\";\nimport type { Data, DragDropDroppableProps } from \"./types\";\n\n/**\n * A drop zone component that can receive draggable items\n * Styled similarly to the Upload component's droppable area\n */\
|
|
1
|
+
{"version":3,"file":"droppable.js","sources":["../../../src/components/DragDrop/droppable.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useCallback, useMemo, memo } from \"react\";\nimport { useDroppable } from \"./hooks\";\nimport { clsx, useCls } from \"../utils\";\nimport { ArrowsOutCardinalIcon } from \"@bioturing/assets\";\nimport { useRender } from \"@base-ui-components/react/use-render\";\nimport type { Data, DragDropDroppableProps, DraggableInfo } from \"./types\";\nimport { Value } from \"./value\";\nimport { uniqWith, isEqual } from \"es-toolkit\";\n\n/**\n * A drop zone component that can receive draggable items\n * Styled similarly to the Upload component's droppable area\n */\nconst DroppableInner = <T extends Data = Data, M extends boolean = false>({\n id,\n children,\n className,\n disabled = false,\n placeholder = \"Drop items here\",\n icon = <ArrowsOutCardinalIcon size={24} />,\n render,\n onDrop,\n validate,\n multiple,\n value,\n onChange,\n renderValueLabel,\n renderValueIcon,\n ...rest\n}: DragDropDroppableProps<T, M>) => {\n const cls = useCls();\n const handleOnDrop = useCallback(\n (item: DraggableInfo<T>) => {\n if (onDrop) {\n onDrop(item);\n }\n if (onChange) {\n if (multiple) {\n (onChange as (value: T[]) => void)(\n uniqWith([...(value as T[]), item.data], isEqual)\n );\n } else {\n (onChange as (value: T) => void)(item.data);\n }\n }\n },\n [onDrop, onChange, multiple, value]\n );\n const { isOver, setNodeRef, attributes, listeners } = useDroppable({\n id,\n disabled,\n onDrop: handleOnDrop,\n validate,\n });\n\n // memoize value props to avoid re-renders\n const valueProps = useMemo(\n () => ({ value, onChange, multiple, renderValueLabel, renderValueIcon }),\n [value, onChange, multiple, renderValueLabel, renderValueIcon]\n );\n\n // memoize dropzone content\n const dropzoneContent = useMemo(\n () =>\n children || (\n <div className={cls(\"drop-zone-content\")}>\n <div className={cls(\"drop-zone-icon\")}>{icon}</div>\n <div className={cls(\"drop-zone-text\")}>{placeholder}</div>\n </div>\n ),\n [children, cls, icon, placeholder]\n );\n\n // memoize default render tree\n const defaultRender = useCallback<\n (props: Record<string, unknown>) => React.ReactElement\n >(\n ({ className, ...props }) =>\n (!multiple && value) || (multiple && (value as T[]).length) ? (\n <Value<T, M>\n {...valueProps}\n className={className as string}\n {...props}\n />\n ) : (\n <div className={clsx(cls(\"drop-zone\"), className as string)} {...props}>\n {dropzoneContent}\n </div>\n ),\n [value, multiple, valueProps, dropzoneContent, cls]\n );\n\n const renderedElement = useRender({\n render: render ?? defaultRender,\n ref: setNodeRef,\n props: {\n className: className,\n ...attributes,\n ...listeners,\n ...rest,\n },\n state: {\n isOver,\n value,\n onChange: onChange as (value: M extends true ? T[] : T) => void,\n id,\n },\n });\n\n return renderedElement;\n};\n\nexport const Droppable = memo(DroppableInner) as typeof DroppableInner;\n"],"names":["DroppableInner","id","children","className","disabled","placeholder","icon","jsx","ArrowsOutCardinalIcon","render","onDrop","validate","multiple","value","onChange","renderValueLabel","renderValueIcon","rest","cls","useCls","handleOnDrop","useCallback","item","uniqWith","isEqual","isOver","setNodeRef","attributes","listeners","useDroppable","valueProps","useMemo","dropzoneContent","jsxs","defaultRender","props","Value","clsx","useRender","Droppable","memo"],"mappings":";;;;;;;;;;AAeA,MAAMA,IAAiB,CAAmD;AAAA,EACxE,IAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,MAAAC,IAAO,gBAAAC,EAACC,GAAsB,EAAA,MAAM,GAAI,CAAA;AAAA,EACxC,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,GAAGC;AACL,MAAoC;AAClC,QAAMC,IAAMC,EAAO,GACbC,IAAeC;AAAA,IACnB,CAACC,MAA2B;AAC1B,MAAIZ,KACFA,EAAOY,CAAI,GAETR,KAECA;AAAA,QADCF,IAEAW,EAAS,CAAC,GAAIV,GAAeS,EAAK,IAAI,GAAGE,CAAO,IAGjBF,EAAK;AAAA,MAFtC;AAAA,IAKN;AAAA,IACA,CAACZ,GAAQI,GAAUF,GAAUC,CAAK;AAAA,EACpC,GACM,EAAE,QAAAY,GAAQ,YAAAC,GAAY,YAAAC,GAAY,WAAAC,EAAA,IAAcC,EAAa;AAAA,IACjE,IAAA5B;AAAA,IACA,UAAAG;AAAA,IACA,QAAQgB;AAAA,IACR,UAAAT;AAAA,EAAA,CACD,GAGKmB,IAAaC;AAAA,IACjB,OAAO,EAAE,OAAAlB,GAAO,UAAAC,GAAU,UAAAF,GAAU,kBAAAG,GAAkB,iBAAAC,EAAgB;AAAA,IACtE,CAACH,GAAOC,GAAUF,GAAUG,GAAkBC,CAAe;AAAA,EAC/D,GAGMgB,IAAkBD;AAAA,IACtB,MACE7B,KACE,gBAAA+B,EAAC,SAAI,WAAWf,EAAI,mBAAmB,GACrC,UAAA;AAAA,MAAA,gBAAAX,EAAC,OAAI,EAAA,WAAWW,EAAI,gBAAgB,GAAI,UAAKZ,GAAA;AAAA,wBAC5C,OAAI,EAAA,WAAWY,EAAI,gBAAgB,GAAI,UAAYb,EAAA,CAAA;AAAA,IAAA,GACtD;AAAA,IAEJ,CAACH,GAAUgB,GAAKZ,GAAMD,CAAW;AAAA,EACnC,GAGM6B,IAAgBb;AAAA,IAGpB,CAAC,EAAE,WAAAlB,GAAW,GAAGgC,EACd,MAAA,CAACvB,KAAYC,KAAWD,KAAaC,EAAc,SAClD,gBAAAN;AAAA,MAAC6B;AAAA,MAAA;AAAA,QACE,GAAGN;AAAA,QACJ,WAAW3B;AAAAA,QACV,GAAGgC;AAAA,MAAA;AAAA,IAGN,IAAA,gBAAA5B,EAAC,OAAI,EAAA,WAAW8B,EAAKnB,EAAI,WAAW,GAAGf,CAAmB,GAAI,GAAGgC,GAC9D,UACHH,EAAA,CAAA;AAAA,IAEJ,CAACnB,GAAOD,GAAUkB,GAAYE,GAAiBd,CAAG;AAAA,EACpD;AAmBO,SAjBiBoB,EAAU;AAAA,IAChC,QAAQ7B,KAAUyB;AAAA,IAClB,KAAKR;AAAA,IACL,OAAO;AAAA,MACL,WAAAvB;AAAA,MACA,GAAGwB;AAAA,MACH,GAAGC;AAAA,MACH,GAAGX;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,QAAAQ;AAAA,MACA,OAAAZ;AAAA,MACA,UAAAC;AAAA,MACA,IAAAb;AAAA,IAAA;AAAA,EACF,CACD;AAGH,GAEasC,IAAYC,EAAKxC,CAAc;"}
|
|
@@ -1,49 +1,55 @@
|
|
|
1
|
-
import { useState as
|
|
2
|
-
import { useDragDropContext as
|
|
3
|
-
function
|
|
1
|
+
import { useState as R, useRef as N, useCallback as u, useEffect as A } from "react";
|
|
2
|
+
import { useDragDropContext as z } from "./context.js";
|
|
3
|
+
function k({
|
|
4
4
|
id: c,
|
|
5
|
-
data:
|
|
5
|
+
data: r,
|
|
6
6
|
disabled: n = !1,
|
|
7
|
-
onDragStart:
|
|
7
|
+
onDragStart: y,
|
|
8
8
|
onDragEnd: E
|
|
9
9
|
}) {
|
|
10
|
-
const [g, i] =
|
|
10
|
+
const [g, i] = R(!1), x = N(null), e = N(null), I = u((a) => {
|
|
11
11
|
x.current = a;
|
|
12
12
|
}, []), {
|
|
13
13
|
setActive: o,
|
|
14
14
|
onDragStart: m,
|
|
15
15
|
onDragEnd: v,
|
|
16
16
|
setIsDragging: p
|
|
17
|
-
} =
|
|
17
|
+
} = z(), d = y || m, l = E || v, S = u(
|
|
18
18
|
(a) => {
|
|
19
|
-
var D,
|
|
19
|
+
var D, O, T, j;
|
|
20
20
|
if (n) return;
|
|
21
21
|
i(!0), p(!0);
|
|
22
|
-
const
|
|
23
|
-
o(
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const f = { data: r, id: c };
|
|
23
|
+
o(f), d && d({ active: f });
|
|
24
|
+
let t;
|
|
25
|
+
try {
|
|
26
|
+
t = JSON.stringify({ id: c, data: r });
|
|
27
|
+
} catch (h) {
|
|
28
|
+
console.error("Error serializing data:", h);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
(D = a.dataTransfer) == null || D.setData("application/json", t), (O = a.dataTransfer) == null || O.setData("text/plain", t);
|
|
26
32
|
const s = x.current;
|
|
27
33
|
if (s) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
a.clientX -
|
|
32
|
-
a.clientY -
|
|
34
|
+
const h = s.getBoundingClientRect();
|
|
35
|
+
e.current = s.cloneNode(!0), e.current.style.maxWidth = "400px", e.current.style.position = "absolute", e.current.style.pointerEvents = "none", e.current.style.top = "-99px", e.current.style.left = "-99px", e.current.style.zIndex = "-1", (T = s.parentElement) == null || T.appendChild(e.current), (j = a.dataTransfer) == null || j.setDragImage(
|
|
36
|
+
e.current,
|
|
37
|
+
a.clientX - h.left,
|
|
38
|
+
a.clientY - h.top
|
|
33
39
|
);
|
|
34
40
|
}
|
|
35
41
|
},
|
|
36
|
-
[c,
|
|
37
|
-
),
|
|
42
|
+
[c, r, n, d, o, p]
|
|
43
|
+
), C = u(
|
|
38
44
|
(a) => {
|
|
39
|
-
var
|
|
40
|
-
n || (i(!1), p(!1), (
|
|
45
|
+
var f;
|
|
46
|
+
n || (i(!1), p(!1), (f = e.current) == null || f.remove(), l && l({ active: { data: r, id: c }, over: null }));
|
|
41
47
|
},
|
|
42
|
-
[c,
|
|
48
|
+
[c, r, n, l, p]
|
|
43
49
|
);
|
|
44
50
|
return {
|
|
45
51
|
isDragging: g,
|
|
46
|
-
setNodeRef:
|
|
52
|
+
setNodeRef: I,
|
|
47
53
|
attributes: {
|
|
48
54
|
draggable: !n,
|
|
49
55
|
role: "button",
|
|
@@ -53,49 +59,49 @@ function z({
|
|
|
53
59
|
"data-disabled": n ? !0 : void 0
|
|
54
60
|
},
|
|
55
61
|
listeners: {
|
|
56
|
-
onDragStart:
|
|
57
|
-
onDragEnd:
|
|
62
|
+
onDragStart: S,
|
|
63
|
+
onDragEnd: C
|
|
58
64
|
}
|
|
59
65
|
};
|
|
60
66
|
}
|
|
61
67
|
function B({
|
|
62
68
|
id: c,
|
|
63
|
-
disabled:
|
|
69
|
+
disabled: r = !1,
|
|
64
70
|
validate: n = () => !0,
|
|
65
|
-
onDrop:
|
|
71
|
+
onDrop: y
|
|
66
72
|
}) {
|
|
67
|
-
const [E, g] =
|
|
68
|
-
|
|
73
|
+
const [E, g] = R(!1), [i, x] = R(void 0), e = N(null), I = u((t) => {
|
|
74
|
+
e.current = t;
|
|
69
75
|
}, []), {
|
|
70
76
|
active: o,
|
|
71
77
|
setActive: m,
|
|
72
78
|
onDragEnd: v,
|
|
73
79
|
onDrop: p,
|
|
74
80
|
isDragging: d
|
|
75
|
-
} =
|
|
76
|
-
|
|
81
|
+
} = z(), l = y || p;
|
|
82
|
+
A(() => {
|
|
77
83
|
o && n && x(n(o));
|
|
78
84
|
}, [o, n]);
|
|
79
|
-
const
|
|
80
|
-
(
|
|
81
|
-
|
|
85
|
+
const S = u(
|
|
86
|
+
(t) => {
|
|
87
|
+
r || (t.preventDefault(), g(!0));
|
|
82
88
|
},
|
|
83
|
-
[
|
|
84
|
-
),
|
|
85
|
-
(
|
|
86
|
-
|
|
89
|
+
[r]
|
|
90
|
+
), C = u(
|
|
91
|
+
(t) => {
|
|
92
|
+
r || (t.preventDefault(), t.dataTransfer.dropEffect = "move");
|
|
87
93
|
},
|
|
88
|
-
[
|
|
94
|
+
[r]
|
|
89
95
|
), a = u(
|
|
90
|
-
(
|
|
91
|
-
|
|
96
|
+
(t) => {
|
|
97
|
+
r || t.currentTarget === t.target && g(!1);
|
|
92
98
|
},
|
|
93
|
-
[
|
|
94
|
-
),
|
|
95
|
-
(
|
|
96
|
-
if (!
|
|
99
|
+
[r]
|
|
100
|
+
), f = u(
|
|
101
|
+
(t) => {
|
|
102
|
+
if (!r && (t.preventDefault(), !!i))
|
|
97
103
|
try {
|
|
98
|
-
const s =
|
|
104
|
+
const s = t.dataTransfer.getData("application/json");
|
|
99
105
|
let D;
|
|
100
106
|
if (s)
|
|
101
107
|
D = JSON.parse(s);
|
|
@@ -103,7 +109,7 @@ function B({
|
|
|
103
109
|
D = o;
|
|
104
110
|
else
|
|
105
111
|
return;
|
|
106
|
-
|
|
112
|
+
l && l(D), v && o && v({
|
|
107
113
|
active: D,
|
|
108
114
|
over: { id: c }
|
|
109
115
|
}), g(!1), m(null);
|
|
@@ -111,29 +117,29 @@ function B({
|
|
|
111
117
|
console.error("Error processing drop:", s);
|
|
112
118
|
}
|
|
113
119
|
},
|
|
114
|
-
[
|
|
120
|
+
[r, c, o, l, v, m, i]
|
|
115
121
|
);
|
|
116
122
|
return {
|
|
117
123
|
isOver: E,
|
|
118
|
-
setNodeRef:
|
|
124
|
+
setNodeRef: I,
|
|
119
125
|
attributes: {
|
|
120
126
|
"data-droppable": !0,
|
|
121
127
|
"data-over": E ? !0 : void 0,
|
|
122
|
-
"data-disabled":
|
|
128
|
+
"data-disabled": r ? !0 : void 0,
|
|
123
129
|
"data-dragging": d ? !0 : void 0,
|
|
124
|
-
"data-valid": i
|
|
130
|
+
"data-valid": i ? !0 : void 0
|
|
125
131
|
},
|
|
126
132
|
valid: i,
|
|
127
133
|
listeners: {
|
|
128
|
-
onDragEnter:
|
|
129
|
-
onDragOver:
|
|
134
|
+
onDragEnter: S,
|
|
135
|
+
onDragOver: C,
|
|
130
136
|
onDragLeave: a,
|
|
131
|
-
onDrop:
|
|
137
|
+
onDrop: f
|
|
132
138
|
}
|
|
133
139
|
};
|
|
134
140
|
}
|
|
135
141
|
export {
|
|
136
|
-
|
|
142
|
+
k as useDraggable,
|
|
137
143
|
B as useDroppable
|
|
138
144
|
};
|
|
139
145
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../src/components/DragDrop/hooks.ts"],"sourcesContent":["import { useCallback, useRef, useState, useEffect } from \"react\";\n\nimport {\n DraggableInfo,\n type Data,\n type UseDraggableProps,\n type UseDroppableProps,\n} from \"./types\";\nimport { useDragDropContext } from \"./context\";\n\n/**\n * Hook for making an element draggable using HTML5 drag and drop API\n */\nexport function useDraggable<T extends Data = Data>({\n id,\n data,\n disabled = false,\n onDragStart: onDragStartProp,\n onDragEnd: onDragEndProp,\n}: UseDraggableProps<T>) {\n const [isDragging, setIsDragging] = useState(false);\n const nodeRef = useRef<HTMLElement | null>(null);\n const thumbnailNodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n setActive,\n onDragStart: onDragStartContext,\n onDragEnd: onDragEndContext,\n setIsDragging: setIsDraggingContext,\n } = useDragDropContext();\n\n const onDragStart = onDragStartProp || onDragStartContext;\n const onDragEnd = onDragEndProp || onDragEndContext;\n\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(true);\n setIsDraggingContext(true);\n\n // Update the active item in context\n const dragItem = { data, id };\n setActive(dragItem);\n\n // Call the onDragStart callback if available\n if (onDragStart) {\n onDragStart({ active: dragItem });\n }\n\n // Set data transfer\n const dataPayload = JSON.stringify({ id, data });\n e.dataTransfer?.setData(\"application/json\", dataPayload);\n\n // For Firefox compatibility\n e.dataTransfer?.setData(\"text/plain\", dataPayload);\n\n // Set drag image (optional)\n const node = nodeRef.current;\n if (node) {\n const nodeRect = node.getBoundingClientRect();\n\n thumbnailNodeRef.current = node.cloneNode(true) as HTMLElement;\n thumbnailNodeRef.current.style.maxWidth = \"400px\";\n thumbnailNodeRef.current.style.position = \"absolute\";\n thumbnailNodeRef.current.style.pointerEvents = \"none\";\n thumbnailNodeRef.current.style.top = \"-99px\";\n thumbnailNodeRef.current.style.left = \"-99px\";\n thumbnailNodeRef.current.style.zIndex = \"-1\";\n\n node.parentElement?.appendChild(thumbnailNodeRef.current);\n\n // Use the node itself as the drag image\n e.dataTransfer?.setDragImage(\n thumbnailNodeRef.current,\n e.clientX - nodeRect.left,\n e.clientY - nodeRect.top\n );\n }\n },\n [id, data, disabled, onDragStart, setActive, setIsDraggingContext]\n );\n\n const handleDragEnd = useCallback(\n (_e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(false);\n setIsDraggingContext(false);\n thumbnailNodeRef.current?.remove();\n\n if (onDragEnd) {\n onDragEnd({ active: { data, id }, over: null });\n }\n },\n [id, data, disabled, onDragEnd, setIsDraggingContext]\n );\n\n return {\n isDragging,\n setNodeRef,\n attributes: {\n draggable: !disabled,\n role: \"button\",\n \"aria-pressed\": isDragging,\n tabIndex: disabled ? -1 : 0,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n },\n listeners: {\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n },\n };\n}\n\n/**\n * Hook for making an element a drop target using HTML5 drag and drop API\n */\nexport function useDroppable<T extends Data = Data>({\n id,\n disabled = false,\n validate = () => true,\n onDrop: onDropProp,\n}: UseDroppableProps<T>) {\n const [isOver, setIsOver] = useState(false);\n const [valid, setValid] = useState(undefined);\n const nodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n active,\n setActive,\n onDragEnd,\n onDrop: onDropContext,\n isDragging,\n } = useDragDropContext<T>();\n\n const onDrop = onDropProp || onDropContext;\n\n useEffect(() => {\n if (active && validate) {\n setValid(validate(active));\n }\n }, [active, validate]);\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsOver(true);\n },\n [disabled]\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault(); // Necessary to allow dropping\n e.dataTransfer.dropEffect = \"move\";\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n // Only set isOver to false if we're leaving this element (not a child)\n if (e.currentTarget === e.target) {\n setIsOver(false);\n }\n },\n [disabled]\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!valid) return;\n\n try {\n // Try to get data from dataTransfer\n const jsonData = e.dataTransfer.getData(\"application/json\");\n let draggedItem: DraggableInfo<T>;\n\n if (jsonData) {\n draggedItem = JSON.parse(jsonData);\n } else if (active) {\n // Fall back to active item from context if dataTransfer is not available\n draggedItem = active;\n } else {\n return; // No item to drop\n }\n\n // Call the component's onDrop handler if provided\n if (onDrop) {\n onDrop(draggedItem);\n }\n\n // Call the onDragEnd callback from context if available\n if (onDragEnd && active) {\n onDragEnd({\n active: draggedItem,\n over: { id },\n });\n }\n\n setIsOver(false);\n\n // Reset the active item in context\n setActive(null);\n } catch (error) {\n console.error(\"Error processing drop:\", error);\n }\n },\n [disabled, id, active, onDrop, onDragEnd, setActive, valid]\n );\n\n return {\n isOver,\n setNodeRef,\n attributes: {\n \"data-droppable\": true,\n \"data-over\": isOver ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-valid\": valid === true ? true : undefined,\n },\n valid,\n listeners: {\n onDragEnter: handleDragEnter,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n },\n };\n}\n"],"names":["useDraggable","id","data","disabled","onDragStartProp","onDragEndProp","isDragging","setIsDragging","useState","nodeRef","useRef","thumbnailNodeRef","setNodeRef","useCallback","node","setActive","onDragStartContext","onDragEndContext","setIsDraggingContext","useDragDropContext","onDragStart","onDragEnd","handleDragStart","e","dragItem","dataPayload","_a","_b","nodeRect","_c","_d","handleDragEnd","_e","useDroppable","validate","onDropProp","isOver","setIsOver","valid","setValid","active","onDropContext","onDrop","useEffect","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","jsonData","draggedItem","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../src/components/DragDrop/hooks.ts"],"sourcesContent":["import { useCallback, useRef, useState, useEffect } from \"react\";\n\nimport {\n DraggableInfo,\n type Data,\n type UseDraggableProps,\n type UseDroppableProps,\n} from \"./types\";\nimport { useDragDropContext } from \"./context\";\n\n/**\n * Hook for making an element draggable using HTML5 drag and drop API\n */\nexport function useDraggable<T extends Data = Data>({\n id,\n data,\n disabled = false,\n onDragStart: onDragStartProp,\n onDragEnd: onDragEndProp,\n}: UseDraggableProps<T>) {\n const [isDragging, setIsDragging] = useState(false);\n const nodeRef = useRef<HTMLElement | null>(null);\n const thumbnailNodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n setActive,\n onDragStart: onDragStartContext,\n onDragEnd: onDragEndContext,\n setIsDragging: setIsDraggingContext,\n } = useDragDropContext();\n\n const onDragStart = onDragStartProp || onDragStartContext;\n const onDragEnd = onDragEndProp || onDragEndContext;\n\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(true);\n setIsDraggingContext(true);\n\n // Update the active item in context\n const dragItem = { data, id };\n setActive(dragItem);\n\n // Call the onDragStart callback if available\n if (onDragStart) {\n onDragStart({ active: dragItem });\n }\n\n // Set data transfer\n let dataPayload: string;\n try {\n dataPayload = JSON.stringify({ id, data });\n } catch (error) {\n console.error(\"Error serializing data:\", error);\n return;\n }\n e.dataTransfer?.setData(\"application/json\", dataPayload);\n\n // For Firefox compatibility\n e.dataTransfer?.setData(\"text/plain\", dataPayload);\n\n // Set drag image (optional)\n const node = nodeRef.current;\n if (node) {\n const nodeRect = node.getBoundingClientRect();\n\n thumbnailNodeRef.current = node.cloneNode(true) as HTMLElement;\n thumbnailNodeRef.current.style.maxWidth = \"400px\";\n thumbnailNodeRef.current.style.position = \"absolute\";\n thumbnailNodeRef.current.style.pointerEvents = \"none\";\n thumbnailNodeRef.current.style.top = \"-99px\";\n thumbnailNodeRef.current.style.left = \"-99px\";\n thumbnailNodeRef.current.style.zIndex = \"-1\";\n\n node.parentElement?.appendChild(thumbnailNodeRef.current);\n\n // Use the node itself as the drag image\n e.dataTransfer?.setDragImage(\n thumbnailNodeRef.current,\n e.clientX - nodeRect.left,\n e.clientY - nodeRect.top\n );\n }\n },\n [id, data, disabled, onDragStart, setActive, setIsDraggingContext]\n );\n\n const handleDragEnd = useCallback(\n (_e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(false);\n setIsDraggingContext(false);\n thumbnailNodeRef.current?.remove();\n\n if (onDragEnd) {\n onDragEnd({ active: { data, id }, over: null });\n }\n },\n [id, data, disabled, onDragEnd, setIsDraggingContext]\n );\n\n return {\n isDragging,\n setNodeRef,\n attributes: {\n draggable: !disabled,\n role: \"button\",\n \"aria-pressed\": isDragging,\n tabIndex: disabled ? -1 : 0,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n },\n listeners: {\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n },\n };\n}\n\n/**\n * Hook for making an element a drop target using HTML5 drag and drop API\n */\nexport function useDroppable<T extends Data = Data>({\n id,\n disabled = false,\n validate = () => true,\n onDrop: onDropProp,\n}: UseDroppableProps<T>) {\n const [isOver, setIsOver] = useState(false);\n const [valid, setValid] = useState(undefined);\n const nodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n active,\n setActive,\n onDragEnd,\n onDrop: onDropContext,\n isDragging,\n } = useDragDropContext<T>();\n\n const onDrop = onDropProp || onDropContext;\n\n useEffect(() => {\n if (active && validate) {\n setValid(validate(active));\n }\n }, [active, validate]);\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsOver(true);\n },\n [disabled]\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault(); // Necessary to allow dropping\n e.dataTransfer.dropEffect = \"move\";\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n // Only set isOver to false if we're leaving this element (not a child)\n if (e.currentTarget === e.target) {\n setIsOver(false);\n }\n },\n [disabled]\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!valid) return;\n\n try {\n // Try to get data from dataTransfer\n const jsonData = e.dataTransfer.getData(\"application/json\");\n let draggedItem: DraggableInfo<T>;\n\n if (jsonData) {\n draggedItem = JSON.parse(jsonData);\n } else if (active) {\n // Fall back to active item from context if dataTransfer is not available\n draggedItem = active;\n } else {\n return; // No item to drop\n }\n\n // Call the component's onDrop handler if provided\n if (onDrop) {\n onDrop(draggedItem);\n }\n\n // Call the onDragEnd callback from context if available\n if (onDragEnd && active) {\n onDragEnd({\n active: draggedItem,\n over: { id },\n });\n }\n\n setIsOver(false);\n\n // Reset the active item in context\n setActive(null);\n } catch (error) {\n console.error(\"Error processing drop:\", error);\n }\n },\n [disabled, id, active, onDrop, onDragEnd, setActive, valid]\n );\n\n return {\n isOver,\n setNodeRef,\n attributes: {\n \"data-droppable\": true,\n \"data-over\": isOver ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-valid\": valid ? true : undefined,\n },\n valid,\n listeners: {\n onDragEnter: handleDragEnter,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n },\n };\n}\n"],"names":["useDraggable","id","data","disabled","onDragStartProp","onDragEndProp","isDragging","setIsDragging","useState","nodeRef","useRef","thumbnailNodeRef","setNodeRef","useCallback","node","setActive","onDragStartContext","onDragEndContext","setIsDraggingContext","useDragDropContext","onDragStart","onDragEnd","handleDragStart","e","dragItem","dataPayload","error","_a","_b","nodeRect","_c","_d","handleDragEnd","_e","useDroppable","validate","onDropProp","isOver","setIsOver","valid","setValid","active","onDropContext","onDrop","useEffect","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","jsonData","draggedItem"],"mappings":"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"}
|
|
@@ -3,32 +3,33 @@ import { jsx as r } from "react/jsx-runtime";
|
|
|
3
3
|
import { useState as o } from "react";
|
|
4
4
|
import { Draggable as f } from "./draggable.js";
|
|
5
5
|
import { Droppable as u } from "./droppable.js";
|
|
6
|
-
import {
|
|
6
|
+
import { Value as d } from "./value.js";
|
|
7
|
+
import { DragDropContext as v } from "./context.js";
|
|
7
8
|
import './style.css';/* empty css */
|
|
8
|
-
import { useCls as
|
|
9
|
-
import { clsx as
|
|
10
|
-
function
|
|
9
|
+
import { useCls as x } from "../utils/antdUtils.js";
|
|
10
|
+
import { clsx as b } from "../utils/cn.js";
|
|
11
|
+
function S({
|
|
11
12
|
children: t,
|
|
12
13
|
// These callbacks are passed to child components via context
|
|
13
|
-
onDragEnd:
|
|
14
|
-
onDragStart:
|
|
14
|
+
onDragEnd: e,
|
|
15
|
+
onDragStart: n,
|
|
15
16
|
onDrop: a,
|
|
16
|
-
className:
|
|
17
|
+
className: i
|
|
17
18
|
}) {
|
|
18
|
-
const
|
|
19
|
-
active:
|
|
19
|
+
const s = x(), [m, c] = o(null), [g, p] = o(!1), D = {
|
|
20
|
+
active: m,
|
|
20
21
|
setActive: (l) => {
|
|
21
|
-
|
|
22
|
+
c(l);
|
|
22
23
|
},
|
|
23
|
-
isDragging:
|
|
24
|
+
isDragging: g,
|
|
24
25
|
setIsDragging: p,
|
|
25
|
-
onDragStart:
|
|
26
|
-
onDragEnd:
|
|
26
|
+
onDragStart: n,
|
|
27
|
+
onDragEnd: e,
|
|
27
28
|
onDrop: a
|
|
28
29
|
};
|
|
29
|
-
return /* @__PURE__ */ r(
|
|
30
|
+
return /* @__PURE__ */ r(v.Provider, { value: D, children: /* @__PURE__ */ r("div", { className: b(s("drag-container"), i), children: t }) });
|
|
30
31
|
}
|
|
31
|
-
const
|
|
32
|
+
const P = Object.assign(S, {
|
|
32
33
|
/**
|
|
33
34
|
* Item that can be dragged
|
|
34
35
|
*/
|
|
@@ -36,10 +37,14 @@ const O = Object.assign(b, {
|
|
|
36
37
|
/**
|
|
37
38
|
* Zone where items can be dropped
|
|
38
39
|
*/
|
|
39
|
-
Droppable: u
|
|
40
|
+
Droppable: u,
|
|
41
|
+
/**
|
|
42
|
+
* Value component to display the value of the dragged item
|
|
43
|
+
*/
|
|
44
|
+
Value: d
|
|
40
45
|
});
|
|
41
46
|
export {
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
P as DragDrop,
|
|
48
|
+
S as DragDropRoot
|
|
44
49
|
};
|
|
45
50
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/DragDrop/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type DragEndEvent,\n type DragStartEvent,\n type Data as DragData,\n type UniqueIdentifier,\n type DragDropDraggableProps,\n type DragDropDroppableProps,\n type DragDropProps,\n} from \"./types\";\nimport { useState } from \"react\";\nimport { clsx, useCls } from \"../utils\";\nimport { Draggable } from \"./draggable\";\nimport { Droppable } from \"./droppable\";\nimport { DragDropContext } from \"./context\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n/**\n * The root component for the drag and drop functionality\n */\nexport function DragDropRoot<T extends DragData = DragData>({\n children,\n // These callbacks are passed to child components via context\n onDragEnd: _onDragEnd,\n onDragStart: _onDragStart,\n onDrop: _onDrop,\n className,\n}: DragDropProps<T>) {\n const cls = useCls();\n const [active, setActive] = useState<{\n data: T;\n id: UniqueIdentifier;\n } | null>(null);\n\n const [isDragging, setIsDragging] = useState(false);\n\n // These functions are now handled directly in the Item and DropZone components\n\n // Create context value for child components\n const contextValue = {\n active,\n setActive: (item: { data: unknown; id: UniqueIdentifier } | null) => {\n setActive(item as { data: T; id: UniqueIdentifier } | null);\n },\n isDragging,\n setIsDragging,\n onDragStart: _onDragStart,\n onDragEnd: _onDragEnd,\n onDrop: _onDrop,\n };\n\n return (\n <DragDropContext.Provider value={contextValue}>\n <div className={clsx(cls(\"drag-container\"), className)}>{children}</div>\n </DragDropContext.Provider>\n );\n}\n\n/**\n * Drag component with subcomponents\n */\nexport const DragDrop = Object.assign(DragDropRoot, {\n /**\n * Item that can be dragged\n */\n Draggable,\n\n /**\n * Zone where items can be dropped\n */\n Droppable,\n});\n\nexport type {\n DragEndEvent,\n DragStartEvent,\n DragDropDraggableProps,\n DragDropDroppableProps,\n DragData,\n DragDropProps,\n};\n"],"names":["DragDropRoot","children","_onDragEnd","_onDragStart","_onDrop","className","cls","useCls","active","setActive","useState","isDragging","setIsDragging","contextValue","item","DragDropContext","jsx","clsx","DragDrop","Draggable","Droppable"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/DragDrop/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type DragEndEvent,\n type DragStartEvent,\n type Data as DragData,\n type UniqueIdentifier,\n type DragDropDraggableProps,\n type DragDropDroppableProps,\n type DragDropProps,\n} from \"./types\";\nimport { useState } from \"react\";\nimport { clsx, useCls } from \"../utils\";\nimport { Draggable } from \"./draggable\";\nimport { Droppable } from \"./droppable\";\nimport { Value } from \"./value\";\nimport { DragDropContext } from \"./context\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n/**\n * The root component for the drag and drop functionality\n */\nexport function DragDropRoot<T extends DragData = DragData>({\n children,\n // These callbacks are passed to child components via context\n onDragEnd: _onDragEnd,\n onDragStart: _onDragStart,\n onDrop: _onDrop,\n className,\n}: DragDropProps<T>) {\n const cls = useCls();\n const [active, setActive] = useState<{\n data: T;\n id: UniqueIdentifier;\n } | null>(null);\n\n const [isDragging, setIsDragging] = useState(false);\n\n // These functions are now handled directly in the Item and DropZone components\n\n // Create context value for child components\n const contextValue = {\n active,\n setActive: (item: { data: unknown; id: UniqueIdentifier } | null) => {\n setActive(item as { data: T; id: UniqueIdentifier } | null);\n },\n isDragging,\n setIsDragging,\n onDragStart: _onDragStart,\n onDragEnd: _onDragEnd,\n onDrop: _onDrop,\n };\n\n return (\n <DragDropContext.Provider value={contextValue}>\n <div className={clsx(cls(\"drag-container\"), className)}>{children}</div>\n </DragDropContext.Provider>\n );\n}\n\n/**\n * Drag component with subcomponents\n */\nexport const DragDrop = Object.assign(DragDropRoot, {\n /**\n * Item that can be dragged\n */\n Draggable,\n\n /**\n * Zone where items can be dropped\n */\n Droppable,\n\n /**\n * Value component to display the value of the dragged item\n */\n Value,\n});\n\nexport type {\n DragEndEvent,\n DragStartEvent,\n DragDropDraggableProps,\n DragDropDroppableProps,\n DragData,\n DragDropProps,\n};\n"],"names":["DragDropRoot","children","_onDragEnd","_onDragStart","_onDrop","className","cls","useCls","active","setActive","useState","isDragging","setIsDragging","contextValue","item","DragDropContext","jsx","clsx","DragDrop","Draggable","Droppable","Value"],"mappings":";;;;;;;;;;AAwBO,SAASA,EAA4C;AAAA,EAC1D,UAAAC;AAAA;AAAA,EAEA,WAAWC;AAAA,EACX,aAAaC;AAAA,EACb,QAAQC;AAAA,EACR,WAAAC;AACF,GAAqB;AACnB,QAAMC,IAAMC,EAAO,GACb,CAACC,GAAQC,CAAS,IAAIC,EAGlB,IAAI,GAER,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAK,GAK5CG,IAAe;AAAA,IACnB,QAAAL;AAAA,IACA,WAAW,CAACM,MAAyD;AACnE,MAAAL,EAAUK,CAAgD;AAAA,IAC5D;AAAA,IACA,YAAAH;AAAA,IACA,eAAAC;AAAA,IACA,aAAaT;AAAA,IACb,WAAWD;AAAA,IACX,QAAQE;AAAA,EACV;AAEA,2BACGW,EAAgB,UAAhB,EAAyB,OAAOF,GAC/B,UAAC,gBAAAG,EAAA,OAAA,EAAI,WAAWC,EAAKX,EAAI,gBAAgB,GAAGD,CAAS,GAAI,UAAAJ,EAAS,CAAA,GACpE;AAEJ;AAKa,MAAAiB,IAAW,OAAO,OAAOlB,GAAc;AAAA;AAAA;AAAA;AAAA,EAIlD,WAAAmB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAAC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAAC;AACF,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.ds-drag-container{position:relative}.ds-draggable{position:relative;cursor:grab;-webkit-user-select:none;user-select:none;background-color:var(--ds-color-bg-container);border:1px solid var(--ds-color-border);border-radius:var(--ds-border-radius);padding:.5rem;margin-bottom:.5rem;display:flex;max-width:100%;gap:.5rem;transition:background-color .2s,border-color .2s,box-shadow .2s}.ds-draggable[data-dragging]{opacity:.5;box-shadow:0 2px 8px #00000026;z-index:1}.ds-draggable[data-disabled]{cursor:not-allowed;opacity:.5;background-color:var(--ds-color-bg-disabled)}.ds-draggable:hover{border-color:var(--ds-color-primary)}.ds-draggable .ds-draggable-indicator{font-size:1.25rem;color:var(--ds-color-icon)}.ds-drop-zone{position:relative;width:100%;background-color:var(--ds-color-fill-alter);border:1px dashed var(--ds-color-border);border-radius:var(--ds-border-radius);padding:.75rem;display:flex;align-items:center;justify-content:center;transition:border-color .1s,background-color .1s}.ds-drop-zone[data-disabled=true]{cursor:not-allowed;background-color:var(--ds-color-bg-disabled);border-color:var(--ds-color-border)}.ds-drop-zone[data-dropping][data-valid],.ds-drop-zone[data-over][data-valid]{border-color:var(--ds-color-primary);background-color:var(--ds-color-primary-bg)}.ds-drop-zone[data-dragging][data-valid]{border-color:var(--ds-color-primary)}.ds-drop-zone .ds-drop-zone-content{display:flex;align-items:center;justify-content:center;text-align:center;gap:.5rem}.ds-drop-zone .ds-drop-zone-icon{font-size:1.25rem;color:var(--ds-color-icon)}.ds-drop-zone .ds-drop-zone-text{color:var(--ds-color-text-description);font-size:var(--ds-font-size)}
|
|
1
|
+
.ds-drag-container{position:relative}.ds-draggable{position:relative;cursor:grab;-webkit-user-select:none;user-select:none;background-color:var(--ds-color-bg-container);border:1px solid var(--ds-color-border);border-radius:var(--ds-border-radius);padding:.5rem;margin-bottom:.5rem;display:flex;max-width:100%;gap:.5rem;transition:background-color .2s,border-color .2s,box-shadow .2s}.ds-draggable[data-dragging]{opacity:.5;box-shadow:0 2px 8px #00000026;z-index:1}.ds-draggable[data-disabled]{cursor:not-allowed;opacity:.5;background-color:var(--ds-color-bg-disabled)}.ds-draggable:hover{border-color:var(--ds-color-primary)}.ds-draggable .ds-draggable-indicator{font-size:1.25rem;color:var(--ds-color-icon)}.ds-drop-zone{position:relative;width:100%;background-color:var(--ds-color-fill-alter);border:1px dashed var(--ds-color-border);border-radius:var(--ds-border-radius);padding:.75rem;display:flex;align-items:center;justify-content:center;transition:border-color .1s,background-color .1s}.ds-drop-zone[data-disabled=true]{cursor:not-allowed;background-color:var(--ds-color-bg-disabled);border-color:var(--ds-color-border)}.ds-drop-zone[data-dropping][data-valid],.ds-drop-zone[data-over][data-valid]{border-color:var(--ds-color-primary);background-color:var(--ds-color-primary-bg)}.ds-drop-zone[data-dragging][data-valid]{border-color:var(--ds-color-primary)}.ds-drop-zone .ds-drop-zone-content{display:flex;align-items:center;justify-content:center;text-align:center;gap:.5rem}.ds-drop-zone .ds-drop-zone-icon{font-size:1.25rem;color:var(--ds-color-icon)}.ds-drop-zone .ds-drop-zone-text{color:var(--ds-color-text-description);font-size:var(--ds-font-size)}.ds-dropzone-value{padding:.75rem;border-radius:var(--ds-border-radius);border-width:1px;border-style:solid;border-color:var(--ds-color-border)}.ds-dropzone-value[data-dragging][data-valid]{border-color:var(--ds-color-primary);border-style:dashed}.ds-dropzone-value[data-dropping][data-valid],.ds-dropzone-value[data-over][data-valid]{border-color:var(--ds-color-primary);background-color:var(--ds-color-primary-bg)}.ds-dropzone-value-icon{color:var(--ds-color-icon);font-size:1.5rem}.ds-dropzone-value-text{color:var(--ds-color-text-secondary)}.ds-dropzone-value-multiple .ds-tag{max-width:50%;margin:0}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as e, Fragment as u, jsxs as S } from "react/jsx-runtime";
|
|
3
|
+
import { FileIcon as h, XIcon as j } from "@bioturing/assets";
|
|
4
|
+
import { isEqual as w } from "es-toolkit";
|
|
5
|
+
import { memo as E, forwardRef as F, useCallback as c, cloneElement as M } from "react";
|
|
6
|
+
import { Stack as T } from "../Stack/index.js";
|
|
7
|
+
import { Tag as q } from "../Tag/component.js";
|
|
8
|
+
import { useCls as y } from "../utils/antdUtils.js";
|
|
9
|
+
import { Truncate as B } from "../Truncate/component.js";
|
|
10
|
+
import { IconButton as X } from "../IconButton/component.js";
|
|
11
|
+
function A({
|
|
12
|
+
value: o,
|
|
13
|
+
onChange: l,
|
|
14
|
+
multiple: s,
|
|
15
|
+
renderValueLabel: a,
|
|
16
|
+
renderValueIcon: p,
|
|
17
|
+
className: b,
|
|
18
|
+
style: z,
|
|
19
|
+
...I
|
|
20
|
+
}, N) {
|
|
21
|
+
const n = y(), i = c(
|
|
22
|
+
(r) => {
|
|
23
|
+
const t = a(r);
|
|
24
|
+
return typeof t == "string" ? /* @__PURE__ */ e(B, { position: "middle", className: n("dropzone-value-label"), children: t }) : /* @__PURE__ */ e("span", { className: n("dropzone-value-label"), children: t });
|
|
25
|
+
},
|
|
26
|
+
[n, a]
|
|
27
|
+
), m = c(
|
|
28
|
+
(r) => M(p(r) || /* @__PURE__ */ e(h, {}), {
|
|
29
|
+
className: n("dropzone-value-icon")
|
|
30
|
+
}),
|
|
31
|
+
[n, p]
|
|
32
|
+
), d = c(
|
|
33
|
+
(r) => {
|
|
34
|
+
l(
|
|
35
|
+
o.filter((t) => !w(t, r))
|
|
36
|
+
);
|
|
37
|
+
},
|
|
38
|
+
[l, o]
|
|
39
|
+
), k = c(() => /* @__PURE__ */ e(u, { children: (o || []).map((r, t) => {
|
|
40
|
+
const R = i(r);
|
|
41
|
+
return /* @__PURE__ */ e(
|
|
42
|
+
q,
|
|
43
|
+
{
|
|
44
|
+
icon: m(r),
|
|
45
|
+
size: "large",
|
|
46
|
+
closable: !0,
|
|
47
|
+
onClose: () => d(r),
|
|
48
|
+
children: R
|
|
49
|
+
},
|
|
50
|
+
t
|
|
51
|
+
);
|
|
52
|
+
}) }), [i, o, m, d]), f = c(() => {
|
|
53
|
+
l == null || l(null);
|
|
54
|
+
}, [l]), x = c(() => {
|
|
55
|
+
const r = i(o);
|
|
56
|
+
return /* @__PURE__ */ S(u, { children: [
|
|
57
|
+
m(o),
|
|
58
|
+
r,
|
|
59
|
+
/* @__PURE__ */ e(X, { size: "small", onClick: f, children: /* @__PURE__ */ e(j, {}) })
|
|
60
|
+
] });
|
|
61
|
+
}, [o, i, m, f]);
|
|
62
|
+
return /* @__PURE__ */ e(
|
|
63
|
+
T,
|
|
64
|
+
{
|
|
65
|
+
ref: N,
|
|
66
|
+
gap: s ? 4 : 8,
|
|
67
|
+
align: "center",
|
|
68
|
+
wrap: s,
|
|
69
|
+
className: n(
|
|
70
|
+
"dropzone-value",
|
|
71
|
+
s && "dropzone-value-multiple",
|
|
72
|
+
b
|
|
73
|
+
),
|
|
74
|
+
style: z,
|
|
75
|
+
...I,
|
|
76
|
+
children: s ? k() : x()
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
const U = E(F(A));
|
|
81
|
+
export {
|
|
82
|
+
U as Value
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.js","sources":["../../../src/components/DragDrop/value.tsx"],"sourcesContent":["\"use client\";\nimport { FileIcon, XIcon } from \"@bioturing/assets\";\nimport { isEqual } from \"es-toolkit\";\nimport React, {\n cloneElement,\n forwardRef,\n memo,\n useCallback,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n} from \"react\";\nimport { IconButton } from \"../IconButton\";\nimport { Stack } from \"../Stack\";\nimport { Tag } from \"../Tag\";\nimport { Truncate } from \"../Truncate\";\nimport { useCls } from \"../utils\";\nimport { DragDropValueProps, type Data } from \"./types\";\n\nfunction ValueInner<T extends Data, M extends boolean>(\n {\n value,\n onChange,\n multiple,\n renderValueLabel,\n renderValueIcon,\n className,\n style,\n ...rest\n }: DragDropValueProps<T, M> & ComponentPropsWithoutRef<\"div\">,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const cls = useCls();\n\n const renderLabel = useCallback(\n (value: T) => {\n const label = renderValueLabel(value);\n return typeof label === \"string\" ? (\n <Truncate position=\"middle\" className={cls(\"dropzone-value-label\")}>\n {label}\n </Truncate>\n ) : (\n <span className={cls(\"dropzone-value-label\")}>{label}</span>\n );\n },\n [cls, renderValueLabel]\n );\n\n const renderedValueIcon = useCallback(\n (value: T) => {\n return cloneElement(renderValueIcon(value) || <FileIcon />, {\n className: cls(\"dropzone-value-icon\"),\n });\n },\n [cls, renderValueIcon]\n );\n\n const handleResetMultiple = useCallback(\n (singleValue: T) => {\n (onChange as (value: T[]) => void)(\n (value as T[]).filter((v) => !isEqual(v, singleValue))\n );\n },\n [onChange, value]\n );\n\n const renderMultiple = useCallback(() => {\n return (\n <>\n {((value as T[]) || []).map((singleValue, index) => {\n const label = renderLabel(singleValue);\n return (\n <Tag\n key={index}\n icon={renderedValueIcon(singleValue)}\n size=\"large\"\n closable\n onClose={() => handleResetMultiple(singleValue)}\n >\n {label}\n </Tag>\n );\n })}\n </>\n );\n }, [renderLabel, value, renderedValueIcon, handleResetMultiple]);\n\n const handleResetSingle = useCallback(() => {\n onChange?.(null);\n }, [onChange]);\n\n const renderSingle = useCallback(() => {\n const label = renderLabel(value as T);\n return (\n <>\n {renderedValueIcon(value as T)}\n {label}\n <IconButton size=\"small\" onClick={handleResetSingle}>\n <XIcon />\n </IconButton>\n </>\n );\n }, [value, renderLabel, renderedValueIcon, handleResetSingle]);\n\n return (\n <Stack\n ref={ref}\n gap={multiple ? 4 : 8}\n align=\"center\"\n wrap={multiple}\n className={cls(\n \"dropzone-value\",\n multiple && \"dropzone-value-multiple\",\n className\n )}\n style={style}\n {...rest}\n >\n {multiple ? renderMultiple() : renderSingle()}\n </Stack>\n );\n}\n\nexport const Value = memo(forwardRef(ValueInner)) as <\n T extends Data,\n M extends boolean\n>(\n props: DragDropValueProps<T, M> & { ref?: ForwardedRef<HTMLDivElement> }\n) => ReturnType<typeof ValueInner>;\n"],"names":["ValueInner","value","onChange","multiple","renderValueLabel","renderValueIcon","className","style","rest","ref","cls","useCls","renderLabel","useCallback","label","Truncate","jsx","renderedValueIcon","cloneElement","FileIcon","handleResetMultiple","singleValue","v","isEqual","renderMultiple","index","Tag","handleResetSingle","renderSingle","jsxs","Fragment","IconButton","XIcon","Stack","Value","memo","forwardRef"],"mappings":";;;;;;;;;;AAkBA,SAASA,EACP;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAMC,EAAO,GAEbC,IAAcC;AAAA,IAClB,CAACZ,MAAa;AACN,YAAAa,IAAQV,EAAiBH,CAAK;AACpC,aAAO,OAAOa,KAAU,6BACrBC,GAAS,EAAA,UAAS,UAAS,WAAWL,EAAI,sBAAsB,GAC9D,UAAAI,GACH,IAEC,gBAAAE,EAAA,QAAA,EAAK,WAAWN,EAAI,sBAAsB,GAAI,UAAMI,GAAA;AAAA,IAEzD;AAAA,IACA,CAACJ,GAAKN,CAAgB;AAAA,EACxB,GAEMa,IAAoBJ;AAAA,IACxB,CAACZ,MACQiB,EAAab,EAAgBJ,CAAK,KAAK,gBAAAe,EAACG,KAAS,GAAI;AAAA,MAC1D,WAAWT,EAAI,qBAAqB;AAAA,IAAA,CACrC;AAAA,IAEH,CAACA,GAAKL,CAAe;AAAA,EACvB,GAEMe,IAAsBP;AAAA,IAC1B,CAACQ,MAAmB;AACjB,MAAAnB;AAAA,QACED,EAAc,OAAO,CAACqB,MAAM,CAACC,EAAQD,GAAGD,CAAW,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAACnB,GAAUD,CAAK;AAAA,EAClB,GAEMuB,IAAiBX,EAAY,6BAG1B,WAAiBZ,KAAA,CAAA,GAAI,IAAI,CAACoB,GAAaI,MAAU;AAC5C,UAAAX,IAAQF,EAAYS,CAAW;AAEnC,WAAA,gBAAAL;AAAA,MAACU;AAAA,MAAA;AAAA,QAEC,MAAMT,EAAkBI,CAAW;AAAA,QACnC,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,SAAS,MAAMD,EAAoBC,CAAW;AAAA,QAE7C,UAAAP;AAAA,MAAA;AAAA,MANIW;AAAA,IAOP;AAAA,EAEH,CAAA,GACH,GAED,CAACb,GAAaX,GAAOgB,GAAmBG,CAAmB,CAAC,GAEzDO,IAAoBd,EAAY,MAAM;AAC1C,IAAAX,KAAA,QAAAA,EAAW;AAAA,EAAI,GACd,CAACA,CAAQ,CAAC,GAEP0B,IAAef,EAAY,MAAM;AAC/B,UAAAC,IAAQF,EAAYX,CAAU;AACpC,WAEK,gBAAA4B,EAAAC,GAAA,EAAA,UAAA;AAAA,MAAAb,EAAkBhB,CAAU;AAAA,MAC5Ba;AAAA,MACD,gBAAAE,EAACe,KAAW,MAAK,SAAQ,SAASJ,GAChC,UAAA,gBAAAX,EAACgB,IAAM,CAAA,EACT,CAAA;AAAA,IAAA,GACF;AAAA,KAED,CAAC/B,GAAOW,GAAaK,GAAmBU,CAAiB,CAAC;AAG3D,SAAA,gBAAAX;AAAA,IAACiB;AAAA,IAAA;AAAA,MACC,KAAAxB;AAAA,MACA,KAAKN,IAAW,IAAI;AAAA,MACpB,OAAM;AAAA,MACN,MAAMA;AAAA,MACN,WAAWO;AAAA,QACT;AAAA,QACAP,KAAY;AAAA,QACZG;AAAA,MACF;AAAA,MACA,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEH,UAAAL,IAAWqB,EAAe,IAAII,EAAa;AAAA,IAAA;AAAA,EAC9C;AAEJ;AAEO,MAAMM,IAAQC,EAAKC,EAAWpC,CAAU,CAAC;"}
|