@lv-x-software-house/x_view 1.2.6-dev.19 → 1.2.6-dev.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13282,12 +13282,19 @@ function RichGroupEditor({
13282
13282
  }
13283
13283
 
13284
13284
  // src/components/AncestryBoard.jsx
13285
+ var Tooltip = ({ text, children }) => {
13286
+ if (!text) return children;
13287
+ return /* @__PURE__ */ import_react29.default.createElement("div", { className: "relative group/tooltip" }, children, /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-slate-900 border border-white/10 text-white text-[10px] rounded opacity-0 group-hover/tooltip:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-[3000] shadow-2xl" }, text));
13288
+ };
13285
13289
  var BoardItem = ({
13286
13290
  item,
13287
13291
  index,
13292
+ prevItem,
13293
+ nextItem,
13288
13294
  onUpdate,
13289
13295
  onDelete,
13290
13296
  onIndent,
13297
+ onIndentDown,
13291
13298
  onOutdent,
13292
13299
  onMoveUp,
13293
13300
  onMoveDown,
@@ -13298,9 +13305,21 @@ var BoardItem = ({
13298
13305
  }) => {
13299
13306
  var _a;
13300
13307
  const isFolder = item.type === "folder";
13301
- const canIndent = index > 0;
13302
13308
  const canMoveUp = index > 0;
13303
- const isFirstItem = index === 0;
13309
+ const canMoveDown = nextItem !== void 0;
13310
+ const isNested = onOutdent !== void 0;
13311
+ const getIndentUpTooltip = () => {
13312
+ if (!prevItem) return null;
13313
+ const typeLabel = prevItem.type === "folder" ? "folder" : "text_group";
13314
+ return isFolder ? prevItem.type === "folder" ? "Aninhar na pasta acima" : null : `Mover para dentro do ${typeLabel} acima`;
13315
+ };
13316
+ const getIndentDownTooltip = () => {
13317
+ if (!nextItem) return null;
13318
+ const typeLabel = nextItem.type === "folder" ? "folder" : "text_group";
13319
+ return isFolder ? nextItem.type === "folder" ? "Aninhar na pasta abaixo" : null : `Mover para dentro do ${typeLabel} abaixo`;
13320
+ };
13321
+ const showIndentUp = !!getIndentUpTooltip();
13322
+ const showIndentDown = !!getIndentDownTooltip();
13304
13323
  const handleContentChange = (content) => {
13305
13324
  onUpdate(item.id, { ...item, content });
13306
13325
  };
@@ -13326,7 +13345,7 @@ var BoardItem = ({
13326
13345
  placeholder: "Nome da pasta..."
13327
13346
  }
13328
13347
  ) : /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-sm font-medium text-slate-200" }, item.name), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-2 mt-0.5" }, /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider font-semibold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens"))),
13329
- /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1.5 opacity-0 group-item/item:opacity-100 group-hover/folder:opacity-100 transition-opacity" }, canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-0.5 bg-slate-900/80 backdrop-blur-sm p-1 rounded-lg border border-white/5 shadow-xl" }, /* @__PURE__ */ import_react29.default.createElement(
13348
+ /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1.5 opacity-0 group-item/item:opacity-100 group-hover/folder:opacity-100 transition-opacity" }, canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-0.5 bg-slate-900/80 backdrop-blur-sm p-1 rounded-lg border border-white/5 shadow-xl" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ import_react29.default.createElement(
13330
13349
  "button",
13331
13350
  {
13332
13351
  onClick: (e) => {
@@ -13334,56 +13353,62 @@ var BoardItem = ({
13334
13353
  onMoveUp(item.id);
13335
13354
  },
13336
13355
  disabled: !canMoveUp,
13337
- className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`,
13338
- title: "Subir"
13356
+ className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13339
13357
  },
13340
13358
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13341
- ), /* @__PURE__ */ import_react29.default.createElement(
13359
+ )), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
13342
13360
  "button",
13343
13361
  {
13344
13362
  onClick: (e) => {
13345
13363
  e.stopPropagation();
13346
13364
  onMoveDown(item.id);
13347
13365
  },
13348
- className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors",
13349
- title: "Descer"
13366
+ disabled: !canMoveDown,
13367
+ className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13350
13368
  },
13351
13369
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13352
- ), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ import_react29.default.createElement(
13370
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13353
13371
  "button",
13354
13372
  {
13355
13373
  onClick: (e) => {
13356
13374
  e.stopPropagation();
13357
13375
  onIndent(item.id);
13358
13376
  },
13359
- disabled: !canIndent,
13360
- className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`,
13361
- title: "Aninhar"
13377
+ className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13362
13378
  },
13363
13379
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13364
- ), /* @__PURE__ */ import_react29.default.createElement(
13380
+ )), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13365
13381
  "button",
13366
13382
  {
13367
13383
  onClick: (e) => {
13368
13384
  e.stopPropagation();
13369
- onOutdent(item.id);
13385
+ onIndentDown(item.id);
13370
13386
  },
13371
- className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors",
13372
- title: "Desaninhar"
13387
+ className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13373
13388
  },
13374
13389
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13375
- ), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ import_react29.default.createElement(
13390
+ )), (isNested || !showIndentUp && !showIndentDown) && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
13391
+ "button",
13392
+ {
13393
+ onClick: (e) => {
13394
+ e.stopPropagation();
13395
+ onOutdent(item.id);
13396
+ },
13397
+ disabled: !onOutdent,
13398
+ className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13399
+ },
13400
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpRight, { size: 14 })
13401
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Pasta" }, /* @__PURE__ */ import_react29.default.createElement(
13376
13402
  "button",
13377
13403
  {
13378
13404
  onClick: (e) => {
13379
13405
  e.stopPropagation();
13380
13406
  onDelete(item.id);
13381
13407
  },
13382
- className: "p-1.5 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
13383
- title: "Remover Pasta"
13408
+ className: "p-1.5 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13384
13409
  },
13385
13410
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13386
- )), /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiChevronRight, { className: "text-slate-500 group-hover/folder:translate-x-1 transition-transform" }))
13411
+ ))), /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiChevronRight, { className: "text-slate-500 group-hover/folder:translate-x-1 transition-transform" }))
13387
13412
  ));
13388
13413
  }
13389
13414
  return /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col gap-2 py-2 px-3 transition-all duration-200 hover:bg-white/5 border-l-2 border-transparent hover:border-white/20" }, /* @__PURE__ */ import_react29.default.createElement(
@@ -13405,58 +13430,64 @@ var BoardItem = ({
13405
13430
  },
13406
13431
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiPlus, { size: 12 }),
13407
13432
  /* @__PURE__ */ import_react29.default.createElement("span", null, "Subgrupo")
13408
- )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(
13433
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ import_react29.default.createElement(
13409
13434
  "button",
13410
13435
  {
13411
13436
  onClick: () => onMoveUp(item.id),
13412
13437
  disabled: !canMoveUp,
13413
- className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
13414
- title: "Subir"
13438
+ className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13415
13439
  },
13416
13440
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13417
- ), /* @__PURE__ */ import_react29.default.createElement(
13441
+ )), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
13418
13442
  "button",
13419
13443
  {
13420
13444
  onClick: () => onMoveDown(item.id),
13421
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13422
- title: "Descer"
13445
+ disabled: !canMoveDown,
13446
+ className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13423
13447
  },
13424
13448
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13425
- ), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react29.default.createElement(
13449
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13426
13450
  "button",
13427
13451
  {
13428
13452
  onClick: () => onIndent(item.id),
13429
- disabled: !canIndent,
13430
- className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
13431
- title: "Aninhar no grupo acima"
13453
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13432
13454
  },
13433
13455
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13434
- ), /* @__PURE__ */ import_react29.default.createElement(
13456
+ )), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13435
13457
  "button",
13436
13458
  {
13437
- onClick: () => onOutdent(item.id),
13438
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13439
- title: "Desaninhar"
13459
+ onClick: () => onIndentDown(item.id),
13460
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13440
13461
  },
13441
13462
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13442
- ), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react29.default.createElement(
13463
+ )), (isNested || !showIndentUp && !showIndentDown) && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
13464
+ "button",
13465
+ {
13466
+ onClick: () => onOutdent(item.id),
13467
+ disabled: !onOutdent,
13468
+ className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13469
+ },
13470
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpRight, { size: 14 })
13471
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Grupo" }, /* @__PURE__ */ import_react29.default.createElement(
13443
13472
  "button",
13444
13473
  {
13445
13474
  onClick: () => onDelete(item.id),
13446
- className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
13447
- title: "Remover Grupo"
13475
+ className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13448
13476
  },
13449
13477
  /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13450
- )))), item.children && item.children.length > 0 && /* @__PURE__ */ import_react29.default.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ import_react29.default.createElement(
13478
+ ))))), item.children && item.children.length > 0 && /* @__PURE__ */ import_react29.default.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ import_react29.default.createElement(
13451
13479
  BoardItem,
13452
13480
  {
13453
13481
  key: child.id,
13454
13482
  index: idx,
13483
+ prevItem: item.children[idx - 1],
13484
+ nextItem: item.children[idx + 1],
13455
13485
  item: child,
13456
13486
  onUpdate,
13457
13487
  onDelete,
13458
13488
  onAddSubgroup,
13459
13489
  onIndent,
13490
+ onIndentDown,
13460
13491
  onOutdent,
13461
13492
  onMoveUp,
13462
13493
  onMoveDown,
@@ -13673,6 +13704,20 @@ function AncestryBoard({
13673
13704
  setGroups(next);
13674
13705
  triggerInstantSave(next);
13675
13706
  };
13707
+ const handleIndentDown = (id) => {
13708
+ const next = JSON.parse(JSON.stringify(groups));
13709
+ const found = findGroupAndParent(next, id);
13710
+ if (!found || found.index === found.siblings.length - 1) return;
13711
+ const { group, siblings, index } = found;
13712
+ const targetParent = siblings[index + 1];
13713
+ if (group.type === "folder" && targetParent.type === "group") {
13714
+ return;
13715
+ }
13716
+ siblings.splice(index, 1);
13717
+ targetParent.children.push(group);
13718
+ setGroups(next);
13719
+ triggerInstantSave(next);
13720
+ };
13676
13721
  const handleOutdent = (id) => {
13677
13722
  const next = JSON.parse(JSON.stringify(groups));
13678
13723
  const found = findGroupAndParent(next, id);
@@ -13778,11 +13823,14 @@ function AncestryBoard({
13778
13823
  {
13779
13824
  key: item.id,
13780
13825
  index,
13826
+ prevItem: currentGroups[index - 1],
13827
+ nextItem: currentGroups[index + 1],
13781
13828
  item,
13782
13829
  onUpdate: handleUpdateItem,
13783
13830
  onDelete: handleDeleteItem,
13784
13831
  onAddSubgroup: handleAddSubgroup,
13785
13832
  onIndent: handleIndent,
13833
+ onIndentDown: handleIndentDown,
13786
13834
  onOutdent: handleOutdent,
13787
13835
  onMoveUp: handleMoveUp,
13788
13836
  onMoveDown: handleMoveDown,
package/dist/index.mjs CHANGED
@@ -13332,12 +13332,19 @@ function RichGroupEditor({
13332
13332
  }
13333
13333
 
13334
13334
  // src/components/AncestryBoard.jsx
13335
+ var Tooltip = ({ text, children }) => {
13336
+ if (!text) return children;
13337
+ return /* @__PURE__ */ React28.createElement("div", { className: "relative group/tooltip" }, children, /* @__PURE__ */ React28.createElement("div", { className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-slate-900 border border-white/10 text-white text-[10px] rounded opacity-0 group-hover/tooltip:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-[3000] shadow-2xl" }, text));
13338
+ };
13335
13339
  var BoardItem = ({
13336
13340
  item,
13337
13341
  index,
13342
+ prevItem,
13343
+ nextItem,
13338
13344
  onUpdate,
13339
13345
  onDelete,
13340
13346
  onIndent,
13347
+ onIndentDown,
13341
13348
  onOutdent,
13342
13349
  onMoveUp,
13343
13350
  onMoveDown,
@@ -13348,9 +13355,21 @@ var BoardItem = ({
13348
13355
  }) => {
13349
13356
  var _a;
13350
13357
  const isFolder = item.type === "folder";
13351
- const canIndent = index > 0;
13352
13358
  const canMoveUp = index > 0;
13353
- const isFirstItem = index === 0;
13359
+ const canMoveDown = nextItem !== void 0;
13360
+ const isNested = onOutdent !== void 0;
13361
+ const getIndentUpTooltip = () => {
13362
+ if (!prevItem) return null;
13363
+ const typeLabel = prevItem.type === "folder" ? "folder" : "text_group";
13364
+ return isFolder ? prevItem.type === "folder" ? "Aninhar na pasta acima" : null : `Mover para dentro do ${typeLabel} acima`;
13365
+ };
13366
+ const getIndentDownTooltip = () => {
13367
+ if (!nextItem) return null;
13368
+ const typeLabel = nextItem.type === "folder" ? "folder" : "text_group";
13369
+ return isFolder ? nextItem.type === "folder" ? "Aninhar na pasta abaixo" : null : `Mover para dentro do ${typeLabel} abaixo`;
13370
+ };
13371
+ const showIndentUp = !!getIndentUpTooltip();
13372
+ const showIndentDown = !!getIndentDownTooltip();
13354
13373
  const handleContentChange = (content) => {
13355
13374
  onUpdate(item.id, { ...item, content });
13356
13375
  };
@@ -13376,7 +13395,7 @@ var BoardItem = ({
13376
13395
  placeholder: "Nome da pasta..."
13377
13396
  }
13378
13397
  ) : /* @__PURE__ */ React28.createElement("span", { className: "text-sm font-medium text-slate-200" }, item.name), /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-2 mt-0.5" }, /* @__PURE__ */ React28.createElement("span", { className: "text-[10px] text-slate-500 uppercase tracking-wider font-semibold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens"))),
13379
- /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-1.5 opacity-0 group-item/item:opacity-100 group-hover/folder:opacity-100 transition-opacity" }, canEdit && /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-0.5 bg-slate-900/80 backdrop-blur-sm p-1 rounded-lg border border-white/5 shadow-xl" }, /* @__PURE__ */ React28.createElement(
13398
+ /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-1.5 opacity-0 group-item/item:opacity-100 group-hover/folder:opacity-100 transition-opacity" }, canEdit && /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-0.5 bg-slate-900/80 backdrop-blur-sm p-1 rounded-lg border border-white/5 shadow-xl" }, /* @__PURE__ */ React28.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ React28.createElement(
13380
13399
  "button",
13381
13400
  {
13382
13401
  onClick: (e) => {
@@ -13384,56 +13403,62 @@ var BoardItem = ({
13384
13403
  onMoveUp(item.id);
13385
13404
  },
13386
13405
  disabled: !canMoveUp,
13387
- className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`,
13388
- title: "Subir"
13406
+ className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13389
13407
  },
13390
13408
  /* @__PURE__ */ React28.createElement(FiArrowUp, { size: 14 })
13391
- ), /* @__PURE__ */ React28.createElement(
13409
+ )), /* @__PURE__ */ React28.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ React28.createElement(
13392
13410
  "button",
13393
13411
  {
13394
13412
  onClick: (e) => {
13395
13413
  e.stopPropagation();
13396
13414
  onMoveDown(item.id);
13397
13415
  },
13398
- className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors",
13399
- title: "Descer"
13416
+ disabled: !canMoveDown,
13417
+ className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13400
13418
  },
13401
13419
  /* @__PURE__ */ React28.createElement(FiArrowDown, { size: 14 })
13402
- ), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ React28.createElement(
13420
+ )), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), showIndentUp && /* @__PURE__ */ React28.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ React28.createElement(
13403
13421
  "button",
13404
13422
  {
13405
13423
  onClick: (e) => {
13406
13424
  e.stopPropagation();
13407
13425
  onIndent(item.id);
13408
13426
  },
13409
- disabled: !canIndent,
13410
- className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`,
13411
- title: "Aninhar"
13427
+ className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13412
13428
  },
13413
13429
  /* @__PURE__ */ React28.createElement(FiArrowRight2, { size: 14 })
13414
- ), /* @__PURE__ */ React28.createElement(
13430
+ )), showIndentDown && /* @__PURE__ */ React28.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ React28.createElement(
13415
13431
  "button",
13416
13432
  {
13417
13433
  onClick: (e) => {
13418
13434
  e.stopPropagation();
13419
- onOutdent(item.id);
13435
+ onIndentDown(item.id);
13420
13436
  },
13421
- className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors",
13422
- title: "Desaninhar"
13437
+ className: "p-1.5 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13423
13438
  },
13424
13439
  /* @__PURE__ */ React28.createElement(FiArrowLeft3, { size: 14 })
13425
- ), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ React28.createElement(
13440
+ )), (isNested || !showIndentUp && !showIndentDown) && /* @__PURE__ */ React28.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ React28.createElement(
13441
+ "button",
13442
+ {
13443
+ onClick: (e) => {
13444
+ e.stopPropagation();
13445
+ onOutdent(item.id);
13446
+ },
13447
+ disabled: !onOutdent,
13448
+ className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13449
+ },
13450
+ /* @__PURE__ */ React28.createElement(FiCornerUpRight4, { size: 14 })
13451
+ )), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-0.5" }), /* @__PURE__ */ React28.createElement(Tooltip, { text: "Remover Pasta" }, /* @__PURE__ */ React28.createElement(
13426
13452
  "button",
13427
13453
  {
13428
13454
  onClick: (e) => {
13429
13455
  e.stopPropagation();
13430
13456
  onDelete(item.id);
13431
13457
  },
13432
- className: "p-1.5 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
13433
- title: "Remover Pasta"
13458
+ className: "p-1.5 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13434
13459
  },
13435
13460
  /* @__PURE__ */ React28.createElement(FiTrash23, { size: 14 })
13436
- )), /* @__PURE__ */ React28.createElement(FiChevronRight7, { className: "text-slate-500 group-hover/folder:translate-x-1 transition-transform" }))
13461
+ ))), /* @__PURE__ */ React28.createElement(FiChevronRight7, { className: "text-slate-500 group-hover/folder:translate-x-1 transition-transform" }))
13437
13462
  ));
13438
13463
  }
13439
13464
  return /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col gap-2 mb-3 pl-3 border-l border-white/10 relative group/item animate-in fade-in slide-in-from-left-2 duration-300" }, /* @__PURE__ */ React28.createElement("div", { className: "absolute -left-[1px] top-4 w-2 h-px bg-white/20" }), /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col gap-2 py-2 px-3 transition-all duration-200 hover:bg-white/5 border-l-2 border-transparent hover:border-white/20" }, /* @__PURE__ */ React28.createElement(
@@ -13455,58 +13480,64 @@ var BoardItem = ({
13455
13480
  },
13456
13481
  /* @__PURE__ */ React28.createElement(FiPlus10, { size: 12 }),
13457
13482
  /* @__PURE__ */ React28.createElement("span", null, "Subgrupo")
13458
- )), /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ React28.createElement(
13483
+ )), /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ React28.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ React28.createElement(
13459
13484
  "button",
13460
13485
  {
13461
13486
  onClick: () => onMoveUp(item.id),
13462
13487
  disabled: !canMoveUp,
13463
- className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
13464
- title: "Subir"
13488
+ className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13465
13489
  },
13466
13490
  /* @__PURE__ */ React28.createElement(FiArrowUp, { size: 14 })
13467
- ), /* @__PURE__ */ React28.createElement(
13491
+ )), /* @__PURE__ */ React28.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ React28.createElement(
13468
13492
  "button",
13469
13493
  {
13470
13494
  onClick: () => onMoveDown(item.id),
13471
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13472
- title: "Descer"
13495
+ disabled: !canMoveDown,
13496
+ className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13473
13497
  },
13474
13498
  /* @__PURE__ */ React28.createElement(FiArrowDown, { size: 14 })
13475
- ), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ React28.createElement(
13499
+ )), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), showIndentUp && /* @__PURE__ */ React28.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ React28.createElement(
13476
13500
  "button",
13477
13501
  {
13478
13502
  onClick: () => onIndent(item.id),
13479
- disabled: !canIndent,
13480
- className: `p-1.5 rounded transition-colors ${!canIndent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`,
13481
- title: "Aninhar no grupo acima"
13503
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13482
13504
  },
13483
13505
  /* @__PURE__ */ React28.createElement(FiArrowRight2, { size: 14 })
13484
- ), /* @__PURE__ */ React28.createElement(
13506
+ )), showIndentDown && /* @__PURE__ */ React28.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ React28.createElement(
13485
13507
  "button",
13486
13508
  {
13487
- onClick: () => onOutdent(item.id),
13488
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13489
- title: "Desaninhar"
13509
+ onClick: () => onIndentDown(item.id),
13510
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13490
13511
  },
13491
13512
  /* @__PURE__ */ React28.createElement(FiArrowLeft3, { size: 14 })
13492
- ), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ React28.createElement(
13513
+ )), (isNested || !showIndentUp && !showIndentDown) && /* @__PURE__ */ React28.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ React28.createElement(
13514
+ "button",
13515
+ {
13516
+ onClick: () => onOutdent(item.id),
13517
+ disabled: !onOutdent,
13518
+ className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13519
+ },
13520
+ /* @__PURE__ */ React28.createElement(FiCornerUpRight4, { size: 14 })
13521
+ )), /* @__PURE__ */ React28.createElement("div", { className: "w-px h-3 bg-white/10 mx-1" }), /* @__PURE__ */ React28.createElement(Tooltip, { text: "Remover Grupo" }, /* @__PURE__ */ React28.createElement(
13493
13522
  "button",
13494
13523
  {
13495
13524
  onClick: () => onDelete(item.id),
13496
- className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",
13497
- title: "Remover Grupo"
13525
+ className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13498
13526
  },
13499
13527
  /* @__PURE__ */ React28.createElement(FiTrash23, { size: 14 })
13500
- )))), item.children && item.children.length > 0 && /* @__PURE__ */ React28.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ React28.createElement(
13528
+ ))))), item.children && item.children.length > 0 && /* @__PURE__ */ React28.createElement("div", { className: "ml-2" }, item.children.map((child, idx) => /* @__PURE__ */ React28.createElement(
13501
13529
  BoardItem,
13502
13530
  {
13503
13531
  key: child.id,
13504
13532
  index: idx,
13533
+ prevItem: item.children[idx - 1],
13534
+ nextItem: item.children[idx + 1],
13505
13535
  item: child,
13506
13536
  onUpdate,
13507
13537
  onDelete,
13508
13538
  onAddSubgroup,
13509
13539
  onIndent,
13540
+ onIndentDown,
13510
13541
  onOutdent,
13511
13542
  onMoveUp,
13512
13543
  onMoveDown,
@@ -13723,6 +13754,20 @@ function AncestryBoard({
13723
13754
  setGroups(next);
13724
13755
  triggerInstantSave(next);
13725
13756
  };
13757
+ const handleIndentDown = (id) => {
13758
+ const next = JSON.parse(JSON.stringify(groups));
13759
+ const found = findGroupAndParent(next, id);
13760
+ if (!found || found.index === found.siblings.length - 1) return;
13761
+ const { group, siblings, index } = found;
13762
+ const targetParent = siblings[index + 1];
13763
+ if (group.type === "folder" && targetParent.type === "group") {
13764
+ return;
13765
+ }
13766
+ siblings.splice(index, 1);
13767
+ targetParent.children.push(group);
13768
+ setGroups(next);
13769
+ triggerInstantSave(next);
13770
+ };
13726
13771
  const handleOutdent = (id) => {
13727
13772
  const next = JSON.parse(JSON.stringify(groups));
13728
13773
  const found = findGroupAndParent(next, id);
@@ -13828,11 +13873,14 @@ function AncestryBoard({
13828
13873
  {
13829
13874
  key: item.id,
13830
13875
  index,
13876
+ prevItem: currentGroups[index - 1],
13877
+ nextItem: currentGroups[index + 1],
13831
13878
  item,
13832
13879
  onUpdate: handleUpdateItem,
13833
13880
  onDelete: handleDeleteItem,
13834
13881
  onAddSubgroup: handleAddSubgroup,
13835
13882
  onIndent: handleIndent,
13883
+ onIndentDown: handleIndentDown,
13836
13884
  onOutdent: handleOutdent,
13837
13885
  onMoveUp: handleMoveUp,
13838
13886
  onMoveDown: handleMoveDown,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.6-dev.19",
3
+ "version": "1.2.6-dev.20",
4
4
  "description": "Pacote privado contendo os componentes e lógica de renderização 3D do X View.",
5
5
  "author": "iv.x - Engenharia de Software - ivxsoftwarehouse@gmail.com",
6
6
  "license": "UNLICENSED",