perfect-gui 4.3.1 → 4.3.2
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 +37 -35
- package/dist/perfect-gui.umd.js +8 -7
- package/package.json +1 -1
- package/src/index.js +22 -4
- package/src/styles.js +7 -6
package/dist/perfect-gui.mjs
CHANGED
|
@@ -97,20 +97,21 @@ function w(y) {
|
|
|
97
97
|
|
|
98
98
|
.p-gui__image-container {
|
|
99
99
|
width: 100%;
|
|
100
|
-
display: grid;
|
|
101
|
-
grid-template-columns: repeat(auto-fill, 32%);
|
|
102
|
-
justify-content: space-between;
|
|
103
100
|
padding: 0 2%;
|
|
101
|
+
display: flex;
|
|
102
|
+
justify-content: flex-start;
|
|
103
|
+
flex-wrap: wrap;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
.p-gui__image {
|
|
107
|
-
aspect-ratio: 1 / 1;
|
|
108
107
|
background-size: cover;
|
|
109
108
|
cursor: pointer;
|
|
110
109
|
position: relative;
|
|
111
|
-
margin
|
|
112
|
-
margin-bottom: 19px;
|
|
110
|
+
margin: 1px 2.5px 19px 2.5px;
|
|
113
111
|
border-radius: var(--main-border-radius);
|
|
112
|
+
flex: 0 0 calc(33.333% - 5px);
|
|
113
|
+
height: 90px;
|
|
114
|
+
background-position: center;
|
|
114
115
|
}
|
|
115
116
|
|
|
116
117
|
.p-gui__image--selected::after {
|
|
@@ -412,13 +413,13 @@ function w(y) {
|
|
|
412
413
|
`
|
|
413
414
|
);
|
|
414
415
|
}
|
|
415
|
-
class
|
|
416
|
+
class g {
|
|
416
417
|
constructor(e = {}) {
|
|
417
418
|
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) {
|
|
418
419
|
this._folderConstructor(e.folderOptions);
|
|
419
420
|
return;
|
|
420
421
|
}
|
|
421
|
-
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
|
|
422
|
+
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 g && (typeof g[g.instanceCounter] != "number" ? g[g.instanceCounter] = 0 : g[g.instanceCounter]++), this.instanceId = g[g.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(`${w(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();
|
|
422
423
|
}
|
|
423
424
|
_styleInstance() {
|
|
424
425
|
let e = this._getScrollbarWidth(this.container);
|
|
@@ -510,29 +511,30 @@ class h {
|
|
|
510
511
|
let r = i.replace(/^.*[\\\/]/, ""), o;
|
|
511
512
|
e.name == null ? o = r : o = typeof e.name == "string" && e.name || " ";
|
|
512
513
|
const s = e.selected === !0, n = e.selectionBorder !== !1;
|
|
513
|
-
|
|
514
|
+
let a = "";
|
|
515
|
+
e.width && (typeof e.width == "number" && (e.width += "px"), a += `flex: 0 0 calc(${e.width} - 5px); `), e.height && (typeof e.height == "number" && (e.height += "px"), a += `height: ${e.height}; `), this.imageContainer || (this.imageContainer = this._createElement({
|
|
514
516
|
class: "p-gui__image-container"
|
|
515
517
|
}));
|
|
516
|
-
var
|
|
518
|
+
var l = this._createElement({
|
|
517
519
|
class: "p-gui__image",
|
|
518
|
-
inline:
|
|
520
|
+
inline: "background-image: url(" + i + "); " + a,
|
|
519
521
|
parent: this.imageContainer
|
|
520
522
|
});
|
|
521
|
-
s && n &&
|
|
522
|
-
parent:
|
|
523
|
+
s && n && l.classList.add("p-gui__image--selected"), this._createElement({
|
|
524
|
+
parent: l,
|
|
523
525
|
class: "p-gui__image-text",
|
|
524
526
|
textContent: o
|
|
525
|
-
}), typeof t == "function" && (
|
|
526
|
-
let
|
|
527
|
-
for (let
|
|
528
|
-
|
|
529
|
-
n &&
|
|
527
|
+
}), typeof t == "function" && (l.onclick = () => {
|
|
528
|
+
let u = this.imageContainer.querySelectorAll(".p-gui__image--selected");
|
|
529
|
+
for (let d = 0; d < u.length; d++)
|
|
530
|
+
u[d].classList.remove("p-gui__image--selected");
|
|
531
|
+
n && l.classList.add("p-gui__image--selected"), t({ path: i, text: o });
|
|
530
532
|
});
|
|
531
533
|
}
|
|
532
534
|
slider(e = {}, t) {
|
|
533
535
|
if (typeof e != "object")
|
|
534
536
|
throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);
|
|
535
|
-
let i = typeof e.name == "string" && e.name || " ", r = !1, o = null, s = e.obj || e.object, n = e.prop || e.property, a = typeof e.value == "number" ? e.value : null, l = e.min ?? 0,
|
|
537
|
+
let i = typeof e.name == "string" && e.name || " ", r = !1, o = null, s = e.obj || e.object, n = e.prop || e.property, a = typeof e.value == "number" ? e.value : null, l = e.min ?? 0, u = e.max ?? 1, d = e.step || (u - l) / 100;
|
|
536
538
|
if (a !== null)
|
|
537
539
|
(n != null || s != null) && console.warn('[GUI] slider() "obj" and "property" parameters are ignored when a "value" parameter is used.');
|
|
538
540
|
else if (n != null && s != null) {
|
|
@@ -542,24 +544,24 @@ class h {
|
|
|
542
544
|
throw Error(`[GUI] slider() "obj" (or "object") parameter must be an object. Received: ${typeof s}.`);
|
|
543
545
|
i == " " && (i = n), o = this.propReferences.push(s[n]) - 1, r = !0;
|
|
544
546
|
} else
|
|
545
|
-
(n != null && s == null || n == null && s == null) && console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'), a = (
|
|
547
|
+
(n != null && s == null || n == null && s == null) && console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'), a = (u - l) / 2;
|
|
546
548
|
this.imageContainer = null;
|
|
547
|
-
var
|
|
549
|
+
var h = this._createElement({
|
|
548
550
|
class: "p-gui__slider",
|
|
549
551
|
textContent: i
|
|
550
552
|
}), f = this._createElement({
|
|
551
|
-
parent:
|
|
553
|
+
parent: h,
|
|
552
554
|
el: "input",
|
|
553
555
|
class: "p-gui__slider-ctrl",
|
|
554
556
|
customAttributes: {
|
|
555
557
|
type: "range",
|
|
556
558
|
min: l,
|
|
557
|
-
max:
|
|
558
|
-
step:
|
|
559
|
+
max: u,
|
|
560
|
+
step: d,
|
|
559
561
|
value: r ? s[n] : a
|
|
560
562
|
}
|
|
561
563
|
}), _ = this._createElement({
|
|
562
|
-
parent:
|
|
564
|
+
parent: h,
|
|
563
565
|
class: "p-gui__slider-value",
|
|
564
566
|
textContent: String(r ? s[n] : a)
|
|
565
567
|
});
|
|
@@ -626,7 +628,7 @@ class h {
|
|
|
626
628
|
if (typeof e != "object")
|
|
627
629
|
throw Error(`[GUI] vector2() first parameter must be an object. Received: ${typeof e}.`);
|
|
628
630
|
let i = typeof e.name == "string" && e.name || " ";
|
|
629
|
-
const r = e.x.min ?? 0, o = e.x.max ?? 1, s = e.y.min ?? 0, n = e.y.max ?? 1, a = e.x.obj || e.x.object, l = e.x.prop || e.x.property,
|
|
631
|
+
const r = e.x.min ?? 0, o = e.x.max ?? 1, s = e.y.min ?? 0, n = e.y.max ?? 1, a = e.x.obj || e.x.object, l = e.x.prop || e.x.property, u = this.propReferences.push(a[l]) - 1, d = e.y.obj || e.y.object, h = e.y.prop || e.y.property, f = this.propReferences.push(d[h]) - 1;
|
|
630
632
|
t = typeof t == "function" ? t : null, this.imageContainer = null;
|
|
631
633
|
const _ = this._createElement({
|
|
632
634
|
class: "p-gui__vector2",
|
|
@@ -634,13 +636,13 @@ class h {
|
|
|
634
636
|
}), b = this._createElement({
|
|
635
637
|
parent: _,
|
|
636
638
|
class: "p-gui__vector-value",
|
|
637
|
-
textContent: a[l] + ", " +
|
|
639
|
+
textContent: a[l] + ", " + d[h]
|
|
638
640
|
}), c = this._createElement({
|
|
639
641
|
parent: _,
|
|
640
642
|
el: "div",
|
|
641
643
|
class: "p-gui__vector2-area",
|
|
642
644
|
onclick: (p) => {
|
|
643
|
-
a[l] = parseFloat(this._mapLinear(p.offsetX, 0, c.clientWidth, r, o).toFixed(2)),
|
|
645
|
+
a[l] = parseFloat(this._mapLinear(p.offsetX, 0, c.clientWidth, r, o).toFixed(2)), d[h] = parseFloat(this._mapLinear(p.offsetY, 0, c.clientHeight, n, s).toFixed(2)), t && t(a[l], a[h]);
|
|
644
646
|
}
|
|
645
647
|
});
|
|
646
648
|
let m = !1;
|
|
@@ -649,7 +651,7 @@ class h {
|
|
|
649
651
|
}), c.addEventListener("pointerup", () => {
|
|
650
652
|
m = !1;
|
|
651
653
|
}), c.addEventListener("pointermove", (p) => {
|
|
652
|
-
m && (a[l] = parseFloat(this._mapLinear(p.offsetX, 0, c.clientWidth, r, o).toFixed(2)),
|
|
654
|
+
m && (a[l] = parseFloat(this._mapLinear(p.offsetX, 0, c.clientWidth, r, o).toFixed(2)), d[h] = parseFloat(this._mapLinear(p.offsetY, 0, c.clientHeight, n, s).toFixed(2)), t && t(a[l], a[h]));
|
|
653
655
|
}), this._createElement({
|
|
654
656
|
parent: c,
|
|
655
657
|
class: "p-gui__vector2-line p-gui__vector2-line-x"
|
|
@@ -661,12 +663,12 @@ class h {
|
|
|
661
663
|
parent: c,
|
|
662
664
|
class: "p-gui__vector2-dot"
|
|
663
665
|
});
|
|
664
|
-
x.style.left = this._mapLinear(a[l], r, o, 0, c.clientWidth) + "px", x.style.top = this._mapLinear(
|
|
666
|
+
x.style.left = this._mapLinear(a[l], r, o, 0, c.clientWidth) + "px", x.style.top = this._mapLinear(d[h], s, n, c.clientHeight, 0) + "px", Object.defineProperty(a, l, {
|
|
665
667
|
set: (p) => {
|
|
666
|
-
this.propReferences[
|
|
668
|
+
this.propReferences[u] = p, x.style.left = this._mapLinear(p, r, o, 0, c.clientWidth) + "px", b.textContent = String(p) + ", " + d[h];
|
|
667
669
|
},
|
|
668
|
-
get: () => this.propReferences[
|
|
669
|
-
}), Object.defineProperty(
|
|
670
|
+
get: () => this.propReferences[u]
|
|
671
|
+
}), Object.defineProperty(d, h, {
|
|
670
672
|
set: (p) => {
|
|
671
673
|
this.propReferences[f] = p, x.style.top = this._mapLinear(p, s, n, c.clientHeight, 0) + "px", b.textContent = a[l] + ", " + String(p);
|
|
672
674
|
},
|
|
@@ -712,7 +714,7 @@ class h {
|
|
|
712
714
|
},
|
|
713
715
|
parent: a
|
|
714
716
|
});
|
|
715
|
-
let l = new
|
|
717
|
+
let l = new g({ isFolder: !0, folderOptions: {
|
|
716
718
|
wrapper: a
|
|
717
719
|
} });
|
|
718
720
|
return this.folders.push(l), l;
|
|
@@ -741,5 +743,5 @@ class h {
|
|
|
741
743
|
}
|
|
742
744
|
}
|
|
743
745
|
export {
|
|
744
|
-
|
|
746
|
+
g as default
|
|
745
747
|
};
|
package/dist/perfect-gui.umd.js
CHANGED
|
@@ -94,20 +94,21 @@
|
|
|
94
94
|
|
|
95
95
|
.p-gui__image-container {
|
|
96
96
|
width: 100%;
|
|
97
|
-
display: grid;
|
|
98
|
-
grid-template-columns: repeat(auto-fill, 32%);
|
|
99
|
-
justify-content: space-between;
|
|
100
97
|
padding: 0 2%;
|
|
98
|
+
display: flex;
|
|
99
|
+
justify-content: flex-start;
|
|
100
|
+
flex-wrap: wrap;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
.p-gui__image {
|
|
104
|
-
aspect-ratio: 1 / 1;
|
|
105
104
|
background-size: cover;
|
|
106
105
|
cursor: pointer;
|
|
107
106
|
position: relative;
|
|
108
|
-
margin
|
|
109
|
-
margin-bottom: 19px;
|
|
107
|
+
margin: 1px 2.5px 19px 2.5px;
|
|
110
108
|
border-radius: var(--main-border-radius);
|
|
109
|
+
flex: 0 0 calc(33.333% - 5px);
|
|
110
|
+
height: 90px;
|
|
111
|
+
background-position: center;
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
.p-gui__image--selected::after {
|
|
@@ -412,4 +413,4 @@
|
|
|
412
413
|
transform: translate3d(${this.xOffset}px,${this.yOffset}px,0);
|
|
413
414
|
${this.screenCorner.y=="top"?"":"top: auto; bottom: 0;"}
|
|
414
415
|
${this.backgroundColor?"background: "+this.backgroundColor+";":""}
|
|
415
|
-
}`)}_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 i=0;i<t.length&&!(parseInt(t[i].id.replace("p-gui-",""))>this.instanceId);i++)this.screenCorner.y==t[i].dataset.cornerY&&(this.screenCorner.x=="left"&&t[i].dataset.cornerX=="left"?this.xOffset+=t[i].offsetWidth:this.screenCorner.x=="right"&&t[i].dataset.cornerX=="right"&&(this.xOffset-=t[i].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)`}_createElement(e){e.el=e.el||"div";var t=document.createElement(e.el);if(e.id&&(t.id=e.id),e.class&&(t.className=e.class),e.inline&&(t.style=e.inline),e.href&&(t.href=e.href),e.onclick&&(t.onclick=e.onclick),e.onchange&&(t.onchange=e.onchange),e.textContent&&(t.textContent=e.textContent),e.innerHTML&&(t.innerHTML=e.innerHTML),e.type&&(t.type=e.type),e.value&&(t.value=e.value),e.customAttributes)for(var i in e.customAttributes)t.setAttribute(i,e.customAttributes[i]);return e.parent=e.parent?e.parent:this.wrapper,e.parent.append(t),t}_addStyles(e){this.stylesheet.innerHTML+=e}_addWrapper(){this.wrapper=this._createElement({parent:this.container,id:"p-gui-"+this.instanceId,class:"p-gui"}),this.header=this._createElement({parent:this.wrapper,class:"p-gui__header",textContent:this.name,inline:`${this.backgroundColor?"border-color: "+this.backgroundColor+";":""}`}),this._createElement({parent:this.header,class:"p-gui__header-close",onclick:this.toggleClose.bind(this)})}button(e,t){let i="";typeof e!="string"?typeof e=="object"&&(e!=null&&e.hasOwnProperty("name"))?i=e.name==""?" ":e.name:i=" ":i=e==""?" ":e,this.imageContainer=null,typeof t!="function"&&(t=()=>{});const r=this._createElement({class:"p-gui__button",textContent:i,onclick:t});typeof e.color=="string"&&(r.style.setProperty("--color-accent",e.color),r.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 i;if(typeof e.path=="string")i=e.path;else throw typeof e.path==null?Error("[GUI] image() path must be provided."):Error("[GUI] image() path must be a string.");let r=i.replace(/^.*[\\\/]/,""),o;e.name==null?o=r:o=typeof e.name=="string"&&e.name||" ";const s=e.selected===!0,n=e.selectionBorder!==!1;this.imageContainer||(this.imageContainer=this._createElement({class:"p-gui__image-container"}));var a=this._createElement({class:"p-gui__image",inline:`background-image: url(${i})`,parent:this.imageContainer});s&&n&&a.classList.add("p-gui__image--selected"),this._createElement({parent:a,class:"p-gui__image-text",textContent:o}),typeof t=="function"&&(a.onclick=()=>{let l=this.imageContainer.querySelectorAll(".p-gui__image--selected");for(let g=0;g<l.length;g++)l[g].classList.remove("p-gui__image--selected");n&&a.classList.add("p-gui__image--selected"),t({path:i,text:o})})}slider(e={},t){if(typeof e!="object")throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r=!1,o=null,s=e.obj||e.object,n=e.prop||e.property,a=typeof e.value=="number"?e.value:null,l=e.min??0,g=e.max??1,u=e.step||(g-l)/100;if(a!==null)(n!=null||s!=null)&&console.warn('[GUI] slider() "obj" and "property" parameters are ignored when a "value" parameter is used.');else if(n!=null&&s!=null){if(typeof n!="string")throw Error(`[GUI] slider() "prop" (or "property") parameter must be an string. Received: ${typeof n}.`);if(typeof s!="object")throw Error(`[GUI] slider() "obj" (or "object") parameter must be an object. Received: ${typeof s}.`);i==" "&&(i=n),o=this.propReferences.push(s[n])-1,r=!0}else(n!=null&&s==null||n==null&&s==null)&&console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'),a=(g-l)/2;this.imageContainer=null;var h=this._createElement({class:"p-gui__slider",textContent:i}),f=this._createElement({parent:h,el:"input",class:"p-gui__slider-ctrl",customAttributes:{type:"range",min:l,max:g,step:u,value:r?s[n]:a}}),x=this._createElement({parent:h,class:"p-gui__slider-value",textContent:String(r?s[n]:a)});f.addEventListener("input",()=>{x.textContent=f.value,r&&(s[n]=f.value),typeof t=="function"&&t(parseFloat(f.value))}),r&&Object.defineProperty(s,n,{set:b=>{this.propReferences[o]=b,f.value=b,x.textContent=String(b)},get:()=>this.propReferences[o]})}toggle(e={},t){if(typeof e!="object")throw Error(`[GUI] toggle() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r=e.value===!0;this.imageContainer=null;let o=this._createElement({class:"p-gui__switch",onclick:n=>{let a=n.target.childNodes[1],l=!0;a.classList.contains("p-gui__switch-checkbox--active")&&(l=!1),a.classList.toggle("p-gui__switch-checkbox--active"),typeof t=="function"&&t(l)},textContent:i}),s=r?" p-gui__switch-checkbox--active":"";this._createElement({parent:o,class:"p-gui__switch-checkbox"+s})}list(e={},t){if(typeof e!="object")throw Error(`[GUI] list() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"?e.name:" ",r=Array.isArray(e.values)?e.values:null;t=typeof t=="function"?t:null,this.imageContainer=null;let o=this._createElement({class:"p-gui__list",textContent:i}),s=this._createElement({parent:o,el:"select",class:"p-gui__list-dropdown",onchange:n=>{t&&t(n.target.value)}});r.forEach(n=>{this._createElement({parent:s,el:"option",customAttributes:{value:n},textContent:n})})}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 i=typeof e.name=="string"&&e.name||" ";const r=e.x.min??0,o=e.x.max??1,s=e.y.min??0,n=e.y.max??1,a=e.x.obj||e.x.object,l=e.x.prop||e.x.property,g=this.propReferences.push(a[l])-1,u=e.y.obj||e.y.object,h=e.y.prop||e.y.property,f=this.propReferences.push(u[h])-1;t=typeof t=="function"?t:null,this.imageContainer=null;const x=this._createElement({class:"p-gui__vector2",textContent:i}),b=this._createElement({parent:x,class:"p-gui__vector-value",textContent:a[l]+", "+u[h]}),p=this._createElement({parent:x,el:"div",class:"p-gui__vector2-area",onclick:d=>{a[l]=parseFloat(this._mapLinear(d.offsetX,0,p.clientWidth,r,o).toFixed(2)),u[h]=parseFloat(this._mapLinear(d.offsetY,0,p.clientHeight,n,s).toFixed(2)),t&&t(a[l],a[h])}});let y=!1;p.addEventListener("pointerdown",d=>{y=!0}),p.addEventListener("pointerup",()=>{y=!1}),p.addEventListener("pointermove",d=>{y&&(a[l]=parseFloat(this._mapLinear(d.offsetX,0,p.clientWidth,r,o).toFixed(2)),u[h]=parseFloat(this._mapLinear(d.offsetY,0,p.clientHeight,n,s).toFixed(2)),t&&t(a[l],a[h]))}),this._createElement({parent:p,class:"p-gui__vector2-line p-gui__vector2-line-x"}),this._createElement({parent:p,class:"p-gui__vector2-line p-gui__vector2-line-y"});const m=this._createElement({parent:p,class:"p-gui__vector2-dot"});m.style.left=this._mapLinear(a[l],r,o,0,p.clientWidth)+"px",m.style.top=this._mapLinear(u[h],s,n,p.clientHeight,0)+"px",Object.defineProperty(a,l,{set:d=>{this.propReferences[g]=d,m.style.left=this._mapLinear(d,r,o,0,p.clientWidth)+"px",b.textContent=String(d)+", "+u[h]},get:()=>this.propReferences[g]}),Object.defineProperty(u,h,{set:d=>{this.propReferences[f]=d,m.style.top=this._mapLinear(d,s,n,p.clientHeight,0)+"px",b.textContent=a[l]+", "+String(d)},get:()=>this.propReferences[f]})}color(e={},t){if(typeof e!="object")throw Error(`[GUI] color() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r;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}".`):r=e.value),r||(r="#000000");const o=this._createElement({el:"div",class:"p-gui__color",textContent:i}),s=this._createElement({parent:o,el:"input",class:"p-gui__color-picker",type:"color",value:r});typeof t=="function"&&s.addEventListener("input",()=>{t(s.value)})}folder(e={}){let t=typeof e.closed=="boolean"?e.closed:!1,i=e.name||"",r=e.color||null,o=e.maxHeight||null;this.imageContainer=null;let s="p-gui__folder";this.folders.length==0&&(s+=" p-gui__folder--first"),t&&(s+=" p-gui__folder--closed");let n=r?`background-color: ${r};`:"";n+=o?`max-height: ${o}px;`:"";let a=this._createElement({class:s,inline:n});this._createElement({innerHTML:`<span class="p-gui__folder-arrow"></span>${i}`,class:"p-gui__folder-header",onclick:function(){this.parentNode.classList.toggle("p-gui__folder--closed")},parent:a});let l=new c({isFolder:!0,folderOptions:{wrapper:a}});return this.folders.push(l),l}_makeDraggable(){var e=this;this.header.addEventListener("pointerdown",t),this.header.addEventListener("pointerup",r);function t(o){o.preventDefault(),e.position.initX=e.position.x,e.position.initY=e.position.y,e.position.prevX=o.clientX,e.position.prevY=o.clientY,document.addEventListener("pointermove",i)}function i(o){o.preventDefault(),e.hasBeenDragged||(e.hasBeenDragged=!0,e.wrapper.setAttribute("data-dragged","true")),e.position.x=e.position.initX+o.clientX-e.position.prevX,e.position.y=e.position.initY+o.clientY-e.position.prevY,e.wrapper.style.transform="translate3d("+e.position.x+"px,"+e.position.y+"px,0)"}function r(o){document.removeEventListener("pointermove",i)}}toggleClose(){this.closed=!this.closed,this.wrapper.classList.toggle("p-gui--collapsed")}kill(){this.wrapper.remove()}_mapLinear(e,t,i,r,o){return r+(e-t)*(o-r)/(i-t)}}return c});
|
|
416
|
+
}`)}_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 i=0;i<t.length&&!(parseInt(t[i].id.replace("p-gui-",""))>this.instanceId);i++)this.screenCorner.y==t[i].dataset.cornerY&&(this.screenCorner.x=="left"&&t[i].dataset.cornerX=="left"?this.xOffset+=t[i].offsetWidth:this.screenCorner.x=="right"&&t[i].dataset.cornerX=="right"&&(this.xOffset-=t[i].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)`}_createElement(e){e.el=e.el||"div";var t=document.createElement(e.el);if(e.id&&(t.id=e.id),e.class&&(t.className=e.class),e.inline&&(t.style=e.inline),e.href&&(t.href=e.href),e.onclick&&(t.onclick=e.onclick),e.onchange&&(t.onchange=e.onchange),e.textContent&&(t.textContent=e.textContent),e.innerHTML&&(t.innerHTML=e.innerHTML),e.type&&(t.type=e.type),e.value&&(t.value=e.value),e.customAttributes)for(var i in e.customAttributes)t.setAttribute(i,e.customAttributes[i]);return e.parent=e.parent?e.parent:this.wrapper,e.parent.append(t),t}_addStyles(e){this.stylesheet.innerHTML+=e}_addWrapper(){this.wrapper=this._createElement({parent:this.container,id:"p-gui-"+this.instanceId,class:"p-gui"}),this.header=this._createElement({parent:this.wrapper,class:"p-gui__header",textContent:this.name,inline:`${this.backgroundColor?"border-color: "+this.backgroundColor+";":""}`}),this._createElement({parent:this.header,class:"p-gui__header-close",onclick:this.toggleClose.bind(this)})}button(e,t){let i="";typeof e!="string"?typeof e=="object"&&(e!=null&&e.hasOwnProperty("name"))?i=e.name==""?" ":e.name:i=" ":i=e==""?" ":e,this.imageContainer=null,typeof t!="function"&&(t=()=>{});const r=this._createElement({class:"p-gui__button",textContent:i,onclick:t});typeof e.color=="string"&&(r.style.setProperty("--color-accent",e.color),r.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 i;if(typeof e.path=="string")i=e.path;else throw typeof e.path==null?Error("[GUI] image() path must be provided."):Error("[GUI] image() path must be a string.");let r=i.replace(/^.*[\\\/]/,""),o;e.name==null?o=r:o=typeof e.name=="string"&&e.name||" ";const s=e.selected===!0,n=e.selectionBorder!==!1;let a="";e.width&&(typeof e.width=="number"&&(e.width+="px"),a+=`flex: 0 0 calc(${e.width} - 5px); `),e.height&&(typeof e.height=="number"&&(e.height+="px"),a+=`height: ${e.height}; `),this.imageContainer||(this.imageContainer=this._createElement({class:"p-gui__image-container"}));var l=this._createElement({class:"p-gui__image",inline:"background-image: url("+i+"); "+a,parent:this.imageContainer});s&&n&&l.classList.add("p-gui__image--selected"),this._createElement({parent:l,class:"p-gui__image-text",textContent:o}),typeof t=="function"&&(l.onclick=()=>{let u=this.imageContainer.querySelectorAll(".p-gui__image--selected");for(let h=0;h<u.length;h++)u[h].classList.remove("p-gui__image--selected");n&&l.classList.add("p-gui__image--selected"),t({path:i,text:o})})}slider(e={},t){if(typeof e!="object")throw Error(`[GUI] slider() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r=!1,o=null,s=e.obj||e.object,n=e.prop||e.property,a=typeof e.value=="number"?e.value:null,l=e.min??0,u=e.max??1,h=e.step||(u-l)/100;if(a!==null)(n!=null||s!=null)&&console.warn('[GUI] slider() "obj" and "property" parameters are ignored when a "value" parameter is used.');else if(n!=null&&s!=null){if(typeof n!="string")throw Error(`[GUI] slider() "prop" (or "property") parameter must be an string. Received: ${typeof n}.`);if(typeof s!="object")throw Error(`[GUI] slider() "obj" (or "object") parameter must be an object. Received: ${typeof s}.`);i==" "&&(i=n),o=this.propReferences.push(s[n])-1,r=!0}else(n!=null&&s==null||n==null&&s==null)&&console.warn('[GUI] slider() "obj" and "prop" parameters must be used together.'),a=(u-l)/2;this.imageContainer=null;var g=this._createElement({class:"p-gui__slider",textContent:i}),f=this._createElement({parent:g,el:"input",class:"p-gui__slider-ctrl",customAttributes:{type:"range",min:l,max:u,step:h,value:r?s[n]:a}}),x=this._createElement({parent:g,class:"p-gui__slider-value",textContent:String(r?s[n]:a)});f.addEventListener("input",()=>{x.textContent=f.value,r&&(s[n]=f.value),typeof t=="function"&&t(parseFloat(f.value))}),r&&Object.defineProperty(s,n,{set:b=>{this.propReferences[o]=b,f.value=b,x.textContent=String(b)},get:()=>this.propReferences[o]})}toggle(e={},t){if(typeof e!="object")throw Error(`[GUI] toggle() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r=e.value===!0;this.imageContainer=null;let o=this._createElement({class:"p-gui__switch",onclick:n=>{let a=n.target.childNodes[1],l=!0;a.classList.contains("p-gui__switch-checkbox--active")&&(l=!1),a.classList.toggle("p-gui__switch-checkbox--active"),typeof t=="function"&&t(l)},textContent:i}),s=r?" p-gui__switch-checkbox--active":"";this._createElement({parent:o,class:"p-gui__switch-checkbox"+s})}list(e={},t){if(typeof e!="object")throw Error(`[GUI] list() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"?e.name:" ",r=Array.isArray(e.values)?e.values:null;t=typeof t=="function"?t:null,this.imageContainer=null;let o=this._createElement({class:"p-gui__list",textContent:i}),s=this._createElement({parent:o,el:"select",class:"p-gui__list-dropdown",onchange:n=>{t&&t(n.target.value)}});r.forEach(n=>{this._createElement({parent:s,el:"option",customAttributes:{value:n},textContent:n})})}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 i=typeof e.name=="string"&&e.name||" ";const r=e.x.min??0,o=e.x.max??1,s=e.y.min??0,n=e.y.max??1,a=e.x.obj||e.x.object,l=e.x.prop||e.x.property,u=this.propReferences.push(a[l])-1,h=e.y.obj||e.y.object,g=e.y.prop||e.y.property,f=this.propReferences.push(h[g])-1;t=typeof t=="function"?t:null,this.imageContainer=null;const x=this._createElement({class:"p-gui__vector2",textContent:i}),b=this._createElement({parent:x,class:"p-gui__vector-value",textContent:a[l]+", "+h[g]}),p=this._createElement({parent:x,el:"div",class:"p-gui__vector2-area",onclick:d=>{a[l]=parseFloat(this._mapLinear(d.offsetX,0,p.clientWidth,r,o).toFixed(2)),h[g]=parseFloat(this._mapLinear(d.offsetY,0,p.clientHeight,n,s).toFixed(2)),t&&t(a[l],a[g])}});let y=!1;p.addEventListener("pointerdown",d=>{y=!0}),p.addEventListener("pointerup",()=>{y=!1}),p.addEventListener("pointermove",d=>{y&&(a[l]=parseFloat(this._mapLinear(d.offsetX,0,p.clientWidth,r,o).toFixed(2)),h[g]=parseFloat(this._mapLinear(d.offsetY,0,p.clientHeight,n,s).toFixed(2)),t&&t(a[l],a[g]))}),this._createElement({parent:p,class:"p-gui__vector2-line p-gui__vector2-line-x"}),this._createElement({parent:p,class:"p-gui__vector2-line p-gui__vector2-line-y"});const m=this._createElement({parent:p,class:"p-gui__vector2-dot"});m.style.left=this._mapLinear(a[l],r,o,0,p.clientWidth)+"px",m.style.top=this._mapLinear(h[g],s,n,p.clientHeight,0)+"px",Object.defineProperty(a,l,{set:d=>{this.propReferences[u]=d,m.style.left=this._mapLinear(d,r,o,0,p.clientWidth)+"px",b.textContent=String(d)+", "+h[g]},get:()=>this.propReferences[u]}),Object.defineProperty(h,g,{set:d=>{this.propReferences[f]=d,m.style.top=this._mapLinear(d,s,n,p.clientHeight,0)+"px",b.textContent=a[l]+", "+String(d)},get:()=>this.propReferences[f]})}color(e={},t){if(typeof e!="object")throw Error(`[GUI] color() first parameter must be an object. Received: ${typeof e}.`);let i=typeof e.name=="string"&&e.name||" ",r;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}".`):r=e.value),r||(r="#000000");const o=this._createElement({el:"div",class:"p-gui__color",textContent:i}),s=this._createElement({parent:o,el:"input",class:"p-gui__color-picker",type:"color",value:r});typeof t=="function"&&s.addEventListener("input",()=>{t(s.value)})}folder(e={}){let t=typeof e.closed=="boolean"?e.closed:!1,i=e.name||"",r=e.color||null,o=e.maxHeight||null;this.imageContainer=null;let s="p-gui__folder";this.folders.length==0&&(s+=" p-gui__folder--first"),t&&(s+=" p-gui__folder--closed");let n=r?`background-color: ${r};`:"";n+=o?`max-height: ${o}px;`:"";let a=this._createElement({class:s,inline:n});this._createElement({innerHTML:`<span class="p-gui__folder-arrow"></span>${i}`,class:"p-gui__folder-header",onclick:function(){this.parentNode.classList.toggle("p-gui__folder--closed")},parent:a});let l=new c({isFolder:!0,folderOptions:{wrapper:a}});return this.folders.push(l),l}_makeDraggable(){var e=this;this.header.addEventListener("pointerdown",t),this.header.addEventListener("pointerup",r);function t(o){o.preventDefault(),e.position.initX=e.position.x,e.position.initY=e.position.y,e.position.prevX=o.clientX,e.position.prevY=o.clientY,document.addEventListener("pointermove",i)}function i(o){o.preventDefault(),e.hasBeenDragged||(e.hasBeenDragged=!0,e.wrapper.setAttribute("data-dragged","true")),e.position.x=e.position.initX+o.clientX-e.position.prevX,e.position.y=e.position.initY+o.clientY-e.position.prevY,e.wrapper.style.transform="translate3d("+e.position.x+"px,"+e.position.y+"px,0)"}function r(o){document.removeEventListener("pointermove",i)}}toggleClose(){this.closed=!this.closed,this.wrapper.classList.toggle("p-gui--collapsed")}kill(){this.wrapper.remove()}_mapLinear(e,t,i,r,o){return r+(e-t)*(o-r)/(i-t)}}return c});
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -289,19 +289,35 @@ export default class GUI {
|
|
|
289
289
|
|
|
290
290
|
const selected = params.selected === true;
|
|
291
291
|
const selectionBorder = params.selectionBorder !== false;
|
|
292
|
+
|
|
293
|
+
// width & height options
|
|
294
|
+
let inline_styles = '';
|
|
295
|
+
if (params.width) {
|
|
296
|
+
if (typeof params.width == 'number') {
|
|
297
|
+
params.width += 'px';
|
|
298
|
+
}
|
|
299
|
+
inline_styles += `flex: 0 0 calc(${params.width} - 5px); `;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (params.height) {
|
|
303
|
+
if (typeof params.height == 'number') {
|
|
304
|
+
params.height += 'px';
|
|
305
|
+
}
|
|
306
|
+
inline_styles += `height: ${params.height}; `;
|
|
307
|
+
}
|
|
292
308
|
|
|
293
309
|
if (!this.imageContainer) {
|
|
294
310
|
this.imageContainer = this._createElement({
|
|
295
311
|
class: 'p-gui__image-container'
|
|
296
312
|
});
|
|
297
313
|
}
|
|
298
|
-
|
|
314
|
+
|
|
299
315
|
// Image
|
|
300
316
|
var image = this._createElement({
|
|
301
317
|
class: 'p-gui__image',
|
|
302
|
-
inline:
|
|
318
|
+
inline: 'background-image: url(' + path + '); ' + inline_styles,
|
|
303
319
|
parent: this.imageContainer
|
|
304
|
-
})
|
|
320
|
+
});
|
|
305
321
|
|
|
306
322
|
if (selected && selectionBorder) {
|
|
307
323
|
image.classList.add('p-gui__image--selected');
|
|
@@ -312,7 +328,9 @@ export default class GUI {
|
|
|
312
328
|
parent: image,
|
|
313
329
|
class: 'p-gui__image-text',
|
|
314
330
|
textContent: name
|
|
315
|
-
})
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
|
|
316
334
|
|
|
317
335
|
if (typeof callback == 'function') {
|
|
318
336
|
image.onclick = () => {
|
package/src/styles.js
CHANGED
|
@@ -100,20 +100,21 @@ export default function( position_type ) {
|
|
|
100
100
|
|
|
101
101
|
.p-gui__image-container {
|
|
102
102
|
width: 100%;
|
|
103
|
-
display: grid;
|
|
104
|
-
grid-template-columns: repeat(auto-fill, 32%);
|
|
105
|
-
justify-content: space-between;
|
|
106
103
|
padding: 0 2%;
|
|
104
|
+
display: flex;
|
|
105
|
+
justify-content: flex-start;
|
|
106
|
+
flex-wrap: wrap;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
.p-gui__image {
|
|
110
|
-
aspect-ratio: 1 / 1;
|
|
111
110
|
background-size: cover;
|
|
112
111
|
cursor: pointer;
|
|
113
112
|
position: relative;
|
|
114
|
-
margin
|
|
115
|
-
margin-bottom: 19px;
|
|
113
|
+
margin: 1px 2.5px 19px 2.5px;
|
|
116
114
|
border-radius: var(--main-border-radius);
|
|
115
|
+
flex: 0 0 calc(33.333% - 5px);
|
|
116
|
+
height: 90px;
|
|
117
|
+
background-position: center;
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
.p-gui__image--selected::after {
|