@lv-x-software-house/x_view 1.2.5-dev.28 → 1.2.5-dev.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9715,7 +9715,7 @@ function QuestDetailsPanel({
9715
9715
  viewMembers = [],
9716
9716
  currentUser
9717
9717
  }) {
9718
- var _a;
9718
+ var _a, _b;
9719
9719
  const initialRawTitle = (node == null ? void 0 : node.raw_title) || (((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.includes(" - \xBB ")) ? node.name.split(" - \xBB ")[1] : node == null ? void 0 : node.name) || "";
9720
9720
  const [rawTitle, setRawTitle] = (0, import_react19.useState)(initialRawTitle);
9721
9721
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
@@ -9731,6 +9731,9 @@ function QuestDetailsPanel({
9731
9731
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = (0, import_react19.useState)(false);
9732
9732
  const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = (0, import_react19.useState)(false);
9733
9733
  const [assigneeSearchQuery, setAssigneeSearchQuery] = (0, import_react19.useState)("");
9734
+ const [returnAssigneeId, setReturnAssigneeId] = (0, import_react19.useState)("");
9735
+ const [isReturnDropdownOpen, setIsReturnDropdownOpen] = (0, import_react19.useState)(false);
9736
+ const [returnSearchQuery, setReturnSearchQuery] = (0, import_react19.useState)("");
9734
9737
  const [customProps, setCustomProps] = (0, import_react19.useState)(() => extractCustomPropsFromNode(node || {}));
9735
9738
  const [reviewStack, setReviewStack] = (0, import_react19.useState)((node == null ? void 0 : node.reviewStack) || []);
9736
9739
  const [timeline, setTimeline] = (0, import_react19.useState)((node == null ? void 0 : node.timeline) || []);
@@ -9770,6 +9773,7 @@ function QuestDetailsPanel({
9770
9773
  setStatus((node == null ? void 0 : node.status) ?? "Backlog");
9771
9774
  setSize((node == null ? void 0 : node.size) ?? "medium");
9772
9775
  setAssigneeId((node == null ? void 0 : node.assignee_id) || "");
9776
+ setReturnAssigneeId("");
9773
9777
  setDescription((node == null ? void 0 : node.description) ?? "");
9774
9778
  setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9775
9779
  setExistingSections((node == null ? void 0 : node.description_sections) || []);
@@ -9829,7 +9833,7 @@ function QuestDetailsPanel({
9829
9833
  setIsSaving(true);
9830
9834
  const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
9831
9835
  const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
9832
- const targetMember = viewMembers.find((m) => String(m.id) === String(assigneeId));
9836
+ const targetMember = viewMembers.find((m) => String(m.id) === String(returnAssigneeId));
9833
9837
  const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
9834
9838
  const newEvent = {
9835
9839
  type: "review_returned",
@@ -9847,7 +9851,7 @@ function QuestDetailsPanel({
9847
9851
  description,
9848
9852
  status: updatedStatus,
9849
9853
  color: updatedColor,
9850
- assignee_id: assigneeId,
9854
+ assignee_id: returnAssigneeId,
9851
9855
  reviewStack,
9852
9856
  timeline: updatedTimeline,
9853
9857
  size,
@@ -9860,6 +9864,8 @@ function QuestDetailsPanel({
9860
9864
  await onSave(nodeToSave, false);
9861
9865
  setTimeline(updatedTimeline);
9862
9866
  setStatus(updatedStatus);
9867
+ setAssigneeId(returnAssigneeId);
9868
+ setReturnAssigneeId("");
9863
9869
  onDataUpdate(nodeToSave);
9864
9870
  setHasUnsavedChanges(false);
9865
9871
  } catch (error) {
@@ -10157,13 +10163,54 @@ function QuestDetailsPanel({
10157
10163
  viewMembers,
10158
10164
  readOnly: !canEdit
10159
10165
  }
10160
- )), status === "Review" && canEdit && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react19.default.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Se algo precisar de ajuste, selecione o respons\xE1vel acima e clique para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement(
10166
+ )), status === "Review" && canEdit && /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ import_react19.default.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Selecione o respons\xE1vel abaixo para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ import_react19.default.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react19.default.createElement(
10167
+ "button",
10168
+ {
10169
+ type: "button",
10170
+ onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
10171
+ className: "w-full bg-slate-800/80 p-2 text-xs rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-1 focus:ring-purple-400/50 transition-colors flex items-center justify-between"
10172
+ },
10173
+ /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiUser, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-slate-200 font-medium" }, ((_b = viewMembers.find((m) => String(m.id) === String(returnAssigneeId))) == null ? void 0 : _b.name) || "Selecionar respons\xE1vel...")),
10174
+ /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiChevronDown, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
10175
+ ), isReturnDropdownOpen && /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10176
+ setIsReturnDropdownOpen(false);
10177
+ setReturnSearchQuery("");
10178
+ } }), /* @__PURE__ */ import_react19.default.createElement("div", { className: "absolute bottom-full left-0 mb-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_react19.default.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ import_react19.default.createElement(import_fi17.FiSearch, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ import_react19.default.createElement(
10179
+ "input",
10180
+ {
10181
+ type: "text",
10182
+ autoFocus: true,
10183
+ placeholder: "Buscar membro...",
10184
+ value: returnSearchQuery,
10185
+ onChange: (e) => setReturnSearchQuery(e.target.value),
10186
+ className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
10187
+ onClick: (e) => e.stopPropagation()
10188
+ }
10189
+ )), /* @__PURE__ */ import_react19.default.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
10190
+ const search = returnSearchQuery.toLowerCase();
10191
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10192
+ }).map((member) => /* @__PURE__ */ import_react19.default.createElement(
10193
+ "li",
10194
+ {
10195
+ key: member.id,
10196
+ onClick: () => {
10197
+ setReturnAssigneeId(member.id);
10198
+ setIsReturnDropdownOpen(false);
10199
+ setReturnSearchQuery("");
10200
+ },
10201
+ className: `px-3 py-2 text-[11px] cursor-pointer transition-colors flex items-center gap-2 ${returnAssigneeId === member.id ? "bg-purple-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
10202
+ },
10203
+ member.name || member.email
10204
+ )), viewMembers.filter((member) => {
10205
+ const search = returnSearchQuery.toLowerCase();
10206
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10207
+ }).length === 0 && /* @__PURE__ */ import_react19.default.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ import_react19.default.createElement(
10161
10208
  "button",
10162
10209
  {
10163
10210
  type: "button",
10164
10211
  onClick: handleReturnToOperation,
10165
- disabled: isSaving,
10166
- className: "w-full h-10 flex items-center justify-center gap-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 text-xs font-semibold border border-white/10 transition-all hover:border-white/20 active:scale-[0.98] disabled:opacity-50 disabled:cursor-wait"
10212
+ disabled: isSaving || !returnAssigneeId,
10213
+ className: `w-full h-10 flex items-center justify-center gap-2 rounded-lg text-xs font-semibold border transition-all active:scale-[0.98] disabled:opacity-40 disabled:grayscale-[0.5] disabled:cursor-not-allowed ${!returnAssigneeId ? "bg-slate-800 text-slate-500 border-white/5" : "bg-slate-800 hover:bg-slate-700 text-purple-300 border-purple-500/20 hover:border-purple-500/40"}`
10167
10214
  },
10168
10215
  /* @__PURE__ */ import_react19.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react19.default.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
10169
10216
  "Retornar para Opera\xE7\xE3o"
package/dist/index.mjs CHANGED
@@ -9732,7 +9732,7 @@ function QuestDetailsPanel({
9732
9732
  viewMembers = [],
9733
9733
  currentUser
9734
9734
  }) {
9735
- var _a;
9735
+ var _a, _b;
9736
9736
  const initialRawTitle = (node == null ? void 0 : node.raw_title) || (((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.includes(" - \xBB ")) ? node.name.split(" - \xBB ")[1] : node == null ? void 0 : node.name) || "";
9737
9737
  const [rawTitle, setRawTitle] = useState19(initialRawTitle);
9738
9738
  const prefixParts = ((node == null ? void 0 : node.name) || "").split(" - \xBB ");
@@ -9748,6 +9748,9 @@ function QuestDetailsPanel({
9748
9748
  const [isStatusDropdownOpen, setIsStatusDropdownOpen] = useState19(false);
9749
9749
  const [isAssigneeDropdownOpen, setIsAssigneeDropdownOpen] = useState19(false);
9750
9750
  const [assigneeSearchQuery, setAssigneeSearchQuery] = useState19("");
9751
+ const [returnAssigneeId, setReturnAssigneeId] = useState19("");
9752
+ const [isReturnDropdownOpen, setIsReturnDropdownOpen] = useState19(false);
9753
+ const [returnSearchQuery, setReturnSearchQuery] = useState19("");
9751
9754
  const [customProps, setCustomProps] = useState19(() => extractCustomPropsFromNode(node || {}));
9752
9755
  const [reviewStack, setReviewStack] = useState19((node == null ? void 0 : node.reviewStack) || []);
9753
9756
  const [timeline, setTimeline] = useState19((node == null ? void 0 : node.timeline) || []);
@@ -9787,6 +9790,7 @@ function QuestDetailsPanel({
9787
9790
  setStatus((node == null ? void 0 : node.status) ?? "Backlog");
9788
9791
  setSize((node == null ? void 0 : node.size) ?? "medium");
9789
9792
  setAssigneeId((node == null ? void 0 : node.assignee_id) || "");
9793
+ setReturnAssigneeId("");
9790
9794
  setDescription((node == null ? void 0 : node.description) ?? "");
9791
9795
  setIntensity((node == null ? void 0 : node.intensity) !== void 0 ? node.intensity : 0);
9792
9796
  setExistingSections((node == null ? void 0 : node.description_sections) || []);
@@ -9846,7 +9850,7 @@ function QuestDetailsPanel({
9846
9850
  setIsSaving(true);
9847
9851
  const actorId = (currentUser == null ? void 0 : currentUser.id) || "unknown";
9848
9852
  const actorName = (currentUser == null ? void 0 : currentUser.name) || "Revisor";
9849
- const targetMember = viewMembers.find((m) => String(m.id) === String(assigneeId));
9853
+ const targetMember = viewMembers.find((m) => String(m.id) === String(returnAssigneeId));
9850
9854
  const targetName = (targetMember == null ? void 0 : targetMember.name) || "executor";
9851
9855
  const newEvent = {
9852
9856
  type: "review_returned",
@@ -9864,7 +9868,7 @@ function QuestDetailsPanel({
9864
9868
  description,
9865
9869
  status: updatedStatus,
9866
9870
  color: updatedColor,
9867
- assignee_id: assigneeId,
9871
+ assignee_id: returnAssigneeId,
9868
9872
  reviewStack,
9869
9873
  timeline: updatedTimeline,
9870
9874
  size,
@@ -9877,6 +9881,8 @@ function QuestDetailsPanel({
9877
9881
  await onSave(nodeToSave, false);
9878
9882
  setTimeline(updatedTimeline);
9879
9883
  setStatus(updatedStatus);
9884
+ setAssigneeId(returnAssigneeId);
9885
+ setReturnAssigneeId("");
9880
9886
  onDataUpdate(nodeToSave);
9881
9887
  setHasUnsavedChanges(false);
9882
9888
  } catch (error) {
@@ -10174,13 +10180,54 @@ function QuestDetailsPanel({
10174
10180
  viewMembers,
10175
10181
  readOnly: !canEdit
10176
10182
  }
10177
- )), status === "Review" && canEdit && /* @__PURE__ */ React18.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React18.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ React18.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React18.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ React18.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ React18.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Se algo precisar de ajuste, selecione o respons\xE1vel acima e clique para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ React18.createElement(
10183
+ )), status === "Review" && canEdit && /* @__PURE__ */ React18.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React18.createElement("div", { className: "bg-slate-900/40 rounded-xl p-4 border border-white/5 space-y-3" }, /* @__PURE__ */ React18.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React18.createElement("h3", { className: "text-[11px] uppercase font-bold text-slate-500 tracking-wider" }, "A\xE7\xF5es de Review"), /* @__PURE__ */ React18.createElement("span", { className: "px-2 py-0.5 rounded-full bg-purple-500/10 text-purple-300 text-[10px] font-medium border border-purple-500/20" }, "Em Revis\xE3o")), /* @__PURE__ */ React18.createElement("p", { className: "text-xs text-slate-400 leading-relaxed" }, "Selecione o respons\xE1vel abaixo para retornar o ciclo para opera\xE7\xE3o."), /* @__PURE__ */ React18.createElement("div", { className: "space-y-1.5 flex flex-col" }, /* @__PURE__ */ React18.createElement("label", { className: "text-[10px] text-slate-400 font-medium ml-0.5" }, "Retornar para:"), /* @__PURE__ */ React18.createElement("div", { className: "relative" }, /* @__PURE__ */ React18.createElement(
10184
+ "button",
10185
+ {
10186
+ type: "button",
10187
+ onClick: () => setIsReturnDropdownOpen(!isReturnDropdownOpen),
10188
+ className: "w-full bg-slate-800/80 p-2 text-xs rounded-lg border border-white/10 hover:border-white/20 focus:outline-none focus:ring-1 focus:ring-purple-400/50 transition-colors flex items-center justify-between"
10189
+ },
10190
+ /* @__PURE__ */ React18.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React18.createElement(FiUser3, { className: "text-slate-400", size: 12 }), /* @__PURE__ */ React18.createElement("span", { className: "text-slate-200 font-medium" }, ((_b = viewMembers.find((m) => String(m.id) === String(returnAssigneeId))) == null ? void 0 : _b.name) || "Selecionar respons\xE1vel...")),
10191
+ /* @__PURE__ */ React18.createElement(FiChevronDown7, { className: `text-slate-400 transition-transform duration-200 ${isReturnDropdownOpen ? "rotate-180" : ""}`, size: 14 })
10192
+ ), isReturnDropdownOpen && /* @__PURE__ */ React18.createElement(React18.Fragment, null, /* @__PURE__ */ React18.createElement("div", { className: "fixed inset-0 z-40", onClick: () => {
10193
+ setIsReturnDropdownOpen(false);
10194
+ setReturnSearchQuery("");
10195
+ } }), /* @__PURE__ */ React18.createElement("div", { className: "absolute bottom-full left-0 mb-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__ */ React18.createElement("div", { className: "p-2 border-b border-white/5 bg-white/5 flex items-center gap-2" }, /* @__PURE__ */ React18.createElement(FiSearch6, { className: "text-slate-500", size: 12 }), /* @__PURE__ */ React18.createElement(
10196
+ "input",
10197
+ {
10198
+ type: "text",
10199
+ autoFocus: true,
10200
+ placeholder: "Buscar membro...",
10201
+ value: returnSearchQuery,
10202
+ onChange: (e) => setReturnSearchQuery(e.target.value),
10203
+ className: "bg-transparent border-none outline-none text-[10px] text-white placeholder-slate-500 w-full",
10204
+ onClick: (e) => e.stopPropagation()
10205
+ }
10206
+ )), /* @__PURE__ */ React18.createElement("ul", { className: "max-h-32 overflow-y-auto custom-scrollbar" }, viewMembers.filter((member) => {
10207
+ const search = returnSearchQuery.toLowerCase();
10208
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10209
+ }).map((member) => /* @__PURE__ */ React18.createElement(
10210
+ "li",
10211
+ {
10212
+ key: member.id,
10213
+ onClick: () => {
10214
+ setReturnAssigneeId(member.id);
10215
+ setIsReturnDropdownOpen(false);
10216
+ setReturnSearchQuery("");
10217
+ },
10218
+ className: `px-3 py-2 text-[11px] cursor-pointer transition-colors flex items-center gap-2 ${returnAssigneeId === member.id ? "bg-purple-500/20 text-white" : "text-slate-300 hover:bg-white/5 hover:text-white"}`
10219
+ },
10220
+ member.name || member.email
10221
+ )), viewMembers.filter((member) => {
10222
+ const search = returnSearchQuery.toLowerCase();
10223
+ return (member.name || "").toLowerCase().includes(search) || (member.email || "").toLowerCase().includes(search);
10224
+ }).length === 0 && /* @__PURE__ */ React18.createElement("li", { className: "px-3 py-4 text-[10px] text-slate-500 text-center italic" }, "Nenhum membro encontrado")))))), /* @__PURE__ */ React18.createElement(
10178
10225
  "button",
10179
10226
  {
10180
10227
  type: "button",
10181
10228
  onClick: handleReturnToOperation,
10182
- disabled: isSaving,
10183
- className: "w-full h-10 flex items-center justify-center gap-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 text-xs font-semibold border border-white/10 transition-all hover:border-white/20 active:scale-[0.98] disabled:opacity-50 disabled:cursor-wait"
10229
+ disabled: isSaving || !returnAssigneeId,
10230
+ className: `w-full h-10 flex items-center justify-center gap-2 rounded-lg text-xs font-semibold border transition-all active:scale-[0.98] disabled:opacity-40 disabled:grayscale-[0.5] disabled:cursor-not-allowed ${!returnAssigneeId ? "bg-slate-800 text-slate-500 border-white/5" : "bg-slate-800 hover:bg-slate-700 text-purple-300 border-purple-500/20 hover:border-purple-500/40"}`
10184
10231
  },
10185
10232
  /* @__PURE__ */ React18.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ React18.createElement("path", { d: "M12 19V5M5 12l7 7 7-7" })),
10186
10233
  "Retornar para Opera\xE7\xE3o"
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.28",
3
+ "version": "1.2.5-dev.29",
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",