@lv-x-software-house/x_view 1.2.6-dev.37 → 1.2.6-dev.39

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.
Files changed (3) hide show
  1. package/dist/index.js +451 -330
  2. package/dist/index.mjs +458 -331
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8493,7 +8493,7 @@ var PRESET_COLORS = [
8493
8493
  "#ffffff",
8494
8494
  "#000000"
8495
8495
  ];
8496
- function ColorPicker({ color, onChange, disabled }) {
8496
+ function ColorPicker({ color, onChange, disabled, isCompact = false }) {
8497
8497
  const [isOpen, setIsOpen] = (0, import_react13.useState)(false);
8498
8498
  const popoverRef = (0, import_react13.useRef)(null);
8499
8499
  (0, import_react13.useEffect)(() => {
@@ -8511,27 +8511,87 @@ function ColorPicker({ color, onChange, disabled }) {
8511
8511
  onChange(val.startsWith("#") ? val : "#" + val);
8512
8512
  }
8513
8513
  };
8514
- return /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative w-full", ref: popoverRef }, /* @__PURE__ */ import_react13.default.createElement("div", { className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${disabled ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}` }, /* @__PURE__ */ import_react13.default.createElement(
8515
- "button",
8514
+ if (isCompact) {
8515
+ return /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative", ref: popoverRef }, /* @__PURE__ */ import_react13.default.createElement(
8516
+ "button",
8517
+ {
8518
+ type: "button",
8519
+ onClick: () => !disabled && setIsOpen(!isOpen),
8520
+ className: `h-5 w-5 rounded border border-white/20 shadow-sm transition-all hover:scale-110 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden ${disabled ? "opacity-40 grayscale pointer-events-none" : ""}`,
8521
+ style: { backgroundColor: color },
8522
+ title: "Alterar Cor"
8523
+ },
8524
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 shadow-[inset_0_0_2px_rgba(255,255,255,0.2)]" })
8525
+ ), isOpen && !disabled && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute bottom-full right-0 mb-2 z-[9999] p-3 bg-slate-950 rounded-xl border border-white/10 shadow-2xl w-[200px] animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "mb-3 custom-react-colorful" }, /* @__PURE__ */ import_react13.default.createElement(import_react_colorful.HexColorPicker, { color, onChange })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-px bg-white/10 my-3" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-5 gap-2" }, PRESET_COLORS.map((preset) => /* @__PURE__ */ import_react13.default.createElement(
8526
+ "button",
8527
+ {
8528
+ key: preset,
8529
+ type: "button",
8530
+ onClick: () => {
8531
+ onChange(preset);
8532
+ setIsOpen(false);
8533
+ },
8534
+ className: "w-full aspect-square rounded border border-white/5 hover:border-white/30 hover:scale-110 transition-all shadow-sm flex items-center justify-center",
8535
+ style: { backgroundColor: preset },
8536
+ title: preset
8537
+ },
8538
+ (color || "").toLowerCase() === (preset || "").toLowerCase() && /* @__PURE__ */ import_react13.default.createElement(
8539
+ import_fi12.FiCheck,
8540
+ {
8541
+ className: `drop-shadow-md ${["#ffffff", "#4df5cb", "#84cc16", "#f59e0b"].includes(preset) ? "text-black" : "text-white"}`,
8542
+ size: 12
8543
+ }
8544
+ )
8545
+ )))), /* @__PURE__ */ import_react13.default.createElement("style", null, `
8546
+ .custom-react-colorful .react-colorful {
8547
+ width: 100%;
8548
+ height: 150px;
8549
+ }
8550
+ .custom-react-colorful .react-colorful__saturation {
8551
+ border-radius: 8px 8px 0 0;
8552
+ border-bottom: 1px solid rgba(255,255,255,0.1);
8553
+ }
8554
+ .custom-react-colorful .react-colorful__hue {
8555
+ height: 16px;
8556
+ border-radius: 0 0 8px 8px;
8557
+ margin-top: 2px;
8558
+ }
8559
+ .custom-react-colorful .react-colorful__pointer {
8560
+ width: 16px;
8561
+ height: 16px;
8562
+ border: 2px solid #fff;
8563
+ box-shadow: 0 1px 4px rgba(0,0,0,0.5);
8564
+ }
8565
+ `));
8566
+ }
8567
+ return /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative w-full", ref: popoverRef }, /* @__PURE__ */ import_react13.default.createElement(
8568
+ "div",
8516
8569
  {
8517
- type: "button",
8518
- onClick: () => !disabled && setIsOpen(!isOpen),
8519
- className: "h-8 w-12 rounded-md border border-white/10 shadow-sm transition-transform hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden",
8520
- style: { backgroundColor: color },
8521
- title: "Abrir seletor de cor"
8570
+ className: `flex items-center gap-3 bg-slate-900/60 p-2.5 rounded-lg border border-white/10 transition-opacity duration-200 ${disabled ? "opacity-40 pointer-events-none grayscale" : "opacity-100"}`
8522
8571
  },
8523
- /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 shadow-[inset_0_0_2px_rgba(255,255,255,0.2)]" })
8524
- ), /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-800/50 rounded-md px-2 py-1.5 border border-white/5 focus-within:border-indigo-500/50 focus-within:ring-1 focus-within:ring-indigo-500/50 transition-all" }, /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiHash, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react13.default.createElement(
8525
- "input",
8526
- {
8527
- type: "text",
8528
- value: color.replace("#", ""),
8529
- onChange: handleInputChange,
8530
- disabled,
8531
- className: "w-full bg-transparent border-none focus:ring-0 text-sm text-slate-200 uppercase font-mono placeholder-slate-600 p-0",
8532
- maxLength: 6
8533
- }
8534
- ))), isOpen && !disabled && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute top-full left-0 mt-2 z-[9999] p-3 bg-slate-950 rounded-xl border border-white/10 shadow-2xl w-[200px] animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "mb-3 custom-react-colorful" }, /* @__PURE__ */ import_react13.default.createElement(import_react_colorful.HexColorPicker, { color, onChange })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-px bg-white/10 my-3" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-5 gap-2" }, PRESET_COLORS.map((preset) => /* @__PURE__ */ import_react13.default.createElement(
8572
+ /* @__PURE__ */ import_react13.default.createElement(
8573
+ "button",
8574
+ {
8575
+ type: "button",
8576
+ onClick: () => !disabled && setIsOpen(!isOpen),
8577
+ className: "h-8 w-12 rounded-md border border-white/10 shadow-sm transition-transform hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 relative overflow-hidden",
8578
+ style: { backgroundColor: color },
8579
+ title: "Abrir seletor de cor"
8580
+ },
8581
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 shadow-[inset_0_0_2px_rgba(255,255,255,0.2)]" })
8582
+ ),
8583
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-800/50 rounded-md px-2 py-1.5 border border-white/5 focus-within:border-indigo-500/50 focus-within:ring-1 focus-within:ring-indigo-500/50 transition-all" }, /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiHash, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react13.default.createElement(
8584
+ "input",
8585
+ {
8586
+ type: "text",
8587
+ value: color.replace("#", ""),
8588
+ onChange: handleInputChange,
8589
+ disabled,
8590
+ className: "w-full bg-transparent border-none focus:ring-0 text-sm text-slate-200 uppercase font-mono placeholder-slate-600 p-0",
8591
+ maxLength: 6
8592
+ }
8593
+ ))
8594
+ ), isOpen && !disabled && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute top-full left-0 mt-2 z-[9999] p-3 bg-slate-950 rounded-xl border border-white/10 shadow-2xl w-[200px] animate-in fade-in zoom-in-95 duration-100" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "mb-3 custom-react-colorful" }, /* @__PURE__ */ import_react13.default.createElement(import_react_colorful.HexColorPicker, { color, onChange })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "h-px bg-white/10 my-3" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-5 gap-2" }, PRESET_COLORS.map((preset) => /* @__PURE__ */ import_react13.default.createElement(
8535
8595
  "button",
8536
8596
  {
8537
8597
  key: preset,
@@ -13289,220 +13349,250 @@ var Tooltip = ({ text, children }) => {
13289
13349
  if (!text) return children;
13290
13350
  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));
13291
13351
  };
13292
- var BoardItem = import_react29.default.memo(({
13293
- item,
13294
- index,
13295
- prevItem,
13296
- nextItem,
13297
- onUpdate,
13298
- onDelete,
13299
- onAddSubgroup,
13300
- onIndent,
13301
- onIndentDown,
13302
- onOutdent,
13303
- onMoveUp,
13304
- onMoveDown,
13305
- searchItems,
13306
- onMentionClick,
13307
- onEnterFolder,
13308
- canEdit,
13309
- isAtRoot = false
13310
- }) => {
13311
- var _a;
13312
- const isFolder = item.type === "folder";
13313
- const canMoveUp = index > 0;
13314
- const canMoveDown = nextItem !== void 0;
13315
- const getIndentUpTooltip = () => {
13316
- if (!prevItem) return null;
13317
- const typeLabel = prevItem.type === "folder" ? "pasta" : "grupo de texto";
13318
- return isFolder ? prevItem.type === "folder" ? "Aninhar na pasta acima" : null : `Mover para dentro do ${typeLabel} acima`;
13319
- };
13320
- const getIndentDownTooltip = () => {
13321
- if (!nextItem) return null;
13322
- const typeLabel = nextItem.type === "folder" ? "pasta" : "grupo de texto";
13323
- return isFolder ? nextItem.type === "folder" ? "Aninhar na pasta abaixo" : null : `Mover para dentro do ${typeLabel} abaixo`;
13324
- };
13325
- const showIndentUp = !!getIndentUpTooltip();
13326
- const showIndentDown = !!getIndentDownTooltip();
13327
- const handleContentChange = (content) => {
13328
- onUpdate(item.id, { ...item, content });
13329
- };
13330
- const handleNameChange = (e) => {
13331
- onUpdate(item.id, { ...item, name: e.target.value });
13332
- };
13333
- if (isFolder) {
13334
- return /* @__PURE__ */ import_react29.default.createElement("div", { className: "relative group/item animate-in fade-in zoom-in duration-300 w-[calc(16.66%-14px)] min-w-[160px] h-14 flex-shrink-0" }, /* @__PURE__ */ import_react29.default.createElement(
13335
- "div",
13336
- {
13337
- onClick: () => onEnterFolder(item.id),
13338
- className: "h-full flex items-center gap-3 px-3 py-2 bg-white/5 hover:bg-white/10 border border-white/10 hover:border-white/20 rounded-xl cursor-pointer transition-all duration-300 group/folder relative overflow-hidden"
13339
- },
13340
- /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 left-0 w-1 bg-gradient-to-r from-indigo-500/20 to-transparent opacity-0 group-hover/folder:opacity-100 transition-opacity" }),
13341
- /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-9 h-9 rounded-lg bg-indigo-500/10 flex items-center justify-center text-indigo-400 group-hover/folder:scale-105 group-hover/folder:bg-indigo-500/20 transition-all duration-300 shadow-inner shrink-0" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiFolder, { size: 18 })),
13342
- /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(
13343
- "input",
13344
- {
13345
- type: "text",
13346
- value: item.name,
13347
- onChange: handleNameChange,
13348
- onClick: (e) => e.stopPropagation(),
13349
- className: "bg-transparent border-none outline-none text-xs font-semibold text-slate-200 w-full focus:text-white placeholder:text-slate-600 truncate",
13350
- placeholder: "Nome..."
13351
- }
13352
- ) : /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-xs font-semibold text-slate-200 block truncate" }, item.name), /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[9px] text-slate-500 uppercase tracking-widest font-bold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens")),
13353
- canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 right-1.5 opacity-0 group-hover/folder:opacity-100 transition-all duration-300 z-10 flex items-center" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex bg-slate-950/90 backdrop-blur-md p-1 rounded-lg border border-white/10 shadow-2xl items-center" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Mover" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react29.default.createElement(
13354
- "button",
13352
+ var BoardItem = import_react29.default.memo(
13353
+ ({
13354
+ item,
13355
+ index,
13356
+ prevItem,
13357
+ nextItem,
13358
+ onUpdate,
13359
+ onDelete,
13360
+ onAddSubgroup,
13361
+ onIndent,
13362
+ onIndentDown,
13363
+ onOutdent,
13364
+ onMoveUp,
13365
+ onMoveDown,
13366
+ searchItems,
13367
+ onMentionClick,
13368
+ onEnterFolder,
13369
+ canEdit,
13370
+ isAtRoot = false
13371
+ }) => {
13372
+ var _a;
13373
+ const isFolder = item.type === "folder";
13374
+ const canMoveUp = index > 0;
13375
+ const canMoveDown = nextItem !== void 0;
13376
+ const getIndentUpTooltip = () => {
13377
+ if (!prevItem) return null;
13378
+ const typeLabel = prevItem.type === "folder" ? "pasta" : "grupo de texto";
13379
+ return isFolder ? prevItem.type === "folder" ? "Aninhar na pasta ao lado" : null : `Mover para dentro do ${typeLabel} acima`;
13380
+ };
13381
+ const getIndentDownTooltip = () => {
13382
+ if (!nextItem) return null;
13383
+ const typeLabel = nextItem.type === "folder" ? "pasta" : "grupo de texto";
13384
+ return isFolder ? nextItem.type === "folder" ? "Aninhar na pasta lado" : null : `Mover para dentro do ${typeLabel} abaixo`;
13385
+ };
13386
+ const showIndentUp = !!getIndentUpTooltip();
13387
+ const showIndentDown = !!getIndentDownTooltip();
13388
+ const handleContentChange = (content) => {
13389
+ onUpdate(item.id, { ...item, content });
13390
+ };
13391
+ const handleNameChange = (e) => {
13392
+ onUpdate(item.id, { ...item, name: e.target.value });
13393
+ };
13394
+ const handleColorChange = (newColor) => {
13395
+ onUpdate(item.id, { ...item, color: newColor });
13396
+ };
13397
+ if (isFolder) {
13398
+ return /* @__PURE__ */ import_react29.default.createElement("div", { className: "relative group/item animate-in fade-in zoom-in duration-300 w-[calc(16.66%-14px)] min-w-[160px] h-14 flex-shrink-0" }, /* @__PURE__ */ import_react29.default.createElement(
13399
+ "div",
13355
13400
  {
13356
- onClick: (e) => {
13357
- e.stopPropagation();
13358
- onMoveUp(item.id);
13359
- },
13360
- disabled: !canMoveUp,
13361
- className: `p-1 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13401
+ onClick: () => onEnterFolder(item.id),
13402
+ className: "h-full flex items-center gap-3 px-3 py-2 bg-white/5 hover:bg-white/10 border border-white/10 hover:border-white/20 rounded-xl cursor-pointer transition-all duration-300 group/folder relative"
13362
13403
  },
13363
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13364
- ), /* @__PURE__ */ import_react29.default.createElement(
13365
- "button",
13366
- {
13367
- onClick: (e) => {
13368
- e.stopPropagation();
13369
- onMoveDown(item.id);
13404
+ /* @__PURE__ */ import_react29.default.createElement(
13405
+ "div",
13406
+ {
13407
+ className: "absolute inset-y-0 left-0 w-1 opacity-0 group-hover/folder:opacity-100 transition-opacity rounded-l-xl",
13408
+ style: { background: `linear-gradient(to right, ${item.color || "#6366f1"}33, transparent)` }
13409
+ }
13410
+ ),
13411
+ /* @__PURE__ */ import_react29.default.createElement(
13412
+ "div",
13413
+ {
13414
+ className: "w-9 h-9 rounded-lg flex items-center justify-center group-hover/folder:scale-105 transition-all duration-300 shadow-inner shrink-0",
13415
+ style: {
13416
+ backgroundColor: `${item.color || "#6366f1"}1a`,
13417
+ // 10% opacity
13418
+ color: item.color || "#6366f1"
13419
+ }
13370
13420
  },
13371
- disabled: !canMoveDown,
13372
- className: `p-1 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13373
- },
13374
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13375
- ))), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Aninhar" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center" }, showIndentUp && /* @__PURE__ */ import_react29.default.createElement(
13376
- "button",
13377
- {
13378
- onClick: (e) => {
13379
- e.stopPropagation();
13380
- onIndent(item.id);
13421
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiFolder, { size: 18 })
13422
+ ),
13423
+ /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(
13424
+ "input",
13425
+ {
13426
+ type: "text",
13427
+ value: item.name,
13428
+ onChange: handleNameChange,
13429
+ onClick: (e) => e.stopPropagation(),
13430
+ className: "bg-transparent border-none outline-none text-xs font-semibold text-slate-200 w-full focus:text-white placeholder:text-slate-600 truncate",
13431
+ placeholder: "Nome..."
13432
+ }
13433
+ ) : /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-xs font-semibold text-slate-200 block truncate" }, item.name), /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[9px] text-slate-500 uppercase tracking-widest font-bold" }, ((_a = item.children) == null ? void 0 : _a.length) || 0, " itens")),
13434
+ canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-y-0 right-1.5 opacity-0 group-hover/folder:opacity-100 transition-all duration-300 z-10 flex items-center" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex bg-slate-950/90 backdrop-blur-md p-1 rounded-lg border border-white/10 shadow-2xl items-center" }, /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Subir" }, /* @__PURE__ */ import_react29.default.createElement(
13435
+ "button",
13436
+ {
13437
+ onClick: (e) => {
13438
+ e.stopPropagation();
13439
+ onMoveUp(item.id);
13440
+ },
13441
+ disabled: !canMoveUp,
13442
+ className: `p-1 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13381
13443
  },
13382
- className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13383
- },
13384
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13385
- ), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(
13386
- "button",
13387
- {
13388
- onClick: (e) => {
13389
- e.stopPropagation();
13390
- onIndentDown(item.id);
13444
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13445
+ )), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
13446
+ "button",
13447
+ {
13448
+ onClick: (e) => {
13449
+ e.stopPropagation();
13450
+ onMoveDown(item.id);
13451
+ },
13452
+ disabled: !canMoveDown,
13453
+ className: `p-1 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-400 hover:text-white hover:bg-white/10"}`
13391
13454
  },
13392
- className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13393
- },
13394
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13395
- ))), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(
13396
- "button",
13397
- {
13398
- onClick: (e) => {
13399
- e.stopPropagation();
13400
- onOutdent(item.id);
13455
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13456
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), showIndentUp && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentUpTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13457
+ "button",
13458
+ {
13459
+ onClick: (e) => {
13460
+ e.stopPropagation();
13461
+ onIndent(item.id);
13462
+ },
13463
+ className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13401
13464
  },
13402
- className: `p-1 rounded text-slate-400 hover:text-white hover:bg-white/10 transition-colors`
13403
- },
13404
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
13405
- )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(
13406
- "button",
13407
- {
13408
- onClick: (e) => {
13409
- e.stopPropagation();
13410
- onDelete(item.id);
13465
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13466
+ )), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13467
+ "button",
13468
+ {
13469
+ onClick: (e) => {
13470
+ e.stopPropagation();
13471
+ onIndentDown(item.id);
13472
+ },
13473
+ className: "p-1 text-slate-400 hover:text-white hover:bg-white/10 rounded transition-colors"
13411
13474
  },
13412
- className: "p-1 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13413
- },
13414
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13415
- )))
13416
- ));
13417
- }
13418
- return /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-full flex flex-col gap-2 mb-3 pl-4 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(
13419
- RichGroupEditor_default,
13420
- {
13421
- content: item.content,
13422
- onChange: handleContentChange,
13423
- onMentionClick,
13424
- searchItems,
13425
- readOnly: !canEdit,
13426
- placeholder: "Escreva sobre este grupo de texto\u2026 ou @ para mencionar"
13427
- }
13428
- ), canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(
13429
- "button",
13430
- {
13431
- onClick: () => onAddSubgroup(item.id, "text_group"),
13432
- className: "flex items-center gap-1 px-1.5 py-1 text-[10px] uppercase font-bold tracking-wider text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13433
- title: "Criar Subgrupo de Texto"
13434
- },
13435
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiPlus, { size: 12 }),
13436
- /* @__PURE__ */ import_react29.default.createElement("span", null, "Subgrupo")
13437
- )), /* @__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(
13438
- "button",
13439
- {
13440
- onClick: () => onMoveUp(item.id),
13441
- disabled: !canMoveUp,
13442
- className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13443
- },
13444
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13445
- )), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
13446
- "button",
13447
- {
13448
- onClick: () => onMoveDown(item.id),
13449
- disabled: !canMoveDown,
13450
- className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13451
- },
13452
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13453
- )), /* @__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(
13454
- "button",
13455
- {
13456
- onClick: () => onIndent(item.id),
13457
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13458
- },
13459
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13460
- )), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13461
- "button",
13462
- {
13463
- onClick: () => onIndentDown(item.id),
13464
- className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13465
- },
13466
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13467
- )), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
13468
- "button",
13469
- {
13470
- onClick: () => onOutdent(item.id),
13471
- disabled: !onOutdent,
13472
- className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13473
- },
13474
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
13475
- )), /* @__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 de Texto" }, /* @__PURE__ */ import_react29.default.createElement(
13476
- "button",
13477
- {
13478
- onClick: () => onDelete(item.id),
13479
- className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13480
- },
13481
- /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13482
- ))))), 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(
13483
- BoardItem,
13484
- {
13485
- key: child.id,
13486
- index: idx,
13487
- prevItem: item.children[idx - 1],
13488
- nextItem: item.children[idx + 1],
13489
- item: child,
13490
- onUpdate,
13491
- onDelete,
13492
- onAddSubgroup,
13493
- onIndent,
13494
- onIndentDown,
13495
- onOutdent,
13496
- onMoveUp,
13497
- onMoveDown,
13498
- searchItems,
13499
- onMentionClick,
13500
- onEnterFolder,
13501
- canEdit,
13502
- isAtRoot: false
13475
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13476
+ )), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
13477
+ "button",
13478
+ {
13479
+ onClick: (e) => {
13480
+ e.stopPropagation();
13481
+ onOutdent(item.id);
13482
+ },
13483
+ className: `p-1 rounded text-slate-400 hover:text-white hover:bg-white/10 transition-colors`
13484
+ },
13485
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
13486
+ ))), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Remover Pasta" }, /* @__PURE__ */ import_react29.default.createElement(
13487
+ "button",
13488
+ {
13489
+ onClick: (e) => {
13490
+ e.stopPropagation();
13491
+ onDelete(item.id);
13492
+ },
13493
+ className: "p-1 text-slate-500 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13494
+ },
13495
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13496
+ )), /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-px h-4 bg-white/5 mx-0.5 self-center" }), /* @__PURE__ */ import_react29.default.createElement("div", { className: "px-1", onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ import_react29.default.createElement(
13497
+ ColorPicker,
13498
+ {
13499
+ isCompact: true,
13500
+ color: item.color || "#6366f1",
13501
+ onChange: handleColorChange,
13502
+ disabled: !canEdit
13503
+ }
13504
+ ))))
13505
+ ));
13503
13506
  }
13504
- ))));
13505
- });
13507
+ return /* @__PURE__ */ import_react29.default.createElement("div", { className: "w-full flex flex-col gap-2 mb-3 pl-4 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(
13508
+ RichGroupEditor_default,
13509
+ {
13510
+ content: item.content,
13511
+ onChange: handleContentChange,
13512
+ onMentionClick,
13513
+ searchItems,
13514
+ readOnly: !canEdit,
13515
+ placeholder: "Escreva sobre este grupo de texto\u2026 ou @ para mencionar"
13516
+ }
13517
+ ), canEdit && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center justify-between pt-2 mt-1 border-t border-white/5 opacity-40 group-hover/item:opacity-100 transition-opacity" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1" }, /* @__PURE__ */ import_react29.default.createElement(
13518
+ "button",
13519
+ {
13520
+ onClick: () => onAddSubgroup(item.id, "text_group"),
13521
+ className: "flex items-center gap-1 px-1.5 py-1 text-[10px] uppercase font-bold tracking-wider text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors",
13522
+ title: "Criar Subgrupo de Texto"
13523
+ },
13524
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiPlus, { size: 12 }),
13525
+ /* @__PURE__ */ import_react29.default.createElement("span", null, "Subgrupo")
13526
+ )), /* @__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(
13527
+ "button",
13528
+ {
13529
+ onClick: () => onMoveUp(item.id),
13530
+ disabled: !canMoveUp,
13531
+ className: `p-1.5 rounded transition-colors ${!canMoveUp ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13532
+ },
13533
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowUp, { size: 14 })
13534
+ )), /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Descer" }, /* @__PURE__ */ import_react29.default.createElement(
13535
+ "button",
13536
+ {
13537
+ onClick: () => onMoveDown(item.id),
13538
+ disabled: !canMoveDown,
13539
+ className: `p-1.5 rounded transition-colors ${!canMoveDown ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13540
+ },
13541
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowDown, { size: 14 })
13542
+ )), /* @__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(
13543
+ "button",
13544
+ {
13545
+ onClick: () => onIndent(item.id),
13546
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13547
+ },
13548
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowLeft, { size: 14 })
13549
+ )), showIndentDown && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: getIndentDownTooltip() }, /* @__PURE__ */ import_react29.default.createElement(
13550
+ "button",
13551
+ {
13552
+ onClick: () => onIndentDown(item.id),
13553
+ className: "p-1.5 text-slate-500 hover:text-white hover:bg-white/10 rounded transition-colors"
13554
+ },
13555
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiArrowRight, { size: 14 })
13556
+ )), !isAtRoot && /* @__PURE__ */ import_react29.default.createElement(Tooltip, { text: "Desaninhar / Recuar n\xEDvel" }, /* @__PURE__ */ import_react29.default.createElement(
13557
+ "button",
13558
+ {
13559
+ onClick: () => onOutdent(item.id),
13560
+ disabled: !onOutdent,
13561
+ className: `p-1.5 rounded transition-colors ${!onOutdent ? "text-slate-800 cursor-not-allowed" : "text-slate-500 hover:text-white hover:bg-white/10"}`
13562
+ },
13563
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpLeft, { size: 14 })
13564
+ )), /* @__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 de Texto" }, /* @__PURE__ */ import_react29.default.createElement(
13565
+ "button",
13566
+ {
13567
+ onClick: () => onDelete(item.id),
13568
+ className: "p-1.5 text-slate-600 hover:text-red-400 hover:bg-red-500/10 rounded transition-colors"
13569
+ },
13570
+ /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiTrash2, { size: 14 })
13571
+ ))))), 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(
13572
+ BoardItem,
13573
+ {
13574
+ key: child.id,
13575
+ index: idx,
13576
+ prevItem: item.children[idx - 1],
13577
+ nextItem: item.children[idx + 1],
13578
+ item: child,
13579
+ onUpdate,
13580
+ onDelete,
13581
+ onAddSubgroup,
13582
+ onIndent,
13583
+ onIndentDown,
13584
+ onOutdent,
13585
+ onMoveUp,
13586
+ onMoveDown,
13587
+ searchItems,
13588
+ onMentionClick,
13589
+ onEnterFolder,
13590
+ canEdit,
13591
+ isAtRoot: false
13592
+ }
13593
+ ))));
13594
+ }
13595
+ );
13506
13596
  function Boards({
13507
13597
  isOpen,
13508
13598
  onClose,
@@ -13530,13 +13620,17 @@ function Boards({
13530
13620
  }
13531
13621
  return null;
13532
13622
  };
13533
- const sanitizeBoardItems = (0, import_react29.useCallback)((list) => list.map((g) => ({
13534
- id: g.id,
13535
- type: g.type || "text_group",
13536
- name: g.name || "",
13537
- content: g.content || [],
13538
- children: sanitizeBoardItems(g.children || [])
13539
- })), []);
13623
+ const sanitizeBoardItems = (0, import_react29.useCallback)(
13624
+ (list) => list.map((g) => ({
13625
+ id: g.id,
13626
+ type: g.type || "text_group",
13627
+ name: g.name || "",
13628
+ color: g.color || void 0,
13629
+ content: g.content || [],
13630
+ children: sanitizeBoardItems(g.children || [])
13631
+ })),
13632
+ []
13633
+ );
13540
13634
  (0, import_react29.useEffect)(() => {
13541
13635
  if (initialBoardItems && !isLoaded) {
13542
13636
  const hasLegacyTypes = (list) => list.some(
@@ -13551,6 +13645,7 @@ function Boards({
13551
13645
  id: g.id || (0, import_uuid11.v4)(),
13552
13646
  type: g.type || "text_group",
13553
13647
  name: g.name || "",
13648
+ color: g.color || void 0,
13554
13649
  content: Array.isArray(g.content) ? g.content : [],
13555
13650
  children: prepare(g.children || [])
13556
13651
  }));
@@ -13608,21 +13703,24 @@ function Boards({
13608
13703
  }, 3e3);
13609
13704
  return () => clearTimeout(id);
13610
13705
  }, [boardItems, isLoaded, onSave, sanitizeBoardItems]);
13611
- const triggerInstantSave = (0, import_react29.useCallback)(async (updatedBoardItems) => {
13612
- if (!onSave) return;
13613
- const sanitized = sanitizeBoardItems(updatedBoardItems);
13614
- const sanitizedJson = JSON.stringify(sanitized);
13615
- lastSavedBoardItemsRef.current = sanitizedJson;
13616
- setSaveStatus("saving");
13617
- try {
13618
- await onSave(sanitized);
13619
- setSaveStatus("saved");
13620
- setTimeout(() => setSaveStatus("idle"), 3e3);
13621
- } catch (err) {
13622
- console.error("Erro ao salvar board:", err);
13623
- setSaveStatus("error");
13624
- }
13625
- }, [onSave, sanitizeBoardItems]);
13706
+ const triggerInstantSave = (0, import_react29.useCallback)(
13707
+ async (updatedBoardItems) => {
13708
+ if (!onSave) return;
13709
+ const sanitized = sanitizeBoardItems(updatedBoardItems);
13710
+ const sanitizedJson = JSON.stringify(sanitized);
13711
+ lastSavedBoardItemsRef.current = sanitizedJson;
13712
+ setSaveStatus("saving");
13713
+ try {
13714
+ await onSave(sanitized);
13715
+ setSaveStatus("saved");
13716
+ setTimeout(() => setSaveStatus("idle"), 3e3);
13717
+ } catch (err) {
13718
+ console.error("Erro ao salvar board:", err);
13719
+ setSaveStatus("error");
13720
+ }
13721
+ },
13722
+ [onSave, sanitizeBoardItems]
13723
+ );
13626
13724
  (0, import_react29.useEffect)(() => {
13627
13725
  if (!isOpen) return;
13628
13726
  const handler = (e) => {
@@ -13651,24 +13749,28 @@ function Boards({
13651
13749
  const lastFolder = currentPath[currentPath.length - 1];
13652
13750
  return lastFolder ? lastFolder.children : boardItems;
13653
13751
  }, [boardItems, currentPath]);
13654
- const handleAddItem = (0, import_react29.useCallback)((type = "text_group") => {
13655
- const newItem = {
13656
- id: (0, import_uuid11.v4)(),
13657
- type,
13658
- name: type === "folder" ? "Nova Pasta" : "",
13659
- content: [],
13660
- children: []
13661
- };
13662
- if (navigationStack.length === 0) {
13663
- setBoardItems((prev) => [...prev, newItem]);
13664
- } else {
13665
- const parentId = navigationStack[navigationStack.length - 1];
13666
- const add = (list) => list.map(
13667
- (g) => g.id === parentId ? { ...g, children: [...g.children, newItem] } : { ...g, children: add(g.children) }
13668
- );
13669
- setBoardItems((prev) => add(prev));
13670
- }
13671
- }, [navigationStack]);
13752
+ const handleAddItem = (0, import_react29.useCallback)(
13753
+ (type = "text_group") => {
13754
+ const newItem = {
13755
+ id: (0, import_uuid11.v4)(),
13756
+ type,
13757
+ name: type === "folder" ? "Nova Pasta" : "",
13758
+ color: type === "folder" ? "#6366f1" : void 0,
13759
+ content: [],
13760
+ children: []
13761
+ };
13762
+ if (navigationStack.length === 0) {
13763
+ setBoardItems((prev) => [...prev, newItem]);
13764
+ } else {
13765
+ const parentId = navigationStack[navigationStack.length - 1];
13766
+ const add = (list) => list.map(
13767
+ (g) => g.id === parentId ? { ...g, children: [...g.children, newItem] } : { ...g, children: add(g.children) }
13768
+ );
13769
+ setBoardItems((prev) => add(prev));
13770
+ }
13771
+ },
13772
+ [navigationStack]
13773
+ );
13672
13774
  const handleAddSubgroup = (0, import_react29.useCallback)((parentId, type = "text_group") => {
13673
13775
  const add = (list) => list.map((g) => {
13674
13776
  if (g.id === parentId) {
@@ -13677,6 +13779,7 @@ function Boards({
13677
13779
  id: (0, import_uuid11.v4)(),
13678
13780
  type,
13679
13781
  name: type === "folder" ? "Nova Pasta" : "",
13782
+ color: type === "folder" ? "#6366f1" : void 0,
13680
13783
  content: [],
13681
13784
  children: []
13682
13785
  };
@@ -13696,70 +13799,88 @@ function Boards({
13696
13799
  const del = (list) => list.filter((g) => g.id !== id).map((g) => ({ ...g, children: del(g.children) }));
13697
13800
  setBoardItems((prev) => del(prev));
13698
13801
  }, []);
13699
- const handleIndent = (0, import_react29.useCallback)((id) => {
13700
- const next = JSON.parse(JSON.stringify(boardItems));
13701
- const found = findGroupAndParent(next, id);
13702
- if (!found || found.index === 0) return;
13703
- const { group, siblings, index } = found;
13704
- const targetParent = siblings[index - 1];
13705
- if (group.type === "folder" && targetParent.type === "text_group") return;
13706
- siblings.splice(index, 1);
13707
- targetParent.children.push(group);
13708
- setBoardItems(next);
13709
- triggerInstantSave(next);
13710
- }, [boardItems, triggerInstantSave]);
13711
- const handleIndentDown = (0, import_react29.useCallback)((id) => {
13712
- const next = JSON.parse(JSON.stringify(boardItems));
13713
- const found = findGroupAndParent(next, id);
13714
- if (!found || found.index === found.siblings.length - 1) return;
13715
- const { group, siblings, index } = found;
13716
- const targetParent = siblings[index + 1];
13717
- if (group.type === "folder" && targetParent.type === "text_group") return;
13718
- siblings.splice(index, 1);
13719
- targetParent.children.push(group);
13720
- setBoardItems(next);
13721
- triggerInstantSave(next);
13722
- }, [boardItems, triggerInstantSave]);
13723
- const handleOutdent = (0, import_react29.useCallback)((id) => {
13724
- const next = JSON.parse(JSON.stringify(boardItems));
13725
- const found = findGroupAndParent(next, id);
13726
- if (!found || !found.parent) return;
13727
- const { group, siblings, index, parent } = found;
13728
- siblings.splice(index, 1);
13729
- const parentFound = findGroupAndParent(next, parent.id);
13730
- if (parentFound) {
13731
- parentFound.siblings.splice(parentFound.index + 1, 0, group);
13732
- } else {
13733
- next.push(group);
13734
- }
13735
- setBoardItems(next);
13736
- triggerInstantSave(next);
13737
- }, [boardItems, triggerInstantSave]);
13738
- const handleMoveUp = (0, import_react29.useCallback)((id) => {
13739
- const next = JSON.parse(JSON.stringify(boardItems));
13740
- const found = findGroupAndParent(next, id);
13741
- if (!found || found.index === 0) return;
13742
- const { siblings, index } = found;
13743
- const item = siblings[index];
13744
- siblings.splice(index, 1);
13745
- siblings.splice(index - 1, 0, item);
13746
- setBoardItems(next);
13747
- triggerInstantSave(next);
13748
- }, [boardItems, triggerInstantSave]);
13749
- const handleMoveDown = (0, import_react29.useCallback)((id) => {
13750
- const next = JSON.parse(JSON.stringify(boardItems));
13751
- const found = findGroupAndParent(next, id);
13752
- if (!found || found.index === found.siblings.length - 1) return;
13753
- const { siblings, index } = found;
13754
- const item = siblings[index];
13755
- siblings.splice(index, 1);
13756
- siblings.splice(index + 1, 0, item);
13757
- setBoardItems(next);
13758
- triggerInstantSave(next);
13759
- }, [boardItems, triggerInstantSave]);
13760
- const handleMentionClick = (0, import_react29.useCallback)((item) => {
13761
- if (onSelect) onSelect(item);
13762
- }, [onSelect]);
13802
+ const handleIndent = (0, import_react29.useCallback)(
13803
+ (id) => {
13804
+ const next = JSON.parse(JSON.stringify(boardItems));
13805
+ const found = findGroupAndParent(next, id);
13806
+ if (!found || found.index === 0) return;
13807
+ const { group, siblings, index } = found;
13808
+ const targetParent = siblings[index - 1];
13809
+ if (group.type === "folder" && targetParent.type === "text_group") return;
13810
+ siblings.splice(index, 1);
13811
+ targetParent.children.push(group);
13812
+ setBoardItems(next);
13813
+ triggerInstantSave(next);
13814
+ },
13815
+ [boardItems, triggerInstantSave]
13816
+ );
13817
+ const handleIndentDown = (0, import_react29.useCallback)(
13818
+ (id) => {
13819
+ const next = JSON.parse(JSON.stringify(boardItems));
13820
+ const found = findGroupAndParent(next, id);
13821
+ if (!found || found.index === found.siblings.length - 1) return;
13822
+ const { group, siblings, index } = found;
13823
+ const targetParent = siblings[index + 1];
13824
+ if (group.type === "folder" && targetParent.type === "text_group") return;
13825
+ siblings.splice(index, 1);
13826
+ targetParent.children.push(group);
13827
+ setBoardItems(next);
13828
+ triggerInstantSave(next);
13829
+ },
13830
+ [boardItems, triggerInstantSave]
13831
+ );
13832
+ const handleOutdent = (0, import_react29.useCallback)(
13833
+ (id) => {
13834
+ const next = JSON.parse(JSON.stringify(boardItems));
13835
+ const found = findGroupAndParent(next, id);
13836
+ if (!found || !found.parent) return;
13837
+ const { group, siblings, index, parent } = found;
13838
+ siblings.splice(index, 1);
13839
+ const parentFound = findGroupAndParent(next, parent.id);
13840
+ if (parentFound) {
13841
+ parentFound.siblings.splice(parentFound.index + 1, 0, group);
13842
+ } else {
13843
+ next.push(group);
13844
+ }
13845
+ setBoardItems(next);
13846
+ triggerInstantSave(next);
13847
+ },
13848
+ [boardItems, triggerInstantSave]
13849
+ );
13850
+ const handleMoveUp = (0, import_react29.useCallback)(
13851
+ (id) => {
13852
+ const next = JSON.parse(JSON.stringify(boardItems));
13853
+ const found = findGroupAndParent(next, id);
13854
+ if (!found || found.index === 0) return;
13855
+ const { siblings, index } = found;
13856
+ const item = siblings[index];
13857
+ siblings.splice(index, 1);
13858
+ siblings.splice(index - 1, 0, item);
13859
+ setBoardItems(next);
13860
+ triggerInstantSave(next);
13861
+ },
13862
+ [boardItems, triggerInstantSave]
13863
+ );
13864
+ const handleMoveDown = (0, import_react29.useCallback)(
13865
+ (id) => {
13866
+ const next = JSON.parse(JSON.stringify(boardItems));
13867
+ const found = findGroupAndParent(next, id);
13868
+ if (!found || found.index === found.siblings.length - 1) return;
13869
+ const { siblings, index } = found;
13870
+ const item = siblings[index];
13871
+ siblings.splice(index, 1);
13872
+ siblings.splice(index + 1, 0, item);
13873
+ setBoardItems(next);
13874
+ triggerInstantSave(next);
13875
+ },
13876
+ [boardItems, triggerInstantSave]
13877
+ );
13878
+ const handleMentionClick = (0, import_react29.useCallback)(
13879
+ (item) => {
13880
+ if (onSelect) onSelect(item);
13881
+ },
13882
+ [onSelect]
13883
+ );
13763
13884
  const navigateUp = (0, import_react29.useCallback)(() => {
13764
13885
  setNavigationStack((prev) => prev.slice(0, -1));
13765
13886
  }, []);