@frontify/fondue 12.0.0-beta.196 → 12.0.0-beta.198

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.
@@ -20,7 +20,7 @@ const v = ({
20
20
  {
21
21
  className: o([
22
22
  "tw-inline-flex tw-leading-4 tw-items-center tw-gap-1 tw-font-sans tw-text-s tw-max-w-full tw-min-w-0 tw-flex-initial",
23
- n ? "tw-text-disabled" : "tw-text-text-weak"
23
+ n ? "tw-text-text-disabled" : "tw-text-text-weak"
24
24
  ]),
25
25
  "data-test-id": "input-label-container"
26
26
  },
@@ -1 +1 @@
1
- {"version":3,"file":"InputLabel.es.js","sources":["../../../src/components/InputLabel/InputLabel.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { TooltipProps } from '@components/Tooltip/Tooltip';\nimport { TooltipIcon, TooltipIconProps } from '@components/TooltipIcon/TooltipIcon';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { merge } from '@utilities/merge';\nimport React, { ReactElement, ReactNode } from 'react';\n\nexport type InputLabelTooltipProps =\n | (TooltipProps & Pick<TooltipIconProps, 'triggerStyle' | 'triggerIcon'>)\n | (TooltipProps & Pick<TooltipIconProps, 'triggerStyle' | 'triggerIcon'>)[];\n\nexport type InputLabelProps = {\n htmlFor: string;\n required?: boolean;\n disabled?: boolean;\n clickable?: boolean;\n tooltip?: InputLabelTooltipProps;\n bold?: boolean;\n children?: ReactNode;\n};\n\nexport const InputLabel = ({\n children,\n htmlFor,\n required = false,\n disabled = false,\n clickable = false,\n tooltip = [],\n bold,\n}: InputLabelProps): ReactElement => {\n const tooltips = Array.isArray(tooltip) ? tooltip : [tooltip];\n\n const tooltipsWithKeys = tooltips.map((tooltip, index) => ({\n key: index,\n ...tooltip,\n }));\n\n return (\n <div\n className={merge([\n 'tw-inline-flex tw-leading-4 tw-items-center tw-gap-1 tw-font-sans tw-text-s tw-max-w-full tw-min-w-0 tw-flex-initial',\n disabled ? 'tw-text-disabled' : 'tw-text-text-weak',\n ])}\n data-test-id=\"input-label-container\"\n >\n <div className=\"tw-flex-1 tw-overflow-hidden tw-text-ellipsis tw-whitespace-nowrap\">\n <label\n htmlFor={htmlFor}\n className={merge([\n 'tw-select-none',\n bold && 'tw-font-medium',\n disabled || !clickable\n ? 'hover:tw-cursor-not-allowed tw-pointer-events-none'\n : 'hover:tw-cursor-pointer hover:tw-text-text group-hover:tw-text-text',\n ])}\n data-test-id=\"input-label\"\n title={typeof children === 'string' ? children : ''}\n >\n {children}\n </label>\n </div>\n\n {required && (\n <span data-test-id=\"input-label-required\" className=\"tw-h-4 tw-text-m tw-text-text-negative\">\n *\n </span>\n )}\n {tooltipsWithKeys.map(({ key, triggerIcon, triggerStyle, hoverDelay = 100, ...tooltipProps }) => (\n <div key={key} className=\"tw-leading-3\">\n <TooltipIcon\n tooltip={{ ...tooltipProps, hoverDelay }}\n iconSize={IconSize.Size16}\n triggerIcon={triggerIcon}\n triggerStyle={triggerStyle}\n />\n </div>\n ))}\n </div>\n );\n};\nInputLabel.displayName = 'FondueInputLabel';\n"],"names":["InputLabel","children","htmlFor","required","disabled","clickable","tooltip","bold","tooltipsWithKeys","index","React","merge","key","triggerIcon","triggerStyle","hoverDelay","tooltipProps","TooltipIcon","IconSize"],"mappings":";;;;AAsBO,MAAMA,IAAa,CAAC;AAAA,EACvB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,SAAAC,IAAU,CAAC;AAAA,EACX,MAAAC;AACJ,MAAqC;AAGjC,QAAMC,KAFW,MAAM,QAAQF,CAAO,IAAIA,IAAU,CAACA,CAAO,GAE1B,IAAI,CAACA,GAASG,OAAW;AAAA,IACvD,KAAKA;AAAA,IACL,GAAGH;AAAAA,EACL,EAAA;AAGE,SAAA,gBAAAI,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAM;AAAA,QACb;AAAA,QACAP,IAAW,qBAAqB;AAAA,MAAA,CACnC;AAAA,MACD,gBAAa;AAAA,IAAA;AAAA,IAEb,gBAAAM,EAAA,cAAC,OAAI,EAAA,WAAU,qEACX,GAAA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,SAAAR;AAAA,QACA,WAAWS,EAAM;AAAA,UACb;AAAA,UACAJ,KAAQ;AAAA,UACRH,KAAY,CAACC,IACP,uDACA;AAAA,QAAA,CACT;AAAA,QACD,gBAAa;AAAA,QACb,OAAO,OAAOJ,KAAa,WAAWA,IAAW;AAAA,MAAA;AAAA,MAEhDA;AAAA,IAAA,CAET;AAAA,IAECE,KACI,gBAAAO,EAAA,cAAA,QAAA,EAAK,gBAAa,wBAAuB,WAAU,4CAAyC,GAE7F;AAAA,IAEHF,EAAiB,IAAI,CAAC,EAAE,KAAAI,GAAK,aAAAC,GAAa,cAAAC,GAAc,YAAAC,IAAa,KAAK,GAAGC,EAC1E,MAAA,gBAAAN,EAAA,cAAC,OAAI,EAAA,KAAAE,GAAU,WAAU,eACrB,GAAA,gBAAAF,EAAA;AAAA,MAACO;AAAA,MAAA;AAAA,QACG,SAAS,EAAE,GAAGD,GAAc,YAAAD,EAAW;AAAA,QACvC,UAAUG,EAAS;AAAA,QACnB,aAAAL;AAAA,QACA,cAAAC;AAAA,MAAA;AAAA,IAAA,CAER,CACH;AAAA,EAAA;AAGb;AACAd,EAAW,cAAc;"}
1
+ {"version":3,"file":"InputLabel.es.js","sources":["../../../src/components/InputLabel/InputLabel.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { TooltipProps } from '@components/Tooltip/Tooltip';\nimport { TooltipIcon, TooltipIconProps } from '@components/TooltipIcon/TooltipIcon';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { merge } from '@utilities/merge';\nimport React, { ReactElement, ReactNode } from 'react';\n\nexport type InputLabelTooltipProps =\n | (TooltipProps & Pick<TooltipIconProps, 'triggerStyle' | 'triggerIcon'>)\n | (TooltipProps & Pick<TooltipIconProps, 'triggerStyle' | 'triggerIcon'>)[];\n\nexport type InputLabelProps = {\n htmlFor: string;\n required?: boolean;\n disabled?: boolean;\n clickable?: boolean;\n tooltip?: InputLabelTooltipProps;\n bold?: boolean;\n children?: ReactNode;\n};\n\nexport const InputLabel = ({\n children,\n htmlFor,\n required = false,\n disabled = false,\n clickable = false,\n tooltip = [],\n bold,\n}: InputLabelProps): ReactElement => {\n const tooltips = Array.isArray(tooltip) ? tooltip : [tooltip];\n\n const tooltipsWithKeys = tooltips.map((tooltip, index) => ({\n key: index,\n ...tooltip,\n }));\n\n return (\n <div\n className={merge([\n 'tw-inline-flex tw-leading-4 tw-items-center tw-gap-1 tw-font-sans tw-text-s tw-max-w-full tw-min-w-0 tw-flex-initial',\n disabled ? 'tw-text-text-disabled' : 'tw-text-text-weak',\n ])}\n data-test-id=\"input-label-container\"\n >\n <div className=\"tw-flex-1 tw-overflow-hidden tw-text-ellipsis tw-whitespace-nowrap\">\n <label\n htmlFor={htmlFor}\n className={merge([\n 'tw-select-none',\n bold && 'tw-font-medium',\n disabled || !clickable\n ? 'hover:tw-cursor-not-allowed tw-pointer-events-none'\n : 'hover:tw-cursor-pointer hover:tw-text-text group-hover:tw-text-text',\n ])}\n data-test-id=\"input-label\"\n title={typeof children === 'string' ? children : ''}\n >\n {children}\n </label>\n </div>\n\n {required && (\n <span data-test-id=\"input-label-required\" className=\"tw-h-4 tw-text-m tw-text-text-negative\">\n *\n </span>\n )}\n {tooltipsWithKeys.map(({ key, triggerIcon, triggerStyle, hoverDelay = 100, ...tooltipProps }) => (\n <div key={key} className=\"tw-leading-3\">\n <TooltipIcon\n tooltip={{ ...tooltipProps, hoverDelay }}\n iconSize={IconSize.Size16}\n triggerIcon={triggerIcon}\n triggerStyle={triggerStyle}\n />\n </div>\n ))}\n </div>\n );\n};\nInputLabel.displayName = 'FondueInputLabel';\n"],"names":["InputLabel","children","htmlFor","required","disabled","clickable","tooltip","bold","tooltipsWithKeys","index","React","merge","key","triggerIcon","triggerStyle","hoverDelay","tooltipProps","TooltipIcon","IconSize"],"mappings":";;;;AAsBO,MAAMA,IAAa,CAAC;AAAA,EACvB,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,SAAAC,IAAU,CAAC;AAAA,EACX,MAAAC;AACJ,MAAqC;AAGjC,QAAMC,KAFW,MAAM,QAAQF,CAAO,IAAIA,IAAU,CAACA,CAAO,GAE1B,IAAI,CAACA,GAASG,OAAW;AAAA,IACvD,KAAKA;AAAA,IACL,GAAGH;AAAAA,EACL,EAAA;AAGE,SAAA,gBAAAI,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAM;AAAA,QACb;AAAA,QACAP,IAAW,0BAA0B;AAAA,MAAA,CACxC;AAAA,MACD,gBAAa;AAAA,IAAA;AAAA,IAEb,gBAAAM,EAAA,cAAC,OAAI,EAAA,WAAU,qEACX,GAAA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,SAAAR;AAAA,QACA,WAAWS,EAAM;AAAA,UACb;AAAA,UACAJ,KAAQ;AAAA,UACRH,KAAY,CAACC,IACP,uDACA;AAAA,QAAA,CACT;AAAA,QACD,gBAAa;AAAA,QACb,OAAO,OAAOJ,KAAa,WAAWA,IAAW;AAAA,MAAA;AAAA,MAEhDA;AAAA,IAAA,CAET;AAAA,IAECE,KACI,gBAAAO,EAAA,cAAA,QAAA,EAAK,gBAAa,wBAAuB,WAAU,4CAAyC,GAE7F;AAAA,IAEHF,EAAiB,IAAI,CAAC,EAAE,KAAAI,GAAK,aAAAC,GAAa,cAAAC,GAAc,YAAAC,IAAa,KAAK,GAAGC,EAC1E,MAAA,gBAAAN,EAAA,cAAC,OAAI,EAAA,KAAAE,GAAU,WAAU,eACrB,GAAA,gBAAAF,EAAA;AAAA,MAACO;AAAA,MAAA;AAAA,QACG,SAAS,EAAE,GAAGD,GAAc,YAAAD,EAAW;AAAA,QACvC,UAAUG,EAAS;AAAA,QACnB,aAAAL;AAAA,QACA,cAAAC;AAAA,MAAA;AAAA,IAAA,CAER,CACH;AAAA,EAAA;AAGb;AACAd,EAAW,cAAc;"}
@@ -1,9 +1,9 @@
1
- import f, { memo as ue, useMemo as _, useReducer as me, useState as N, useEffect as x, useCallback as I, useRef as Ie, useLayoutEffect as Se, cloneElement as ge } from "react";
1
+ import f, { memo as ue, useMemo as N, useReducer as me, useState as x, useEffect as b, useCallback as I, useRef as Ie, useLayoutEffect as Se, cloneElement as ge } from "react";
2
2
  import { SortableContext as Te, verticalListSortingStrategy as De } from "@dnd-kit/sortable";
3
3
  import { restrictToWindowEdges as fe } from "@dnd-kit/modifiers";
4
4
  import { enableMapSet as we, produce as Ce } from "immer";
5
5
  import { createPortal as Oe } from "react-dom";
6
- import { MeasuringStrategy as Re, KeyboardCode as w, useSensors as _e, useSensor as B, PointerSensor as Ne, KeyboardSensor as xe, DndContext as be, closestCenter as he, DragOverlay as ke } from "@dnd-kit/core";
6
+ import { MeasuringStrategy as Re, KeyboardCode as w, useSensors as _e, useSensor as B, PointerSensor as Ne, KeyboardSensor as xe, DndContext as be, closestCenter as ke, DragOverlay as he } from "@dnd-kit/core";
7
7
  import { TreeContext as Le } from "./TreeContext.es.js";
8
8
  import { getReactNodeIdsInFlatArray as Me, removeReactNodesFromFlatArray as ve } from "./helpers/nodes.es.js";
9
9
  import Ae from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js";
@@ -22,8 +22,8 @@ const Ke = Ce((o, d) => {
22
22
  switch (d.type) {
23
23
  case "SET_SELECT":
24
24
  {
25
- const a = new Set(o.selectedIds), i = !o.selectedIds.has(d.payload);
26
- i && o.selectionMode === "single" && a.clear(), i ? a.add(d.payload) : a.delete(d.payload), o.selectedIds = a;
25
+ const a = new Set(o.selectedIds), c = !o.selectedIds.has(d.payload);
26
+ c && o.selectionMode === "single" && a.clear(), c ? a.add(d.payload) : a.delete(d.payload), o.selectedIds = a;
27
27
  }
28
28
  break;
29
29
  case "SET_EXPAND":
@@ -43,19 +43,21 @@ const Ke = Ce((o, d) => {
43
43
  break;
44
44
  case "REGISTER_NODE_CHILDREN":
45
45
  {
46
- const { id: a, children: i } = d.payload, u = o.nodes.findIndex((p) => p.props.id === a);
46
+ const { id: a, children: c } = d.payload, u = o.nodes.findIndex((i) => i.props.id === a);
47
47
  if (u === -1) {
48
48
  console.error(`Element with ID "${a}" not found.`);
49
49
  return;
50
50
  }
51
- const y = u + 1, S = o.nodes.slice(y, i.length - 1).map((p) => p.props.id), b = i.map((p) => p.props.id);
52
- if (Ae(S, b))
51
+ const y = u + 1, S = o.nodes.slice(y, c.length - 1).map((i) => i.props.id), C = c.map((i) => i.props.id);
52
+ if (Ae(S, C))
53
53
  return;
54
54
  const g = [
55
55
  ...o.nodes.slice(0, y),
56
- ...i,
56
+ ...c,
57
57
  ...o.nodes.slice(y)
58
- ].filter((p, k, t) => k === t.findIndex((l) => l.key === p.key));
58
+ ].filter(
59
+ (i, h, t) => h === t.findIndex((l) => l.key === i.key) && (i.props.parentId === a && C.includes(i.key) || i.props.parentId !== a)
60
+ );
59
61
  o.nodes = g;
60
62
  }
61
63
  break;
@@ -85,16 +87,16 @@ const Ke = Ce((o, d) => {
85
87
  id: o,
86
88
  onDrop: d,
87
89
  onSelect: a,
88
- onExpand: i,
90
+ onExpand: c,
89
91
  children: u,
90
92
  selectedIds: y,
91
93
  expandedIds: S,
92
- draggable: b = !1,
94
+ draggable: C = !1,
93
95
  multiselect: g = !1,
94
- "data-test-id": p = "fondue-tree"
96
+ "data-test-id": i = "fondue-tree"
95
97
  }) => {
96
98
  var J, W;
97
- const k = _(
99
+ const h = N(
98
100
  () => ({
99
101
  selectionMode: "single",
100
102
  selectedIds: new Set(y ?? []),
@@ -103,8 +105,8 @@ const Ke = Ce((o, d) => {
103
105
  projection: null
104
106
  }),
105
107
  [u, S, y]
106
- ), [t, l] = me(Ke, k), [C, H] = N(0), [L, M] = N(null), [O, K] = N(null), [h, R] = N(null), Z = _(() => t.nodes.map((e) => e.props.id), [t.nodes]);
107
- x(() => {
108
+ ), [t, l] = me(Ke, h), [O, H] = x(0), [L, M] = x(null), [R, K] = x(null), [k, _] = x(null), Z = N(() => t.nodes.map((e) => e.props.id), [t.nodes]);
109
+ b(() => {
108
110
  const e = (n) => {
109
111
  g && (n.key === "Meta" || n.ctrlKey) && l({
110
112
  type: "SET_SELECTION_MODE",
@@ -138,14 +140,14 @@ const Ke = Ce((o, d) => {
138
140
  [a]
139
141
  ), D = I(
140
142
  (e) => {
141
- if (i)
142
- return i(e);
143
+ if (c)
144
+ return c(e);
143
145
  l({
144
146
  type: "SET_EXPAND",
145
147
  payload: e
146
148
  });
147
149
  },
148
- [i]
150
+ [c]
149
151
  ), ee = I(
150
152
  (e) => {
151
153
  var s;
@@ -161,7 +163,7 @@ const Ke = Ce((o, d) => {
161
163
  ), te = ({ active: { id: e } }) => {
162
164
  K(e), M(e);
163
165
  const r = t.nodes.find((n) => n.props.id === e);
164
- r && R({
166
+ r && _({
165
167
  parentId: r.props.parentId,
166
168
  overId: e
167
169
  }), document.body.style.setProperty("cursor", "grabbing");
@@ -172,7 +174,7 @@ const Ke = Ce((o, d) => {
172
174
  }, se = () => {
173
175
  $();
174
176
  }, $ = () => {
175
- M(null), K(null), H(0), R(null), document.body.style.setProperty("cursor", "");
177
+ M(null), K(null), H(0), _(null), document.body.style.setProperty("cursor", "");
176
178
  }, de = I(
177
179
  (e) => {
178
180
  const r = document.activeElement;
@@ -180,7 +182,7 @@ const Ke = Ce((o, d) => {
180
182
  return;
181
183
  const n = Array.from(r.parentElement.children).filter(
182
184
  (m) => m.nodeName === "LI"
183
- ), s = n.indexOf(r), c = t.nodes[s], E = c.props.id, Y = t.expandedIds.has(E), v = c.props.parentId, A = r.getAttribute("data-has-children") === "true", { code: pe } = e, q = () => {
185
+ ), s = n.indexOf(r), p = t.nodes[s], E = p.props.id, Y = t.expandedIds.has(E), v = p.props.parentId, A = r.getAttribute("data-has-children") === "true", { code: pe } = e, q = () => {
184
186
  e.preventDefault(), T(E);
185
187
  }, P = () => {
186
188
  e.preventDefault(), D(E);
@@ -222,14 +224,14 @@ const Ke = Ce((o, d) => {
222
224
  [D, T, t.expandedIds, t.nodes]
223
225
  ), V = Ie({
224
226
  nodes: t.nodes,
225
- offset: C
226
- }), [re] = N(() => Pe(V)), ae = _e(B(Ne), B(xe, { coordinateGetter: re })), le = _(() => {
227
+ offset: O
228
+ }), [re] = x(() => Pe(V)), ae = _e(B(Ne), B(xe, { coordinateGetter: re })), le = N(() => {
227
229
  const e = (n) => {
228
- var s, c;
229
- return (c = (s = t.nodes.find((E) => E.key === n.id)) == null ? void 0 : s.props.contentComponent) == null ? void 0 : c.props.title;
230
+ var s, p;
231
+ return (p = (s = t.nodes.find((E) => E.key === n.id)) == null ? void 0 : s.props.contentComponent) == null ? void 0 : p.props.title;
230
232
  }, r = (n) => {
231
- var s, c;
232
- return (c = (s = t.nodes.find((E) => E.key === (n == null ? void 0 : n.id))) == null ? void 0 : s.props.contentComponent) == null ? void 0 : c.props.title;
233
+ var s, p;
234
+ return (p = (s = t.nodes.find((E) => E.key === (n == null ? void 0 : n.id))) == null ? void 0 : s.props.contentComponent) == null ? void 0 : p.props.title;
233
235
  };
234
236
  return {
235
237
  onDragStart({ active: n }) {
@@ -243,8 +245,8 @@ const Ke = Ce((o, d) => {
243
245
  overId: s == null ? void 0 : s.id,
244
246
  overTitle: r(s),
245
247
  treeState: t,
246
- setCurrentPosition: R,
247
- currentPosition: h
248
+ setCurrentPosition: _,
249
+ currentPosition: k
248
250
  });
249
251
  },
250
252
  onDragOver({ active: n, over: s }) {
@@ -255,8 +257,8 @@ const Ke = Ce((o, d) => {
255
257
  overId: s == null ? void 0 : s.id,
256
258
  overTitle: r(s),
257
259
  treeState: t,
258
- setCurrentPosition: R,
259
- currentPosition: h
260
+ setCurrentPosition: _,
261
+ currentPosition: k
260
262
  });
261
263
  },
262
264
  onDragEnd({ active: n, over: s }) {
@@ -267,53 +269,53 @@ const Ke = Ce((o, d) => {
267
269
  overId: s == null ? void 0 : s.id,
268
270
  overTitle: r(s),
269
271
  treeState: t,
270
- setCurrentPosition: R,
271
- currentPosition: h
272
+ setCurrentPosition: _,
273
+ currentPosition: k
272
274
  });
273
275
  },
274
276
  onDragCancel({ active: n }) {
275
- var c;
276
- return `Moving was cancelled. ${((c = t.nodes.find((E) => E.key === n.id)) == null ? void 0 : c.props.contentComponent.props.title) || n.id} was dropped in its original position.`;
277
+ var p;
278
+ return `Moving was cancelled. ${((p = t.nodes.find((E) => E.key === n.id)) == null ? void 0 : p.props.contentComponent.props.title) || n.id} was dropped in its original position.`;
277
279
  }
278
280
  };
279
- }, [h, t]);
281
+ }, [k, t]);
280
282
  Se(() => {
281
283
  l({
282
284
  type: "REGISTER_ROOT_NODES",
283
285
  payload: Q(u, { parentId: G, level: 0 })
284
286
  });
285
- }, [u]), x(() => {
287
+ }, [u]), b(() => {
286
288
  l({
287
289
  type: "REPLACE_EXPANDED",
288
290
  payload: S ?? []
289
291
  });
290
- }, [S]), x(() => {
292
+ }, [S]), b(() => {
291
293
  l({
292
294
  type: "REPLACE_SELECTED",
293
295
  payload: y ?? []
294
296
  });
295
- }, [y]), x(() => {
297
+ }, [y]), b(() => {
296
298
  V.current = {
297
299
  nodes: t.nodes,
298
- offset: C
300
+ offset: O
299
301
  };
300
- }, [C, t.nodes]), x(() => {
301
- const e = O && L ? Ge({
302
+ }, [O, t.nodes]), b(() => {
303
+ const e = R && L ? Ge({
302
304
  nodes: t.nodes,
303
- activeId: O,
305
+ activeId: R,
304
306
  overId: L,
305
- dragOffset: C
307
+ dragOffset: O
306
308
  }) : null;
307
309
  l({
308
310
  type: "SET_PROJECTION",
309
311
  payload: e
310
312
  });
311
- }, [O, C, L, t.nodes]);
312
- const ie = _(
313
+ }, [R, O, L, t.nodes]);
314
+ const ie = N(
313
315
  () => t.nodes.map((e) => ge(e, {
314
316
  ...e.props,
315
- projection: e.props.id === O ? t.projection : null,
316
- treeDraggable: b,
317
+ projection: e.props.id === R ? t.projection : null,
318
+ treeDraggable: C,
317
319
  isSelected: t.selectedIds.has(e.props.id),
318
320
  isExpanded: t.expandedIds.has(e.props.id),
319
321
  registerOverlay: F,
@@ -323,10 +325,10 @@ const Ke = Ce((o, d) => {
323
325
  onSelect: T
324
326
  })),
325
327
  [
326
- b,
328
+ C,
327
329
  D,
328
330
  T,
329
- O,
331
+ R,
330
332
  U,
331
333
  F,
332
334
  t.expandedIds,
@@ -335,7 +337,7 @@ const Ke = Ce((o, d) => {
335
337
  t.selectedIds,
336
338
  X
337
339
  ]
338
- ), ce = _(
340
+ ), ce = N(
339
341
  () => ({
340
342
  treeState: t,
341
343
  onSelect: T,
@@ -348,7 +350,7 @@ const Ke = Ce((o, d) => {
348
350
  {
349
351
  id: o,
350
352
  role: "tree",
351
- "data-test-id": p,
353
+ "data-test-id": i,
352
354
  onKeyDown: de,
353
355
  "aria-multiselectable": t.selectionMode === "multiselect",
354
356
  className: "tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none"
@@ -364,11 +366,11 @@ const Ke = Ce((o, d) => {
364
366
  onDragStart: te,
365
367
  onDragCancel: se,
366
368
  accessibility: { announcements: le },
367
- collisionDetection: he
369
+ collisionDetection: ke
368
370
  },
369
371
  /* @__PURE__ */ f.createElement(Te, { items: Z, strategy: De }, ie),
370
372
  Oe(
371
- /* @__PURE__ */ f.createElement(ke, { wrapperElement: "ul", dropAnimation: null, modifiers: [fe] }, t.overlay && /* @__PURE__ */ f.createElement(
373
+ /* @__PURE__ */ f.createElement(he, { wrapperElement: "ul", dropAnimation: null, modifiers: [fe] }, t.overlay && /* @__PURE__ */ f.createElement(
372
374
  je,
373
375
  {
374
376
  ...t.overlay,
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, {\n cloneElement,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { enableMapSet, produce } from 'immer';\nimport { createPortal } from 'react-dom';\nimport { isEqual } from 'lodash-es';\nimport {\n DndContext,\n DragEndEvent,\n DragMoveEvent,\n DragOverlay,\n KeyboardCode,\n KeyboardSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\n\nimport type {\n RegisterNodeChildrenPayload,\n SensorContext,\n TreeActive,\n TreeAnnouncements,\n TreeDragOverEvent,\n TreeDragStartEvent,\n TreeOver,\n TreeProps,\n TreeState,\n TreeStateAction,\n} from '@components/Tree/types';\n\nimport { type Overlay, TreeItemOverlay } from './TreeItem';\nimport {\n getMovementAnnouncement,\n getProjection,\n getReactNodeIdsInFlatArray,\n removeReactNodesFromFlatArray,\n} from './helpers';\nimport { removeFragmentsAndEnrichChildren, sortableTreeKeyboardCoordinates } from './utils';\nimport { TreeContext, TreeContextProps } from './TreeContext';\n\nexport const ROOT_ID = '__ROOT__';\nexport const INDENTATION_WIDTH = 32;\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'SET_SELECT':\n {\n const newSelected = new Set(draft.selectedIds);\n\n const isSelected = !draft.selectedIds.has(action.payload);\n\n if (isSelected && draft.selectionMode === 'single') {\n newSelected.clear();\n }\n\n isSelected ? newSelected.add(action.payload) : newSelected.delete(action.payload);\n\n draft.selectedIds = newSelected;\n }\n break;\n\n case 'SET_EXPAND':\n {\n const newExpanded = new Set(draft.expandedIds);\n\n const isExpanded = !draft.expandedIds.has(action.payload);\n\n isExpanded ? newExpanded.add(action.payload) : newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n }\n break;\n\n case 'SET_SELECTION_MODE':\n {\n draft.selectionMode = action.payload.selectionMode;\n }\n break;\n\n case 'SET_PROJECTION':\n {\n draft.projection = action.payload;\n }\n break;\n\n case 'REGISTER_OVERLAY_ITEM':\n {\n draft.overlay = action.payload;\n }\n break;\n\n case 'REGISTER_NODE_CHILDREN':\n {\n const { id, children } = action.payload;\n\n const index = draft.nodes.findIndex((node) => node.props.id === id);\n\n if (index === -1) {\n console.error(`Element with ID \"${id}\" not found.`);\n return;\n }\n\n const sliceIndex = index + 1;\n\n const currentNodeChildrenIds = draft.nodes\n .slice(sliceIndex, children.length - 1)\n .map((node) => node.props.id);\n\n const newNodeChildrenIds = children.map((node) => node.props.id);\n\n if (isEqual(currentNodeChildrenIds, newNodeChildrenIds)) {\n return;\n }\n\n const nodes = [\n ...draft.nodes.slice(0, sliceIndex),\n ...children,\n ...draft.nodes.slice(sliceIndex),\n ].filter((node, index, self) => index === self.findIndex((item) => item.key === node.key));\n\n draft.nodes = nodes;\n }\n break;\n\n case 'UNREGISTER_NODE_CHILDREN':\n {\n const nodeIds = getReactNodeIdsInFlatArray(draft.nodes, action.payload);\n\n draft.nodes = removeReactNodesFromFlatArray(draft.nodes, nodeIds);\n }\n break;\n\n case 'REGISTER_ROOT_NODES':\n {\n draft.nodes = action.payload;\n }\n break;\n\n case 'REPLACE_EXPANDED':\n {\n draft.expandedIds = new Set(action.payload);\n }\n break;\n\n case 'REPLACE_SELECTED':\n {\n draft.selectedIds = new Set(action.payload);\n }\n break;\n\n case 'REPLACE_STATE':\n draft.nodes = action.payload.nodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n break;\n default:\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect,\n onExpand,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n nodes: removeFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n projection: null,\n }),\n [children, expandedIds, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [offset, setOffset] = useState(0);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n const items = useMemo(() => treeState.nodes.map((node) => node.props.id), [treeState.nodes]);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string) => {\n if (onSelect) {\n return onSelect(id);\n }\n\n updateTreeState({\n type: 'SET_SELECT',\n payload: id,\n });\n },\n [onSelect],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'SET_EXPAND',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n });\n },\n [onDrop, treeState.projection?.parentId, treeState.projection?.position],\n );\n\n const handleDragStart = ({ active: { id: activeId } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n const activeNode = treeState.nodes.find((node) => node.props.id === activeId);\n\n if (activeNode) {\n setCurrentPosition({\n parentId: activeNode.props.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', '');\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLUListElement>) => {\n const activeElement = document.activeElement;\n\n if (!activeElement || !activeElement.parentElement || !(activeElement instanceof HTMLLIElement)) {\n return;\n }\n\n const items = Array.from(activeElement.parentElement.children).filter(\n (child) => child.nodeName === 'LI',\n ) as HTMLLIElement[];\n\n const currentIndex = items.indexOf(activeElement);\n\n const node = treeState.nodes[currentIndex];\n\n const id: string = node.props.id;\n const isExpanded = treeState.expandedIds.has(id);\n const parentId: string = node.props.parentId;\n const hasChildren = activeElement.getAttribute('data-has-children') === 'true';\n\n const { code } = event;\n\n const toggleSelect = () => {\n event.preventDefault();\n\n handleSelect(id);\n };\n\n const toggleExpand = () => {\n event.preventDefault();\n\n handleExpand(id);\n };\n\n const focusPrevious = () => {\n const previousIndex = (currentIndex + items.length - 1) % items.length;\n items[previousIndex].focus();\n };\n\n const focusNext = () => {\n const nextIndex = (currentIndex + 1) % items.length;\n items[nextIndex].focus();\n };\n\n switch (code) {\n case KeyboardCode.Enter:\n toggleSelect();\n\n break;\n\n case KeyboardCode.Space:\n hasChildren ? toggleExpand() : toggleSelect();\n\n break;\n\n case KeyboardCode.Right:\n if (!hasChildren) {\n break;\n }\n\n isExpanded ? focusNext() : toggleExpand();\n\n break;\n\n case KeyboardCode.Left:\n if (hasChildren && isExpanded) {\n toggleExpand();\n } else if (parentId && parentId !== ROOT_ID) {\n const parentIndex = treeState.nodes.findIndex((node) => node.props.id === parentId);\n\n items[parentIndex].focus();\n }\n break;\n\n case KeyboardCode.Up:\n event.preventDefault();\n focusPrevious();\n\n break;\n\n case KeyboardCode.Down:\n event.preventDefault();\n focusNext();\n\n break;\n\n default:\n break;\n }\n },\n [handleExpand, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset,\n });\n\n const [coordinateGetter] = useState(() => sortableTreeKeyboardCoordinates(sensorContext));\n\n const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter }));\n\n const announcements: TreeAnnouncements = useMemo(() => {\n const getActiveTitle = (active: TreeActive) =>\n treeState.nodes.find((node) => node.key === active.id)?.props.contentComponent?.props.title;\n const getOverTitle = (over: TreeOver | null) =>\n treeState.nodes.find((node) => node.key === over?.id)?.props.contentComponent?.props.title;\n\n return {\n onDragStart({ active }) {\n return `Picked up ${getActiveTitle(active) || active.id}.`;\n },\n onDragMove({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragMove',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragOver({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragOver',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragEnd({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragEnd',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragCancel({ active }) {\n const nodeTitle = treeState.nodes.find((node) => node.key === active.id)?.props.contentComponent\n .props.title;\n\n return `Moving was cancelled. ${nodeTitle || active.id} was dropped in its original position.`;\n },\n };\n }, [currentPosition, treeState]);\n\n useLayoutEffect(() => {\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: removeFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const nodes = useMemo(\n () =>\n treeState.nodes.map((node) => {\n return cloneElement(node, {\n ...node.props,\n projection: node.props.id === activeId ? treeState.projection : null,\n treeDraggable: draggable,\n isSelected: treeState.selectedIds.has(node.props.id),\n isExpanded: treeState.expandedIds.has(node.props.id),\n registerOverlay,\n registerNodeChildren,\n unregisterNodeChildren,\n onExpand: handleExpand,\n onSelect: handleSelect,\n });\n }),\n [\n draggable,\n handleExpand,\n handleSelect,\n activeId,\n registerNodeChildren,\n registerOverlay,\n treeState.expandedIds,\n treeState.nodes,\n treeState.projection,\n treeState.selectedIds,\n unregisterNodeChildren,\n ],\n );\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n }),\n [treeState, handleSelect, handleExpand],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n collisionDetection={closestCenter}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay wrapperElement=\"ul\" dropAnimation={null} modifiers={[restrictToWindowEdges]}>\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["ROOT_ID","INDENTATION_WIDTH","measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newSelected","isSelected","newExpanded","id","children","index","node","sliceIndex","currentNodeChildrenIds","newNodeChildrenIds","isEqual","nodes","self","item","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","onDrop","onSelect","onExpand","selectedIds","expandedIds","draggable","multiselect","dataTestId","initialState","useMemo","removeFragmentsAndEnrichChildren","treeState","updateTreeState","useReducer","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","items","useEffect","keyDownHandler","event","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","handleExpand","handleDragEnd","resetState","over","active","_a","_b","handleDragStart","activeNode","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","activeElement","child","currentIndex","isExpanded","parentId","hasChildren","code","toggleSelect","toggleExpand","focusPrevious","previousIndex","focusNext","nextIndex","KeyboardCode","parentIndex","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getActiveTitle","getOverTitle","getMovementAnnouncement","useLayoutEffect","projection","getProjection","cloneElement","contextValue","React","TreeContext","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, {\n cloneElement,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { enableMapSet, produce } from 'immer';\nimport { createPortal } from 'react-dom';\nimport { isEqual } from 'lodash-es';\nimport {\n DndContext,\n DragEndEvent,\n DragMoveEvent,\n DragOverlay,\n KeyboardCode,\n KeyboardSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\n\nimport type {\n RegisterNodeChildrenPayload,\n SensorContext,\n TreeActive,\n TreeAnnouncements,\n TreeDragOverEvent,\n TreeDragStartEvent,\n TreeOver,\n TreeProps,\n TreeState,\n TreeStateAction,\n} from '@components/Tree/types';\n\nimport { type Overlay, TreeItemOverlay } from './TreeItem';\nimport {\n getMovementAnnouncement,\n getProjection,\n getReactNodeIdsInFlatArray,\n removeReactNodesFromFlatArray,\n} from './helpers';\nimport { removeFragmentsAndEnrichChildren, sortableTreeKeyboardCoordinates } from './utils';\nimport { TreeContext, TreeContextProps } from './TreeContext';\n\nexport const ROOT_ID = '__ROOT__';\nexport const INDENTATION_WIDTH = 32;\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'SET_SELECT':\n {\n const newSelected = new Set(draft.selectedIds);\n\n const isSelected = !draft.selectedIds.has(action.payload);\n\n if (isSelected && draft.selectionMode === 'single') {\n newSelected.clear();\n }\n\n isSelected ? newSelected.add(action.payload) : newSelected.delete(action.payload);\n\n draft.selectedIds = newSelected;\n }\n break;\n\n case 'SET_EXPAND':\n {\n const newExpanded = new Set(draft.expandedIds);\n\n const isExpanded = !draft.expandedIds.has(action.payload);\n\n isExpanded ? newExpanded.add(action.payload) : newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n }\n break;\n\n case 'SET_SELECTION_MODE':\n {\n draft.selectionMode = action.payload.selectionMode;\n }\n break;\n\n case 'SET_PROJECTION':\n {\n draft.projection = action.payload;\n }\n break;\n\n case 'REGISTER_OVERLAY_ITEM':\n {\n draft.overlay = action.payload;\n }\n break;\n\n case 'REGISTER_NODE_CHILDREN':\n {\n const { id, children } = action.payload;\n\n const index = draft.nodes.findIndex((node) => node.props.id === id);\n\n if (index === -1) {\n console.error(`Element with ID \"${id}\" not found.`);\n return;\n }\n\n const sliceIndex = index + 1;\n\n const currentNodeChildrenIds = draft.nodes\n .slice(sliceIndex, children.length - 1)\n .map((node) => node.props.id);\n\n const newNodeChildrenIds = children.map((node) => node.props.id);\n\n if (isEqual(currentNodeChildrenIds, newNodeChildrenIds)) {\n return;\n }\n\n const nodes = [\n ...draft.nodes.slice(0, sliceIndex),\n ...children,\n ...draft.nodes.slice(sliceIndex),\n ].filter(\n (node, index, self) =>\n index === self.findIndex((item) => item.key === node.key) &&\n ((node.props.parentId === id && newNodeChildrenIds.includes(node.key)) ||\n node.props.parentId !== id),\n );\n\n draft.nodes = nodes;\n }\n break;\n\n case 'UNREGISTER_NODE_CHILDREN':\n {\n const nodeIds = getReactNodeIdsInFlatArray(draft.nodes, action.payload);\n\n draft.nodes = removeReactNodesFromFlatArray(draft.nodes, nodeIds);\n }\n break;\n\n case 'REGISTER_ROOT_NODES':\n {\n draft.nodes = action.payload;\n }\n break;\n\n case 'REPLACE_EXPANDED':\n {\n draft.expandedIds = new Set(action.payload);\n }\n break;\n\n case 'REPLACE_SELECTED':\n {\n draft.selectedIds = new Set(action.payload);\n }\n break;\n\n case 'REPLACE_STATE':\n draft.nodes = action.payload.nodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n break;\n default:\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect,\n onExpand,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n nodes: removeFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n projection: null,\n }),\n [children, expandedIds, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [offset, setOffset] = useState(0);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n const items = useMemo(() => treeState.nodes.map((node) => node.props.id), [treeState.nodes]);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string) => {\n if (onSelect) {\n return onSelect(id);\n }\n\n updateTreeState({\n type: 'SET_SELECT',\n payload: id,\n });\n },\n [onSelect],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'SET_EXPAND',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n });\n },\n [onDrop, treeState.projection?.parentId, treeState.projection?.position],\n );\n\n const handleDragStart = ({ active: { id: activeId } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n const activeNode = treeState.nodes.find((node) => node.props.id === activeId);\n\n if (activeNode) {\n setCurrentPosition({\n parentId: activeNode.props.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', '');\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLUListElement>) => {\n const activeElement = document.activeElement;\n\n if (!activeElement || !activeElement.parentElement || !(activeElement instanceof HTMLLIElement)) {\n return;\n }\n\n const items = Array.from(activeElement.parentElement.children).filter(\n (child) => child.nodeName === 'LI',\n ) as HTMLLIElement[];\n\n const currentIndex = items.indexOf(activeElement);\n\n const node = treeState.nodes[currentIndex];\n\n const id: string = node.props.id;\n const isExpanded = treeState.expandedIds.has(id);\n const parentId: string = node.props.parentId;\n const hasChildren = activeElement.getAttribute('data-has-children') === 'true';\n\n const { code } = event;\n\n const toggleSelect = () => {\n event.preventDefault();\n\n handleSelect(id);\n };\n\n const toggleExpand = () => {\n event.preventDefault();\n\n handleExpand(id);\n };\n\n const focusPrevious = () => {\n const previousIndex = (currentIndex + items.length - 1) % items.length;\n items[previousIndex].focus();\n };\n\n const focusNext = () => {\n const nextIndex = (currentIndex + 1) % items.length;\n items[nextIndex].focus();\n };\n\n switch (code) {\n case KeyboardCode.Enter:\n toggleSelect();\n\n break;\n\n case KeyboardCode.Space:\n hasChildren ? toggleExpand() : toggleSelect();\n\n break;\n\n case KeyboardCode.Right:\n if (!hasChildren) {\n break;\n }\n\n isExpanded ? focusNext() : toggleExpand();\n\n break;\n\n case KeyboardCode.Left:\n if (hasChildren && isExpanded) {\n toggleExpand();\n } else if (parentId && parentId !== ROOT_ID) {\n const parentIndex = treeState.nodes.findIndex((node) => node.props.id === parentId);\n\n items[parentIndex].focus();\n }\n break;\n\n case KeyboardCode.Up:\n event.preventDefault();\n focusPrevious();\n\n break;\n\n case KeyboardCode.Down:\n event.preventDefault();\n focusNext();\n\n break;\n\n default:\n break;\n }\n },\n [handleExpand, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset,\n });\n\n const [coordinateGetter] = useState(() => sortableTreeKeyboardCoordinates(sensorContext));\n\n const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter }));\n\n const announcements: TreeAnnouncements = useMemo(() => {\n const getActiveTitle = (active: TreeActive) =>\n treeState.nodes.find((node) => node.key === active.id)?.props.contentComponent?.props.title;\n const getOverTitle = (over: TreeOver | null) =>\n treeState.nodes.find((node) => node.key === over?.id)?.props.contentComponent?.props.title;\n\n return {\n onDragStart({ active }) {\n return `Picked up ${getActiveTitle(active) || active.id}.`;\n },\n onDragMove({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragMove',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragOver({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragOver',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragEnd({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragEnd',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragCancel({ active }) {\n const nodeTitle = treeState.nodes.find((node) => node.key === active.id)?.props.contentComponent\n .props.title;\n\n return `Moving was cancelled. ${nodeTitle || active.id} was dropped in its original position.`;\n },\n };\n }, [currentPosition, treeState]);\n\n useLayoutEffect(() => {\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: removeFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const nodes = useMemo(\n () =>\n treeState.nodes.map((node) => {\n return cloneElement(node, {\n ...node.props,\n projection: node.props.id === activeId ? treeState.projection : null,\n treeDraggable: draggable,\n isSelected: treeState.selectedIds.has(node.props.id),\n isExpanded: treeState.expandedIds.has(node.props.id),\n registerOverlay,\n registerNodeChildren,\n unregisterNodeChildren,\n onExpand: handleExpand,\n onSelect: handleSelect,\n });\n }),\n [\n draggable,\n handleExpand,\n handleSelect,\n activeId,\n registerNodeChildren,\n registerOverlay,\n treeState.expandedIds,\n treeState.nodes,\n treeState.projection,\n treeState.selectedIds,\n unregisterNodeChildren,\n ],\n );\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n }),\n [treeState, handleSelect, handleExpand],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n collisionDetection={closestCenter}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay wrapperElement=\"ul\" dropAnimation={null} modifiers={[restrictToWindowEdges]}>\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["ROOT_ID","INDENTATION_WIDTH","measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newSelected","isSelected","newExpanded","id","children","index","node","sliceIndex","currentNodeChildrenIds","newNodeChildrenIds","isEqual","nodes","self","item","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","onDrop","onSelect","onExpand","selectedIds","expandedIds","draggable","multiselect","dataTestId","initialState","useMemo","removeFragmentsAndEnrichChildren","treeState","updateTreeState","useReducer","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","items","useEffect","keyDownHandler","event","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","handleExpand","handleDragEnd","resetState","over","active","_a","_b","handleDragStart","activeNode","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","activeElement","child","currentIndex","isExpanded","parentId","hasChildren","code","toggleSelect","toggleExpand","focusPrevious","previousIndex","focusNext","nextIndex","KeyboardCode","parentIndex","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getActiveTitle","getOverTitle","getMovementAnnouncement","useLayoutEffect","projection","getProjection","cloneElement","contextValue","React","TreeContext","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}