@lv-x-software-house/x_view 1.2.5-dev.18 → 1.2.5-dev.19

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 +119 -20
  2. package/dist/index.mjs +124 -25
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8381,6 +8381,7 @@ function InSceneQuestForm({
8381
8381
  // NOVA PROP
8382
8382
  viewMembers = []
8383
8383
  }) {
8384
+ var _a, _b;
8384
8385
  const [name, setName] = (0, import_react16.useState)("");
8385
8386
  const [assigneeId, setAssigneeId] = (0, import_react16.useState)("");
8386
8387
  const [types, setTypes] = (0, import_react16.useState)(["quest"]);
@@ -8390,6 +8391,8 @@ function InSceneQuestForm({
8390
8391
  const [intensity, setIntensity] = (0, import_react16.useState)(0);
8391
8392
  const [description, setDescription] = (0, import_react16.useState)("");
8392
8393
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react16.useState)(false);
8394
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react16.useState)(false);
8395
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react16.useState)("");
8393
8396
  const [customProps, setCustomProps] = (0, import_react16.useState)([]);
8394
8397
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = (0, import_react16.useState)(false);
8395
8398
  const propsEndRef = (0, import_react16.useRef)(null);
@@ -8398,8 +8401,8 @@ function InSceneQuestForm({
8398
8401
  const newProp = createNewCustomProperty(customProps);
8399
8402
  setCustomProps([...customProps, newProp]);
8400
8403
  setTimeout(() => {
8401
- var _a;
8402
- (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "center" });
8404
+ var _a2;
8405
+ (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth", block: "center" });
8403
8406
  }, 100);
8404
8407
  };
8405
8408
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8517,16 +8520,59 @@ function InSceneQuestForm({
8517
8520
  },
8518
8521
  /* @__PURE__ */ import_react16.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
8519
8522
  s
8520
- )))))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react16.default.createElement(
8521
- "select",
8523
+ )))))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
8524
+ "button",
8522
8525
  {
8523
- value: assigneeId,
8524
- onChange: (e) => setAssigneeId(e.target.value),
8525
- className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors text-slate-200"
8526
+ type: "button",
8527
+ onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
8528
+ className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
8526
8529
  },
8527
- /* @__PURE__ */ import_react16.default.createElement("option", { value: "" }, "Nenhum"),
8528
- viewMembers.map((member) => /* @__PURE__ */ import_react16.default.createElement("option", { key: member.id, value: member.id }, member.name || member.email || member.id))
8529
- )), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react16.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 12 })))), /* @__PURE__ */ import_react16.default.createElement(
8530
+ /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
8531
+ /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8532
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8533
+ setIsAssigneeDropdownOpen(false);
8534
+ setAssigneeSearchQuery("");
8535
+ } }), /* @__PURE__ */ import_react16.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react16.default.createElement(
8536
+ "input",
8537
+ {
8538
+ type: "text",
8539
+ autoFocus: true,
8540
+ placeholder: "Buscar membro...",
8541
+ value: assigneeSearchQuery,
8542
+ onChange: (e) => setAssigneeSearchQuery(e.target.value),
8543
+ className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
8544
+ onClick: (e) => e.stopPropagation()
8545
+ }
8546
+ )), /* @__PURE__ */ import_react16.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react16.default.createElement(
8547
+ "li",
8548
+ {
8549
+ onClick: () => {
8550
+ setAssigneeId("");
8551
+ setIsAssigneeDropdownOpen(false);
8552
+ setAssigneeSearchQuery("");
8553
+ },
8554
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
8555
+ },
8556
+ "Nenhum"
8557
+ ), viewMembers.filter((member) => {
8558
+ const search = assigneeSearchQuery.toLowerCase();
8559
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8560
+ }).map((member) => /* @__PURE__ */ import_react16.default.createElement(
8561
+ "li",
8562
+ {
8563
+ key: member.id,
8564
+ onClick: () => {
8565
+ setAssigneeId(member.id);
8566
+ setIsAssigneeDropdownOpen(false);
8567
+ setAssigneeSearchQuery("");
8568
+ },
8569
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${assigneeId === member.id ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
8570
+ },
8571
+ member.name || member.email || member.id
8572
+ )), viewMembers.filter((member) => {
8573
+ const search = assigneeSearchQuery.toLowerCase();
8574
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8575
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react16.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react16.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ import_react16.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ import_react16.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react16.default.createElement(import_fi14.FiX, { size: 12 })))), /* @__PURE__ */ import_react16.default.createElement(
8530
8576
  "input",
8531
8577
  {
8532
8578
  type: "text",
@@ -9145,6 +9191,8 @@ function QuestDetailsPanel({
9145
9191
  const [description, setDescription] = (0, import_react18.useState)((node == null ? void 0 : node.description) ?? "");
9146
9192
  const [intensity, setIntensity] = (0, import_react18.useState)((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9147
9193
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react18.useState)(false);
9194
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react18.useState)(false);
9195
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react18.useState)("");
9148
9196
  const [customProps, setCustomProps] = (0, import_react18.useState)(() => extractCustomPropsFromNode(node || {}));
9149
9197
  const [showTypeSuggestions, setShowTypeSuggestions] = (0, import_react18.useState)(false);
9150
9198
  const [filteredTypes, setFilteredTypes] = (0, import_react18.useState)([]);
@@ -9428,20 +9476,71 @@ function QuestDetailsPanel({
9428
9476
  },
9429
9477
  /* @__PURE__ */ import_react18.default.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
9430
9478
  s
9431
- )))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react18.default.createElement(
9432
- "select",
9479
+ )))))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
9480
+ "button",
9433
9481
  {
9434
- value: assigneeId,
9435
- onChange: (e) => {
9436
- setAssigneeId(e.target.value);
9482
+ type: "button",
9483
+ onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
9484
+ className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
9485
+ },
9486
+ /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
9487
+ /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
9488
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
9489
+ setIsAssigneeDropdownOpen(false);
9490
+ setAssigneeSearchQuery("");
9491
+ } }), /* @__PURE__ */ import_react18.default.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiSearch, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ import_react18.default.createElement(
9492
+ "input",
9493
+ {
9494
+ type: "text",
9495
+ autoFocus: true,
9496
+ placeholder: "Buscar membro...",
9497
+ value: assigneeSearchQuery,
9498
+ onChange: (e) => setAssigneeSearchQuery(e.target.value),
9499
+ className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
9500
+ onClick: (e) => e.stopPropagation()
9501
+ }
9502
+ )), /* @__PURE__ */ import_react18.default.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ import_react18.default.createElement(
9503
+ "li",
9504
+ {
9505
+ onClick: () => {
9506
+ setAssigneeId("");
9507
+ setHasUnsavedChanges(true);
9508
+ setIsAssigneeDropdownOpen(false);
9509
+ setAssigneeSearchQuery("");
9510
+ },
9511
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9512
+ },
9513
+ "Nenhum"
9514
+ ), isAssigneeUndefined && /* @__PURE__ */ import_react18.default.createElement(
9515
+ "li",
9516
+ {
9517
+ onClick: () => {
9518
+ setIsAssigneeDropdownOpen(false);
9519
+ setAssigneeSearchQuery("");
9520
+ },
9521
+ className: "px-3 py-2.5 text-sm cursor-pointer bg-red-500/10 text-red-300 flex items-center gap-2"
9522
+ },
9523
+ "Undefined (Removido)"
9524
+ ), viewMembers.filter((member) => {
9525
+ const search = assigneeSearchQuery.toLowerCase();
9526
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9527
+ }).map((member) => /* @__PURE__ */ import_react18.default.createElement(
9528
+ "li",
9529
+ {
9530
+ key: member.id,
9531
+ onClick: () => {
9532
+ setAssigneeId(member.id);
9437
9533
  setHasUnsavedChanges(true);
9534
+ setIsAssigneeDropdownOpen(false);
9535
+ setAssigneeSearchQuery("");
9438
9536
  },
9439
- className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors text-slate-200"
9537
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${assigneeId === member.id ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9440
9538
  },
9441
- /* @__PURE__ */ import_react18.default.createElement("option", { value: "" }, "Nenhum"),
9442
- isAssigneeUndefined && /* @__PURE__ */ import_react18.default.createElement("option", { value: assigneeId }, "Undefined"),
9443
- viewMembers.map((member) => /* @__PURE__ */ import_react18.default.createElement("option", { key: member.id, value: member.id }, member.name || member.email || member.id))
9444
- ) : /* @__PURE__ */ import_react18.default.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400" }, assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react18.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react18.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9539
+ member.name || member.email || member.id
9540
+ )), viewMembers.filter((member) => {
9541
+ const search = assigneeSearchQuery.toLowerCase();
9542
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9543
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ import_react18.default.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ import_react18.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_react18.default.createElement(import_fi16.FiUser, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react18.default.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ import_react18.default.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ import_react18.default.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ import_react18.default.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ import_react18.default.createElement(import_fi16.FiX, { size: 12 })))), canEdit && /* @__PURE__ */ import_react18.default.createElement(
9445
9544
  "input",
9446
9545
  {
9447
9546
  type: "text",
package/dist/index.mjs CHANGED
@@ -8347,7 +8347,7 @@ function InSceneVersionForm({
8347
8347
 
8348
8348
  // src/components/InSceneQuestForm.jsx
8349
8349
  import React15, { useState as useState16, useRef as useRef12 } from "react";
8350
- import { FiPlus as FiPlus5, FiCheck as FiCheck9, FiEdit2 as FiEdit26, FiTarget, FiX as FiX4, FiChevronDown as FiChevronDown5 } from "react-icons/fi";
8350
+ import { FiPlus as FiPlus5, FiCheck as FiCheck9, FiEdit2 as FiEdit26, FiTarget, FiX as FiX4, FiChevronDown as FiChevronDown5, FiUser, FiSearch as FiSearch4 } from "react-icons/fi";
8351
8351
  var QUEST_STATUS_COLORS2 = {
8352
8352
  "Backlog": "#64748b",
8353
8353
  "In Progress": "#eab308",
@@ -8373,6 +8373,7 @@ function InSceneQuestForm({
8373
8373
  // NOVA PROP
8374
8374
  viewMembers = []
8375
8375
  }) {
8376
+ var _a, _b;
8376
8377
  const [name, setName] = useState16("");
8377
8378
  const [assigneeId, setAssigneeId] = useState16("");
8378
8379
  const [types, setTypes] = useState16(["quest"]);
@@ -8382,6 +8383,8 @@ function InSceneQuestForm({
8382
8383
  const [intensity, setIntensity] = useState16(0);
8383
8384
  const [description, setDescription] = useState16("");
8384
8385
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = useState16(false);
8386
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = useState16(false);
8387
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = useState16("");
8385
8388
  const [customProps, setCustomProps] = useState16([]);
8386
8389
  const [isDescriptionModalOpen, setIsDescriptionModalOpen] = useState16(false);
8387
8390
  const propsEndRef = useRef12(null);
@@ -8390,8 +8393,8 @@ function InSceneQuestForm({
8390
8393
  const newProp = createNewCustomProperty(customProps);
8391
8394
  setCustomProps([...customProps, newProp]);
8392
8395
  setTimeout(() => {
8393
- var _a;
8394
- (_a = propsEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "center" });
8396
+ var _a2;
8397
+ (_a2 = propsEndRef.current) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth", block: "center" });
8395
8398
  }, 100);
8396
8399
  };
8397
8400
  const handleRemoveProp = (index) => setCustomProps(customProps.filter((_, i) => i !== index));
@@ -8509,16 +8512,59 @@ function InSceneQuestForm({
8509
8512
  },
8510
8513
  /* @__PURE__ */ React15.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS2[s] } }),
8511
8514
  s
8512
- )))))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ React15.createElement(
8513
- "select",
8515
+ )))))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), /* @__PURE__ */ React15.createElement("div", { className: "relative" }, /* @__PURE__ */ React15.createElement(
8516
+ "button",
8514
8517
  {
8515
- value: assigneeId,
8516
- onChange: (e) => setAssigneeId(e.target.value),
8517
- className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors text-slate-200"
8518
+ type: "button",
8519
+ onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
8520
+ className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
8518
8521
  },
8519
- /* @__PURE__ */ React15.createElement("option", { value: "" }, "Nenhum"),
8520
- viewMembers.map((member) => /* @__PURE__ */ React15.createElement("option", { key: member.id, value: member.id }, member.name || member.email || member.id))
8521
- )), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ React15.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ React15.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ React15.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ React15.createElement(FiX4, { size: 12 })))), /* @__PURE__ */ React15.createElement(
8522
+ /* @__PURE__ */ React15.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React15.createElement(FiUser, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ React15.createElement("span", { className: "text-slate-200 font-medium" }, ((_a = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _a.name) || ((_b = viewMembers.find((m) => m.id === assigneeId)) == null ? void 0 : _b.email) || "Nenhum")),
8523
+ /* @__PURE__ */ React15.createElement(FiChevronDown5, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
8524
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ React15.createElement(React15.Fragment, null, /* @__PURE__ */ React15.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
8525
+ setIsAssigneeDropdownOpen(false);
8526
+ setAssigneeSearchQuery("");
8527
+ } }), /* @__PURE__ */ React15.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ React15.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ React15.createElement(FiSearch4, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ React15.createElement(
8528
+ "input",
8529
+ {
8530
+ type: "text",
8531
+ autoFocus: true,
8532
+ placeholder: "Buscar membro...",
8533
+ value: assigneeSearchQuery,
8534
+ onChange: (e) => setAssigneeSearchQuery(e.target.value),
8535
+ className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
8536
+ onClick: (e) => e.stopPropagation()
8537
+ }
8538
+ )), /* @__PURE__ */ React15.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ React15.createElement(
8539
+ "li",
8540
+ {
8541
+ onClick: () => {
8542
+ setAssigneeId("");
8543
+ setIsAssigneeDropdownOpen(false);
8544
+ setAssigneeSearchQuery("");
8545
+ },
8546
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
8547
+ },
8548
+ "Nenhum"
8549
+ ), viewMembers.filter((member) => {
8550
+ const search = assigneeSearchQuery.toLowerCase();
8551
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8552
+ }).map((member) => /* @__PURE__ */ React15.createElement(
8553
+ "li",
8554
+ {
8555
+ key: member.id,
8556
+ onClick: () => {
8557
+ setAssigneeId(member.id);
8558
+ setIsAssigneeDropdownOpen(false);
8559
+ setAssigneeSearchQuery("");
8560
+ },
8561
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${assigneeId === member.id ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
8562
+ },
8563
+ member.name || member.email || member.id
8564
+ )), viewMembers.filter((member) => {
8565
+ const search = assigneeSearchQuery.toLowerCase();
8566
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
8567
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ React15.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ React15.createElement("div", { className: "relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 focus-within:ring-2 focus-within:ring-indigo-400/60 transition-all" }, types.map((t, index) => /* @__PURE__ */ React15.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, t !== "quest" && /* @__PURE__ */ React15.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ React15.createElement(FiX4, { size: 12 })))), /* @__PURE__ */ React15.createElement(
8522
8568
  "input",
8523
8569
  {
8524
8570
  type: "text",
@@ -9097,7 +9143,7 @@ function NodeDetailsPanel({
9097
9143
 
9098
9144
  // src/components/QuestDetailsPanel.jsx
9099
9145
  import React17, { useState as useState18, useEffect as useEffect16, useRef as useRef14 } from "react";
9100
- import { FiPlus as FiPlus7, FiX as FiX6, FiCheck as FiCheck11, FiEdit2 as FiEdit28, FiLoader as FiLoader3, FiBookOpen as FiBookOpen4, FiLink as FiLink6, FiTarget as FiTarget2, FiChevronDown as FiChevronDown6 } from "react-icons/fi";
9146
+ import { FiPlus as FiPlus7, FiX as FiX6, FiCheck as FiCheck11, FiEdit2 as FiEdit28, FiLoader as FiLoader3, FiBookOpen as FiBookOpen4, FiLink as FiLink6, FiTarget as FiTarget2, FiChevronDown as FiChevronDown6, FiUser as FiUser2, FiSearch as FiSearch5 } from "react-icons/fi";
9101
9147
  var QUEST_STATUS_COLORS3 = {
9102
9148
  "Backlog": "#64748b",
9103
9149
  "In Progress": "#eab308",
@@ -9137,6 +9183,8 @@ function QuestDetailsPanel({
9137
9183
  const [description, setDescription] = useState18((node == null ? void 0 : node.description) ?? "");
9138
9184
  const [intensity, setIntensity] = useState18((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9139
9185
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = useState18(false);
9186
+ const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = useState18(false);
9187
+ const [assigneeSearchQuery, setAssigneeSearchQuery] = useState18("");
9140
9188
  const [customProps, setCustomProps] = useState18(() => extractCustomPropsFromNode(node || {}));
9141
9189
  const [showTypeSuggestions, setShowTypeSuggestions] = useState18(false);
9142
9190
  const [filteredTypes, setFilteredTypes] = useState18([]);
@@ -9420,20 +9468,71 @@ function QuestDetailsPanel({
9420
9468
  },
9421
9469
  /* @__PURE__ */ React17.createElement("span", { className: "w-3 h-3 rounded-full", style: { backgroundColor: QUEST_STATUS_COLORS3[s] } }),
9422
9470
  s
9423
- )))))), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ React17.createElement(
9424
- "select",
9471
+ )))))), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Assignee (Respons\xE1vel)"), canEdit ? /* @__PURE__ */ React17.createElement("div", { className: "relative" }, /* @__PURE__ */ React17.createElement(
9472
+ "button",
9425
9473
  {
9426
- value: assigneeId,
9427
- onChange: (e) => {
9428
- setAssigneeId(e.target.value);
9474
+ type: "button",
9475
+ onClick: () => setIsAssigneeDropdownOpen(!isAssigneeDropdownOpen),
9476
+ className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors flex items-center justify-between"
9477
+ },
9478
+ /* @__PURE__ */ React17.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React17.createElement(FiUser2, { className: "text-slate-400", size: 14 }), /* @__PURE__ */ React17.createElement("span", { className: "text-slate-200 font-medium" }, isAssigneeUndefined ? "Undefined" : (assigneeMember == null ? void 0 : assigneeMember.name) || (assigneeMember == null ? void 0 : assigneeMember.email) || "Nenhum")),
9479
+ /* @__PURE__ */ React17.createElement(FiChevronDown6, { className: `text-slate-400 transition-transform duration-200 ${isAssigneeDropdownOpen ? "rotate-180" : ""}` })
9480
+ ), isAssigneeDropdownOpen && /* @__PURE__ */ React17.createElement(React17.Fragment, null, /* @__PURE__ */ React17.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
9481
+ setIsAssigneeDropdownOpen(false);
9482
+ setAssigneeSearchQuery("");
9483
+ } }), /* @__PURE__ */ React17.createElement("div", { className: "absolute top-full left-0 mt-1.5 w-full bg-slate-900 border border-white/10 rounded-lg shadow-[0_8px_30px_rgba(0,0,0,0.5)] z-50 overflow-hidden flex flex-col" }, /* @__PURE__ */ React17.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ React17.createElement(FiSearch5, { className: "text-slate-500", size: 14 }), /* @__PURE__ */ React17.createElement(
9484
+ "input",
9485
+ {
9486
+ type: "text",
9487
+ autoFocus: true,
9488
+ placeholder: "Buscar membro...",
9489
+ value: assigneeSearchQuery,
9490
+ onChange: (e) => setAssigneeSearchQuery(e.target.value),
9491
+ className: "bg-transparent border-none outline-none text-xs text-white placeholder-slate-500 w-full",
9492
+ onClick: (e) => e.stopPropagation()
9493
+ }
9494
+ )), /* @__PURE__ */ React17.createElement("ul", { className: "max-h-48 overflow-y-auto custom-scrollbar" }, /* @__PURE__ */ React17.createElement(
9495
+ "li",
9496
+ {
9497
+ onClick: () => {
9498
+ setAssigneeId("");
9499
+ setHasUnsavedChanges(true);
9500
+ setIsAssigneeDropdownOpen(false);
9501
+ setAssigneeSearchQuery("");
9502
+ },
9503
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${!assigneeId ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9504
+ },
9505
+ "Nenhum"
9506
+ ), isAssigneeUndefined && /* @__PURE__ */ React17.createElement(
9507
+ "li",
9508
+ {
9509
+ onClick: () => {
9510
+ setIsAssigneeDropdownOpen(false);
9511
+ setAssigneeSearchQuery("");
9512
+ },
9513
+ className: "px-3 py-2.5 text-sm cursor-pointer bg-red-500/10 text-red-300 flex items-center gap-2"
9514
+ },
9515
+ "Undefined (Removido)"
9516
+ ), viewMembers.filter((member) => {
9517
+ const search = assigneeSearchQuery.toLowerCase();
9518
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9519
+ }).map((member) => /* @__PURE__ */ React17.createElement(
9520
+ "li",
9521
+ {
9522
+ key: member.id,
9523
+ onClick: () => {
9524
+ setAssigneeId(member.id);
9429
9525
  setHasUnsavedChanges(true);
9526
+ setIsAssigneeDropdownOpen(false);
9527
+ setAssigneeSearchQuery("");
9430
9528
  },
9431
- className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-2 focus:ring-indigo-400/60 transition-colors text-slate-200"
9529
+ className: `px-3 py-2.5 text-sm cursor-pointer transition-colors flex items-center gap-2 ${assigneeId === member.id ? "bg-indigo-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
9432
9530
  },
9433
- /* @__PURE__ */ React17.createElement("option", { value: "" }, "Nenhum"),
9434
- isAssigneeUndefined && /* @__PURE__ */ React17.createElement("option", { value: assigneeId }, "Undefined"),
9435
- viewMembers.map((member) => /* @__PURE__ */ React17.createElement("option", { key: member.id, value: member.id }, member.name || member.email || member.id))
9436
- ) : /* @__PURE__ */ React17.createElement("div", { className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 text-slate-400" }, assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ React17.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ React17.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ React17.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ React17.createElement(FiX6, { size: 12 })))), canEdit && /* @__PURE__ */ React17.createElement(
9531
+ member.name || member.email || member.id
9532
+ )), viewMembers.filter((member) => {
9533
+ const search = assigneeSearchQuery.toLowerCase();
9534
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
9535
+ }).length === 0 && assigneeSearchQuery && /* @__PURE__ */ React17.createElement("li", { className: "px-3 py-4 text-xs text-slate-500 text-center italic" }, "Nenhum membro encontrado"))))) : /* @__PURE__ */ React17.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__ */ React17.createElement(FiUser2, { className: "opacity-50", size: 14 }), assigneeId ? assigneeMember ? assigneeMember.name || assigneeMember.email : "Undefined" : "Nenhum")), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Tipos Adicionais"), /* @__PURE__ */ React17.createElement("div", { className: `relative w-full bg-slate-800/70 p-1.5 min-h-[42px] flex flex-wrap gap-1.5 rounded-lg border border-white/10 ${canEdit ? "focus-within:ring-2 focus-within:ring-indigo-400/60" : ""} transition-all` }, types.map((t, index) => /* @__PURE__ */ React17.createElement("span", { key: index, className: `flex items-center gap-1 px-1.5 py-0.5 rounded-md text-xs font-medium border ${t === "quest" ? "bg-sky-500/20 text-sky-200 border-sky-500/30" : "bg-indigo-500/30 text-indigo-100 border-indigo-500/20"}` }, t, canEdit && t !== "quest" && /* @__PURE__ */ React17.createElement("button", { type: "button", onClick: () => handleRemoveType(index), className: "hover:text-white transition-colors" }, /* @__PURE__ */ React17.createElement(FiX6, { size: 12 })))), canEdit && /* @__PURE__ */ React17.createElement(
9437
9536
  "input",
9438
9537
  {
9439
9538
  type: "text",
@@ -10311,7 +10410,7 @@ function AncestryLinkDetailsPanel({ data, onClose, onOpenImageViewer, onOpenRefe
10311
10410
  // src/components/AncestryBoard.jsx
10312
10411
  import React24, { useState as useState24, useMemo as useMemo11, useEffect as useEffect21, useRef as useRef18 } from "react";
10313
10412
  import {
10314
- FiSearch as FiSearch4,
10413
+ FiSearch as FiSearch6,
10315
10414
  FiLayers as FiLayers6,
10316
10415
  FiCornerUpRight as FiCornerUpRight4,
10317
10416
  FiPlay,
@@ -10436,7 +10535,7 @@ var GroupItem = ({
10436
10535
  `,
10437
10536
  title: "Adicionar Ancestralidade a este grupo"
10438
10537
  },
10439
- isPickingForThisGroup ? /* @__PURE__ */ React24.createElement(FiCheckCircle, { size: 12 }) : /* @__PURE__ */ React24.createElement(FiSearch4, { size: 12 }),
10538
+ isPickingForThisGroup ? /* @__PURE__ */ React24.createElement(FiCheckCircle, { size: 12 }) : /* @__PURE__ */ React24.createElement(FiSearch6, { size: 12 }),
10440
10539
  isPickingForThisGroup ? "Selecionando..." : "Adicionar"
10441
10540
  ), /* @__PURE__ */ React24.createElement(
10442
10541
  "button",
@@ -10771,7 +10870,7 @@ function AncestryBoard({
10771
10870
  `
10772
10871
  },
10773
10872
  /* @__PURE__ */ React24.createElement("div", { className: "p-3 border-b border-white/5 bg-slate-900/50" }, /* @__PURE__ */ React24.createElement("div", { className: "relative group" }, /* @__PURE__ */ React24.createElement(
10774
- FiSearch4,
10873
+ FiSearch6,
10775
10874
  {
10776
10875
  className: `absolute left-3 top-1/2 -translate-y-1/2 transition-colors ${pickingGroupId ? "text-indigo-400" : "text-slate-500 group-focus-within:text-indigo-400"}`
10777
10876
  }
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.18",
3
+ "version": "1.2.5-dev.19",
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",