@lv-x-software-house/x_view 1.2.6-dev.10 → 1.2.6-dev.12
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 +5 -58
- package/dist/index.mjs +5 -58
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12961,6 +12961,8 @@ function MentionPopover({ query, items, position, onSelect, onClose }) {
|
|
|
12961
12961
|
if (filtered[activeIndex]) onSelect(filtered[activeIndex]);
|
|
12962
12962
|
} else if (e.key === "Escape") {
|
|
12963
12963
|
e.preventDefault();
|
|
12964
|
+
e.stopPropagation();
|
|
12965
|
+
e.stopImmediatePropagation();
|
|
12964
12966
|
onClose();
|
|
12965
12967
|
}
|
|
12966
12968
|
};
|
|
@@ -13343,7 +13345,6 @@ function AncestryBoard({
|
|
|
13343
13345
|
onSave,
|
|
13344
13346
|
userRole
|
|
13345
13347
|
}) {
|
|
13346
|
-
const [searchTerm, setSearchTerm] = (0, import_react29.useState)("");
|
|
13347
13348
|
const [groups, setGroups] = (0, import_react29.useState)([]);
|
|
13348
13349
|
const [isLoaded, setIsLoaded] = (0, import_react29.useState)(false);
|
|
13349
13350
|
const [saveStatus, setSaveStatus] = (0, import_react29.useState)("idle");
|
|
@@ -13360,13 +13361,6 @@ function AncestryBoard({
|
|
|
13360
13361
|
setIsLoaded(true);
|
|
13361
13362
|
}
|
|
13362
13363
|
}, [initialGroups, isLoaded]);
|
|
13363
|
-
const nodeNamesMap = (0, import_react29.useMemo)(() => {
|
|
13364
|
-
const map = /* @__PURE__ */ new Map();
|
|
13365
|
-
availableNodes.forEach((n) => {
|
|
13366
|
-
if (n == null ? void 0 : n.id) map.set(String(n.id), n.name);
|
|
13367
|
-
});
|
|
13368
|
-
return map;
|
|
13369
|
-
}, [availableNodes]);
|
|
13370
13364
|
const allSearchableItems = (0, import_react29.useMemo)(() => {
|
|
13371
13365
|
const items = [];
|
|
13372
13366
|
availableAncestries.forEach((anc) => {
|
|
@@ -13393,20 +13387,6 @@ function AncestryBoard({
|
|
|
13393
13387
|
});
|
|
13394
13388
|
return items;
|
|
13395
13389
|
}, [availableAncestries, availableNodes]);
|
|
13396
|
-
const filtered = (0, import_react29.useMemo)(() => {
|
|
13397
|
-
const term = searchTerm.toLowerCase().trim();
|
|
13398
|
-
return allSearchableItems.filter((item) => {
|
|
13399
|
-
if (!term) return true;
|
|
13400
|
-
const labelMatch = (item.searchLabel || "").toLowerCase().includes(term);
|
|
13401
|
-
const descMatch = (item.searchDesc || "").toLowerCase().includes(term);
|
|
13402
|
-
let parentMatch = false;
|
|
13403
|
-
if (item.type === "ancestry") {
|
|
13404
|
-
const parentName = nodeNamesMap.get(String(item.ancestral_node)) || "";
|
|
13405
|
-
parentMatch = parentName.toLowerCase().includes(term);
|
|
13406
|
-
}
|
|
13407
|
-
return labelMatch || descMatch || parentMatch;
|
|
13408
|
-
});
|
|
13409
|
-
}, [allSearchableItems, searchTerm, nodeNamesMap]);
|
|
13410
13390
|
const sanitizeGroups = (list) => list.map((g) => ({
|
|
13411
13391
|
id: g.id,
|
|
13412
13392
|
content: g.content || [],
|
|
@@ -13529,40 +13509,7 @@ function AncestryBoard({
|
|
|
13529
13509
|
},
|
|
13530
13510
|
/* @__PURE__ */ import_react29.default.createElement(import_fi23.FiX, { size: 16 })
|
|
13531
13511
|
))),
|
|
13532
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "flex
|
|
13533
|
-
"input",
|
|
13534
|
-
{
|
|
13535
|
-
type: "text",
|
|
13536
|
-
placeholder: "Navegar nas ancestralidades e nodes\u2026",
|
|
13537
|
-
className: "w-full rounded-md pl-9 pr-4 py-2 text-sm bg-slate-950 border border-white/10 text-slate-200 placeholder-slate-600 focus:outline-none focus:ring-1 focus:ring-indigo-500 transition-all",
|
|
13538
|
-
value: searchTerm,
|
|
13539
|
-
onChange: (e) => setSearchTerm(e.target.value),
|
|
13540
|
-
autoFocus: true
|
|
13541
|
-
}
|
|
13542
|
-
))), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
13543
|
-
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
13544
|
-
return /* @__PURE__ */ import_react29.default.createElement(
|
|
13545
|
-
"div",
|
|
13546
|
-
{
|
|
13547
|
-
key: anc.id,
|
|
13548
|
-
className: "group relative flex items-start gap-3 p-3 text-left rounded-lg border border-white/5 bg-slate-800/40 hover:bg-indigo-600/10 hover:border-indigo-500/30 cursor-default transition-all duration-200"
|
|
13549
|
-
},
|
|
13550
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "mt-0.5 w-8 h-8 rounded-md grid place-content-center shrink-0 border bg-slate-800 border-white/5 group-hover:bg-indigo-500 group-hover:text-white transition-all shadow-lg" }, anc.type === "quest" ? /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCheckSquare, { size: 14, className: "text-emerald-400 group-hover:text-white" }) : anc.type === "version" ? /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiGitBranch, { size: 14, className: "text-amber-400 group-hover:text-white" }) : anc.type === "node" ? /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiBox, { size: 14, className: "text-slate-400 group-hover:text-white" }) : /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiLayers, { size: 14, className: "text-indigo-400 group-hover:text-white" })),
|
|
13551
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ import_react29.default.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.searchLabel || "Sem Nome"), /* @__PURE__ */ import_react29.default.createElement("span", { className: "text-[9px] px-1.5 py-0.5 rounded-full bg-white/5 text-slate-500 border border-white/5 uppercase tracking-tighter" }, anc.type)), anc.type === "ancestry" && /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiCornerUpRight, { size: 10 }), /* @__PURE__ */ import_react29.default.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.searchDesc && /* @__PURE__ */ import_react29.default.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.searchDesc)),
|
|
13552
|
-
/* @__PURE__ */ import_react29.default.createElement(
|
|
13553
|
-
"button",
|
|
13554
|
-
{
|
|
13555
|
-
onClick: (e) => {
|
|
13556
|
-
e.stopPropagation();
|
|
13557
|
-
if (onSelect) onSelect(anc);
|
|
13558
|
-
},
|
|
13559
|
-
className: "absolute right-2 bottom-2 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-10",
|
|
13560
|
-
title: "Focar no cen\xE1rio"
|
|
13561
|
-
},
|
|
13562
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiPlay, { size: 14, className: "ml-0.5" }))
|
|
13563
|
-
)
|
|
13564
|
-
);
|
|
13565
|
-
}))), /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react29.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react29.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react29.default.createElement(
|
|
13512
|
+
/* @__PURE__ */ import_react29.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar bg-slate-950/30 p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ import_react29.default.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ import_react29.default.createElement(import_fi23.FiLayers, { size: 24, className: "opacity-20" }), /* @__PURE__ */ import_react29.default.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ import_react29.default.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ import_react29.default.createElement(
|
|
13566
13513
|
GroupItem,
|
|
13567
13514
|
{
|
|
13568
13515
|
key: group.id,
|
|
@@ -13577,8 +13524,8 @@ function AncestryBoard({
|
|
|
13577
13524
|
onMentionClick: handleMentionClick,
|
|
13578
13525
|
canEdit
|
|
13579
13526
|
}
|
|
13580
|
-
)))
|
|
13581
|
-
/* @__PURE__ */ import_react29.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-
|
|
13527
|
+
))),
|
|
13528
|
+
/* @__PURE__ */ import_react29.default.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-end flex-shrink-0" }, /* @__PURE__ */ import_react29.default.createElement("span", null, groups.length, " grupos raiz"))
|
|
13582
13529
|
)
|
|
13583
13530
|
);
|
|
13584
13531
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -13007,6 +13007,8 @@ function MentionPopover({ query, items, position, onSelect, onClose }) {
|
|
|
13007
13007
|
if (filtered[activeIndex]) onSelect(filtered[activeIndex]);
|
|
13008
13008
|
} else if (e.key === "Escape") {
|
|
13009
13009
|
e.preventDefault();
|
|
13010
|
+
e.stopPropagation();
|
|
13011
|
+
e.stopImmediatePropagation();
|
|
13010
13012
|
onClose();
|
|
13011
13013
|
}
|
|
13012
13014
|
};
|
|
@@ -13389,7 +13391,6 @@ function AncestryBoard({
|
|
|
13389
13391
|
onSave,
|
|
13390
13392
|
userRole
|
|
13391
13393
|
}) {
|
|
13392
|
-
const [searchTerm, setSearchTerm] = useState27("");
|
|
13393
13394
|
const [groups, setGroups] = useState27([]);
|
|
13394
13395
|
const [isLoaded, setIsLoaded] = useState27(false);
|
|
13395
13396
|
const [saveStatus, setSaveStatus] = useState27("idle");
|
|
@@ -13406,13 +13407,6 @@ function AncestryBoard({
|
|
|
13406
13407
|
setIsLoaded(true);
|
|
13407
13408
|
}
|
|
13408
13409
|
}, [initialGroups, isLoaded]);
|
|
13409
|
-
const nodeNamesMap = useMemo12(() => {
|
|
13410
|
-
const map = /* @__PURE__ */ new Map();
|
|
13411
|
-
availableNodes.forEach((n) => {
|
|
13412
|
-
if (n == null ? void 0 : n.id) map.set(String(n.id), n.name);
|
|
13413
|
-
});
|
|
13414
|
-
return map;
|
|
13415
|
-
}, [availableNodes]);
|
|
13416
13410
|
const allSearchableItems = useMemo12(() => {
|
|
13417
13411
|
const items = [];
|
|
13418
13412
|
availableAncestries.forEach((anc) => {
|
|
@@ -13439,20 +13433,6 @@ function AncestryBoard({
|
|
|
13439
13433
|
});
|
|
13440
13434
|
return items;
|
|
13441
13435
|
}, [availableAncestries, availableNodes]);
|
|
13442
|
-
const filtered = useMemo12(() => {
|
|
13443
|
-
const term = searchTerm.toLowerCase().trim();
|
|
13444
|
-
return allSearchableItems.filter((item) => {
|
|
13445
|
-
if (!term) return true;
|
|
13446
|
-
const labelMatch = (item.searchLabel || "").toLowerCase().includes(term);
|
|
13447
|
-
const descMatch = (item.searchDesc || "").toLowerCase().includes(term);
|
|
13448
|
-
let parentMatch = false;
|
|
13449
|
-
if (item.type === "ancestry") {
|
|
13450
|
-
const parentName = nodeNamesMap.get(String(item.ancestral_node)) || "";
|
|
13451
|
-
parentMatch = parentName.toLowerCase().includes(term);
|
|
13452
|
-
}
|
|
13453
|
-
return labelMatch || descMatch || parentMatch;
|
|
13454
|
-
});
|
|
13455
|
-
}, [allSearchableItems, searchTerm, nodeNamesMap]);
|
|
13456
13436
|
const sanitizeGroups = (list) => list.map((g) => ({
|
|
13457
13437
|
id: g.id,
|
|
13458
13438
|
content: g.content || [],
|
|
@@ -13575,40 +13555,7 @@ function AncestryBoard({
|
|
|
13575
13555
|
},
|
|
13576
13556
|
/* @__PURE__ */ React28.createElement(FiX8, { size: 16 })
|
|
13577
13557
|
))),
|
|
13578
|
-
/* @__PURE__ */ React28.createElement("div", { className: "flex
|
|
13579
|
-
"input",
|
|
13580
|
-
{
|
|
13581
|
-
type: "text",
|
|
13582
|
-
placeholder: "Navegar nas ancestralidades e nodes\u2026",
|
|
13583
|
-
className: "w-full rounded-md pl-9 pr-4 py-2 text-sm bg-slate-950 border border-white/10 text-slate-200 placeholder-slate-600 focus:outline-none focus:ring-1 focus:ring-indigo-500 transition-all",
|
|
13584
|
-
value: searchTerm,
|
|
13585
|
-
onChange: (e) => setSearchTerm(e.target.value),
|
|
13586
|
-
autoFocus: true
|
|
13587
|
-
}
|
|
13588
|
-
))), /* @__PURE__ */ React28.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-3 space-y-2" }, filtered.map((anc) => {
|
|
13589
|
-
const parentNodeName = nodeNamesMap.get(String(anc.ancestral_node)) || "Node Desconhecido";
|
|
13590
|
-
return /* @__PURE__ */ React28.createElement(
|
|
13591
|
-
"div",
|
|
13592
|
-
{
|
|
13593
|
-
key: anc.id,
|
|
13594
|
-
className: "group relative flex items-start gap-3 p-3 text-left rounded-lg border border-white/5 bg-slate-800/40 hover:bg-indigo-600/10 hover:border-indigo-500/30 cursor-default transition-all duration-200"
|
|
13595
|
-
},
|
|
13596
|
-
/* @__PURE__ */ React28.createElement("div", { className: "mt-0.5 w-8 h-8 rounded-md grid place-content-center shrink-0 border bg-slate-800 border-white/5 group-hover:bg-indigo-500 group-hover:text-white transition-all shadow-lg" }, anc.type === "quest" ? /* @__PURE__ */ React28.createElement(FiCheckSquare4, { size: 14, className: "text-emerald-400 group-hover:text-white" }) : anc.type === "version" ? /* @__PURE__ */ React28.createElement(FiGitBranch4, { size: 14, className: "text-amber-400 group-hover:text-white" }) : anc.type === "node" ? /* @__PURE__ */ React28.createElement(FiBox2, { size: 14, className: "text-slate-400 group-hover:text-white" }) : /* @__PURE__ */ React28.createElement(FiLayers7, { size: 14, className: "text-indigo-400 group-hover:text-white" })),
|
|
13597
|
-
/* @__PURE__ */ React28.createElement("div", { className: "flex-1 min-w-0 pb-2" }, /* @__PURE__ */ React28.createElement("div", { className: "flex items-center justify-between gap-2" }, /* @__PURE__ */ React28.createElement("h4", { className: "text-sm font-medium text-slate-200 group-hover:text-white truncate transition-colors" }, anc.searchLabel || "Sem Nome"), /* @__PURE__ */ React28.createElement("span", { className: "text-[9px] px-1.5 py-0.5 rounded-full bg-white/5 text-slate-500 border border-white/5 uppercase tracking-tighter" }, anc.type)), anc.type === "ancestry" && /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-1.5 mt-0.5 text-[11px] text-slate-500 group-hover:text-indigo-200/70 transition-colors" }, /* @__PURE__ */ React28.createElement(FiCornerUpRight4, { size: 10 }), /* @__PURE__ */ React28.createElement("span", { className: "truncate max-w-[120px]" }, parentNodeName)), anc.searchDesc && /* @__PURE__ */ React28.createElement("p", { className: "mt-1.5 text-[11px] text-slate-400 line-clamp-2 leading-relaxed opacity-80" }, anc.searchDesc)),
|
|
13598
|
-
/* @__PURE__ */ React28.createElement(
|
|
13599
|
-
"button",
|
|
13600
|
-
{
|
|
13601
|
-
onClick: (e) => {
|
|
13602
|
-
e.stopPropagation();
|
|
13603
|
-
if (onSelect) onSelect(anc);
|
|
13604
|
-
},
|
|
13605
|
-
className: "absolute right-2 bottom-2 opacity-0 group-hover:opacity-100 transition-all duration-300 transform translate-y-2 group-hover:translate-y-0 z-10",
|
|
13606
|
-
title: "Focar no cen\xE1rio"
|
|
13607
|
-
},
|
|
13608
|
-
/* @__PURE__ */ React28.createElement("div", { className: "bg-indigo-500 text-white p-2 rounded-full shadow-lg hover:bg-indigo-400 hover:scale-110 transition-all" }, /* @__PURE__ */ React28.createElement(FiPlay, { size: 14, className: "ml-0.5" }))
|
|
13609
|
-
)
|
|
13610
|
-
);
|
|
13611
|
-
}))), /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col flex-1 bg-slate-950/30" }, /* @__PURE__ */ React28.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ React28.createElement(FiLayers7, { size: 24, className: "opacity-20" }), /* @__PURE__ */ React28.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ React28.createElement(React28.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ React28.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ React28.createElement(React28.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ React28.createElement(
|
|
13558
|
+
/* @__PURE__ */ React28.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar bg-slate-950/30 p-6 space-y-4" }, groups.length === 0 ? /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col items-center justify-center h-full text-slate-500 gap-3 border-2 border-dashed border-white/5 rounded-xl m-4 bg-slate-900/20" }, /* @__PURE__ */ React28.createElement(FiLayers7, { size: 24, className: "opacity-20" }), /* @__PURE__ */ React28.createElement("p", { className: "text-xs text-center px-4" }, canEdit ? /* @__PURE__ */ React28.createElement(React28.Fragment, null, "Nenhum grupo criado.", /* @__PURE__ */ React28.createElement("br", null), 'Use o bot\xE3o "Novo Grupo" acima.') : /* @__PURE__ */ React28.createElement(React28.Fragment, null, "Nenhum grupo dispon\xEDvel para visualiza\xE7\xE3o."))) : groups.map((group, index) => /* @__PURE__ */ React28.createElement(
|
|
13612
13559
|
GroupItem,
|
|
13613
13560
|
{
|
|
13614
13561
|
key: group.id,
|
|
@@ -13623,8 +13570,8 @@ function AncestryBoard({
|
|
|
13623
13570
|
onMentionClick: handleMentionClick,
|
|
13624
13571
|
canEdit
|
|
13625
13572
|
}
|
|
13626
|
-
)))
|
|
13627
|
-
/* @__PURE__ */ React28.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-
|
|
13573
|
+
))),
|
|
13574
|
+
/* @__PURE__ */ React28.createElement("div", { className: "px-5 py-2 border-t border-white/10 bg-slate-950/50 text-xs text-slate-500 flex justify-end flex-shrink-0" }, /* @__PURE__ */ React28.createElement("span", null, groups.length, " grupos raiz"))
|
|
13628
13575
|
)
|
|
13629
13576
|
);
|
|
13630
13577
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lv-x-software-house/x_view",
|
|
3
|
-
"version": "1.2.6-dev.
|
|
3
|
+
"version": "1.2.6-dev.12",
|
|
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",
|