@bioturing/components 0.17.1 → 0.18.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.
@@ -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 */\nexport const Droppable = <T extends Data = Data>({\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 ...rest\n}: DragDropDroppableProps<T>) => {\n const cls = useCls();\n const { isOver, setNodeRef, attributes, listeners, valid } = useDroppable({\n id,\n disabled,\n onDrop,\n validate,\n });\n\n // Default content when no children are provided\n const defaultContent = (\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\n const renderedElement = useRender({\n render: render ? (\n render\n ) : (\n <div className={clsx(cls(\"drop-zone\"), className)} />\n ),\n ref: setNodeRef,\n props: {\n children: children || defaultContent,\n className: className,\n ...attributes,\n ...listeners,\n ...rest,\n },\n state: {\n isOver,\n id,\n },\n });\n\n return renderedElement;\n};\n"],"names":["Droppable","id","children","className","disabled","placeholder","icon","jsx","ArrowsOutCardinalIcon","render","onDrop","validate","rest","cls","useCls","isOver","setNodeRef","attributes","listeners","useDroppable","defaultContent","jsxs","useRender","clsx"],"mappings":";;;;;;;AAYO,MAAMA,IAAY,CAAwB;AAAA,EAC/C,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,GAAGC;AACL,MAAiC;AAC/B,QAAMC,IAAMC,EAAO,GACb,EAAE,QAAAC,GAAQ,YAAAC,GAAY,YAAAC,GAAY,WAAAC,EAAiB,IAAIC,EAAa;AAAA,IACxE,IAAAlB;AAAA,IACA,UAAAG;AAAA,IACA,QAAAM;AAAA,IACA,UAAAC;AAAA,EAAA,CACD,GAGKS,IACH,gBAAAC,EAAA,OAAA,EAAI,WAAWR,EAAI,mBAAmB,GACrC,UAAA;AAAA,IAAA,gBAAAN,EAAC,OAAI,EAAA,WAAWM,EAAI,gBAAgB,GAAI,UAAKP,GAAA;AAAA,sBAC5C,OAAI,EAAA,WAAWO,EAAI,gBAAgB,GAAI,UAAYR,EAAA,CAAA;AAAA,EAAA,GACtD;AAuBK,SApBiBiB,EAAU;AAAA,IAChC,QAAQb,KAGL,gBAAAF,EAAA,OAAA,EAAI,WAAWgB,EAAKV,EAAI,WAAW,GAAGV,CAAS,EAAG,CAAA;AAAA,IAErD,KAAKa;AAAA,IACL,OAAO;AAAA,MACL,UAAUd,KAAYkB;AAAA,MACtB,WAAAjB;AAAA,MACA,GAAGc;AAAA,MACH,GAAGC;AAAA,MACH,GAAGN;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,QAAAG;AAAA,MACA,IAAAd;AAAA,IAAA;AAAA,EACF,CACD;AAGH;"}
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 C, useRef as R, useCallback as u, useEffect as J } from "react";
2
- import { useDragDropContext as A } from "./context.js";
3
- function z({
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: t,
5
+ data: r,
6
6
  disabled: n = !1,
7
- onDragStart: h,
7
+ onDragStart: y,
8
8
  onDragEnd: E
9
9
  }) {
10
- const [g, i] = C(!1), x = R(null), r = R(null), y = u((a) => {
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
- } = A(), d = h || m, f = E || v, I = u(
17
+ } = z(), d = y || m, l = E || v, S = u(
18
18
  (a) => {
19
- var D, N, O, T;
19
+ var D, O, T, j;
20
20
  if (n) return;
21
21
  i(!0), p(!0);
22
- const l = { data: t, id: c };
23
- o(l), d && d({ active: l });
24
- const e = JSON.stringify({ id: c, data: t });
25
- (D = a.dataTransfer) == null || D.setData("application/json", e), (N = a.dataTransfer) == null || N.setData("text/plain", e);
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 j = s.getBoundingClientRect();
29
- r.current = s.cloneNode(!0), r.current.style.maxWidth = "400px", r.current.style.position = "absolute", r.current.style.pointerEvents = "none", r.current.style.top = "-99px", r.current.style.left = "-99px", r.current.style.zIndex = "-1", (O = s.parentElement) == null || O.appendChild(r.current), (T = a.dataTransfer) == null || T.setDragImage(
30
- r.current,
31
- a.clientX - j.left,
32
- a.clientY - j.top
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, t, n, d, o, p]
37
- ), S = u(
42
+ [c, r, n, d, o, p]
43
+ ), C = u(
38
44
  (a) => {
39
- var l;
40
- n || (i(!1), p(!1), (l = r.current) == null || l.remove(), f && f({ active: { data: t, id: c }, over: null }));
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, t, n, f, p]
48
+ [c, r, n, l, p]
43
49
  );
44
50
  return {
45
51
  isDragging: g,
46
- setNodeRef: y,
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: I,
57
- onDragEnd: S
62
+ onDragStart: S,
63
+ onDragEnd: C
58
64
  }
59
65
  };
60
66
  }
61
67
  function B({
62
68
  id: c,
63
- disabled: t = !1,
69
+ disabled: r = !1,
64
70
  validate: n = () => !0,
65
- onDrop: h
71
+ onDrop: y
66
72
  }) {
67
- const [E, g] = C(!1), [i, x] = C(void 0), r = R(null), y = u((e) => {
68
- r.current = e;
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
- } = A(), f = h || p;
76
- J(() => {
81
+ } = z(), l = y || p;
82
+ A(() => {
77
83
  o && n && x(n(o));
78
84
  }, [o, n]);
79
- const I = u(
80
- (e) => {
81
- t || (e.preventDefault(), g(!0));
85
+ const S = u(
86
+ (t) => {
87
+ r || (t.preventDefault(), g(!0));
82
88
  },
83
- [t]
84
- ), S = u(
85
- (e) => {
86
- t || (e.preventDefault(), e.dataTransfer.dropEffect = "move");
89
+ [r]
90
+ ), C = u(
91
+ (t) => {
92
+ r || (t.preventDefault(), t.dataTransfer.dropEffect = "move");
87
93
  },
88
- [t]
94
+ [r]
89
95
  ), a = u(
90
- (e) => {
91
- t || e.currentTarget === e.target && g(!1);
96
+ (t) => {
97
+ r || t.currentTarget === t.target && g(!1);
92
98
  },
93
- [t]
94
- ), l = u(
95
- (e) => {
96
- if (!t && (e.preventDefault(), !!i))
99
+ [r]
100
+ ), f = u(
101
+ (t) => {
102
+ if (!r && (t.preventDefault(), !!i))
97
103
  try {
98
- const s = e.dataTransfer.getData("application/json");
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
- f && f(D), v && o && v({
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
- [t, c, o, f, v, m, i]
120
+ [r, c, o, l, v, m, i]
115
121
  );
116
122
  return {
117
123
  isOver: E,
118
- setNodeRef: y,
124
+ setNodeRef: I,
119
125
  attributes: {
120
126
  "data-droppable": !0,
121
127
  "data-over": E ? !0 : void 0,
122
- "data-disabled": t ? !0 : void 0,
128
+ "data-disabled": r ? !0 : void 0,
123
129
  "data-dragging": d ? !0 : void 0,
124
- "data-valid": i === !0 ? !0 : void 0
130
+ "data-valid": i ? !0 : void 0
125
131
  },
126
132
  valid: i,
127
133
  listeners: {
128
- onDragEnter: I,
129
- onDragOver: S,
134
+ onDragEnter: S,
135
+ onDragOver: C,
130
136
  onDragLeave: a,
131
- onDrop: l
137
+ onDrop: f
132
138
  }
133
139
  };
134
140
  }
135
141
  export {
136
- z as useDraggable,
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 { DragDropContext as d } from "./context.js";
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 v } from "../utils/antdUtils.js";
9
- import { clsx as x } from "../utils/cn.js";
10
- function b({
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: n,
14
- onDragStart: e,
14
+ onDragEnd: e,
15
+ onDragStart: n,
15
16
  onDrop: a,
16
- className: s
17
+ className: i
17
18
  }) {
18
- const i = v(), [c, g] = o(null), [m, p] = o(!1), D = {
19
- active: c,
19
+ const s = x(), [m, c] = o(null), [g, p] = o(!1), D = {
20
+ active: m,
20
21
  setActive: (l) => {
21
- g(l);
22
+ c(l);
22
23
  },
23
- isDragging: m,
24
+ isDragging: g,
24
25
  setIsDragging: p,
25
- onDragStart: e,
26
- onDragEnd: n,
26
+ onDragStart: n,
27
+ onDragEnd: e,
27
28
  onDrop: a
28
29
  };
29
- return /* @__PURE__ */ r(d.Provider, { value: D, children: /* @__PURE__ */ r("div", { className: x(i("drag-container"), s), children: t }) });
30
+ return /* @__PURE__ */ r(v.Provider, { value: D, children: /* @__PURE__ */ r("div", { className: b(s("drag-container"), i), children: t }) });
30
31
  }
31
- const O = Object.assign(b, {
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
- O as DragDrop,
43
- b as DragDropRoot
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":";;;;;;;;;AAuBO,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;AACF,CAAC;"}
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;"}
@@ -1,66 +1,74 @@
1
1
  "use client";
2
- import { jsx as c } from "react/jsx-runtime";
3
- import { forwardRef as l } from "react";
4
- import { XIcon as C } from "@bioturing/assets";
5
- import g from "antd/es/tag";
2
+ import { jsx as l } from "react/jsx-runtime";
3
+ import { forwardRef as g, isValidElement as T, cloneElement as b } from "react";
4
+ import { XIcon as y } from "@bioturing/assets";
5
+ import C from "antd/es/tag";
6
+ import j from "antd/es/tag/CheckableTag";
6
7
  import './style.css';/* empty css */
7
- import { useCls as i } from "../utils/antdUtils.js";
8
- import { clsx as p } from "../utils/cn.js";
9
- const I = l(
8
+ import { useCls as f } from "../utils/antdUtils.js";
9
+ import { clsx as c } from "../utils/cn.js";
10
+ const x = g(
10
11
  ({
11
- className: a,
12
- active: e = !1,
13
- color: o,
14
- style: s,
15
- closeIcon: r,
16
- closable: t,
17
- size: f = "small",
12
+ className: o,
13
+ active: r = !1,
14
+ color: e,
15
+ style: m,
16
+ closeIcon: p,
17
+ closable: s,
18
+ size: i = "small",
18
19
  children: n,
19
- ...u
20
- }, T) => {
21
- const d = /* @__PURE__ */ c(C, { weight: "bold" }), m = i();
22
- return /* @__PURE__ */ c(
23
- g,
20
+ icon: t,
21
+ ...d
22
+ }, N) => {
23
+ const u = /* @__PURE__ */ l(y, { weight: "bold" }), a = f(), I = T(t) ? b(t, {
24
+ className: c(
25
+ a("tag-icon"),
26
+ t.props && typeof t.props == "object" && "className" in t.props && typeof t.props.className == "string" ? t.props.className : ""
27
+ )
28
+ }) : t;
29
+ return /* @__PURE__ */ l(
30
+ C,
24
31
  {
25
- ref: T,
26
- className: p(
27
- m("tag"),
28
- m(`tag-${f}`),
29
- !n && m("tag-empty"),
30
- a
32
+ ref: N,
33
+ className: c(
34
+ a("tag"),
35
+ a(`tag-${i}`),
36
+ !n && a("tag-empty"),
37
+ o
31
38
  ),
32
- color: o,
33
- style: s,
34
- closable: t,
35
- closeIcon: t ? r || d : void 0,
36
- ...e ? { "data-active": "true" } : {},
37
- ...u,
39
+ color: e,
40
+ style: m,
41
+ closable: s,
42
+ closeIcon: s ? p || u : void 0,
43
+ icon: I,
44
+ ...r ? { "data-active": "true" } : {},
45
+ ...d,
38
46
  children: n
39
47
  }
40
48
  );
41
49
  }
42
- ), b = l(
43
- ({ className: a, size: e = "small", children: o, ...s }, r) => {
44
- const t = i();
45
- return /* @__PURE__ */ c(
46
- g.CheckableTag,
50
+ ), k = g(
51
+ ({ className: o, size: r = "small", children: e, ...m }, p) => {
52
+ const s = f();
53
+ return /* @__PURE__ */ l(
54
+ j,
47
55
  {
48
- ref: r,
49
- className: p(
50
- t("tag"),
51
- t(`tag-${e}`),
52
- !o && t("tag-empty"),
53
- a
56
+ ref: p,
57
+ className: c(
58
+ s("tag"),
59
+ s(`tag-${r}`),
60
+ !e && s("tag-empty"),
61
+ o
54
62
  ),
55
- ...s,
56
- children: o
63
+ ...m,
64
+ children: e
57
65
  }
58
66
  );
59
67
  }
60
- ), $ = Object.assign(I, {
61
- CheckableTag: b
68
+ ), V = Object.assign(x, {
69
+ CheckableTag: k
62
70
  });
63
71
  export {
64
- $ as Tag
72
+ V as Tag
65
73
  };
66
74
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../../src/components/Tag/component.tsx"],"sourcesContent":["\"use client\";\nimport { forwardRef } from \"react\";\nimport { XIcon } from \"@bioturing/assets\";\nimport {\n default as AntTag,\n type CheckableTagProps as AntCheckableTagProps,\n type TagProps as AntTagProps,\n type TagType,\n} from \"antd/es/tag\";\nimport { clsx, useCls } from \"../utils\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\nexport { TagType };\n\n// Define props interface extending Ant Design's TagProps\nexport interface TagProps extends AntTagProps {\n /**\n * Indicates if the tag is active\n * @default false\n */\n active?: boolean;\n /**\n * Size of the tag\n * @default \"small\"\n */\n size?: \"small\" | \"medium\" | \"large\";\n}\n\nexport interface CheckableTagProps extends AntCheckableTagProps {\n size?: \"small\" | \"medium\" | \"large\";\n}\n\n// Create Tag component\nconst InternalTag = forwardRef<HTMLSpanElement, TagProps>(\n (\n {\n className,\n active = false,\n color,\n style,\n closeIcon,\n closable,\n size = \"small\",\n children,\n ...rest\n },\n ref\n ) => {\n const renderedCloseIcon = <XIcon weight=\"bold\" />;\n const cls = useCls();\n return (\n <AntTag\n ref={ref}\n className={clsx(\n cls(\"tag\"),\n cls(`tag-${size}`),\n !children && cls(\"tag-empty\"),\n className\n )}\n color={color}\n style={style}\n closable={closable}\n closeIcon={closable ? closeIcon || renderedCloseIcon : undefined}\n {...(active ? { \"data-active\": \"true\" } : {})}\n {...rest}\n >\n {children}\n </AntTag>\n );\n }\n);\n\nconst CheckableTag = forwardRef<HTMLSpanElement, CheckableTagProps>(\n ({ className, size = \"small\", children, ...rest }, ref) => {\n const cls = useCls();\n return (\n <AntTag.CheckableTag\n ref={ref}\n className={clsx(\n cls(\"tag\"),\n cls(`tag-${size}`),\n !children && cls(\"tag-empty\"),\n className\n )}\n {...rest}\n >\n {children}\n </AntTag.CheckableTag>\n );\n }\n);\n\nexport const Tag = Object.assign(InternalTag, {\n CheckableTag,\n});\n"],"names":["InternalTag","forwardRef","className","active","color","style","closeIcon","closable","size","children","rest","ref","renderedCloseIcon","jsx","XIcon","cls","useCls","AntTag","clsx","CheckableTag","Tag"],"mappings":";;;;;;;;AAmCA,MAAMA,IAAcC;AAAA,EAClB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC;AAAA,IACA,GAAGC;AAAA,KAELC,MACG;AACH,UAAMC,IAAoB,gBAAAC,EAACC,GAAM,EAAA,QAAO,OAAO,CAAA,GACzCC,IAAMC,EAAO;AAEjB,WAAA,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,WAAWO;AAAA,UACTH,EAAI,KAAK;AAAA,UACTA,EAAI,OAAOP,CAAI,EAAE;AAAA,UACjB,CAACC,KAAYM,EAAI,WAAW;AAAA,UAC5Bb;AAAA,QACF;AAAA,QACA,OAAAE;AAAA,QACA,OAAAC;AAAA,QACA,UAAAE;AAAA,QACA,WAAWA,IAAWD,KAAaM,IAAoB;AAAA,QACtD,GAAIT,IAAS,EAAE,eAAe,WAAW,CAAC;AAAA,QAC1C,GAAGO;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN,GAEMU,IAAelB;AAAA,EACnB,CAAC,EAAE,WAAAC,GAAW,MAAAM,IAAO,SAAS,UAAAC,GAAU,GAAGC,EAAK,GAAGC,MAAQ;AACzD,UAAMI,IAAMC,EAAO;AAEjB,WAAA,gBAAAH;AAAA,MAACI,EAAO;AAAA,MAAP;AAAA,QACC,KAAAN;AAAA,QACA,WAAWO;AAAA,UACTH,EAAI,KAAK;AAAA,UACTA,EAAI,OAAOP,CAAI,EAAE;AAAA,UACjB,CAACC,KAAYM,EAAI,WAAW;AAAA,UAC5Bb;AAAA,QACF;AAAA,QACC,GAAGQ;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN,GAEaW,IAAM,OAAO,OAAOpB,GAAa;AAAA,EAC5C,cAAAmB;AACF,CAAC;"}
1
+ {"version":3,"file":"component.js","sources":["../../../src/components/Tag/component.tsx"],"sourcesContent":["\"use client\";\nimport {\n forwardRef,\n cloneElement,\n isValidElement,\n ReactElement,\n HTMLAttributes,\n} from \"react\";\nimport { XIcon } from \"@bioturing/assets\";\nimport AntTag, {\n type TagProps as AntTagProps,\n type TagType,\n} from \"antd/es/tag\";\nimport AntCheckableTag, {\n type CheckableTagProps as AntCheckableTagProps,\n} from \"antd/es/tag/CheckableTag\";\nimport { clsx, useCls } from \"../utils\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\nexport { TagType };\n\n// Define props interface extending Ant Design's TagProps\nexport interface TagProps extends AntTagProps {\n /**\n * Indicates if the tag is active\n * @default false\n */\n active?: boolean;\n /**\n * Size of the tag\n * @default \"small\"\n */\n size?: \"small\" | \"medium\" | \"large\";\n}\n\nexport interface CheckableTagProps extends AntCheckableTagProps {\n size?: \"small\" | \"medium\" | \"large\";\n}\n\n// Create Tag component\nconst InternalTag = forwardRef<HTMLSpanElement, TagProps>(\n (\n {\n className,\n active = false,\n color,\n style,\n closeIcon,\n closable,\n size = \"small\",\n children,\n icon,\n ...rest\n },\n ref\n ) => {\n const renderedCloseIcon = <XIcon weight=\"bold\" />;\n const cls = useCls();\n const renderedIcon = isValidElement(icon)\n ? cloneElement<HTMLAttributes<SVGElement>>(icon, {\n className: clsx(\n cls(\"tag-icon\"),\n icon.props &&\n typeof icon.props === \"object\" &&\n \"className\" in icon.props &&\n typeof icon.props.className === \"string\"\n ? icon.props.className\n : \"\"\n ),\n })\n : icon;\n return (\n <AntTag\n ref={ref}\n className={clsx(\n cls(\"tag\"),\n cls(`tag-${size}`),\n !children && cls(\"tag-empty\"),\n className\n )}\n color={color}\n style={style}\n closable={closable}\n closeIcon={closable ? closeIcon || renderedCloseIcon : undefined}\n icon={renderedIcon}\n {...(active ? { \"data-active\": \"true\" } : {})}\n {...rest}\n >\n {children}\n </AntTag>\n );\n }\n);\n\nconst CheckableTag = forwardRef<HTMLSpanElement, CheckableTagProps>(\n ({ className, size = \"small\", children, ...rest }, ref) => {\n const cls = useCls();\n return (\n <AntCheckableTag\n ref={ref}\n className={clsx(\n cls(\"tag\"),\n cls(`tag-${size}`),\n !children && cls(\"tag-empty\"),\n className\n )}\n {...rest}\n >\n {children}\n </AntCheckableTag>\n );\n }\n);\n\nexport const Tag = Object.assign(InternalTag, {\n CheckableTag,\n});\n"],"names":["InternalTag","forwardRef","className","active","color","style","closeIcon","closable","size","children","icon","rest","ref","renderedCloseIcon","jsx","XIcon","cls","useCls","renderedIcon","isValidElement","cloneElement","clsx","AntTag","CheckableTag","AntCheckableTag","Tag"],"mappings":";;;;;;;;;AA0CA,MAAMA,IAAcC;AAAA,EAClB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,GAAGC;AAAA,KAELC,MACG;AACH,UAAMC,IAAoB,gBAAAC,EAACC,GAAM,EAAA,QAAO,OAAO,CAAA,GACzCC,IAAMC,EAAO,GACbC,IAAeC,EAAeT,CAAI,IACpCU,EAAyCV,GAAM;AAAA,MAC7C,WAAWW;AAAA,QACTL,EAAI,UAAU;AAAA,QACdN,EAAK,SACH,OAAOA,EAAK,SAAU,YACtB,eAAeA,EAAK,SACpB,OAAOA,EAAK,MAAM,aAAc,WAC9BA,EAAK,MAAM,YACX;AAAA,MAAA;AAAA,IAEP,CAAA,IACDA;AAEF,WAAA,gBAAAI;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,KAAAV;AAAA,QACA,WAAWS;AAAA,UACTL,EAAI,KAAK;AAAA,UACTA,EAAI,OAAOR,CAAI,EAAE;AAAA,UACjB,CAACC,KAAYO,EAAI,WAAW;AAAA,UAC5Bd;AAAA,QACF;AAAA,QACA,OAAAE;AAAA,QACA,OAAAC;AAAA,QACA,UAAAE;AAAA,QACA,WAAWA,IAAWD,KAAaO,IAAoB;AAAA,QACvD,MAAMK;AAAA,QACL,GAAIf,IAAS,EAAE,eAAe,WAAW,CAAC;AAAA,QAC1C,GAAGQ;AAAA,QAEH,UAAAF;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN,GAEMc,IAAetB;AAAA,EACnB,CAAC,EAAE,WAAAC,GAAW,MAAAM,IAAO,SAAS,UAAAC,GAAU,GAAGE,EAAK,GAAGC,MAAQ;AACzD,UAAMI,IAAMC,EAAO;AAEjB,WAAA,gBAAAH;AAAA,MAACU;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,WAAWS;AAAA,UACTL,EAAI,KAAK;AAAA,UACTA,EAAI,OAAOR,CAAI,EAAE;AAAA,UACjB,CAACC,KAAYO,EAAI,WAAW;AAAA,UAC5Bd;AAAA,QACF;AAAA,QACC,GAAGS;AAAA,QAEH,UAAAF;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN,GAEagB,IAAM,OAAO,OAAOzB,GAAa;AAAA,EAC5C,cAAAuB;AACF,CAAC;"}