@lv-x-software-house/x_view 1.2.5-dev.39 → 1.2.5-dev.40

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 +199 -10
  2. package/dist/index.mjs +205 -16
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2884,13 +2884,18 @@ var userActionHandlers = {
2884
2884
  const nextDateObj = calculateNextRecurrenceDate(nodeToSave.recurrence_config);
2885
2885
  if (nextDateObj) {
2886
2886
  const currentCounter = sceneDataRef.current.quest_counter || 1;
2887
+ const usedCounter = currentCounter;
2887
2888
  const nextCounter = currentCounter + 1;
2888
2889
  sceneDataRef.current.quest_counter = nextCounter;
2889
2890
  let nextName = nodeToSave.raw_title || nodeToSave.name;
2890
2891
  const prefixParts = (nodeToSave.name || "").split(" - \xBB ");
2891
- if (prefixParts.length > 1) {
2892
- const prefixBase = prefixParts[0].split(" - ")[0];
2893
- nextName = `${prefixBase} - ${nextCounter} - \xBB ${nodeToSave.raw_title || prefixParts[1]}`;
2892
+ const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
2893
+ if (questPrefix) {
2894
+ const baseParts = questPrefix.split(" - ");
2895
+ const prefixBase = baseParts[0];
2896
+ nextName = `${prefixBase} - ${usedCounter} - \xBB ${nodeToSave.raw_title || prefixParts[1]}`;
2897
+ } else {
2898
+ nextName = `${usedCounter} - \xBB ${nodeToSave.raw_title || nodeToSave.name}`;
2894
2899
  }
2895
2900
  const nextRecurrenceConfig = { ...nodeToSave.recurrence_config };
2896
2901
  if (nextRecurrenceConfig.type === "custom") {
@@ -10254,7 +10259,9 @@ function QuestDetailsPanel({
10254
10259
  types: types.includes("quest") ? types : [...types, "quest"],
10255
10260
  intensity: intensity || 0,
10256
10261
  useImageAsTexture: node.useImageAsTexture || false,
10257
- textureImageUrl: node.textureImageUrl || null
10262
+ textureImageUrl: node.textureImageUrl || null,
10263
+ Date: questDate,
10264
+ recurrence_config: recurrenceConfig
10258
10265
  };
10259
10266
  try {
10260
10267
  await onSave(nodeToSave, false);
@@ -10300,7 +10307,9 @@ ${noteText}` : noteText : entry.notes,
10300
10307
  try {
10301
10308
  const nodeToSave = {
10302
10309
  ...node,
10303
- timeline: updatedTimeline
10310
+ timeline: updatedTimeline,
10311
+ Date: questDate,
10312
+ recurrence_config: recurrenceConfig
10304
10313
  };
10305
10314
  await onSave(nodeToSave, true);
10306
10315
  setTimeline(updatedTimeline);
@@ -10362,7 +10371,14 @@ ${noteText}` : noteText : entry.notes,
10362
10371
  const newTimeline = [...timeline, newEvent];
10363
10372
  setTimeline(newTimeline);
10364
10373
  onColorChange == null ? void 0 : onColorChange(node.id, newColor);
10365
- onDataUpdate == null ? void 0 : onDataUpdate({ ...node, status: newStatus, color: newColor, timeline: newTimeline });
10374
+ onDataUpdate == null ? void 0 : onDataUpdate({
10375
+ ...node,
10376
+ status: newStatus,
10377
+ color: newColor,
10378
+ timeline: newTimeline,
10379
+ Date: questDate,
10380
+ recurrence_config: recurrenceConfig
10381
+ });
10366
10382
  setHasUnsavedChanges(true);
10367
10383
  };
10368
10384
  const handleAddType = (newType) => {
@@ -10536,7 +10552,110 @@ ${noteText}` : noteText : entry.notes,
10536
10552
  readOnly: !canEdit,
10537
10553
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
10538
10554
  }
10539
- ), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10555
+ ), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react20.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Prazo / Data"), canEdit && !questDate && /* @__PURE__ */ import_react20.default.createElement(
10556
+ "button",
10557
+ {
10558
+ type: "button",
10559
+ onClick: () => {
10560
+ setQuestDate({ type: "Data", value: "" });
10561
+ setHasUnsavedChanges(true);
10562
+ },
10563
+ className: "text-[10px] text-indigo-400 hover:text-indigo-300 font-bold uppercase transition-colors"
10564
+ },
10565
+ "+ Adicionar"
10566
+ )), questDate && /* @__PURE__ */ import_react20.default.createElement("div", { className: "p-3 bg-slate-900/60 rounded-xl border border-white/10 space-y-3 relative group" }, canEdit && /* @__PURE__ */ import_react20.default.createElement(
10567
+ "button",
10568
+ {
10569
+ type: "button",
10570
+ onClick: () => {
10571
+ setQuestDate(null);
10572
+ setHasUnsavedChanges(true);
10573
+ },
10574
+ className: "absolute top-2 right-2 w-6 h-6 grid place-items-center rounded-full bg-red-500/10 text-red-400 opacity-0 group-hover:opacity-100 transition-opacity",
10575
+ title: "Remover data"
10576
+ },
10577
+ /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiX, { size: 12 })
10578
+ ), /* @__PURE__ */ import_react20.default.createElement("div", { className: `flex items-center gap-1 rounded-lg bg-slate-800/50 p-1 ${!canEdit ? "opacity-70 pointer-events-none" : ""}` }, ["Data", "Ano", "Date Interval"].map((t) => /* @__PURE__ */ import_react20.default.createElement(
10579
+ "button",
10580
+ {
10581
+ key: t,
10582
+ type: "button",
10583
+ onClick: () => {
10584
+ const newDate = { type: t };
10585
+ if (t === "Date Interval") {
10586
+ newDate.start = "";
10587
+ newDate.end = "";
10588
+ } else {
10589
+ newDate.value = "";
10590
+ }
10591
+ setQuestDate(newDate);
10592
+ setHasUnsavedChanges(true);
10593
+ },
10594
+ className: `flex-1 text-[10px] px-2 py-1.5 rounded-md transition-colors ${questDate.type === t ? "bg-indigo-600 text-white font-semibold shadow" : "text-slate-400 hover:bg-slate-700/50"}`
10595
+ },
10596
+ t === "Date Interval" ? "Intervalo" : t
10597
+ ))), questDate.type === "Data" && /* @__PURE__ */ import_react20.default.createElement(
10598
+ "input",
10599
+ {
10600
+ type: "text",
10601
+ readOnly: !canEdit,
10602
+ placeholder: "DD/MM/AAAA",
10603
+ value: questDate.value || "",
10604
+ onChange: (e) => {
10605
+ const rawValue = e.target.value;
10606
+ const digits = rawValue.replace(/\D/g, "");
10607
+ const len = digits.length;
10608
+ let formattedValue = digits;
10609
+ if (len > 2 && len <= 4)
10610
+ formattedValue = `${digits.slice(0, 2)}/${digits.slice(2)}`;
10611
+ else if (len > 4)
10612
+ formattedValue = `${digits.slice(0, 2)}/${digits.slice(2, 4)}/${digits.slice(4, 8)}`;
10613
+ setQuestDate({ ...questDate, value: formattedValue });
10614
+ setHasUnsavedChanges(true);
10615
+ },
10616
+ maxLength: "10",
10617
+ className: `w-full bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10618
+ }
10619
+ ), questDate.type === "Ano" && /* @__PURE__ */ import_react20.default.createElement(
10620
+ "input",
10621
+ {
10622
+ type: "number",
10623
+ readOnly: !canEdit,
10624
+ placeholder: "AAAA",
10625
+ value: questDate.value || "",
10626
+ onChange: (e) => {
10627
+ setQuestDate({ ...questDate, value: e.target.value });
10628
+ setHasUnsavedChanges(true);
10629
+ },
10630
+ className: `w-full bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10631
+ }
10632
+ ), questDate.type === "Date Interval" && /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(
10633
+ "input",
10634
+ {
10635
+ type: "number",
10636
+ readOnly: !canEdit,
10637
+ placeholder: "In\xEDcio (Ano)",
10638
+ value: questDate.start || "",
10639
+ onChange: (e) => {
10640
+ setQuestDate({ ...questDate, start: e.target.value });
10641
+ setHasUnsavedChanges(true);
10642
+ },
10643
+ className: `flex-1 bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10644
+ }
10645
+ ), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-slate-500" }, "-"), /* @__PURE__ */ import_react20.default.createElement(
10646
+ "input",
10647
+ {
10648
+ type: "number",
10649
+ readOnly: !canEdit,
10650
+ placeholder: "Fim (Ano)",
10651
+ value: questDate.end || "",
10652
+ onChange: (e) => {
10653
+ setQuestDate({ ...questDate, end: e.target.value });
10654
+ setHasUnsavedChanges(true);
10655
+ },
10656
+ className: `flex-1 bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10657
+ }
10658
+ )))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10540
10659
  "button",
10541
10660
  {
10542
10661
  type: "button",
@@ -10634,7 +10753,77 @@ ${noteText}` : noteText : entry.notes,
10634
10753
  )), viewMembers.filter((member) => {
10635
10754
  const search = assigneeSearchQuery.toLowerCase();
10636
10755
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10637
- }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement(
10756
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react20.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react20.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-4 border-t border-white/5 mt-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between mb-3" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiRepeat, { className: `w-3.5 h-3.5 ${recurrenceConfig.enabled ? "text-indigo-400" : "text-slate-500"}` }), /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Recorr\xEAncia")), /* @__PURE__ */ import_react20.default.createElement(
10757
+ "button",
10758
+ {
10759
+ type: "button",
10760
+ disabled: !canEdit,
10761
+ onClick: () => {
10762
+ setRecurrenceConfig((prev) => ({ ...prev, enabled: !prev.enabled }));
10763
+ setHasUnsavedChanges(true);
10764
+ },
10765
+ className: `relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-none ${recurrenceConfig.enabled ? "bg-indigo-600" : "bg-slate-700"} ${canEdit ? "cursor-pointer" : "cursor-default opacity-60"}`
10766
+ },
10767
+ /* @__PURE__ */ import_react20.default.createElement("span", { className: `inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${recurrenceConfig.enabled ? "translate-x-4.5" : "translate-x-1"}` })
10768
+ )), recurrenceConfig.enabled && /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-4 p-3 rounded-xl bg-white/5 border border-white/5 animate-in fade-in slide-in-from-top-1" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "grid grid-cols-2 gap-3" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Tipo"), /* @__PURE__ */ import_react20.default.createElement(
10769
+ "select",
10770
+ {
10771
+ disabled: !canEdit,
10772
+ value: recurrenceConfig.type,
10773
+ onChange: (e) => {
10774
+ setRecurrenceConfig((prev) => ({ ...prev, type: e.target.value }));
10775
+ setHasUnsavedChanges(true);
10776
+ },
10777
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10778
+ },
10779
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: "daily" }, "Di\xE1ria"),
10780
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: "weekly" }, "Semanal"),
10781
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: "custom" }, "Data Espec\xEDfica")
10782
+ )), recurrenceConfig.type === "weekly" && /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Dia da Semana"), /* @__PURE__ */ import_react20.default.createElement(
10783
+ "select",
10784
+ {
10785
+ disabled: !canEdit,
10786
+ value: recurrenceConfig.day_of_week,
10787
+ onChange: (e) => {
10788
+ setRecurrenceConfig((prev) => ({ ...prev, day_of_week: parseInt(e.target.value, 10) }));
10789
+ setHasUnsavedChanges(true);
10790
+ },
10791
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10792
+ },
10793
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 1 }, "Segunda-feira"),
10794
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 2 }, "Ter\xE7a-feira"),
10795
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 3 }, "Quarta-feira"),
10796
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 4 }, "Quinta-feira"),
10797
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 5 }, "Sexta-feira"),
10798
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 6 }, "S\xE1bado"),
10799
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: 0 }, "Domingo")
10800
+ )), recurrenceConfig.type === "custom" && /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Pr\xF3xima Data"), /* @__PURE__ */ import_react20.default.createElement(
10801
+ "input",
10802
+ {
10803
+ readOnly: !canEdit,
10804
+ type: "text",
10805
+ placeholder: "DD/MM/AAAA",
10806
+ value: recurrenceConfig.custom_date,
10807
+ onChange: (e) => {
10808
+ setRecurrenceConfig((prev) => ({ ...prev, custom_date: e.target.value }));
10809
+ setHasUnsavedChanges(true);
10810
+ },
10811
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "text-slate-400"}`
10812
+ }
10813
+ ))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react20.default.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Pr\xF3ximo Respons\xE1vel"), /* @__PURE__ */ import_react20.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react20.default.createElement(
10814
+ "select",
10815
+ {
10816
+ disabled: !canEdit,
10817
+ value: recurrenceConfig.next_assignee_id,
10818
+ onChange: (e) => {
10819
+ setRecurrenceConfig((prev) => ({ ...prev, next_assignee_id: e.target.value }));
10820
+ setHasUnsavedChanges(true);
10821
+ },
10822
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg pl-8 pr-2 py-1.5 text-xs text-slate-200 appearance-none focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10823
+ },
10824
+ /* @__PURE__ */ import_react20.default.createElement("option", { value: "" }, "Sem respons\xE1vel"),
10825
+ viewMembers.map((member) => /* @__PURE__ */ import_react20.default.createElement("option", { key: member.id, value: member.id }, member.name || member.email))
10826
+ ), /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiUser, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-slate-500" }), /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiChevronDown, { className: "absolute right-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-slate-500 pointer-events-none" }))))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react20.default.createElement(
10638
10827
  QuestReviewStackEditor,
10639
10828
  {
10640
10829
  reviewStack,
@@ -10746,7 +10935,7 @@ ${noteText}` : noteText : entry.notes,
10746
10935
  onChange: (e) => updateLinkInNote(link.id, "value", e.target.value),
10747
10936
  className: "flex-1 bg-slate-950/50 border border-white/5 rounded px-2 py-1 text-[10px] focus:outline-none focus:border-indigo-500/50"
10748
10937
  }
10749
- ), /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: () => removeLinkFromNote(link.id), className: "text-slate-600 hover:text-red-400 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiX, { size: 12 })))))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Imagens (URLs)"), /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: addImageToNote, className: "text-indigo-400 hover:text-indigo-300 text-[10px] flex items-center gap-1 font-medium" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiPlus, { size: 10 }), " Adicionar Imagem")), noteImages.length > 0 && /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, noteImages.map((img) => /* @__PURE__ */ import_react20.default.createElement("div", { key: img.id, className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-1" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-950/50 border border-white/5 rounded px-2 py-1" }, /* @__PURE__ */ import_react20.default.createElement(FiImage, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ import_react20.default.createElement(
10938
+ ), /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: () => removeLinkFromNote(link.id), className: "text-slate-600 hover:text-red-400 transition-colors" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiX, { size: 12 })))))), /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react20.default.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Imagens (URLs)"), /* @__PURE__ */ import_react20.default.createElement("button", { type: "button", onClick: addImageToNote, className: "text-indigo-400 hover:text-indigo-300 text-[10px] flex items-center gap-1 font-medium" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiPlus, { size: 10 }), " Adicionar Imagem")), noteImages.length > 0 && /* @__PURE__ */ import_react20.default.createElement("div", { className: "space-y-2" }, noteImages.map((img) => /* @__PURE__ */ import_react20.default.createElement("div", { key: img.id, className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-1" }, /* @__PURE__ */ import_react20.default.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-950/50 border border-white/5 rounded px-2 py-1" }, /* @__PURE__ */ import_react20.default.createElement(import_fi18.FiImage, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ import_react20.default.createElement(
10750
10939
  "input",
10751
10940
  {
10752
10941
  type: "text",
@@ -13388,7 +13577,7 @@ function XViewScene({
13388
13577
  if (!timeInfo.isUndated && timeInfo.label) {
13389
13578
  const dateSprite = createTextSprite(timeInfo.label, 36);
13390
13579
  dateSprite.name = "questDateLabel";
13391
- dateSprite.position.set(0, 3.5, 0);
13580
+ dateSprite.position.set(0, -5.5, 0);
13392
13581
  mesh.add(dateSprite);
13393
13582
  }
13394
13583
  if (mesh.userData.labelObject) {
package/dist/index.mjs CHANGED
@@ -2845,13 +2845,18 @@ var userActionHandlers = {
2845
2845
  const nextDateObj = calculateNextRecurrenceDate(nodeToSave.recurrence_config);
2846
2846
  if (nextDateObj) {
2847
2847
  const currentCounter = sceneDataRef.current.quest_counter || 1;
2848
+ const usedCounter = currentCounter;
2848
2849
  const nextCounter = currentCounter + 1;
2849
2850
  sceneDataRef.current.quest_counter = nextCounter;
2850
2851
  let nextName = nodeToSave.raw_title || nodeToSave.name;
2851
2852
  const prefixParts = (nodeToSave.name || "").split(" - \xBB ");
2852
- if (prefixParts.length > 1) {
2853
- const prefixBase = prefixParts[0].split(" - ")[0];
2854
- nextName = `${prefixBase} - ${nextCounter} - \xBB ${nodeToSave.raw_title || prefixParts[1]}`;
2853
+ const questPrefix = prefixParts.length > 1 ? prefixParts[0] : "";
2854
+ if (questPrefix) {
2855
+ const baseParts = questPrefix.split(" - ");
2856
+ const prefixBase = baseParts[0];
2857
+ nextName = `${prefixBase} - ${usedCounter} - \xBB ${nodeToSave.raw_title || prefixParts[1]}`;
2858
+ } else {
2859
+ nextName = `${usedCounter} - \xBB ${nodeToSave.raw_title || nodeToSave.name}`;
2855
2860
  }
2856
2861
  const nextRecurrenceConfig = { ...nodeToSave.recurrence_config };
2857
2862
  if (nextRecurrenceConfig.type === "custom") {
@@ -4158,7 +4163,7 @@ import { FiPlus, FiEdit2 as FiEdit22, FiBookOpen } from "react-icons/fi";
4158
4163
 
4159
4164
  // src/components/DescriptionEditModal.jsx
4160
4165
  import React5, { useState as useState6, useEffect as useEffect5, useRef as useRef5, useMemo as useMemo4 } from "react";
4161
- import { FiType, FiList, FiCode, FiLink as FiLink2, FiAtSign, FiSearch as FiSearch2, FiHexagon as FiHexagon2, FiGlobe, FiImage as FiImage2, FiCheckSquare } from "react-icons/fi";
4166
+ import { FiType, FiList, FiCode, FiLink as FiLink2, FiAtSign, FiSearch as FiSearch2, FiHexagon as FiHexagon2, FiGlobe, FiImage, FiCheckSquare } from "react-icons/fi";
4162
4167
 
4163
4168
  // src/components/SectionImportModal.jsx
4164
4169
  import React4, { useState as useState5, useMemo as useMemo3, useRef as useRef4, useEffect as useEffect4 } from "react";
@@ -4905,7 +4910,7 @@ ${space}${bullet} `);
4905
4910
  className: "flex items-center gap-1 px-3 py-1.5 rounded bg-indigo-600/30 hover:bg-indigo-600/50 border border-indigo-500/30 text-indigo-200 text-xs font-medium transition-colors whitespace-nowrap",
4906
4911
  title: "Inserir Imagem (Propriedade ou URL)"
4907
4912
  },
4908
- /* @__PURE__ */ React5.createElement(FiImage2, { size: 12 }),
4913
+ /* @__PURE__ */ React5.createElement(FiImage, { size: 12 }),
4909
4914
  " Imagem"
4910
4915
  ), /* @__PURE__ */ React5.createElement(
4911
4916
  "button",
@@ -5044,7 +5049,7 @@ ${space}${bullet} `);
5044
5049
 
5045
5050
  // src/components/DescriptionDisplay.jsx
5046
5051
  import React6, { useMemo as useMemo5, useState as useState7, useEffect as useEffect6, useRef as useRef6 } from "react";
5047
- import { FiCopy as FiCopy2, FiCheck as FiCheck3, FiChevronDown as FiChevronDown3, FiChevronRight as FiChevronRight2, FiTerminal as FiTerminal2, FiCornerDownRight, FiExternalLink as FiExternalLink2, FiImage as FiImage3, FiSave } from "react-icons/fi";
5052
+ import { FiCopy as FiCopy2, FiCheck as FiCheck3, FiChevronDown as FiChevronDown3, FiChevronRight as FiChevronRight2, FiTerminal as FiTerminal2, FiCornerDownRight, FiExternalLink as FiExternalLink2, FiImage as FiImage2, FiSave } from "react-icons/fi";
5048
5053
  var CodeBlock2 = ({ content, isActive, onClick }) => {
5049
5054
  const [isExpanded, setIsExpanded] = useState7(false);
5050
5055
  const [copied, setCopied] = useState7(false);
@@ -5141,7 +5146,7 @@ var renderTextWithImages = (text, onImageClick) => {
5141
5146
  },
5142
5147
  className: "inline-flex items-center gap-1 text-emerald-400 hover:text-emerald-300 hover:underline decoration-emerald-500/50 underline-offset-2 transition-colors cursor-pointer align-baseline mx-0.5"
5143
5148
  },
5144
- /* @__PURE__ */ React6.createElement(FiImage3, { size: 11 }),
5149
+ /* @__PURE__ */ React6.createElement(FiImage2, { size: 11 }),
5145
5150
  /* @__PURE__ */ React6.createElement("span", null, name)
5146
5151
  );
5147
5152
  }
@@ -9494,7 +9499,7 @@ function InSceneQuestForm({
9494
9499
 
9495
9500
  // src/components/NodeDetailsPanel.jsx
9496
9501
  import React17, { useState as useState18, useEffect as useEffect15, useRef as useRef13 } from "react";
9497
- import { FiPlus as FiPlus7, FiMaximize2 as FiMaximize23, FiX as FiX6, FiCheck as FiCheck10, FiImage as FiImage4, FiEdit2 as FiEdit27, FiLoader as FiLoader2, FiBookOpen as FiBookOpen3, FiSun as FiSun2, FiLink as FiLink5, FiDatabase } from "react-icons/fi";
9502
+ import { FiPlus as FiPlus7, FiMaximize2 as FiMaximize23, FiX as FiX6, FiCheck as FiCheck10, FiImage as FiImage3, FiEdit2 as FiEdit27, FiLoader as FiLoader2, FiBookOpen as FiBookOpen3, FiSun as FiSun2, FiLink as FiLink5, FiDatabase } from "react-icons/fi";
9498
9503
  function NodeDetailsPanel({
9499
9504
  node,
9500
9505
  onClose,
@@ -10008,7 +10013,7 @@ function NodeDetailsPanel({
10008
10013
 
10009
10014
  // src/components/QuestDetailsPanel.jsx
10010
10015
  import React19, { useState as useState19, useEffect as useEffect16, useRef as useRef14 } from "react";
10011
- import { FiPlus as FiPlus8, FiX as FiX7, FiCheck as FiCheck11, FiEdit2 as FiEdit28, FiLoader as FiLoader3, FiBookOpen as FiBookOpen4, FiLink as FiLink7, FiTarget as FiTarget3, FiChevronDown as FiChevronDown7, FiUser as FiUser3, FiSearch as FiSearch7, FiRepeat as FiRepeat2 } from "react-icons/fi";
10016
+ import { FiPlus as FiPlus8, FiX as FiX7, FiCheck as FiCheck11, FiEdit2 as FiEdit28, FiLoader as FiLoader3, FiBookOpen as FiBookOpen4, FiLink as FiLink7, FiTarget as FiTarget3, FiChevronDown as FiChevronDown7, FiUser as FiUser3, FiSearch as FiSearch7, FiRepeat as FiRepeat2, FiCalendar as FiCalendar2, FiImage as FiImage4 } from "react-icons/fi";
10012
10017
 
10013
10018
  // src/components/QuestTimeline.jsx
10014
10019
  import React18 from "react";
@@ -10285,7 +10290,9 @@ function QuestDetailsPanel({
10285
10290
  types: types.includes("quest") ? types : [...types, "quest"],
10286
10291
  intensity: intensity || 0,
10287
10292
  useImageAsTexture: node.useImageAsTexture || false,
10288
- textureImageUrl: node.textureImageUrl || null
10293
+ textureImageUrl: node.textureImageUrl || null,
10294
+ Date: questDate,
10295
+ recurrence_config: recurrenceConfig
10289
10296
  };
10290
10297
  try {
10291
10298
  await onSave(nodeToSave, false);
@@ -10331,7 +10338,9 @@ ${noteText}` : noteText : entry.notes,
10331
10338
  try {
10332
10339
  const nodeToSave = {
10333
10340
  ...node,
10334
- timeline: updatedTimeline
10341
+ timeline: updatedTimeline,
10342
+ Date: questDate,
10343
+ recurrence_config: recurrenceConfig
10335
10344
  };
10336
10345
  await onSave(nodeToSave, true);
10337
10346
  setTimeline(updatedTimeline);
@@ -10393,7 +10402,14 @@ ${noteText}` : noteText : entry.notes,
10393
10402
  const newTimeline = [...timeline, newEvent];
10394
10403
  setTimeline(newTimeline);
10395
10404
  onColorChange == null ? void 0 : onColorChange(node.id, newColor);
10396
- onDataUpdate == null ? void 0 : onDataUpdate({ ...node, status: newStatus, color: newColor, timeline: newTimeline });
10405
+ onDataUpdate == null ? void 0 : onDataUpdate({
10406
+ ...node,
10407
+ status: newStatus,
10408
+ color: newColor,
10409
+ timeline: newTimeline,
10410
+ Date: questDate,
10411
+ recurrence_config: recurrenceConfig
10412
+ });
10397
10413
  setHasUnsavedChanges(true);
10398
10414
  };
10399
10415
  const handleAddType = (newType) => {
@@ -10567,7 +10583,110 @@ ${noteText}` : noteText : entry.notes,
10567
10583
  readOnly: !canEdit,
10568
10584
  className: `w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-2 focus:ring-indigo-400/60" : "cursor-default text-slate-400"}`
10569
10585
  }
10570
- ), /* @__PURE__ */ React19.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React19.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React19.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React19.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React19.createElement("div", { className: "relative" }, /* @__PURE__ */ React19.createElement(
10586
+ ), /* @__PURE__ */ React19.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React19.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React19.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ React19.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React19.createElement("label", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Prazo / Data"), canEdit && !questDate && /* @__PURE__ */ React19.createElement(
10587
+ "button",
10588
+ {
10589
+ type: "button",
10590
+ onClick: () => {
10591
+ setQuestDate({ type: "Data", value: "" });
10592
+ setHasUnsavedChanges(true);
10593
+ },
10594
+ className: "text-[10px] text-indigo-400 hover:text-indigo-300 font-bold uppercase transition-colors"
10595
+ },
10596
+ "+ Adicionar"
10597
+ )), questDate && /* @__PURE__ */ React19.createElement("div", { className: "p-3 bg-slate-900/60 rounded-xl border border-white/10 space-y-3 relative group" }, canEdit && /* @__PURE__ */ React19.createElement(
10598
+ "button",
10599
+ {
10600
+ type: "button",
10601
+ onClick: () => {
10602
+ setQuestDate(null);
10603
+ setHasUnsavedChanges(true);
10604
+ },
10605
+ className: "absolute top-2 right-2 w-6 h-6 grid place-items-center rounded-full bg-red-500/10 text-red-400 opacity-0 group-hover:opacity-100 transition-opacity",
10606
+ title: "Remover data"
10607
+ },
10608
+ /* @__PURE__ */ React19.createElement(FiX7, { size: 12 })
10609
+ ), /* @__PURE__ */ React19.createElement("div", { className: `flex items-center gap-1 rounded-lg bg-slate-800/50 p-1 ${!canEdit ? "opacity-70 pointer-events-none" : ""}` }, ["Data", "Ano", "Date Interval"].map((t) => /* @__PURE__ */ React19.createElement(
10610
+ "button",
10611
+ {
10612
+ key: t,
10613
+ type: "button",
10614
+ onClick: () => {
10615
+ const newDate = { type: t };
10616
+ if (t === "Date Interval") {
10617
+ newDate.start = "";
10618
+ newDate.end = "";
10619
+ } else {
10620
+ newDate.value = "";
10621
+ }
10622
+ setQuestDate(newDate);
10623
+ setHasUnsavedChanges(true);
10624
+ },
10625
+ className: `flex-1 text-[10px] px-2 py-1.5 rounded-md transition-colors ${questDate.type === t ? "bg-indigo-600 text-white font-semibold shadow" : "text-slate-400 hover:bg-slate-700/50"}`
10626
+ },
10627
+ t === "Date Interval" ? "Intervalo" : t
10628
+ ))), questDate.type === "Data" && /* @__PURE__ */ React19.createElement(
10629
+ "input",
10630
+ {
10631
+ type: "text",
10632
+ readOnly: !canEdit,
10633
+ placeholder: "DD/MM/AAAA",
10634
+ value: questDate.value || "",
10635
+ onChange: (e) => {
10636
+ const rawValue = e.target.value;
10637
+ const digits = rawValue.replace(/\D/g, "");
10638
+ const len = digits.length;
10639
+ let formattedValue = digits;
10640
+ if (len > 2 && len <= 4)
10641
+ formattedValue = `${digits.slice(0, 2)}/${digits.slice(2)}`;
10642
+ else if (len > 4)
10643
+ formattedValue = `${digits.slice(0, 2)}/${digits.slice(2, 4)}/${digits.slice(4, 8)}`;
10644
+ setQuestDate({ ...questDate, value: formattedValue });
10645
+ setHasUnsavedChanges(true);
10646
+ },
10647
+ maxLength: "10",
10648
+ className: `w-full bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10649
+ }
10650
+ ), questDate.type === "Ano" && /* @__PURE__ */ React19.createElement(
10651
+ "input",
10652
+ {
10653
+ type: "number",
10654
+ readOnly: !canEdit,
10655
+ placeholder: "AAAA",
10656
+ value: questDate.value || "",
10657
+ onChange: (e) => {
10658
+ setQuestDate({ ...questDate, value: e.target.value });
10659
+ setHasUnsavedChanges(true);
10660
+ },
10661
+ className: `w-full bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10662
+ }
10663
+ ), questDate.type === "Date Interval" && /* @__PURE__ */ React19.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React19.createElement(
10664
+ "input",
10665
+ {
10666
+ type: "number",
10667
+ readOnly: !canEdit,
10668
+ placeholder: "In\xEDcio (Ano)",
10669
+ value: questDate.start || "",
10670
+ onChange: (e) => {
10671
+ setQuestDate({ ...questDate, start: e.target.value });
10672
+ setHasUnsavedChanges(true);
10673
+ },
10674
+ className: `flex-1 bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10675
+ }
10676
+ ), /* @__PURE__ */ React19.createElement("span", { className: "text-slate-500" }, "-"), /* @__PURE__ */ React19.createElement(
10677
+ "input",
10678
+ {
10679
+ type: "number",
10680
+ readOnly: !canEdit,
10681
+ placeholder: "Fim (Ano)",
10682
+ value: questDate.end || "",
10683
+ onChange: (e) => {
10684
+ setQuestDate({ ...questDate, end: e.target.value });
10685
+ setHasUnsavedChanges(true);
10686
+ },
10687
+ className: `flex-1 bg-slate-800/70 p-2 text-sm rounded-lg border border-white/10 focus:outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none ${canEdit ? "focus:ring-1 focus:ring-indigo-400/60" : "text-slate-400 cursor-default"}`
10688
+ }
10689
+ )))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React19.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React19.createElement("div", { className: "relative" }, /* @__PURE__ */ React19.createElement(
10571
10690
  "button",
10572
10691
  {
10573
10692
  type: "button",
@@ -10665,7 +10784,77 @@ ${noteText}` : noteText : entry.notes,
10665
10784
  )), viewMembers.filter((member) => {
10666
10785
  const search = assigneeSearchQuery.toLowerCase();
10667
10786
  return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10668
- }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ React19.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ React19.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ React19.createElement(FiUser3, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ React19.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React19.createElement(
10787
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ React19.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ React19.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400 flex items-center gap-2" }, /* @__PURE__ */ React19.createElement(FiUser3, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ React19.createElement("div", { className: "pt-4 border-t border-white/5 mt-2" }, /* @__PURE__ */ React19.createElement("div", { className: "flex items-center justify-between mb-3" }, /* @__PURE__ */ React19.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React19.createElement(FiRepeat2, { className: `w-3.5 h-3.5 ${recurrenceConfig.enabled ? "text-indigo-400" : "text-slate-500"}` }), /* @__PURE__ */ React19.createElement("span", { className: "text-xs text-slate-300 font-medium uppercase tracking-wider" }, "Recorr\xEAncia")), /* @__PURE__ */ React19.createElement(
10788
+ "button",
10789
+ {
10790
+ type: "button",
10791
+ disabled: !canEdit,
10792
+ onClick: () => {
10793
+ setRecurrenceConfig((prev) => ({ ...prev, enabled: !prev.enabled }));
10794
+ setHasUnsavedChanges(true);
10795
+ },
10796
+ className: `relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-none ${recurrenceConfig.enabled ? "bg-indigo-600" : "bg-slate-700"} ${canEdit ? "cursor-pointer" : "cursor-default opacity-60"}`
10797
+ },
10798
+ /* @__PURE__ */ React19.createElement("span", { className: `inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${recurrenceConfig.enabled ? "translate-x-4.5" : "translate-x-1"}` })
10799
+ )), recurrenceConfig.enabled && /* @__PURE__ */ React19.createElement("div", { className: "space-y-4 p-3 rounded-xl bg-white/5 border border-white/5 animate-in fade-in slide-in-from-top-1" }, /* @__PURE__ */ React19.createElement("div", { className: "grid grid-cols-2 gap-3" }, /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React19.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Tipo"), /* @__PURE__ */ React19.createElement(
10800
+ "select",
10801
+ {
10802
+ disabled: !canEdit,
10803
+ value: recurrenceConfig.type,
10804
+ onChange: (e) => {
10805
+ setRecurrenceConfig((prev) => ({ ...prev, type: e.target.value }));
10806
+ setHasUnsavedChanges(true);
10807
+ },
10808
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10809
+ },
10810
+ /* @__PURE__ */ React19.createElement("option", { value: "daily" }, "Di\xE1ria"),
10811
+ /* @__PURE__ */ React19.createElement("option", { value: "weekly" }, "Semanal"),
10812
+ /* @__PURE__ */ React19.createElement("option", { value: "custom" }, "Data Espec\xEDfica")
10813
+ )), recurrenceConfig.type === "weekly" && /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React19.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Dia da Semana"), /* @__PURE__ */ React19.createElement(
10814
+ "select",
10815
+ {
10816
+ disabled: !canEdit,
10817
+ value: recurrenceConfig.day_of_week,
10818
+ onChange: (e) => {
10819
+ setRecurrenceConfig((prev) => ({ ...prev, day_of_week: parseInt(e.target.value, 10) }));
10820
+ setHasUnsavedChanges(true);
10821
+ },
10822
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10823
+ },
10824
+ /* @__PURE__ */ React19.createElement("option", { value: 1 }, "Segunda-feira"),
10825
+ /* @__PURE__ */ React19.createElement("option", { value: 2 }, "Ter\xE7a-feira"),
10826
+ /* @__PURE__ */ React19.createElement("option", { value: 3 }, "Quarta-feira"),
10827
+ /* @__PURE__ */ React19.createElement("option", { value: 4 }, "Quinta-feira"),
10828
+ /* @__PURE__ */ React19.createElement("option", { value: 5 }, "Sexta-feira"),
10829
+ /* @__PURE__ */ React19.createElement("option", { value: 6 }, "S\xE1bado"),
10830
+ /* @__PURE__ */ React19.createElement("option", { value: 0 }, "Domingo")
10831
+ )), recurrenceConfig.type === "custom" && /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React19.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Pr\xF3xima Data"), /* @__PURE__ */ React19.createElement(
10832
+ "input",
10833
+ {
10834
+ readOnly: !canEdit,
10835
+ type: "text",
10836
+ placeholder: "DD/MM/AAAA",
10837
+ value: recurrenceConfig.custom_date,
10838
+ onChange: (e) => {
10839
+ setRecurrenceConfig((prev) => ({ ...prev, custom_date: e.target.value }));
10840
+ setHasUnsavedChanges(true);
10841
+ },
10842
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg px-2 py-1.5 text-xs text-slate-200 focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "text-slate-400"}`
10843
+ }
10844
+ ))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React19.createElement("label", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Pr\xF3ximo Respons\xE1vel"), /* @__PURE__ */ React19.createElement("div", { className: "relative" }, /* @__PURE__ */ React19.createElement(
10845
+ "select",
10846
+ {
10847
+ disabled: !canEdit,
10848
+ value: recurrenceConfig.next_assignee_id,
10849
+ onChange: (e) => {
10850
+ setRecurrenceConfig((prev) => ({ ...prev, next_assignee_id: e.target.value }));
10851
+ setHasUnsavedChanges(true);
10852
+ },
10853
+ className: `w-full bg-slate-900/50 border border-white/10 rounded-lg pl-8 pr-2 py-1.5 text-xs text-slate-200 appearance-none focus:outline-none ${canEdit ? "focus:ring-1 focus:ring-indigo-500/50" : "opacity-70"}`
10854
+ },
10855
+ /* @__PURE__ */ React19.createElement("option", { value: "" }, "Sem respons\xE1vel"),
10856
+ viewMembers.map((member) => /* @__PURE__ */ React19.createElement("option", { key: member.id, value: member.id }, member.name || member.email))
10857
+ ), /* @__PURE__ */ React19.createElement(FiUser3, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-slate-500" }), /* @__PURE__ */ React19.createElement(FiChevronDown7, { className: "absolute right-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-slate-500 pointer-events-none" }))))), /* @__PURE__ */ React19.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React19.createElement(
10669
10858
  QuestReviewStackEditor,
10670
10859
  {
10671
10860
  reviewStack,
@@ -10777,7 +10966,7 @@ ${noteText}` : noteText : entry.notes,
10777
10966
  onChange: (e) => updateLinkInNote(link.id, "value", e.target.value),
10778
10967
  className: "flex-1 bg-slate-950/50 border border-white/5 rounded px-2 py-1 text-[10px] focus:outline-none focus:border-indigo-500/50"
10779
10968
  }
10780
- ), /* @__PURE__ */ React19.createElement("button", { type: "button", onClick: () => removeLinkFromNote(link.id), className: "text-slate-600 hover:text-red-400 transition-colors" }, /* @__PURE__ */ React19.createElement(FiX7, { size: 12 })))))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React19.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React19.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Imagens (URLs)"), /* @__PURE__ */ React19.createElement("button", { type: "button", onClick: addImageToNote, className: "text-indigo-400 hover:text-indigo-300 text-[10px] flex items-center gap-1 font-medium" }, /* @__PURE__ */ React19.createElement(FiPlus8, { size: 10 }), " Adicionar Imagem")), noteImages.length > 0 && /* @__PURE__ */ React19.createElement("div", { className: "space-y-2" }, noteImages.map((img) => /* @__PURE__ */ React19.createElement("div", { key: img.id, className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-1" }, /* @__PURE__ */ React19.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-950/50 border border-white/5 rounded px-2 py-1" }, /* @__PURE__ */ React19.createElement(FiImage, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ React19.createElement(
10969
+ ), /* @__PURE__ */ React19.createElement("button", { type: "button", onClick: () => removeLinkFromNote(link.id), className: "text-slate-600 hover:text-red-400 transition-colors" }, /* @__PURE__ */ React19.createElement(FiX7, { size: 12 })))))), /* @__PURE__ */ React19.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React19.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React19.createElement("span", { className: "text-[10px] text-slate-500 uppercase font-bold tracking-tight" }, "Imagens (URLs)"), /* @__PURE__ */ React19.createElement("button", { type: "button", onClick: addImageToNote, className: "text-indigo-400 hover:text-indigo-300 text-[10px] flex items-center gap-1 font-medium" }, /* @__PURE__ */ React19.createElement(FiPlus8, { size: 10 }), " Adicionar Imagem")), noteImages.length > 0 && /* @__PURE__ */ React19.createElement("div", { className: "space-y-2" }, noteImages.map((img) => /* @__PURE__ */ React19.createElement("div", { key: img.id, className: "flex items-center gap-2 animate-in fade-in slide-in-from-left-1" }, /* @__PURE__ */ React19.createElement("div", { className: "flex-1 flex items-center gap-2 bg-slate-950/50 border border-white/5 rounded px-2 py-1" }, /* @__PURE__ */ React19.createElement(FiImage4, { size: 10, className: "text-slate-600" }), /* @__PURE__ */ React19.createElement(
10781
10970
  "input",
10782
10971
  {
10783
10972
  type: "text",
@@ -13432,7 +13621,7 @@ function XViewScene({
13432
13621
  if (!timeInfo.isUndated && timeInfo.label) {
13433
13622
  const dateSprite = createTextSprite(timeInfo.label, 36);
13434
13623
  dateSprite.name = "questDateLabel";
13435
- dateSprite.position.set(0, 3.5, 0);
13624
+ dateSprite.position.set(0, -5.5, 0);
13436
13625
  mesh.add(dateSprite);
13437
13626
  }
13438
13627
  if (mesh.userData.labelObject) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lv-x-software-house/x_view",
3
- "version": "1.2.5-dev.39",
3
+ "version": "1.2.5-dev.40",
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",