perfect-gui 4.7.5 → 4.8.1
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/perfect-gui.mjs +118 -115
- package/dist/perfect-gui.umd.js +3 -3
- package/package.json +2 -2
- package/src/index.js +46 -17
- package/vite.config.js +2 -1
package/dist/perfect-gui.mjs
CHANGED
|
@@ -414,20 +414,20 @@ function A(y) {
|
|
|
414
414
|
`
|
|
415
415
|
);
|
|
416
416
|
}
|
|
417
|
-
class
|
|
417
|
+
class x {
|
|
418
418
|
constructor(e = {}) {
|
|
419
419
|
if (e.container ? (this.container = typeof e.container == "string" ? document.querySelector(e.container) : e.container, this.position_type = "absolute") : (this.container = document.body, this.position_type = "fixed"), this.propReferences = [], this.folders = [], e.isFolder) {
|
|
420
420
|
this._folderConstructor(e.folderOptions);
|
|
421
421
|
return;
|
|
422
422
|
}
|
|
423
|
-
this.name = e != null && typeof e.name == "string" ? e.name : "", this.backgroundColor = e.color || null, this.container == document.body ? this.maxHeight = window.innerHeight : this.maxHeight = Math.min(this.container.clientHeight, window.innerHeight), e.maxHeight && (this.initMaxHeight = e.maxHeight, this.maxHeight = Math.min(this.initMaxHeight, this.maxHeight)), this.screenCorner = this._parseScreenCorner(e.position), this instanceof
|
|
423
|
+
this.name = e != null && typeof e.name == "string" ? e.name : "", this.backgroundColor = e.color || null, this.container == document.body ? this.maxHeight = window.innerHeight : this.maxHeight = Math.min(this.container.clientHeight, window.innerHeight), e.maxHeight && (this.initMaxHeight = e.maxHeight, this.maxHeight = Math.min(this.initMaxHeight, this.maxHeight)), this.screenCorner = this._parseScreenCorner(e.position), this instanceof x && (typeof x[x.instanceCounter] != "number" ? x[x.instanceCounter] = 0 : x[x.instanceCounter]++), this.instanceId = x[x.instanceCounter], this.wrapperWidth = e.width || 290, this.stylesheet = document.createElement("style"), this.stylesheet.setAttribute("type", "text/css"), this.stylesheet.setAttribute("id", "lm-gui-stylesheet"), document.head.append(this.stylesheet), this.instanceId == 0 && this._addStyles(`${A(this.position_type)}`), this._styleInstance(), this._addWrapper(), this.wrapper.setAttribute("data-corner-x", this.screenCorner.x), this.wrapper.setAttribute("data-corner-y", this.screenCorner.y), e.autoRepositioning != !1 && window.addEventListener("resize", this._handleResize.bind(this)), this._handleResize(), this.hasBeenDragged = !1, e.draggable == !0 && this._makeDraggable(), this.closed = !1, e.closed && this.toggleClose();
|
|
424
424
|
}
|
|
425
425
|
_styleInstance() {
|
|
426
426
|
let e = this._getScrollbarWidth(this.container);
|
|
427
427
|
if (this.screenCorner.x == "left" ? this.xOffset = 0 : this.xOffset = this.container.clientWidth - this.wrapperWidth - e, this.instanceId > 0) {
|
|
428
428
|
let t = this.container.querySelectorAll(".p-gui");
|
|
429
|
-
for (let
|
|
430
|
-
this.screenCorner.y == t[
|
|
429
|
+
for (let n = 0; n < t.length; n++)
|
|
430
|
+
this.screenCorner.y == t[n].dataset.cornerY && (this.screenCorner.x == "left" && t[n].dataset.cornerX == "left" ? this.xOffset += t[n].offsetWidth : this.screenCorner.x == "right" && t[n].dataset.cornerX == "right" && (this.xOffset -= t[n].offsetWidth));
|
|
431
431
|
}
|
|
432
432
|
this.yOffset = 0, this.position = {
|
|
433
433
|
prevX: this.xOffset,
|
|
@@ -458,8 +458,8 @@ class b {
|
|
|
458
458
|
let e = this._getScrollbarWidth(this.container);
|
|
459
459
|
if (this.xOffset = this.screenCorner.x == "left" ? 0 : this.container.clientWidth - this.wrapperWidth - e, this.instanceId > 0) {
|
|
460
460
|
let t = this.container.querySelectorAll(`.p-gui:not(#${this.wrapper.id}):not([data-dragged])`);
|
|
461
|
-
for (let
|
|
462
|
-
this.screenCorner.y == t[
|
|
461
|
+
for (let n = 0; n < t.length && !(parseInt(t[n].id.replace("p-gui-", "")) > this.instanceId); n++)
|
|
462
|
+
this.screenCorner.y == t[n].dataset.cornerY && (this.screenCorner.x == "left" && t[n].dataset.cornerX == "left" ? this.xOffset += t[n].offsetWidth : this.screenCorner.x == "right" && t[n].dataset.cornerX == "right" && (this.xOffset -= t[n].offsetWidth));
|
|
463
463
|
}
|
|
464
464
|
this.position = { prevX: this.xOffset, prevY: this.yOffset, x: this.xOffset, y: this.yOffset }, this.wrapper.style.transform = `translate3d(${this.position.x}px, ${this.position.y}px, 0)`;
|
|
465
465
|
}
|
|
@@ -472,104 +472,104 @@ class b {
|
|
|
472
472
|
e.className = "p-gui__header-close", e.addEventListener("click", this.toggleClose.bind(this)), this.header.append(e);
|
|
473
473
|
}
|
|
474
474
|
button(e, t) {
|
|
475
|
-
let
|
|
476
|
-
typeof e != "string" ? typeof e == "object" && (e != null && e.hasOwnProperty("name")) ?
|
|
475
|
+
let n = "";
|
|
476
|
+
typeof e != "string" ? typeof e == "object" && (e != null && e.hasOwnProperty("name")) ? n = e.name == "" ? " " : e.name : n = " " : n = e == "" ? " " : e, this.imageContainer = null, typeof t != "function" && (t = () => {
|
|
477
477
|
});
|
|
478
478
|
const a = document.createElement("div");
|
|
479
|
-
a.className = "p-gui__button", a.textContent =
|
|
479
|
+
a.className = "p-gui__button", a.textContent = n, a.addEventListener("click", t), this.wrapper.append(a), typeof e.color == "string" && (a.style.setProperty("--color-accent", e.color), a.style.setProperty("--color-accent-hover", e.hoverColor || e.color));
|
|
480
480
|
}
|
|
481
481
|
image(e = {}, t) {
|
|
482
482
|
if (typeof e != "object")
|
|
483
483
|
throw Error(`[GUI] image() first parameter must be an object. Received: ${typeof e}.`);
|
|
484
|
-
let
|
|
484
|
+
let n;
|
|
485
485
|
if (typeof e.path == "string")
|
|
486
|
-
|
|
486
|
+
n = e.path;
|
|
487
487
|
else
|
|
488
488
|
throw typeof e.path == null ? Error("[GUI] image() path must be provided.") : Error("[GUI] image() path must be a string.");
|
|
489
|
-
let a =
|
|
490
|
-
e.name == null ?
|
|
489
|
+
let a = n.replace(/^.*[\\\/]/, ""), p;
|
|
490
|
+
e.name == null ? p = a : p = typeof e.name == "string" && e.name || " ";
|
|
491
491
|
const r = e.selected === !0, i = e.selectionBorder !== !1;
|
|
492
|
-
let
|
|
493
|
-
e.width && (typeof e.width == "number" && (e.width += "px"),
|
|
492
|
+
let o = "";
|
|
493
|
+
e.width && (typeof e.width == "number" && (e.width += "px"), o += `flex: 0 0 calc(${e.width} - 5px); `), e.height && (typeof e.height == "number" && (e.height += "px"), o += `height: ${e.height}; `), this.imageContainer || (this.imageContainer = document.createElement("div"), this.imageContainer.className = "p-gui__image-container", this.wrapper.append(this.imageContainer));
|
|
494
494
|
const s = document.createElement("div");
|
|
495
|
-
s.className = "p-gui__image", s.style = "background-image: url(" +
|
|
495
|
+
s.className = "p-gui__image", s.style = "background-image: url(" + n + "); " + o, this.imageContainer.append(s), r && i && s.classList.add("p-gui__image--selected");
|
|
496
496
|
const l = document.createElement("div");
|
|
497
|
-
return l.className = "p-gui__image-text", l.textContent =
|
|
498
|
-
let
|
|
499
|
-
for (let
|
|
500
|
-
c
|
|
501
|
-
i && s.classList.add("p-gui__image--selected"), typeof t == "function" && t({ path:
|
|
497
|
+
return l.className = "p-gui__image-text", l.textContent = p, s.append(l), s.addEventListener("click", () => {
|
|
498
|
+
let f = s.parentElement.querySelectorAll(".p-gui__image--selected");
|
|
499
|
+
for (let c = 0; c < f.length; c++)
|
|
500
|
+
f[c].classList.remove("p-gui__image--selected");
|
|
501
|
+
i && s.classList.add("p-gui__image--selected"), typeof t == "function" && t({ path: n, text: p });
|
|
502
502
|
}), s;
|
|
503
503
|
}
|
|
504
504
|
slider(e = {}, t) {
|
|
505
505
|
if (typeof e != "object")
|
|
506
506
|
throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);
|
|
507
|
-
let
|
|
508
|
-
if (
|
|
507
|
+
let n = typeof e.name == "string" && e.name || " ", a = !1, p = null, r = e.obj, i = e.prop, o = typeof e.value == "number" ? e.value : null, s = e.min ?? 0, l = e.max ?? 1, f = e.step || (l - s) / 100;
|
|
508
|
+
if (o !== null)
|
|
509
509
|
(i != null || r != null) && console.warn('[GUI] slider() "obj" and "prop" parameters are ignored when a "value" parameter is used.');
|
|
510
510
|
else if (i != null && r != null) {
|
|
511
511
|
if (typeof i != "string")
|
|
512
512
|
throw Error(`[GUI] slider() "prop" parameter must be an string. Received: ${typeof i}.`);
|
|
513
513
|
if (typeof r != "object")
|
|
514
514
|
throw Error(`[GUI] slider() "obj" parameter must be an object. Received: ${typeof r}.`);
|
|
515
|
-
|
|
515
|
+
n == " " && (n = i), p = this.propReferences.push(r[i]) - 1, a = !0;
|
|
516
516
|
} else
|
|
517
|
-
(i != null && r == null || i == null && r == null) && console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'),
|
|
517
|
+
(i != null && r == null || i == null && r == null) && console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'), o = (l - s) / 2;
|
|
518
518
|
this.imageContainer = null;
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
const
|
|
522
|
-
|
|
519
|
+
const c = document.createElement("div");
|
|
520
|
+
c.className = "p-gui__slider", c.textContent = n, this.wrapper.append(c);
|
|
521
|
+
const d = document.createElement("input");
|
|
522
|
+
d.className = "p-gui__slider-ctrl", d.setAttribute("type", "range"), d.setAttribute("min", s), d.setAttribute("max", l), d.setAttribute("step", f), d.setAttribute("value", a ? r[i] : o), c.append(d);
|
|
523
523
|
const h = document.createElement("div");
|
|
524
|
-
h.className = "p-gui__slider-value", h.textContent = String(a ? r[i] :
|
|
525
|
-
h.textContent =
|
|
524
|
+
h.className = "p-gui__slider-value", h.textContent = String(a ? r[i] : o), c.append(h), d.addEventListener("input", () => {
|
|
525
|
+
h.textContent = d.value, a ? r[i] = d.value : typeof t == "function" && t(parseFloat(d.value));
|
|
526
526
|
}), a && Object.defineProperty(r, i, {
|
|
527
|
-
set: (
|
|
528
|
-
this.propReferences[
|
|
527
|
+
set: (g) => {
|
|
528
|
+
this.propReferences[p] = g, d.value = g, h.textContent = String(g), typeof t == "function" && t(parseFloat(d.value));
|
|
529
529
|
},
|
|
530
|
-
get: () => this.propReferences[
|
|
530
|
+
get: () => this.propReferences[p]
|
|
531
531
|
});
|
|
532
532
|
}
|
|
533
533
|
toggle(e = {}, t) {
|
|
534
534
|
if (typeof e != "object")
|
|
535
535
|
throw Error(`[GUI] toggle() first parameter must be an object. Received: ${typeof e}.`);
|
|
536
|
-
let
|
|
537
|
-
if (
|
|
536
|
+
let n = typeof e.name == "string" && e.name || " ", a = !1, p = null, r = e.obj, i = e.prop, o = typeof e.value == "boolean" ? e.value : null;
|
|
537
|
+
if (o !== null)
|
|
538
538
|
(i != null || r != null) && console.warn('[GUI] toggle() "obj" and "prop" parameters are ignored when a "value" parameter is used.');
|
|
539
539
|
else if (i != null && r != null) {
|
|
540
540
|
if (typeof i != "string")
|
|
541
541
|
throw Error(`[GUI] toggle() "prop" parameter must be an string. Received: ${typeof i}.`);
|
|
542
542
|
if (typeof r != "object")
|
|
543
543
|
throw Error(`[GUI] toggle() "obj" parameter must be an object. Received: ${typeof r}.`);
|
|
544
|
-
|
|
544
|
+
n == " " && (n = i), p = this.propReferences.push(r[i]) - 1, a = !0;
|
|
545
545
|
} else
|
|
546
546
|
(i != null && r == null || i == null && r == null) && console.warn('[GUI] toggle() "obj" and "prop" parameters must be used together.');
|
|
547
547
|
this.imageContainer = null;
|
|
548
548
|
const s = document.createElement("div");
|
|
549
|
-
s.textContent =
|
|
550
|
-
const
|
|
549
|
+
s.textContent = n, s.className = "p-gui__switch", this.wrapper.append(s), s.addEventListener("click", (c) => {
|
|
550
|
+
const d = c.target.childNodes[1];
|
|
551
551
|
let h = !0;
|
|
552
|
-
|
|
552
|
+
d.classList.contains("p-gui__switch-checkbox--active") && (h = !1), d.classList.toggle("p-gui__switch-checkbox--active"), a ? r[i] = h : typeof t == "function" && t(h);
|
|
553
553
|
});
|
|
554
|
-
let l = (() => a ? r[i] ? " p-gui__switch-checkbox--active" : "" :
|
|
555
|
-
const
|
|
556
|
-
|
|
557
|
-
set: (
|
|
558
|
-
this.propReferences[
|
|
554
|
+
let l = (() => a ? r[i] ? " p-gui__switch-checkbox--active" : "" : o ? " p-gui__switch-checkbox--active" : "")();
|
|
555
|
+
const f = document.createElement("div");
|
|
556
|
+
f.className = "p-gui__switch-checkbox" + l, s.append(f), a && Object.defineProperty(r, i, {
|
|
557
|
+
set: (c) => {
|
|
558
|
+
this.propReferences[p] = c, c ? f.classList.add("p-gui__switch-checkbox--active") : f.classList.remove("p-gui__switch-checkbox--active"), typeof t == "function" && t(c);
|
|
559
559
|
},
|
|
560
|
-
get: () => this.propReferences[
|
|
560
|
+
get: () => this.propReferences[p]
|
|
561
561
|
});
|
|
562
562
|
}
|
|
563
563
|
list(e = {}, t) {
|
|
564
564
|
if (typeof e != "object")
|
|
565
565
|
throw Error(`[GUI] list() first parameter must be an object. Received: ${typeof e}.`);
|
|
566
|
-
let
|
|
566
|
+
let n = typeof e.name == "string" ? e.name : " ", a = !1, p = null, r = e.obj, i = e.prop, o = Array.isArray(e.values) ? e.values : null, s, l = typeof o[0] != "string";
|
|
567
567
|
if (t = typeof t == "function" ? t : null, e.value !== void 0 || e.value === void 0 && r === void 0 && i === void 0)
|
|
568
568
|
(i != null || r != null) && console.warn('[GUI] list() "obj" and "prop" parameters are ignored when a "value" parameter is used.'), s = (() => {
|
|
569
|
-
if (!
|
|
569
|
+
if (!o)
|
|
570
570
|
return null;
|
|
571
571
|
if (typeof e.value == "string")
|
|
572
|
-
return
|
|
572
|
+
return o.indexOf(e.value);
|
|
573
573
|
if (typeof e.value == "number")
|
|
574
574
|
return e.value;
|
|
575
575
|
})();
|
|
@@ -579,30 +579,33 @@ class b {
|
|
|
579
579
|
if (typeof r != "object")
|
|
580
580
|
throw Error(`[GUI] list() "obj" parameter must be an object. Received: ${typeof r}.`);
|
|
581
581
|
s = (() => {
|
|
582
|
-
if (!
|
|
582
|
+
if (!o)
|
|
583
583
|
return null;
|
|
584
584
|
if (typeof r[i] == "string")
|
|
585
|
-
return
|
|
585
|
+
return l ? o.find((d) => d.value === r[i]).value : o.indexOf(r[i]);
|
|
586
586
|
if (typeof r[i] == "number")
|
|
587
|
-
return r[i];
|
|
588
|
-
})(),
|
|
587
|
+
return l ? o.find((d) => d.value === r[i]).value : r[i];
|
|
588
|
+
})(), p = this.propReferences.push(r[i]) - 1, a = !0;
|
|
589
589
|
} else
|
|
590
590
|
(i != null && r == null || i == null && r == null) && console.warn('[GUI] list() "obj" and "prop" parameters must be used together.');
|
|
591
591
|
this.imageContainer = null;
|
|
592
|
-
let
|
|
593
|
-
|
|
592
|
+
let f = document.createElement("div");
|
|
593
|
+
f.className = "p-gui__list", f.textContent = n, this.wrapper.append(f);
|
|
594
594
|
let c = document.createElement("select");
|
|
595
|
-
|
|
596
|
-
a ? r[i] =
|
|
597
|
-
}),
|
|
598
|
-
|
|
599
|
-
|
|
595
|
+
f.append(c), c.className = "p-gui__list-dropdown", c.addEventListener("change", (d) => {
|
|
596
|
+
a ? r[i] = d.target.value : t && t(d.target.value);
|
|
597
|
+
}), o && o.forEach((d, h) => {
|
|
598
|
+
const g = l ? d.name : d, u = l ? d.value : d;
|
|
599
|
+
let m = document.createElement("option");
|
|
600
|
+
m.setAttribute("value", u), m.textContent = g, c.append(m), (!l && s == h || l && s == u) && m.setAttribute("selected", "");
|
|
600
601
|
}), a && Object.defineProperty(r, i, {
|
|
601
|
-
set: (
|
|
602
|
-
let
|
|
603
|
-
typeof
|
|
602
|
+
set: (d) => {
|
|
603
|
+
let h, g, u;
|
|
604
|
+
l ? (u = o.find((v) => v.value == d), g = (u == null ? void 0 : u.value) || o[0].value, h = o.indexOf(u)) : (typeof d == "string" && (h = o.indexOf(d), g = d), typeof d == "number" && (h = d, g = o[d])), this.propReferences[p] = l ? g : d;
|
|
605
|
+
const m = c.querySelector("[selected]");
|
|
606
|
+
m && m.removeAttribute("selected"), c.querySelectorAll("option")[h].setAttribute("selected", ""), typeof t == "function" && t(l ? u : g, h);
|
|
604
607
|
},
|
|
605
|
-
get: () => this.propReferences[
|
|
608
|
+
get: () => this.propReferences[p]
|
|
606
609
|
});
|
|
607
610
|
}
|
|
608
611
|
options(e, t) {
|
|
@@ -613,98 +616,98 @@ class b {
|
|
|
613
616
|
vector2(e = {}, t) {
|
|
614
617
|
if (typeof e != "object")
|
|
615
618
|
throw Error(`[GUI] vector2() first parameter must be an object. Received: ${typeof e}.`);
|
|
616
|
-
let
|
|
617
|
-
const a = e.x.min ?? 0,
|
|
619
|
+
let n = typeof e.name == "string" && e.name || " ";
|
|
620
|
+
const a = e.x.min ?? 0, p = e.x.max ?? 1, r = e.y.min ?? 0, i = e.y.max ?? 1, o = e.x.obj, s = e.x.prop, l = this.propReferences.push(o[s]) - 1, f = e.y.obj, c = e.y.prop, d = this.propReferences.push(f[c]) - 1;
|
|
618
621
|
t = typeof t == "function" ? t : null, this.imageContainer = null;
|
|
619
622
|
const h = document.createElement("div");
|
|
620
|
-
h.className = "p-gui__vector2", h.textContent =
|
|
621
|
-
const
|
|
622
|
-
|
|
623
|
-
const
|
|
624
|
-
|
|
625
|
-
|
|
623
|
+
h.className = "p-gui__vector2", h.textContent = n, this.wrapper.append(h);
|
|
624
|
+
const g = document.createElement("div");
|
|
625
|
+
g.className = "p-gui__vector-value", g.textContent = o[s] + ", " + f[c], h.append(g);
|
|
626
|
+
const u = document.createElement("div");
|
|
627
|
+
u.className = "p-gui__vector2-area", h.append(u), u.addEventListener("click", (b) => {
|
|
628
|
+
o[s] = parseFloat(this._mapLinear(b.offsetX, 0, u.clientWidth, a, p).toFixed(2)), f[c] = parseFloat(this._mapLinear(b.offsetY, 0, u.clientHeight, i, r).toFixed(2)), t && t(o[s], o[c]);
|
|
626
629
|
});
|
|
627
|
-
let
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
}),
|
|
631
|
-
|
|
632
|
-
}),
|
|
633
|
-
|
|
630
|
+
let m = !1;
|
|
631
|
+
u.addEventListener("pointerdown", (b) => {
|
|
632
|
+
m = !0;
|
|
633
|
+
}), u.addEventListener("pointerup", () => {
|
|
634
|
+
m = !1;
|
|
635
|
+
}), u.addEventListener("pointermove", (b) => {
|
|
636
|
+
m && (o[s] = parseFloat(this._mapLinear(b.offsetX, 0, u.clientWidth, a, p).toFixed(2)), f[c] = parseFloat(this._mapLinear(b.offsetY, 0, u.clientHeight, i, r).toFixed(2)), t && t(o[s], o[c]));
|
|
634
637
|
});
|
|
635
|
-
const w = document.createElement("div");
|
|
636
|
-
w.className = "p-gui__vector2-line p-gui__vector2-line-x", f.append(w);
|
|
637
638
|
const v = document.createElement("div");
|
|
638
|
-
v.className = "p-gui__vector2-line p-gui__vector2-line-
|
|
639
|
-
const
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
639
|
+
v.className = "p-gui__vector2-line p-gui__vector2-line-x", u.append(v);
|
|
640
|
+
const w = document.createElement("div");
|
|
641
|
+
w.className = "p-gui__vector2-line p-gui__vector2-line-y", u.append(w);
|
|
642
|
+
const _ = document.createElement("div");
|
|
643
|
+
_.className = "p-gui__vector2-dot", u.append(_), _.style.left = this._mapLinear(o[s], a, p, 0, u.clientWidth) + "px", _.style.top = this._mapLinear(f[c], r, i, u.clientHeight, 0) + "px", Object.defineProperty(o, s, {
|
|
644
|
+
set: (b) => {
|
|
645
|
+
this.propReferences[l] = b, _.style.left = this._mapLinear(b, a, p, 0, u.clientWidth) + "px", g.textContent = String(b) + ", " + f[c];
|
|
643
646
|
},
|
|
644
647
|
get: () => this.propReferences[l]
|
|
645
|
-
}), Object.defineProperty(
|
|
646
|
-
set: (
|
|
647
|
-
this.propReferences[
|
|
648
|
+
}), Object.defineProperty(f, c, {
|
|
649
|
+
set: (b) => {
|
|
650
|
+
this.propReferences[d] = b, _.style.top = this._mapLinear(b, r, i, u.clientHeight, 0) + "px", g.textContent = o[s] + ", " + String(b);
|
|
648
651
|
},
|
|
649
|
-
get: () => this.propReferences[
|
|
652
|
+
get: () => this.propReferences[d]
|
|
650
653
|
});
|
|
651
654
|
}
|
|
652
655
|
color(e = {}, t) {
|
|
653
656
|
if (typeof e != "object")
|
|
654
657
|
throw Error(`[GUI] color() first parameter must be an object. Received: ${typeof e}.`);
|
|
655
|
-
let
|
|
656
|
-
if (typeof e.value == "string" && (e.value.length != 7 || e.value[0] != "#" ? console.error(`[GUI] color() 'value' parameter must be an hexadecimal string in the format "#ffffff". Received: "${e.value}".`) :
|
|
658
|
+
let n = typeof e.name == "string" && e.name || " ", a = !1, p = null, r = e.obj, i = e.prop, o;
|
|
659
|
+
if (typeof e.value == "string" && (e.value.length != 7 || e.value[0] != "#" ? console.error(`[GUI] color() 'value' parameter must be an hexadecimal string in the format "#ffffff". Received: "${e.value}".`) : o = e.value), o || (o = "#000000"), e.value !== void 0)
|
|
657
660
|
(i != null || r != null) && console.warn('[GUI] color() "obj" and "prop" parameters are ignored when a "value" parameter is used.');
|
|
658
661
|
else if (i != null && r != null) {
|
|
659
662
|
if (typeof i != "string")
|
|
660
663
|
throw Error(`[GUI] color() "prop" parameter must be an string. Received: ${typeof i}.`);
|
|
661
664
|
if (typeof r != "object")
|
|
662
665
|
throw Error(`[GUI] color() "obj" parameter must be an object. Received: ${typeof r}.`);
|
|
663
|
-
|
|
666
|
+
n == " " && (n = i), p = this.propReferences.push(r[i]) - 1, a = !0;
|
|
664
667
|
} else
|
|
665
668
|
(i != null && r == null || i == null && r == null) && console.warn('[GUI] color() "obj" and "prop" parameters must be used together.');
|
|
666
669
|
this.imageContainer = null;
|
|
667
670
|
const s = document.createElement("div");
|
|
668
|
-
s.className = "p-gui__color", s.textContent =
|
|
671
|
+
s.className = "p-gui__color", s.textContent = n, this.wrapper.append(s);
|
|
669
672
|
const l = document.createElement("input");
|
|
670
|
-
l.className = "p-gui__color-picker", l.setAttribute("type", "color"), l.value =
|
|
673
|
+
l.className = "p-gui__color-picker", l.setAttribute("type", "color"), l.value = o, s.append(l), typeof t == "function" && l.addEventListener("input", () => {
|
|
671
674
|
a ? r[i] = l.value : typeof t == "function" && t(l.value);
|
|
672
675
|
}), a && Object.defineProperty(r, i, {
|
|
673
|
-
set: (
|
|
674
|
-
this.propReferences[
|
|
676
|
+
set: (f) => {
|
|
677
|
+
this.propReferences[p] = f, l.value = f, typeof t == "function" && t(f);
|
|
675
678
|
},
|
|
676
|
-
get: () => this.propReferences[
|
|
679
|
+
get: () => this.propReferences[p]
|
|
677
680
|
});
|
|
678
681
|
}
|
|
679
682
|
folder(e = {}) {
|
|
680
|
-
let t = typeof e.closed == "boolean" ? e.closed : !1,
|
|
683
|
+
let t = typeof e.closed == "boolean" ? e.closed : !1, n = e.name || "", a = e.color || null, p = e.maxHeight || null;
|
|
681
684
|
this.imageContainer = null;
|
|
682
685
|
let r = "p-gui__folder";
|
|
683
686
|
this.folders.length == 0 && (r += " p-gui__folder--first"), t && (r += " p-gui__folder--closed");
|
|
684
687
|
let i = a ? `background-color: ${a};` : "";
|
|
685
|
-
i +=
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
+
i += p ? `max-height: ${p}px;` : "";
|
|
689
|
+
const o = document.createElement("div");
|
|
690
|
+
o.className = r, o.style = i, this.wrapper.append(o);
|
|
688
691
|
const s = document.createElement("div");
|
|
689
|
-
s.innerHTML = `<span class="p-gui__folder-arrow"></span>${
|
|
690
|
-
|
|
692
|
+
s.innerHTML = `<span class="p-gui__folder-arrow"></span>${n}`, s.className = "p-gui__folder-header", o.append(s), s.addEventListener("click", () => {
|
|
693
|
+
o.classList.toggle("p-gui__folder--closed");
|
|
691
694
|
});
|
|
692
|
-
let l = new
|
|
693
|
-
wrapper:
|
|
695
|
+
let l = new x({ isFolder: !0, folderOptions: {
|
|
696
|
+
wrapper: o
|
|
694
697
|
} });
|
|
695
698
|
return this.folders.push(l), l;
|
|
696
699
|
}
|
|
697
700
|
_makeDraggable() {
|
|
698
701
|
var e = this;
|
|
699
702
|
this.header.addEventListener("pointerdown", t), this.header.addEventListener("pointerup", a);
|
|
700
|
-
function t(
|
|
701
|
-
|
|
703
|
+
function t(p) {
|
|
704
|
+
p.preventDefault(), e.position.initX = e.position.x, e.position.initY = e.position.y, e.position.prevX = p.clientX, e.position.prevY = p.clientY, document.addEventListener("pointermove", n);
|
|
702
705
|
}
|
|
703
|
-
function
|
|
704
|
-
|
|
706
|
+
function n(p) {
|
|
707
|
+
p.preventDefault(), e.hasBeenDragged || (e.hasBeenDragged = !0, e.wrapper.setAttribute("data-dragged", "true")), e.position.x = e.position.initX + p.clientX - e.position.prevX, e.position.y = e.position.initY + p.clientY - e.position.prevY, e.wrapper.style.transform = "translate3d(" + e.position.x + "px," + e.position.y + "px,0)";
|
|
705
708
|
}
|
|
706
|
-
function a(
|
|
707
|
-
document.removeEventListener("pointermove",
|
|
709
|
+
function a(p) {
|
|
710
|
+
document.removeEventListener("pointermove", n);
|
|
708
711
|
}
|
|
709
712
|
}
|
|
710
713
|
toggleClose() {
|
|
@@ -713,10 +716,10 @@ class b {
|
|
|
713
716
|
kill() {
|
|
714
717
|
this.wrapper.remove();
|
|
715
718
|
}
|
|
716
|
-
_mapLinear(e, t,
|
|
717
|
-
return a + (e - t) * (
|
|
719
|
+
_mapLinear(e, t, n, a, p) {
|
|
720
|
+
return a + (e - t) * (p - a) / (n - t);
|
|
718
721
|
}
|
|
719
722
|
}
|
|
720
723
|
export {
|
|
721
|
-
|
|
724
|
+
x as default
|
|
722
725
|
};
|
package/dist/perfect-gui.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(v,b){typeof exports=="object"&&typeof module<"u"?module.exports=b():typeof define=="function"&&define.amd?define(b):(v=typeof globalThis<"u"?globalThis:v||self,v["Perfect GUI"]=b())})(this,function(){"use strict";function v(A){return`
|
|
2
2
|
.p-gui {
|
|
3
3
|
--main-border-radius: 5px;
|
|
4
4
|
--color-bg: #121212;
|
|
@@ -408,10 +408,10 @@
|
|
|
408
408
|
.p-gui__folder--closed .p-gui__folder-arrow {
|
|
409
409
|
transform: rotate(0deg);
|
|
410
410
|
}
|
|
411
|
-
`}class
|
|
411
|
+
`}class b{constructor(e={}){if(e.container?(this.container=typeof e.container=="string"?document.querySelector(e.container):e.container,this.position_type="absolute"):(this.container=document.body,this.position_type="fixed"),this.propReferences=[],this.folders=[],e.isFolder){this._folderConstructor(e.folderOptions);return}this.name=e!=null&&typeof e.name=="string"?e.name:"",this.backgroundColor=e.color||null,this.container==document.body?this.maxHeight=window.innerHeight:this.maxHeight=Math.min(this.container.clientHeight,window.innerHeight),e.maxHeight&&(this.initMaxHeight=e.maxHeight,this.maxHeight=Math.min(this.initMaxHeight,this.maxHeight)),this.screenCorner=this._parseScreenCorner(e.position),this instanceof b&&(typeof b[b.instanceCounter]!="number"?b[b.instanceCounter]=0:b[b.instanceCounter]++),this.instanceId=b[b.instanceCounter],this.wrapperWidth=e.width||290,this.stylesheet=document.createElement("style"),this.stylesheet.setAttribute("type","text/css"),this.stylesheet.setAttribute("id","lm-gui-stylesheet"),document.head.append(this.stylesheet),this.instanceId==0&&this._addStyles(`${v(this.position_type)}`),this._styleInstance(),this._addWrapper(),this.wrapper.setAttribute("data-corner-x",this.screenCorner.x),this.wrapper.setAttribute("data-corner-y",this.screenCorner.y),e.autoRepositioning!=!1&&window.addEventListener("resize",this._handleResize.bind(this)),this._handleResize(),this.hasBeenDragged=!1,e.draggable==!0&&this._makeDraggable(),this.closed=!1,e.closed&&this.toggleClose()}_styleInstance(){let e=this._getScrollbarWidth(this.container);if(this.screenCorner.x=="left"?this.xOffset=0:this.xOffset=this.container.clientWidth-this.wrapperWidth-e,this.instanceId>0){let t=this.container.querySelectorAll(".p-gui");for(let o=0;o<t.length;o++)this.screenCorner.y==t[o].dataset.cornerY&&(this.screenCorner.x=="left"&&t[o].dataset.cornerX=="left"?this.xOffset+=t[o].offsetWidth:this.screenCorner.x=="right"&&t[o].dataset.cornerX=="right"&&(this.xOffset-=t[o].offsetWidth))}this.yOffset=0,this.position={prevX:this.xOffset,prevY:this.yOffset,x:this.xOffset,y:this.yOffset},this._addStyles(`#p-gui-${this.instanceId} {
|
|
412
412
|
width: ${this.wrapperWidth}px;
|
|
413
413
|
max-height: ${this.maxHeight}px;
|
|
414
414
|
transform: translate3d(${this.xOffset}px,${this.yOffset}px,0);
|
|
415
415
|
${this.screenCorner.y=="top"?"":"top: auto; bottom: 0;"}
|
|
416
416
|
${this.backgroundColor?"background: "+this.backgroundColor+";":""}
|
|
417
|
-
}`)}_folderConstructor(e){this.wrapper=e.wrapper}_parseScreenCorner(e){let t={x:"right",y:"top"};return e==null||(typeof e!="string"&&console.error("[perfect-gui] Position must be a string."),e.includes("left")&&(t.x="left"),e.includes("bottom")&&(t.y="bottom")),t}_getScrollbarWidth(e){return e===document.body?window.innerWidth-document.documentElement.clientWidth:e.offsetWidth-e.clientWidth}_handleResize(){if(this.container==document.body?this.maxHeight=window.innerHeight:this.maxHeight=Math.min(this.container.clientHeight,window.innerHeight),this.initMaxHeight&&(this.maxHeight=Math.min(this.initMaxHeight,this.maxHeight)),this.wrapper.style.maxHeight=this.maxHeight+"px",this.hasBeenDragged)return;let e=this._getScrollbarWidth(this.container);if(this.xOffset=this.screenCorner.x=="left"?0:this.container.clientWidth-this.wrapperWidth-e,this.instanceId>0){let t=this.container.querySelectorAll(`.p-gui:not(#${this.wrapper.id}):not([data-dragged])`);for(let o=0;o<t.length&&!(parseInt(t[o].id.replace("p-gui-",""))>this.instanceId);o++)this.screenCorner.y==t[o].dataset.cornerY&&(this.screenCorner.x=="left"&&t[o].dataset.cornerX=="left"?this.xOffset+=t[o].offsetWidth:this.screenCorner.x=="right"&&t[o].dataset.cornerX=="right"&&(this.xOffset-=t[o].offsetWidth))}this.position={prevX:this.xOffset,prevY:this.yOffset,x:this.xOffset,y:this.yOffset},this.wrapper.style.transform=`translate3d(${this.position.x}px, ${this.position.y}px, 0)`}_addStyles(e){this.stylesheet.innerHTML+=e}_addWrapper(){this.wrapper=document.createElement("div"),this.wrapper.id="p-gui-"+this.instanceId,this.wrapper.className="p-gui",this.container.append(this.wrapper),this.header=document.createElement("div"),this.header.className="p-gui__header",this.header.textContent=this.name,this.header.style=`${this.backgroundColor?"border-color: "+this.backgroundColor+";":""}`,this.wrapper.append(this.header);const e=document.createElement("div");e.className="p-gui__header-close",e.addEventListener("click",this.toggleClose.bind(this)),this.header.append(e)}button(e,t){let o="";typeof e!="string"?typeof e=="object"&&(e!=null&&e.hasOwnProperty("name"))?o=e.name==""?" ":e.name:o=" ":o=e==""?" ":e,this.imageContainer=null,typeof t!="function"&&(t=()=>{});const a=document.createElement("div");a.className="p-gui__button",a.textContent=o,a.addEventListener("click",t),this.wrapper.append(a),typeof e.color=="string"&&(a.style.setProperty("--color-accent",e.color),a.style.setProperty("--color-accent-hover",e.hoverColor||e.color))}image(e={},t){if(typeof e!="object")throw Error(`[GUI] image() first parameter must be an object. Received: ${typeof e}.`);let o;if(typeof e.path=="string")o=e.path;else throw typeof e.path==null?Error("[GUI] image() path must be provided."):Error("[GUI] image() path must be a string.");let a=o.replace(/^.*[\\\/]/,""),d;e.name==null?d=a:d=typeof e.name=="string"&&e.name||" ";const r=e.selected===!0,i=e.selectionBorder!==!1;let n="";e.width&&(typeof e.width=="number"&&(e.width+="px"),n+=`flex: 0 0 calc(${e.width} - 5px); `),e.height&&(typeof e.height=="number"&&(e.height+="px"),n+=`height: ${e.height}; `),this.imageContainer||(this.imageContainer=document.createElement("div"),this.imageContainer.className="p-gui__image-container",this.wrapper.append(this.imageContainer));const s=document.createElement("div");s.className="p-gui__image",s.style="background-image: url("+o+"); "+n,this.imageContainer.append(s),r&&i&&s.classList.add("p-gui__image--selected");const l=document.createElement("div");return l.className="p-gui__image-text",l.textContent=d,s.append(l),s.addEventListener("click",()=>{let c=s.parentElement.querySelectorAll(".p-gui__image--selected");for(let p=0;p<c.length;p++)c[p].classList.remove("p-gui__image--selected");i&&s.classList.add("p-gui__image--selected"),typeof t=="function"&&t({path:o,text:d})}),s}slider(e={},t){if(typeof e!="object")throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,d=null,r=e.obj,i=e.prop,n=typeof e.value=="number"?e.value:null,s=e.min??0,l=e.max??1,c=e.step||(l-s)/100;if(n!==null)(i!=null||r!=null)&&console.warn('[GUI] slider() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] slider() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] slider() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),d=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'),n=(l-s)/2;this.imageContainer=null;const p=document.createElement("div");p.className="p-gui__slider",p.textContent=o,this.wrapper.append(p);const u=document.createElement("input");u.className="p-gui__slider-ctrl",u.setAttribute("type","range"),u.setAttribute("min",s),u.setAttribute("max",l),u.setAttribute("step",c),u.setAttribute("value",a?r[i]:n),p.append(u);const f=document.createElement("div");f.className="p-gui__slider-value",f.textContent=String(a?r[i]:n),p.append(f),u.addEventListener("input",()=>{f.textContent=u.value,a?r[i]=u.value:typeof t=="function"&&t(parseFloat(u.value))}),a&&Object.defineProperty(r,i,{set:m=>{this.propReferences[d]=m,u.value=m,f.textContent=String(m),typeof t=="function"&&t(parseFloat(u.value))},get:()=>this.propReferences[d]})}toggle(e={},t){if(typeof e!="object")throw Error(`[GUI] toggle() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,d=null,r=e.obj,i=e.prop,n=typeof e.value=="boolean"?e.value:null;if(n!==null)(i!=null||r!=null)&&console.warn('[GUI] toggle() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] toggle() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] toggle() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),d=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] toggle() "obj" and "prop" parameters must be used together.');this.imageContainer=null;const s=document.createElement("div");s.textContent=o,s.className="p-gui__switch",this.wrapper.append(s),s.addEventListener("click",p=>{const u=p.target.childNodes[1];let f=!0;u.classList.contains("p-gui__switch-checkbox--active")&&(f=!1),u.classList.toggle("p-gui__switch-checkbox--active"),a?r[i]=f:typeof t=="function"&&t(f)});let l=(()=>a?r[i]?" p-gui__switch-checkbox--active":"":n?" p-gui__switch-checkbox--active":"")();const c=document.createElement("div");c.className="p-gui__switch-checkbox"+l,s.append(c),a&&Object.defineProperty(r,i,{set:p=>{this.propReferences[d]=p,p?c.classList.add("p-gui__switch-checkbox--active"):c.classList.remove("p-gui__switch-checkbox--active"),typeof t=="function"&&t(p)},get:()=>this.propReferences[d]})}list(e={},t){if(typeof e!="object")throw Error(`[GUI] list() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"?e.name:" ",a=!1,d=null,r=e.obj,i=e.prop,n=Array.isArray(e.values)?e.values:null,s;if(t=typeof t=="function"?t:null,e.value!==void 0||e.value===void 0&&r===void 0&&i===void 0)(i!=null||r!=null)&&console.warn('[GUI] list() "obj" and "prop" parameters are ignored when a "value" parameter is used.'),s=(()=>{if(!n)return null;if(typeof e.value=="string")return n.indexOf(e.value);if(typeof e.value=="number")return e.value})();else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] list() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] list() "obj" parameter must be an object. Received: ${typeof r}.`);s=(()=>{if(!n)return null;if(typeof r[i]=="string")return n.indexOf(r[i]);if(typeof r[i]=="number")return r[i]})(),d=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] list() "obj" and "prop" parameters must be used together.');this.imageContainer=null;let l=document.createElement("div");l.className="p-gui__list",l.textContent=o,this.wrapper.append(l);let c=document.createElement("select");l.append(c),c.className="p-gui__list-dropdown",c.addEventListener("change",p=>{a?r[i]=p.target.value:t&&t(p.target.value)}),n&&n.forEach((p,u)=>{let f=document.createElement("option");f.setAttribute("value",p),f.textContent=p,c.append(f),s==u&&f.setAttribute("selected","")}),a&&Object.defineProperty(r,i,{set:p=>{let u,f;typeof p=="string"&&(u=n.indexOf(p),f=p),typeof p=="number"&&(u=p,f=n[p]),this.propReferences[d]=p,c.querySelector("[selected]").removeAttribute("selected"),c.querySelectorAll("option")[u].setAttribute("selected",""),typeof t=="function"&&t(f,u)},get:()=>this.propReferences[d]})}options(e,t){if(typeof e!="object")throw Error(`[GUI] options() first parameter must be an object. Received: ${typeof e}.`);this.list(e,t)}vector2(e={},t){if(typeof e!="object")throw Error(`[GUI] vector2() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ";const a=e.x.min??0,d=e.x.max??1,r=e.y.min??0,i=e.y.max??1,n=e.x.obj,s=e.x.prop,l=this.propReferences.push(n[s])-1,c=e.y.obj,p=e.y.prop,u=this.propReferences.push(c[p])-1;t=typeof t=="function"?t:null,this.imageContainer=null;const f=document.createElement("div");f.className="p-gui__vector2",f.textContent=o,this.wrapper.append(f);const m=document.createElement("div");m.className="p-gui__vector-value",m.textContent=n[s]+", "+c[p],f.append(m);const h=document.createElement("div");h.className="p-gui__vector2-area",f.append(h),h.addEventListener("click",b=>{n[s]=parseFloat(this._mapLinear(b.offsetX,0,h.clientWidth,a,d).toFixed(2)),c[p]=parseFloat(this._mapLinear(b.offsetY,0,h.clientHeight,i,r).toFixed(2)),t&&t(n[s],n[p])});let w=!1;h.addEventListener("pointerdown",b=>{w=!0}),h.addEventListener("pointerup",()=>{w=!1}),h.addEventListener("pointermove",b=>{w&&(n[s]=parseFloat(this._mapLinear(b.offsetX,0,h.clientWidth,a,d).toFixed(2)),c[p]=parseFloat(this._mapLinear(b.offsetY,0,h.clientHeight,i,r).toFixed(2)),t&&t(n[s],n[p]))});const y=document.createElement("div");y.className="p-gui__vector2-line p-gui__vector2-line-x",h.append(y);const v=document.createElement("div");v.className="p-gui__vector2-line p-gui__vector2-line-y",h.append(v);const x=document.createElement("div");x.className="p-gui__vector2-dot",h.append(x),x.style.left=this._mapLinear(n[s],a,d,0,h.clientWidth)+"px",x.style.top=this._mapLinear(c[p],r,i,h.clientHeight,0)+"px",Object.defineProperty(n,s,{set:b=>{this.propReferences[l]=b,x.style.left=this._mapLinear(b,a,d,0,h.clientWidth)+"px",m.textContent=String(b)+", "+c[p]},get:()=>this.propReferences[l]}),Object.defineProperty(c,p,{set:b=>{this.propReferences[u]=b,x.style.top=this._mapLinear(b,r,i,h.clientHeight,0)+"px",m.textContent=n[s]+", "+String(b)},get:()=>this.propReferences[u]})}color(e={},t){if(typeof e!="object")throw Error(`[GUI] color() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,d=null,r=e.obj,i=e.prop,n;if(typeof e.value=="string"&&(e.value.length!=7||e.value[0]!="#"?console.error(`[GUI] color() 'value' parameter must be an hexadecimal string in the format "#ffffff". Received: "${e.value}".`):n=e.value),n||(n="#000000"),e.value!==void 0)(i!=null||r!=null)&&console.warn('[GUI] color() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] color() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] color() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),d=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] color() "obj" and "prop" parameters must be used together.');this.imageContainer=null;const s=document.createElement("div");s.className="p-gui__color",s.textContent=o,this.wrapper.append(s);const l=document.createElement("input");l.className="p-gui__color-picker",l.setAttribute("type","color"),l.value=n,s.append(l),typeof t=="function"&&l.addEventListener("input",()=>{a?r[i]=l.value:typeof t=="function"&&t(l.value)}),a&&Object.defineProperty(r,i,{set:c=>{this.propReferences[d]=c,l.value=c,typeof t=="function"&&t(c)},get:()=>this.propReferences[d]})}folder(e={}){let t=typeof e.closed=="boolean"?e.closed:!1,o=e.name||"",a=e.color||null,d=e.maxHeight||null;this.imageContainer=null;let r="p-gui__folder";this.folders.length==0&&(r+=" p-gui__folder--first"),t&&(r+=" p-gui__folder--closed");let i=a?`background-color: ${a};`:"";i+=d?`max-height: ${d}px;`:"";const n=document.createElement("div");n.className=r,n.style=i,this.wrapper.append(n);const s=document.createElement("div");s.innerHTML=`<span class="p-gui__folder-arrow"></span>${o}`,s.className="p-gui__folder-header",n.append(s),s.addEventListener("click",()=>{n.classList.toggle("p-gui__folder--closed")});let l=new g({isFolder:!0,folderOptions:{wrapper:n}});return this.folders.push(l),l}_makeDraggable(){var e=this;this.header.addEventListener("pointerdown",t),this.header.addEventListener("pointerup",a);function t(d){d.preventDefault(),e.position.initX=e.position.x,e.position.initY=e.position.y,e.position.prevX=d.clientX,e.position.prevY=d.clientY,document.addEventListener("pointermove",o)}function o(d){d.preventDefault(),e.hasBeenDragged||(e.hasBeenDragged=!0,e.wrapper.setAttribute("data-dragged","true")),e.position.x=e.position.initX+d.clientX-e.position.prevX,e.position.y=e.position.initY+d.clientY-e.position.prevY,e.wrapper.style.transform="translate3d("+e.position.x+"px,"+e.position.y+"px,0)"}function a(d){document.removeEventListener("pointermove",o)}}toggleClose(){this.closed=!this.closed,this.wrapper.classList.toggle("p-gui--collapsed")}kill(){this.wrapper.remove()}_mapLinear(e,t,o,a,d){return a+(e-t)*(d-a)/(o-t)}}return g});
|
|
417
|
+
}`)}_folderConstructor(e){this.wrapper=e.wrapper}_parseScreenCorner(e){let t={x:"right",y:"top"};return e==null||(typeof e!="string"&&console.error("[perfect-gui] Position must be a string."),e.includes("left")&&(t.x="left"),e.includes("bottom")&&(t.y="bottom")),t}_getScrollbarWidth(e){return e===document.body?window.innerWidth-document.documentElement.clientWidth:e.offsetWidth-e.clientWidth}_handleResize(){if(this.container==document.body?this.maxHeight=window.innerHeight:this.maxHeight=Math.min(this.container.clientHeight,window.innerHeight),this.initMaxHeight&&(this.maxHeight=Math.min(this.initMaxHeight,this.maxHeight)),this.wrapper.style.maxHeight=this.maxHeight+"px",this.hasBeenDragged)return;let e=this._getScrollbarWidth(this.container);if(this.xOffset=this.screenCorner.x=="left"?0:this.container.clientWidth-this.wrapperWidth-e,this.instanceId>0){let t=this.container.querySelectorAll(`.p-gui:not(#${this.wrapper.id}):not([data-dragged])`);for(let o=0;o<t.length&&!(parseInt(t[o].id.replace("p-gui-",""))>this.instanceId);o++)this.screenCorner.y==t[o].dataset.cornerY&&(this.screenCorner.x=="left"&&t[o].dataset.cornerX=="left"?this.xOffset+=t[o].offsetWidth:this.screenCorner.x=="right"&&t[o].dataset.cornerX=="right"&&(this.xOffset-=t[o].offsetWidth))}this.position={prevX:this.xOffset,prevY:this.yOffset,x:this.xOffset,y:this.yOffset},this.wrapper.style.transform=`translate3d(${this.position.x}px, ${this.position.y}px, 0)`}_addStyles(e){this.stylesheet.innerHTML+=e}_addWrapper(){this.wrapper=document.createElement("div"),this.wrapper.id="p-gui-"+this.instanceId,this.wrapper.className="p-gui",this.container.append(this.wrapper),this.header=document.createElement("div"),this.header.className="p-gui__header",this.header.textContent=this.name,this.header.style=`${this.backgroundColor?"border-color: "+this.backgroundColor+";":""}`,this.wrapper.append(this.header);const e=document.createElement("div");e.className="p-gui__header-close",e.addEventListener("click",this.toggleClose.bind(this)),this.header.append(e)}button(e,t){let o="";typeof e!="string"?typeof e=="object"&&(e!=null&&e.hasOwnProperty("name"))?o=e.name==""?" ":e.name:o=" ":o=e==""?" ":e,this.imageContainer=null,typeof t!="function"&&(t=()=>{});const a=document.createElement("div");a.className="p-gui__button",a.textContent=o,a.addEventListener("click",t),this.wrapper.append(a),typeof e.color=="string"&&(a.style.setProperty("--color-accent",e.color),a.style.setProperty("--color-accent-hover",e.hoverColor||e.color))}image(e={},t){if(typeof e!="object")throw Error(`[GUI] image() first parameter must be an object. Received: ${typeof e}.`);let o;if(typeof e.path=="string")o=e.path;else throw typeof e.path==null?Error("[GUI] image() path must be provided."):Error("[GUI] image() path must be a string.");let a=o.replace(/^.*[\\\/]/,""),p;e.name==null?p=a:p=typeof e.name=="string"&&e.name||" ";const r=e.selected===!0,i=e.selectionBorder!==!1;let n="";e.width&&(typeof e.width=="number"&&(e.width+="px"),n+=`flex: 0 0 calc(${e.width} - 5px); `),e.height&&(typeof e.height=="number"&&(e.height+="px"),n+=`height: ${e.height}; `),this.imageContainer||(this.imageContainer=document.createElement("div"),this.imageContainer.className="p-gui__image-container",this.wrapper.append(this.imageContainer));const s=document.createElement("div");s.className="p-gui__image",s.style="background-image: url("+o+"); "+n,this.imageContainer.append(s),r&&i&&s.classList.add("p-gui__image--selected");const l=document.createElement("div");return l.className="p-gui__image-text",l.textContent=p,s.append(l),s.addEventListener("click",()=>{let f=s.parentElement.querySelectorAll(".p-gui__image--selected");for(let c=0;c<f.length;c++)f[c].classList.remove("p-gui__image--selected");i&&s.classList.add("p-gui__image--selected"),typeof t=="function"&&t({path:o,text:p})}),s}slider(e={},t){if(typeof e!="object")throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,p=null,r=e.obj,i=e.prop,n=typeof e.value=="number"?e.value:null,s=e.min??0,l=e.max??1,f=e.step||(l-s)/100;if(n!==null)(i!=null||r!=null)&&console.warn('[GUI] slider() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] slider() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] slider() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),p=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'),n=(l-s)/2;this.imageContainer=null;const c=document.createElement("div");c.className="p-gui__slider",c.textContent=o,this.wrapper.append(c);const d=document.createElement("input");d.className="p-gui__slider-ctrl",d.setAttribute("type","range"),d.setAttribute("min",s),d.setAttribute("max",l),d.setAttribute("step",f),d.setAttribute("value",a?r[i]:n),c.append(d);const h=document.createElement("div");h.className="p-gui__slider-value",h.textContent=String(a?r[i]:n),c.append(h),d.addEventListener("input",()=>{h.textContent=d.value,a?r[i]=d.value:typeof t=="function"&&t(parseFloat(d.value))}),a&&Object.defineProperty(r,i,{set:g=>{this.propReferences[p]=g,d.value=g,h.textContent=String(g),typeof t=="function"&&t(parseFloat(d.value))},get:()=>this.propReferences[p]})}toggle(e={},t){if(typeof e!="object")throw Error(`[GUI] toggle() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,p=null,r=e.obj,i=e.prop,n=typeof e.value=="boolean"?e.value:null;if(n!==null)(i!=null||r!=null)&&console.warn('[GUI] toggle() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] toggle() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] toggle() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),p=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] toggle() "obj" and "prop" parameters must be used together.');this.imageContainer=null;const s=document.createElement("div");s.textContent=o,s.className="p-gui__switch",this.wrapper.append(s),s.addEventListener("click",c=>{const d=c.target.childNodes[1];let h=!0;d.classList.contains("p-gui__switch-checkbox--active")&&(h=!1),d.classList.toggle("p-gui__switch-checkbox--active"),a?r[i]=h:typeof t=="function"&&t(h)});let l=(()=>a?r[i]?" p-gui__switch-checkbox--active":"":n?" p-gui__switch-checkbox--active":"")();const f=document.createElement("div");f.className="p-gui__switch-checkbox"+l,s.append(f),a&&Object.defineProperty(r,i,{set:c=>{this.propReferences[p]=c,c?f.classList.add("p-gui__switch-checkbox--active"):f.classList.remove("p-gui__switch-checkbox--active"),typeof t=="function"&&t(c)},get:()=>this.propReferences[p]})}list(e={},t){if(typeof e!="object")throw Error(`[GUI] list() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"?e.name:" ",a=!1,p=null,r=e.obj,i=e.prop,n=Array.isArray(e.values)?e.values:null,s,l=typeof n[0]!="string";if(t=typeof t=="function"?t:null,e.value!==void 0||e.value===void 0&&r===void 0&&i===void 0)(i!=null||r!=null)&&console.warn('[GUI] list() "obj" and "prop" parameters are ignored when a "value" parameter is used.'),s=(()=>{if(!n)return null;if(typeof e.value=="string")return n.indexOf(e.value);if(typeof e.value=="number")return e.value})();else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] list() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] list() "obj" parameter must be an object. Received: ${typeof r}.`);s=(()=>{if(!n)return null;if(typeof r[i]=="string")return l?n.find(d=>d.value===r[i]).value:n.indexOf(r[i]);if(typeof r[i]=="number")return l?n.find(d=>d.value===r[i]).value:r[i]})(),p=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] list() "obj" and "prop" parameters must be used together.');this.imageContainer=null;let f=document.createElement("div");f.className="p-gui__list",f.textContent=o,this.wrapper.append(f);let c=document.createElement("select");f.append(c),c.className="p-gui__list-dropdown",c.addEventListener("change",d=>{a?r[i]=d.target.value:t&&t(d.target.value)}),n&&n.forEach((d,h)=>{const g=l?d.name:d,u=l?d.value:d;let x=document.createElement("option");x.setAttribute("value",u),x.textContent=g,c.append(x),(!l&&s==h||l&&s==u)&&x.setAttribute("selected","")}),a&&Object.defineProperty(r,i,{set:d=>{let h,g,u;l?(u=n.find(w=>w.value==d),g=(u==null?void 0:u.value)||n[0].value,h=n.indexOf(u)):(typeof d=="string"&&(h=n.indexOf(d),g=d),typeof d=="number"&&(h=d,g=n[d])),this.propReferences[p]=l?g:d;const x=c.querySelector("[selected]");x&&x.removeAttribute("selected"),c.querySelectorAll("option")[h].setAttribute("selected",""),typeof t=="function"&&t(l?u:g,h)},get:()=>this.propReferences[p]})}options(e,t){if(typeof e!="object")throw Error(`[GUI] options() first parameter must be an object. Received: ${typeof e}.`);this.list(e,t)}vector2(e={},t){if(typeof e!="object")throw Error(`[GUI] vector2() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ";const a=e.x.min??0,p=e.x.max??1,r=e.y.min??0,i=e.y.max??1,n=e.x.obj,s=e.x.prop,l=this.propReferences.push(n[s])-1,f=e.y.obj,c=e.y.prop,d=this.propReferences.push(f[c])-1;t=typeof t=="function"?t:null,this.imageContainer=null;const h=document.createElement("div");h.className="p-gui__vector2",h.textContent=o,this.wrapper.append(h);const g=document.createElement("div");g.className="p-gui__vector-value",g.textContent=n[s]+", "+f[c],h.append(g);const u=document.createElement("div");u.className="p-gui__vector2-area",h.append(u),u.addEventListener("click",m=>{n[s]=parseFloat(this._mapLinear(m.offsetX,0,u.clientWidth,a,p).toFixed(2)),f[c]=parseFloat(this._mapLinear(m.offsetY,0,u.clientHeight,i,r).toFixed(2)),t&&t(n[s],n[c])});let x=!1;u.addEventListener("pointerdown",m=>{x=!0}),u.addEventListener("pointerup",()=>{x=!1}),u.addEventListener("pointermove",m=>{x&&(n[s]=parseFloat(this._mapLinear(m.offsetX,0,u.clientWidth,a,p).toFixed(2)),f[c]=parseFloat(this._mapLinear(m.offsetY,0,u.clientHeight,i,r).toFixed(2)),t&&t(n[s],n[c]))});const w=document.createElement("div");w.className="p-gui__vector2-line p-gui__vector2-line-x",u.append(w);const y=document.createElement("div");y.className="p-gui__vector2-line p-gui__vector2-line-y",u.append(y);const _=document.createElement("div");_.className="p-gui__vector2-dot",u.append(_),_.style.left=this._mapLinear(n[s],a,p,0,u.clientWidth)+"px",_.style.top=this._mapLinear(f[c],r,i,u.clientHeight,0)+"px",Object.defineProperty(n,s,{set:m=>{this.propReferences[l]=m,_.style.left=this._mapLinear(m,a,p,0,u.clientWidth)+"px",g.textContent=String(m)+", "+f[c]},get:()=>this.propReferences[l]}),Object.defineProperty(f,c,{set:m=>{this.propReferences[d]=m,_.style.top=this._mapLinear(m,r,i,u.clientHeight,0)+"px",g.textContent=n[s]+", "+String(m)},get:()=>this.propReferences[d]})}color(e={},t){if(typeof e!="object")throw Error(`[GUI] color() first parameter must be an object. Received: ${typeof e}.`);let o=typeof e.name=="string"&&e.name||" ",a=!1,p=null,r=e.obj,i=e.prop,n;if(typeof e.value=="string"&&(e.value.length!=7||e.value[0]!="#"?console.error(`[GUI] color() 'value' parameter must be an hexadecimal string in the format "#ffffff". Received: "${e.value}".`):n=e.value),n||(n="#000000"),e.value!==void 0)(i!=null||r!=null)&&console.warn('[GUI] color() "obj" and "prop" parameters are ignored when a "value" parameter is used.');else if(i!=null&&r!=null){if(typeof i!="string")throw Error(`[GUI] color() "prop" parameter must be an string. Received: ${typeof i}.`);if(typeof r!="object")throw Error(`[GUI] color() "obj" parameter must be an object. Received: ${typeof r}.`);o==" "&&(o=i),p=this.propReferences.push(r[i])-1,a=!0}else(i!=null&&r==null||i==null&&r==null)&&console.warn('[GUI] color() "obj" and "prop" parameters must be used together.');this.imageContainer=null;const s=document.createElement("div");s.className="p-gui__color",s.textContent=o,this.wrapper.append(s);const l=document.createElement("input");l.className="p-gui__color-picker",l.setAttribute("type","color"),l.value=n,s.append(l),typeof t=="function"&&l.addEventListener("input",()=>{a?r[i]=l.value:typeof t=="function"&&t(l.value)}),a&&Object.defineProperty(r,i,{set:f=>{this.propReferences[p]=f,l.value=f,typeof t=="function"&&t(f)},get:()=>this.propReferences[p]})}folder(e={}){let t=typeof e.closed=="boolean"?e.closed:!1,o=e.name||"",a=e.color||null,p=e.maxHeight||null;this.imageContainer=null;let r="p-gui__folder";this.folders.length==0&&(r+=" p-gui__folder--first"),t&&(r+=" p-gui__folder--closed");let i=a?`background-color: ${a};`:"";i+=p?`max-height: ${p}px;`:"";const n=document.createElement("div");n.className=r,n.style=i,this.wrapper.append(n);const s=document.createElement("div");s.innerHTML=`<span class="p-gui__folder-arrow"></span>${o}`,s.className="p-gui__folder-header",n.append(s),s.addEventListener("click",()=>{n.classList.toggle("p-gui__folder--closed")});let l=new b({isFolder:!0,folderOptions:{wrapper:n}});return this.folders.push(l),l}_makeDraggable(){var e=this;this.header.addEventListener("pointerdown",t),this.header.addEventListener("pointerup",a);function t(p){p.preventDefault(),e.position.initX=e.position.x,e.position.initY=e.position.y,e.position.prevX=p.clientX,e.position.prevY=p.clientY,document.addEventListener("pointermove",o)}function o(p){p.preventDefault(),e.hasBeenDragged||(e.hasBeenDragged=!0,e.wrapper.setAttribute("data-dragged","true")),e.position.x=e.position.initX+p.clientX-e.position.prevX,e.position.y=e.position.initY+p.clientY-e.position.prevY,e.wrapper.style.transform="translate3d("+e.position.x+"px,"+e.position.y+"px,0)"}function a(p){document.removeEventListener("pointermove",o)}}toggleClose(){this.closed=!this.closed,this.wrapper.classList.toggle("p-gui--collapsed")}kill(){this.wrapper.remove()}_mapLinear(e,t,o,a,p){return a+(e-t)*(p-a)/(o-t)}}return b});
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -518,6 +518,7 @@ export default class GUI {
|
|
|
518
518
|
let prop = params.prop;
|
|
519
519
|
let values = Array.isArray(params.values) ? params.values : null;
|
|
520
520
|
let value;
|
|
521
|
+
let objectValues = typeof values[0] == 'string' ? false : true;
|
|
521
522
|
|
|
522
523
|
callback = typeof callback == 'function' ? callback : null;
|
|
523
524
|
|
|
@@ -555,16 +556,27 @@ export default class GUI {
|
|
|
555
556
|
return null;
|
|
556
557
|
}
|
|
557
558
|
if (typeof obj[prop] == 'string') {
|
|
558
|
-
|
|
559
|
+
if ( !objectValues ) { // values is an array of strings
|
|
560
|
+
return values.indexOf(obj[prop]);
|
|
561
|
+
}
|
|
562
|
+
else { // values is an array of objects
|
|
563
|
+
return values.find(item => item.value === obj[prop]).value;
|
|
564
|
+
}
|
|
559
565
|
}
|
|
560
566
|
if (typeof obj[prop] == 'number') {
|
|
561
|
-
|
|
567
|
+
if ( !objectValues ) { // values is an array of strings
|
|
568
|
+
return obj[prop];
|
|
569
|
+
}
|
|
570
|
+
else { // values is an array of objects
|
|
571
|
+
return values.find(item => item.value === obj[prop]).value;
|
|
572
|
+
}
|
|
562
573
|
}
|
|
563
574
|
})();
|
|
564
575
|
|
|
565
576
|
propReferenceIndex = this.propReferences.push(obj[prop]) - 1;
|
|
566
577
|
isObject = true;
|
|
567
578
|
}
|
|
579
|
+
|
|
568
580
|
else {
|
|
569
581
|
if ((prop != undefined && obj == undefined) || (prop == undefined && obj == undefined)) {
|
|
570
582
|
console.warn(`[GUI] list() "obj" and "prop" parameters must be used together.`);
|
|
@@ -595,12 +607,14 @@ export default class GUI {
|
|
|
595
607
|
{
|
|
596
608
|
values.forEach((item, index) =>
|
|
597
609
|
{
|
|
610
|
+
const optionName = objectValues ? item.name : item;
|
|
611
|
+
const optionValue = objectValues ? item.value : item;
|
|
598
612
|
let option = document.createElement('option');
|
|
599
|
-
option.setAttribute('value',
|
|
600
|
-
option.textContent =
|
|
613
|
+
option.setAttribute('value', optionValue);
|
|
614
|
+
option.textContent = optionName;
|
|
601
615
|
select.append(option);
|
|
602
616
|
|
|
603
|
-
if (value == index) {
|
|
617
|
+
if (!objectValues && value == index || objectValues && value == optionValue) {
|
|
604
618
|
option.setAttribute('selected', '');
|
|
605
619
|
}
|
|
606
620
|
});
|
|
@@ -609,23 +623,38 @@ export default class GUI {
|
|
|
609
623
|
if ( isObject ) {
|
|
610
624
|
Object.defineProperty( obj, prop, {
|
|
611
625
|
set: val => {
|
|
612
|
-
let
|
|
613
|
-
if (
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
626
|
+
let newIndex, newValue, newObj;
|
|
627
|
+
if (objectValues) {
|
|
628
|
+
newObj = values.find(item => {
|
|
629
|
+
return item.value == val;
|
|
630
|
+
});
|
|
631
|
+
newValue = newObj?.value || values[0].value;
|
|
632
|
+
newIndex = values.indexOf(newObj);
|
|
633
|
+
} else {
|
|
634
|
+
if (typeof val == 'string') {
|
|
635
|
+
newIndex = values.indexOf(val);
|
|
636
|
+
newValue = val;
|
|
637
|
+
}
|
|
638
|
+
if (typeof val == 'number') {
|
|
639
|
+
newIndex = val;
|
|
640
|
+
newValue = values[val];
|
|
641
|
+
}
|
|
620
642
|
}
|
|
621
643
|
|
|
622
|
-
this.propReferences[propReferenceIndex] = val;
|
|
644
|
+
this.propReferences[propReferenceIndex] = objectValues ? newValue : val;
|
|
623
645
|
|
|
624
|
-
select.querySelector('[selected]')
|
|
625
|
-
|
|
646
|
+
const previousSelection = select.querySelector('[selected]');
|
|
647
|
+
if ( previousSelection ) {
|
|
648
|
+
previousSelection.removeAttribute('selected')
|
|
649
|
+
}
|
|
650
|
+
select.querySelectorAll('option')[newIndex].setAttribute('selected', '');
|
|
626
651
|
|
|
627
652
|
if (typeof callback == 'function') {
|
|
628
|
-
|
|
653
|
+
if (objectValues) {
|
|
654
|
+
callback(newObj, newIndex);
|
|
655
|
+
} else {
|
|
656
|
+
callback(newValue, newIndex);
|
|
657
|
+
}
|
|
629
658
|
}
|
|
630
659
|
},
|
|
631
660
|
get: () => {
|