@lv-x-software-house/x_view 1.2.4-dev.26 → 1.2.4-dev.28
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 +32 -11
- package/dist/index.mjs +32 -11
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1011,7 +1011,8 @@ var createNodeMesh = (nodeData, position, glowTexture) => {
|
|
|
1011
1011
|
const size = nodeData.size || "medium";
|
|
1012
1012
|
const scale = NODE_SCALE_FACTORS[size] || 1;
|
|
1013
1013
|
mesh.scale.set(scale, scale, scale);
|
|
1014
|
-
const
|
|
1014
|
+
const labelText = nodeData.is_quest && nodeData.raw_title ? nodeData.raw_title : nodeData.name;
|
|
1015
|
+
const label = createTextSprite(labelText);
|
|
1015
1016
|
label.name = "label";
|
|
1016
1017
|
mesh.userData.labelObject = label;
|
|
1017
1018
|
mesh.userData.labelOffset = new THREE.Vector3(0, 3.8, 0);
|
|
@@ -1116,13 +1117,15 @@ var updateExistingNodeVisuals = (state, updatedNode) => {
|
|
|
1116
1117
|
const size = updatedNode.size || "medium";
|
|
1117
1118
|
const scale = NODE_SCALE_FACTORS[size] || 1;
|
|
1118
1119
|
existingMesh.scale.set(scale, scale, scale);
|
|
1119
|
-
|
|
1120
|
+
const oldText = existingMesh.userData.is_quest && existingMesh.userData.raw_title ? existingMesh.userData.raw_title : existingMesh.userData.name;
|
|
1121
|
+
const newText = updatedNode.is_quest && updatedNode.raw_title ? updatedNode.raw_title : updatedNode.name;
|
|
1122
|
+
if (oldText !== newText) {
|
|
1120
1123
|
const oldLabelToDispose = existingMesh.userData.labelObject;
|
|
1121
1124
|
if (oldLabelToDispose && state.graphGroup) {
|
|
1122
1125
|
state.graphGroup.remove(oldLabelToDispose);
|
|
1123
1126
|
if (oldLabelToDispose.material) oldLabelToDispose.material.dispose();
|
|
1124
1127
|
}
|
|
1125
|
-
const newLabel = createTextSprite(
|
|
1128
|
+
const newLabel = createTextSprite(newText || "");
|
|
1126
1129
|
newLabel.name = "label";
|
|
1127
1130
|
existingMesh.userData.labelObject = newLabel;
|
|
1128
1131
|
if (state.graphGroup) {
|
|
@@ -2556,6 +2559,13 @@ var userActionHandlers = {
|
|
|
2556
2559
|
try {
|
|
2557
2560
|
const isView = ((_a = context.viewType) == null ? void 0 : _a.toLowerCase()) === "view";
|
|
2558
2561
|
if (isView && parentFileId === context.sceneConfigId) {
|
|
2562
|
+
const visualNodeIndex = sceneDataRef.current.nodes.findIndex((n) => String(n.id) === String(nodeToSave.id));
|
|
2563
|
+
if (visualNodeIndex > -1) {
|
|
2564
|
+
sceneDataRef.current.nodes[visualNodeIndex] = {
|
|
2565
|
+
...sceneDataRef.current.nodes[visualNodeIndex],
|
|
2566
|
+
...nodeToSave
|
|
2567
|
+
};
|
|
2568
|
+
}
|
|
2559
2569
|
const viewFilePayload = {
|
|
2560
2570
|
parent_dbs: sceneDataRef.current.parent_dbs,
|
|
2561
2571
|
nodes: sceneDataRef.current.nodes,
|
|
@@ -2899,7 +2909,8 @@ var IGNORED_KEYS = [
|
|
|
2899
2909
|
"selectedAbstractionParentId",
|
|
2900
2910
|
"isAddingAbstractionNodes",
|
|
2901
2911
|
"status",
|
|
2902
|
-
"is_quest"
|
|
2912
|
+
"is_quest",
|
|
2913
|
+
"raw_title"
|
|
2903
2914
|
];
|
|
2904
2915
|
function extractCustomPropsFromNode(node) {
|
|
2905
2916
|
const customPropTypes = node._customPropTypes || {};
|
|
@@ -8091,11 +8102,11 @@ function InSceneQuestForm({
|
|
|
8091
8102
|
onChange: (e) => {
|
|
8092
8103
|
const val = e.target.value;
|
|
8093
8104
|
setName(val);
|
|
8094
|
-
onNameChange == null ? void 0 : onNameChange(
|
|
8105
|
+
onNameChange == null ? void 0 : onNameChange(val || "Nova Quest");
|
|
8095
8106
|
},
|
|
8096
8107
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
|
|
8097
8108
|
}
|
|
8098
|
-
), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }
|
|
8109
|
+
), /* @__PURE__ */ import_react16.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__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" }, "Status da Quest"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
8099
8110
|
"button",
|
|
8100
8111
|
{
|
|
8101
8112
|
type: "button",
|
|
@@ -8777,7 +8788,7 @@ function QuestDetailsPanel({
|
|
|
8777
8788
|
const val = e.target.value;
|
|
8778
8789
|
setRawTitle(val);
|
|
8779
8790
|
const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
|
|
8780
|
-
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName);
|
|
8791
|
+
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
|
|
8781
8792
|
};
|
|
8782
8793
|
const handleSizeChange = (newSize) => {
|
|
8783
8794
|
setSize(newSize);
|
|
@@ -8938,7 +8949,7 @@ function QuestDetailsPanel({
|
|
|
8938
8949
|
readOnly: !canEdit,
|
|
8939
8950
|
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"}`
|
|
8940
8951
|
}
|
|
8941
|
-
), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }
|
|
8952
|
+
), /* @__PURE__ */ import_react18.default.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__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" }, "Status da Quest"), /* @__PURE__ */ import_react18.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react18.default.createElement(
|
|
8942
8953
|
"button",
|
|
8943
8954
|
{
|
|
8944
8955
|
type: "button",
|
|
@@ -11834,7 +11845,7 @@ function XViewScene({
|
|
|
11834
11845
|
graphGroup.add(newLabel);
|
|
11835
11846
|
ghostNode.userData.labelObject = newLabel;
|
|
11836
11847
|
};
|
|
11837
|
-
const handleDetailNodeNameChange = (nodeId, newName) => {
|
|
11848
|
+
const handleDetailNodeNameChange = (nodeId, newName, newRawTitle) => {
|
|
11838
11849
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
11839
11850
|
const { graphGroup } = stateRef.current;
|
|
11840
11851
|
if (!mesh || !graphGroup) return;
|
|
@@ -11844,10 +11855,15 @@ function XViewScene({
|
|
|
11844
11855
|
if (oldLabel.material.map) oldLabel.material.map.dispose();
|
|
11845
11856
|
oldLabel.material.dispose();
|
|
11846
11857
|
}
|
|
11847
|
-
const
|
|
11858
|
+
const isQuest = mesh.userData.is_quest;
|
|
11859
|
+
const displayText = isQuest && newRawTitle !== void 0 ? newRawTitle : newName;
|
|
11860
|
+
const newLabel = createTextSprite(displayText || "");
|
|
11848
11861
|
graphGroup.add(newLabel);
|
|
11849
11862
|
mesh.userData.labelObject = newLabel;
|
|
11850
11863
|
mesh.userData.name = newName;
|
|
11864
|
+
if (newRawTitle !== void 0) {
|
|
11865
|
+
mesh.userData.raw_title = newRawTitle;
|
|
11866
|
+
}
|
|
11851
11867
|
};
|
|
11852
11868
|
const handleDetailNodeColorChange = (nodeId, newColor) => {
|
|
11853
11869
|
var _a2;
|
|
@@ -12025,11 +12041,11 @@ function XViewScene({
|
|
|
12025
12041
|
const sceneFileData = {
|
|
12026
12042
|
parent_dbs: sceneDataRef2.current.parent_dbs,
|
|
12027
12043
|
nodes: sceneDataRef2.current.nodes,
|
|
12044
|
+
// Permanece intacto, como estava no último save de cena inicial
|
|
12028
12045
|
links: sceneDataRef2.current.links,
|
|
12029
12046
|
quest_nodes: graphDataRef.current[sceneConfigId2].nodes,
|
|
12030
12047
|
quest_links: graphDataRef.current[sceneConfigId2].links,
|
|
12031
12048
|
quest_counter: currentCounter + 1
|
|
12032
|
-
// NOVO: Incrementa o contador nos metadados
|
|
12033
12049
|
};
|
|
12034
12050
|
try {
|
|
12035
12051
|
await actions.save_view_data(sceneSaveUrl2, sceneFileData);
|
|
@@ -14038,8 +14054,13 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
|
|
|
14038
14054
|
const parentNodeMap = new Map(allNodes.map((node) => [String(node.id), node]));
|
|
14039
14055
|
const parentLinkMap = new Map(allLinks.map((link) => [`${link.source}-${link.target}`, link]));
|
|
14040
14056
|
const validatedNodes = (sceneData.nodes || []).map((sceneNode) => {
|
|
14057
|
+
var _a2, _b2;
|
|
14041
14058
|
const nodeTypes = Array.isArray(sceneNode.type) ? sceneNode.type : [sceneNode.type];
|
|
14042
14059
|
if (nodeTypes.includes("quest")) {
|
|
14060
|
+
const dbQuestNode = (_b2 = (_a2 = parentData[scene_config]) == null ? void 0 : _a2.nodes) == null ? void 0 : _b2.find((qn) => String(qn.id) === String(sceneNode.id));
|
|
14061
|
+
if (dbQuestNode) {
|
|
14062
|
+
return { ...sceneNode, ...dbQuestNode };
|
|
14063
|
+
}
|
|
14043
14064
|
return sceneNode;
|
|
14044
14065
|
}
|
|
14045
14066
|
const dbNode = parentNodeMap.get(String(sceneNode.id));
|
package/dist/index.mjs
CHANGED
|
@@ -967,7 +967,8 @@ var createNodeMesh = (nodeData, position, glowTexture) => {
|
|
|
967
967
|
const size = nodeData.size || "medium";
|
|
968
968
|
const scale = NODE_SCALE_FACTORS[size] || 1;
|
|
969
969
|
mesh.scale.set(scale, scale, scale);
|
|
970
|
-
const
|
|
970
|
+
const labelText = nodeData.is_quest && nodeData.raw_title ? nodeData.raw_title : nodeData.name;
|
|
971
|
+
const label = createTextSprite(labelText);
|
|
971
972
|
label.name = "label";
|
|
972
973
|
mesh.userData.labelObject = label;
|
|
973
974
|
mesh.userData.labelOffset = new THREE.Vector3(0, 3.8, 0);
|
|
@@ -1072,13 +1073,15 @@ var updateExistingNodeVisuals = (state, updatedNode) => {
|
|
|
1072
1073
|
const size = updatedNode.size || "medium";
|
|
1073
1074
|
const scale = NODE_SCALE_FACTORS[size] || 1;
|
|
1074
1075
|
existingMesh.scale.set(scale, scale, scale);
|
|
1075
|
-
|
|
1076
|
+
const oldText = existingMesh.userData.is_quest && existingMesh.userData.raw_title ? existingMesh.userData.raw_title : existingMesh.userData.name;
|
|
1077
|
+
const newText = updatedNode.is_quest && updatedNode.raw_title ? updatedNode.raw_title : updatedNode.name;
|
|
1078
|
+
if (oldText !== newText) {
|
|
1076
1079
|
const oldLabelToDispose = existingMesh.userData.labelObject;
|
|
1077
1080
|
if (oldLabelToDispose && state.graphGroup) {
|
|
1078
1081
|
state.graphGroup.remove(oldLabelToDispose);
|
|
1079
1082
|
if (oldLabelToDispose.material) oldLabelToDispose.material.dispose();
|
|
1080
1083
|
}
|
|
1081
|
-
const newLabel = createTextSprite(
|
|
1084
|
+
const newLabel = createTextSprite(newText || "");
|
|
1082
1085
|
newLabel.name = "label";
|
|
1083
1086
|
existingMesh.userData.labelObject = newLabel;
|
|
1084
1087
|
if (state.graphGroup) {
|
|
@@ -2512,6 +2515,13 @@ var userActionHandlers = {
|
|
|
2512
2515
|
try {
|
|
2513
2516
|
const isView = ((_a = context.viewType) == null ? void 0 : _a.toLowerCase()) === "view";
|
|
2514
2517
|
if (isView && parentFileId === context.sceneConfigId) {
|
|
2518
|
+
const visualNodeIndex = sceneDataRef.current.nodes.findIndex((n) => String(n.id) === String(nodeToSave.id));
|
|
2519
|
+
if (visualNodeIndex > -1) {
|
|
2520
|
+
sceneDataRef.current.nodes[visualNodeIndex] = {
|
|
2521
|
+
...sceneDataRef.current.nodes[visualNodeIndex],
|
|
2522
|
+
...nodeToSave
|
|
2523
|
+
};
|
|
2524
|
+
}
|
|
2515
2525
|
const viewFilePayload = {
|
|
2516
2526
|
parent_dbs: sceneDataRef.current.parent_dbs,
|
|
2517
2527
|
nodes: sceneDataRef.current.nodes,
|
|
@@ -2855,7 +2865,8 @@ var IGNORED_KEYS = [
|
|
|
2855
2865
|
"selectedAbstractionParentId",
|
|
2856
2866
|
"isAddingAbstractionNodes",
|
|
2857
2867
|
"status",
|
|
2858
|
-
"is_quest"
|
|
2868
|
+
"is_quest",
|
|
2869
|
+
"raw_title"
|
|
2859
2870
|
];
|
|
2860
2871
|
function extractCustomPropsFromNode(node) {
|
|
2861
2872
|
const customPropTypes = node._customPropTypes || {};
|
|
@@ -8078,11 +8089,11 @@ function InSceneQuestForm({
|
|
|
8078
8089
|
onChange: (e) => {
|
|
8079
8090
|
const val = e.target.value;
|
|
8080
8091
|
setName(val);
|
|
8081
|
-
onNameChange == null ? void 0 : onNameChange(
|
|
8092
|
+
onNameChange == null ? void 0 : onNameChange(val || "Nova Quest");
|
|
8082
8093
|
},
|
|
8083
8094
|
className: "w-full bg-slate-800/70 p-2.5 text-sm rounded-lg border border-white/10 focus:outline-none focus:ring-2 focus:ring-indigo-400/60"
|
|
8084
8095
|
}
|
|
8085
|
-
), /* @__PURE__ */ React15.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React15.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }
|
|
8096
|
+
), /* @__PURE__ */ React15.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React15.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React15.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React15.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React15.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React15.createElement("div", { className: "relative" }, /* @__PURE__ */ React15.createElement(
|
|
8086
8097
|
"button",
|
|
8087
8098
|
{
|
|
8088
8099
|
type: "button",
|
|
@@ -8764,7 +8775,7 @@ function QuestDetailsPanel({
|
|
|
8764
8775
|
const val = e.target.value;
|
|
8765
8776
|
setRawTitle(val);
|
|
8766
8777
|
const newStandardName = questPrefix ? `${questPrefix} - \xBB ${val || "Sem t\xEDtulo"}` : val;
|
|
8767
|
-
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName);
|
|
8778
|
+
onNameChange == null ? void 0 : onNameChange(node.id, newStandardName, val);
|
|
8768
8779
|
};
|
|
8769
8780
|
const handleSizeChange = (newSize) => {
|
|
8770
8781
|
setSize(newSize);
|
|
@@ -8925,7 +8936,7 @@ function QuestDetailsPanel({
|
|
|
8925
8936
|
readOnly: !canEdit,
|
|
8926
8937
|
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"}`
|
|
8927
8938
|
}
|
|
8928
|
-
), /* @__PURE__ */ React17.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React17.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }
|
|
8939
|
+
), /* @__PURE__ */ React17.createElement("div", { className: "pt-1 flex items-center gap-1.5" }, /* @__PURE__ */ React17.createElement("span", { className: "text-[10px] uppercase font-bold text-slate-500 tracking-wider" }), /* @__PURE__ */ React17.createElement("p", { className: "text-xs text-indigo-300 font-medium truncate", title: standardizedName }, standardizedName))), /* @__PURE__ */ React17.createElement("div", { className: "space-y-1.5 relative mt-2" }, /* @__PURE__ */ React17.createElement("label", { className: "text-xs text-slate-300" }, "Status da Quest"), /* @__PURE__ */ React17.createElement("div", { className: "relative" }, /* @__PURE__ */ React17.createElement(
|
|
8929
8940
|
"button",
|
|
8930
8941
|
{
|
|
8931
8942
|
type: "button",
|
|
@@ -11834,7 +11845,7 @@ function XViewScene({
|
|
|
11834
11845
|
graphGroup.add(newLabel);
|
|
11835
11846
|
ghostNode.userData.labelObject = newLabel;
|
|
11836
11847
|
};
|
|
11837
|
-
const handleDetailNodeNameChange = (nodeId, newName) => {
|
|
11848
|
+
const handleDetailNodeNameChange = (nodeId, newName, newRawTitle) => {
|
|
11838
11849
|
const mesh = stateRef.current.nodeObjects[String(nodeId)];
|
|
11839
11850
|
const { graphGroup } = stateRef.current;
|
|
11840
11851
|
if (!mesh || !graphGroup) return;
|
|
@@ -11844,10 +11855,15 @@ function XViewScene({
|
|
|
11844
11855
|
if (oldLabel.material.map) oldLabel.material.map.dispose();
|
|
11845
11856
|
oldLabel.material.dispose();
|
|
11846
11857
|
}
|
|
11847
|
-
const
|
|
11858
|
+
const isQuest = mesh.userData.is_quest;
|
|
11859
|
+
const displayText = isQuest && newRawTitle !== void 0 ? newRawTitle : newName;
|
|
11860
|
+
const newLabel = createTextSprite(displayText || "");
|
|
11848
11861
|
graphGroup.add(newLabel);
|
|
11849
11862
|
mesh.userData.labelObject = newLabel;
|
|
11850
11863
|
mesh.userData.name = newName;
|
|
11864
|
+
if (newRawTitle !== void 0) {
|
|
11865
|
+
mesh.userData.raw_title = newRawTitle;
|
|
11866
|
+
}
|
|
11851
11867
|
};
|
|
11852
11868
|
const handleDetailNodeColorChange = (nodeId, newColor) => {
|
|
11853
11869
|
var _a2;
|
|
@@ -12025,11 +12041,11 @@ function XViewScene({
|
|
|
12025
12041
|
const sceneFileData = {
|
|
12026
12042
|
parent_dbs: sceneDataRef2.current.parent_dbs,
|
|
12027
12043
|
nodes: sceneDataRef2.current.nodes,
|
|
12044
|
+
// Permanece intacto, como estava no último save de cena inicial
|
|
12028
12045
|
links: sceneDataRef2.current.links,
|
|
12029
12046
|
quest_nodes: graphDataRef.current[sceneConfigId2].nodes,
|
|
12030
12047
|
quest_links: graphDataRef.current[sceneConfigId2].links,
|
|
12031
12048
|
quest_counter: currentCounter + 1
|
|
12032
|
-
// NOVO: Incrementa o contador nos metadados
|
|
12033
12049
|
};
|
|
12034
12050
|
try {
|
|
12035
12051
|
await actions.save_view_data(sceneSaveUrl2, sceneFileData);
|
|
@@ -14038,8 +14054,13 @@ async function get_scene_view_data_logic(db_services, scene_config, owner_id, ty
|
|
|
14038
14054
|
const parentNodeMap = new Map(allNodes.map((node) => [String(node.id), node]));
|
|
14039
14055
|
const parentLinkMap = new Map(allLinks.map((link) => [`${link.source}-${link.target}`, link]));
|
|
14040
14056
|
const validatedNodes = (sceneData.nodes || []).map((sceneNode) => {
|
|
14057
|
+
var _a2, _b2;
|
|
14041
14058
|
const nodeTypes = Array.isArray(sceneNode.type) ? sceneNode.type : [sceneNode.type];
|
|
14042
14059
|
if (nodeTypes.includes("quest")) {
|
|
14060
|
+
const dbQuestNode = (_b2 = (_a2 = parentData[scene_config]) == null ? void 0 : _a2.nodes) == null ? void 0 : _b2.find((qn) => String(qn.id) === String(sceneNode.id));
|
|
14061
|
+
if (dbQuestNode) {
|
|
14062
|
+
return { ...sceneNode, ...dbQuestNode };
|
|
14063
|
+
}
|
|
14043
14064
|
return sceneNode;
|
|
14044
14065
|
}
|
|
14045
14066
|
const dbNode = parentNodeMap.get(String(sceneNode.id));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lv-x-software-house/x_view",
|
|
3
|
-
"version": "1.2.4-dev.
|
|
3
|
+
"version": "1.2.4-dev.28",
|
|
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",
|