raiutils 8.7.6 → 8.7.8
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/README.md +4 -5
- package/package.json +1 -1
- package/schema.js +79 -51
- package/utils.js +36 -75
- package/utils.min.js +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
### Now includes Node.js support!
|
|
5
5
|
|
|
6
|
-
Importing in Node works slightly different due to
|
|
6
|
+
Importing in Node works slightly different to most packages, due to the browser/Node.js auto-detection. Install via `npm i raiutils` and import as follows:
|
|
7
7
|
```js
|
|
8
8
|
import 'utils.js';
|
|
9
9
|
|
|
@@ -63,13 +63,12 @@ For client-side use, the minified *utils.min.js* is recommended (Minified with h
|
|
|
63
63
|
- `utils.setPropSafe(obj, path, val, onlyNull=false)` Set a nested property, even if higher levels don't exist. Useful for defining settings in a complex config object.
|
|
64
64
|
- `utils.getPropSafe(obj, path) returns Object` Gets a nested property, returns undefined if any level doesn't exist.
|
|
65
65
|
- `utils.copy(o[,sub]) returns Object` Deep (recursive) Object.create. Copies down to given sub levels, all levels if undefined.
|
|
66
|
-
- `utils.skinnedInput(el)` Fallback for when css *'appearance:none'* doesn't work. Generates container for input field for css skinning on unsupported browsers.
|
|
67
66
|
- `utils.numField(field[,min[,max[,decMax[,sym]]]])` Turns your boring input field into a mobile-friendly integer, decimal, or financial entry field with max/min & negative support!
|
|
68
67
|
- `utils.autosize(el, maxRows=5, minRows=1)` Auto-resizing textarea, dynamically scales lineHeight based on input.
|
|
69
68
|
- `utils.formatCost(n[,sym]) returns String` Format Number as currency. Uses '$' by default.
|
|
70
|
-
- `utils.
|
|
71
|
-
- `utils.
|
|
72
|
-
- `utils.formatDate(
|
|
69
|
+
- `utils.setDateTime(el, date)` Set 'datetime-local' or 'date' input from JS Date, adjusting for local timezone.
|
|
70
|
+
- `utils.getDateTime(el) returns Date` Get value of 'datetime-local' or 'date' input as JS Date.
|
|
71
|
+
- `utils.formatDate(date[,opts]) returns String` Format Date object into a pretty string, with various options.
|
|
73
72
|
- `utils.months` Array of months from Jan to Dec.
|
|
74
73
|
- `utils.suffix(n) returns String` Add appropriate suffix to number. (ex. 31st, 12th, 22nd)
|
|
75
74
|
- `utils.fixedNum(n,len[,radix=10]) returns String` Fix number to a given minimum length with padded 0's. Adds '0b' for binary *(radix=2)* and '0x' for hex *(radix=16)*
|
package/package.json
CHANGED
package/schema.js
CHANGED
|
@@ -1,22 +1,40 @@
|
|
|
1
|
-
//ChuSchema v1.
|
|
1
|
+
//ChuSchema v1.3, Pecacheu 2025. GNU GPL v3
|
|
2
|
+
|
|
3
|
+
class SubError extends Error {}
|
|
2
4
|
|
|
3
5
|
function errAt(k,e,l) {
|
|
4
|
-
let es=e.message||e;
|
|
5
|
-
k=(l?`[${k}]`:k)+(
|
|
6
|
-
if(
|
|
6
|
+
let s=e instanceof SubError, es=e.message||e;
|
|
7
|
+
k=(l?`[${k}]`:k)+(s ? es.startsWith('[')?'':'.' : ': ');
|
|
8
|
+
if(s) e.message=k+es;
|
|
9
|
+
else e=new SubError(k+es, e instanceof Error?{cause:e}:null);
|
|
7
10
|
return e;
|
|
8
11
|
}
|
|
9
12
|
|
|
10
|
-
function
|
|
11
|
-
function
|
|
13
|
+
function isDictOrArr(d) {return typeof d==='object' && d!==null}
|
|
14
|
+
function isDict(d) {return isDictOrArr(d) && !Array.isArray(d)}
|
|
15
|
+
function oobStr(s) {return ` out-of-bounds (${s.min==null?'*':s.min}-${s.max==null?'*':s.max})`}
|
|
16
|
+
function dictFmt(s) {
|
|
17
|
+
if(typeof s.c==='string') s.c={t:s.c};
|
|
18
|
+
let dt=isDictOrArr(s.f)?2:isDictOrArr(s.c)?1:0;
|
|
19
|
+
if(!dt) throw "Schema lacks format or childType";
|
|
20
|
+
if(dt===2 && s.c) throw "Cannot require both format and childType";
|
|
21
|
+
return dt===2;
|
|
22
|
+
}
|
|
23
|
+
function tryAll(a,fn) {
|
|
24
|
+
if(Array.isArray(a)) {
|
|
25
|
+
let el=[];
|
|
26
|
+
a.forEach(s => {try {fn(s)} catch(e) {el.push(e)}});
|
|
27
|
+
if(el.length >= a.length) throw "[Failed all cases] "+el.map(e => e.message||e).join(', ');
|
|
28
|
+
} else fn(a);
|
|
29
|
+
}
|
|
30
|
+
|
|
12
31
|
function checkType(d,sr) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
tl.forEach((t,i) => {
|
|
32
|
+
let tt,el,sl,s,l,k,n,ds,dt,
|
|
33
|
+
run=(t,i) => {
|
|
16
34
|
//Get prop cache
|
|
17
|
-
if(!(s=
|
|
18
|
-
s=
|
|
19
|
-
for(k in
|
|
35
|
+
if(!(s=sl[k='$'+i])) {
|
|
36
|
+
s=sl[k]={};
|
|
37
|
+
for(k in sl) s[k]=Array.isArray(sl[k])?sl[k][i]:sl[k];
|
|
20
38
|
}
|
|
21
39
|
//Check type
|
|
22
40
|
try {switch(t) {
|
|
@@ -24,68 +42,78 @@ function checkType(d,sr) {
|
|
|
24
42
|
if(typeof d!=='string') throw -1;
|
|
25
43
|
l=d.length;
|
|
26
44
|
if(l<s.min || l>s.max) throw "Str len "+l+oobStr(s);
|
|
27
|
-
if(s.len && l!==s.len) throw "Str len must be "+s.len;
|
|
45
|
+
if(s.len!=null && l!==s.len) throw "Str len must be "+s.len;
|
|
28
46
|
if(typeof s.f==='string') s.f=new RegExp(`^(?:${s.f})$`);
|
|
29
|
-
if(s.f instanceof RegExp && !s.f.test(d)) throw `Str '${d}' does not match format`;
|
|
47
|
+
if(s.f instanceof RegExp && !s.f.test(d)) throw `Str '${d}' does not match format ${s.f}`;
|
|
30
48
|
break; case 'int': case 'float':
|
|
31
49
|
if(typeof d!=='number' || !(t==='int'?Number.isSafeInteger(d):Number.isFinite(d))) throw -1;
|
|
50
|
+
if(s.val!=null && d!==s.val) throw "Num != "+s.val;
|
|
32
51
|
if(d<s.min || d>s.max) throw "Num "+d+oobStr(s);
|
|
33
52
|
break; case 'bool':
|
|
34
53
|
if(typeof d!=='boolean') throw -1;
|
|
35
54
|
break; case 'list':
|
|
36
55
|
if(!Array.isArray(d)) throw -1;
|
|
37
56
|
l=d.length; if(!l && s.min!==0) throw "Empty list";
|
|
38
|
-
if(s.len && l!==s.len) throw "Array size must be "+s.len;
|
|
57
|
+
if(s.len!=null && l!==s.len) throw "Array size must be "+s.len;
|
|
39
58
|
if(l<s.min || l>s.max) throw "Array size "+l+oobStr(s);
|
|
40
|
-
|
|
41
|
-
n
|
|
42
|
-
if(!dt) throw "List schema lacks format or childType";
|
|
43
|
-
if(dt===2 && s.c) throw "Cannot require both format and childType";
|
|
44
|
-
for(; n<l; ++n) try {dt===2?checkSchema(d[n],s.f):checkType(d[n],s.c)}
|
|
59
|
+
n=0, ds=tt.length>1?s:sl, dt=dictFmt(ds);
|
|
60
|
+
for(; n<l; ++n) try {dt?checkSchema(d[n],ds.f):checkType(d[n],ds.c)}
|
|
45
61
|
catch(e) {throw errAt(n,e,1)}
|
|
46
62
|
break; case 'dict':
|
|
47
63
|
if(!isDict(d)) throw -1;
|
|
48
|
-
k=Object.keys(d)
|
|
49
|
-
if(s.
|
|
50
|
-
if(typeof s.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
k=Object.keys(d);
|
|
65
|
+
if(!k.length && s.min!==0) throw "Empty dict";
|
|
66
|
+
if(typeof s.kf==='string') s.kf=new RegExp(`^(?:${s.kf})$`);
|
|
67
|
+
ds=tt.length>1?s:sl, dt=dictFmt(ds);
|
|
68
|
+
for(n of k) try {
|
|
69
|
+
if(n.startsWith('$')) throw "Key cannot start with $";
|
|
70
|
+
if(s.kf instanceof RegExp && !s.kf.test(n)) throw `Key '${n}' does not match format ${s.kf}`;
|
|
71
|
+
dt?checkSchema(d[n],ds.f):checkType(d[n],ds.c);
|
|
72
|
+
} catch(e) {throw errAt(n,e,1)}
|
|
56
73
|
break; default:
|
|
57
74
|
throw `Unknown type ${s.t} in schema`;
|
|
58
75
|
}} catch(e) {el.push(e)}
|
|
59
|
-
});
|
|
60
|
-
if(el.length >= tl.length) {
|
|
61
|
-
let e,m="Must be of type "+sr.t;
|
|
62
|
-
for(e of el) if(e!==-1) m=e;
|
|
63
|
-
throw m;
|
|
64
76
|
}
|
|
77
|
+
tryAll(sr, s => {
|
|
78
|
+
if(typeof s.t!=='string') throw "Missing type";
|
|
79
|
+
sl=s, el=[], tt=s.t.split('|'), tt.forEach(run);
|
|
80
|
+
if(el.length >= tt.length) {
|
|
81
|
+
let e,m;
|
|
82
|
+
for(e of el) if(e!==-1) m=e;
|
|
83
|
+
if(!m) m="Must be of type "+sr.t;
|
|
84
|
+
throw m;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
65
87
|
}
|
|
66
88
|
|
|
67
89
|
const R_FN=/\W+|(\w+)/g;
|
|
68
90
|
|
|
69
91
|
function checkSchema(data, schema, ignoreReq) {
|
|
70
92
|
if(!isDict(data)) throw "Data must be dict";
|
|
71
|
-
if(!
|
|
93
|
+
if(!isDictOrArr(schema)) throw "Schema must be dict|list[dict]";
|
|
72
94
|
let k,d,s,r,n,m;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
95
|
+
tryAll(schema, sch => {
|
|
96
|
+
for(k in data) try {
|
|
97
|
+
d=data[k], s=sch[k];
|
|
98
|
+
if(!s) throw "Not in schema";
|
|
99
|
+
if(k.startsWith('$')) throw "Key cannot start with $";
|
|
100
|
+
checkType(d,s);
|
|
101
|
+
} catch(e) {throw errAt(k,e)}
|
|
102
|
+
if(ignoreReq) return;
|
|
103
|
+
//Check missing
|
|
104
|
+
for(k in sch) if((s=sch[k]).req != null) {
|
|
105
|
+
d=s.req, r=typeof d==='string';
|
|
106
|
+
if(r) { //Conditional req
|
|
107
|
+
n='';
|
|
108
|
+
while(m=R_FN.exec(d)) n+=m[1] ? m[1] in data : m[0];
|
|
109
|
+
d=eval(n);
|
|
110
|
+
}
|
|
111
|
+
if(d) {
|
|
112
|
+
n=k in data;
|
|
113
|
+
if(d===-1 ? n : !n) throw k+": Required"+(r?" if "+s.req:'');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
89
117
|
}
|
|
90
118
|
|
|
91
119
|
function isNumArr(a) {
|
|
@@ -114,4 +142,4 @@ function prettyJSON(val, d=0) {
|
|
|
114
142
|
} else throw "Unknown type "+t;
|
|
115
143
|
}
|
|
116
144
|
|
|
117
|
-
export default {checkSchema, prettyJSON, errAt};
|
|
145
|
+
export default {checkSchema, checkType, prettyJSON, errAt};
|
package/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//https://github.com/Pecacheu/Utils.js; GNU GPL v3
|
|
2
2
|
|
|
3
3
|
'use strict';
|
|
4
|
-
const utils = {VER:'v8.7.
|
|
4
|
+
const utils = {VER:'v8.7.8'},
|
|
5
5
|
_uNJS = typeof global!='undefined';
|
|
6
6
|
|
|
7
7
|
//Node.js compat
|
|
@@ -119,46 +119,7 @@ if(window.TouchList) utils.proto(TouchList, 'get', function(id) {
|
|
|
119
119
|
for(let k in this) if(this[k].identifier == id) return this[k]; return 0;
|
|
120
120
|
})
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
//fallback for when css 'appearance:none' doesn't work. For Mobile Safari, this is usually
|
|
124
|
-
//needed with 'datetime-local', 'select-one', and 'select-multiple' input types
|
|
125
|
-
utils.skinnedInput = el => {
|
|
126
|
-
const cont = utils.mkDiv(null,el.className), is = el.style, type = el.type; el.className += ' isSub';
|
|
127
|
-
if(type == 'datetime-local' || type == 'select-one' || type == 'select-multiple') { //Datetime or Select
|
|
128
|
-
is.opacity = 0; is.top = '-100%'; el.siT = utils.mkEl('span',cont,'isText');
|
|
129
|
-
utils.mkEl('span',cont,'isArrow',{borderTopColor:getComputedStyle(el).color});
|
|
130
|
-
let si=siChange.bind(el); el.addEventListener('change',si); el.forceUpdate=si; si();
|
|
131
|
-
}
|
|
132
|
-
el.replaceWith(cont); cont.appendChild(el);
|
|
133
|
-
//Append StyleSheet
|
|
134
|
-
if(!document.isStyles) document.isStyles=true, utils.mkEl('style',document.body,null,null,'.isSub {'+
|
|
135
|
-
'width:100% !important; height:100% !important; border:none !important; display:inline-block !important;'+
|
|
136
|
-
'position:relative !important; box-shadow:none !important; margin:0 !important; padding:initial !important;'+
|
|
137
|
-
'} .isText {'+
|
|
138
|
-
'display:inline-block; height:100%; max-width:95%;'+
|
|
139
|
-
'overflow:hidden; text-overflow:ellipsis; white-space:nowrap;'+
|
|
140
|
-
'} .isArrow {'+
|
|
141
|
-
'width:0; height:0; display:inline-block; float:right; top:38%; position:relative;'+
|
|
142
|
-
'border-left:3px solid transparent; border-right:3px solid transparent;'+
|
|
143
|
-
'border-top:6px solid #000; vertical-align:middle;'+
|
|
144
|
-
'}');
|
|
145
|
-
}
|
|
146
|
-
function siChange() {
|
|
147
|
-
switch(this.type) {
|
|
148
|
-
case 'datetime-local': this.siT.textContent = utils.formatDate(utils.fromDateTimeBox(this)); break;
|
|
149
|
-
case 'select-one': this.siT.textContent = selBoxLabel(this); break;
|
|
150
|
-
case 'select-multiple': this.siT.textContent = mulBoxLabel(this);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function selBoxLabel(sb) {
|
|
155
|
-
const op = sb.options; if(op.selectedIndex != -1) return op[op.selectedIndex].label;
|
|
156
|
-
return "No Options Selected";
|
|
157
|
-
}
|
|
158
|
-
function mulBoxLabel(sb) {
|
|
159
|
-
const op = sb.options; let str = ''; for(let i=0,l=op.length; i<l; ++i)
|
|
160
|
-
if(op[i].selected) str += (str?', ':'')+op[i].label; return str||"No Options Selected";
|
|
161
|
-
}
|
|
122
|
+
const R_NFZ=/\.0*$/;
|
|
162
123
|
|
|
163
124
|
/*Turns your boring <input> into a mobile-friendly number entry field with max/min & negative support!
|
|
164
125
|
min: Min value, default min safe int
|
|
@@ -174,56 +135,60 @@ utils.numField=(f, min, max, decMax, sym) => {
|
|
|
174
135
|
const RM=RegExp(`[,${sym?RegExp.escape(sym):''}]`,'g');
|
|
175
136
|
f.type=(utils.mobile||decMax||sym)?'tel':'number';
|
|
176
137
|
f.setAttribute('pattern',"\\d*");
|
|
177
|
-
if(min==null) min=Number.MIN_SAFE_INTEGER;
|
|
178
|
-
if(max==null) max=Number.MAX_SAFE_INTEGER;
|
|
179
|
-
if(decMax==null) decMax=sym?2:0;
|
|
180
138
|
if(!f.step) f.step=1;
|
|
181
|
-
f.num=Math.max(0,min), f.ns='';
|
|
182
|
-
f.value=sym?utils.formatCost(f.num,sym):f.num.toString();
|
|
183
139
|
f.addEventListener('keydown',e => {
|
|
184
140
|
if(e.ctrlKey) return;
|
|
185
|
-
let k=e.key, kn=k.length
|
|
141
|
+
let k=e.key, kn=k.length===1&&Number.isFinite(Number(k)),
|
|
186
142
|
ns=f.ns, len=ns.length, dec=ns.indexOf('.');
|
|
187
143
|
|
|
188
|
-
if(k
|
|
189
|
-
else if(kn) {if(dec
|
|
190
|
-
else if(k
|
|
144
|
+
if(k==='Tab' || k==='Enter') return;
|
|
145
|
+
else if(kn) {if(dec===-1 || len-dec < decMax+1) ns+=k} //Number
|
|
146
|
+
else if(k==='.' || k==='*') {if(decMax && dec==-1
|
|
191
147
|
&& f.num!=max && (min>=0 || f.num!=min)) { //Decimal
|
|
192
148
|
if(!len && min>0) ns=Math.floor(min)+'.';
|
|
193
149
|
else ns+='.';
|
|
194
|
-
}} else if(k
|
|
195
|
-
if(min>0 && f.num
|
|
150
|
+
}} else if(k==='Backspace' || k==='Delete') { //Backspace
|
|
151
|
+
if(min>0 && f.num===min && ns.endsWith('.')) ns='';
|
|
196
152
|
else ns=ns.slice(0,-1);
|
|
197
|
-
} else if(k
|
|
198
|
-
else if(k
|
|
199
|
-
else if(k
|
|
153
|
+
} else if(k==='-' || k==='#') {if(min<0 && !len) ns='-'} //Negative
|
|
154
|
+
else if(k==='ArrowUp') ns=null, f.set(f.num+Number(f.step)); //Up
|
|
155
|
+
else if(k==='ArrowDown') ns=null, f.set(f.num-Number(f.step)); //Down
|
|
200
156
|
|
|
201
157
|
if(ns !== null && ns !== f.ns) {
|
|
202
|
-
|
|
158
|
+
len=ns.length, dec=ns.indexOf('.');
|
|
159
|
+
let neg=ns==='-'||ns==='-.', s=neg?'0':ns+(ns.endsWith('.')?'0':''),
|
|
203
160
|
nr=Number(s), n=Math.min(max,Math.max(min,nr));
|
|
204
|
-
if(!kn || f.num !== n ||
|
|
161
|
+
if(!kn || !ns || f.num !== n || (dec!==-1 && len-dec < decMax+1)) {
|
|
205
162
|
f.ns=ns, f.num=n;
|
|
206
|
-
f.value = sym ?
|
|
207
|
-
(
|
|
163
|
+
f.value = sym ? neg?sym+'-0.00':utils.formatCost(n,sym):
|
|
164
|
+
(ns[0]==='-'?'-':'')+Math.floor(Math.abs(n))
|
|
165
|
+
+(dec!==-1?ns.slice(dec)+(R_NFZ.test(ns)?'0':''):'');
|
|
208
166
|
if(f.onnuminput) f.onnuminput.call(f);
|
|
209
167
|
}
|
|
210
168
|
}
|
|
211
169
|
e.preventDefault();
|
|
212
170
|
});
|
|
213
|
-
|
|
214
|
-
if(typeof n
|
|
171
|
+
function numRng(n) {
|
|
172
|
+
if(typeof n==='string') n=n.replace(RM,'');
|
|
215
173
|
n=Math.min(max,Math.max(min,Number(n)||0));
|
|
216
|
-
|
|
174
|
+
return decMax?Number(n.toFixed(decMax)):Math.round(n);
|
|
175
|
+
}
|
|
176
|
+
f.set=n => {
|
|
177
|
+
f.num = numRng(n);
|
|
217
178
|
f.ns = f.num.toString();
|
|
218
179
|
f.value = sym?utils.formatCost(f.num,sym):f.ns;
|
|
219
180
|
f.ns=f.ns.replace(/^(-?)0+/,'$1');
|
|
220
181
|
if(f.onnuminput) f.onnuminput.call(f);
|
|
221
182
|
}
|
|
222
183
|
f.setRange=(nMin, nMax, nDecMax) => {
|
|
223
|
-
min=nMin
|
|
184
|
+
min=nMin==null ? Number.MIN_SAFE_INTEGER : nMin;
|
|
185
|
+
max=nMax==null ? Number.MAX_SAFE_INTEGER : nMax;
|
|
186
|
+
decMax=nDecMax==null ? sym?2:0 : nDecMax;
|
|
187
|
+
if(numRng(f.num) !== f.num) f.set(f.num);
|
|
224
188
|
}
|
|
225
189
|
f.addEventListener('input',() => f.set(f.value));
|
|
226
190
|
f.addEventListener('paste',e => {f.set(e.clipboardData.getData('text')); e.preventDefault()});
|
|
191
|
+
f.setRange(min, max, decMax);
|
|
227
192
|
return f;
|
|
228
193
|
}
|
|
229
194
|
|
|
@@ -261,12 +226,6 @@ utils.formatCost = (n, sym='$') => {
|
|
|
261
226
|
n=='-'?n+a:n+(i&&!(i%3)?',':'')+a,'')+'.'+p[1];
|
|
262
227
|
}
|
|
263
228
|
|
|
264
|
-
//Convert value from 'datetime-local' input to Date object
|
|
265
|
-
utils.fromDateTimeBox = el => {
|
|
266
|
-
const v=el.value; if(!v) return new Date();
|
|
267
|
-
return new Date(v.replace(/-/g,'/').replace(/T/g,' '));
|
|
268
|
-
}
|
|
269
|
-
|
|
270
229
|
//Convert Number to fixed-length
|
|
271
230
|
//Set radix to 16 for HEX
|
|
272
231
|
utils.fixedNum = function(n,len,radix=10) {
|
|
@@ -277,12 +236,14 @@ utils.fixedNum = function(n,len,radix=10) {
|
|
|
277
236
|
utils.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
278
237
|
function fixed2(n) {return n<=9?'0'+n:n}
|
|
279
238
|
|
|
280
|
-
//
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
239
|
+
//Set 'datetime-local' or 'date' input from JS Date object or string, adjusting for local timezone
|
|
240
|
+
utils.setDateTime = (el, date) => {
|
|
241
|
+
if(!(date instanceof Date)) date=new Date(date);
|
|
242
|
+
el.value = new Date(date.getTime() - date.getTimezoneOffset()*60000).
|
|
243
|
+
toISOString().slice(0, el.type==='date'?10:19);
|
|
285
244
|
}
|
|
245
|
+
//Get value of 'datetime-local' or 'date' input as JS Date
|
|
246
|
+
utils.getDateTime = el => new Date(el.value+(el.type==='date'?'T00:00':''));
|
|
286
247
|
|
|
287
248
|
//Format Date object into human-readable string
|
|
288
249
|
//opt:
|
|
@@ -293,7 +254,7 @@ utils.toDateTimeBox = (d, sec) => {
|
|
|
293
254
|
// suf: False to drop date suffix (1st, 2nd, etc.)
|
|
294
255
|
// year: False to hide year, or a number to show year only if it differs from given year
|
|
295
256
|
// df: True to put date first instead of time
|
|
296
|
-
utils.formatDate = (d,opt={}) => {
|
|
257
|
+
utils.formatDate = (d, opt={}) => {
|
|
297
258
|
let t='',yy,dd;
|
|
298
259
|
if(d==null || !d.getDate || !((yy=d.getFullYear())>1969)) return "[Invalid Date]";
|
|
299
260
|
if(opt.time==null||opt.time) {
|
package/utils.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
//https://github.com/Pecacheu/Utils.js GNU GPL v3
|
|
2
|
-
"use strict";const utils={VER:"v8.7.6"},_uNJS="undefined"!=typeof global;let UtilRect,P="undefined"==typeof window?[{},{back(){},forward(){}},class{},class{},class{},class{},()=>{}]:[window,history,DOMRect,HTMLCollection,Element,NodeList,addEventListener];(()=>{let[t,e,i,l,n,s,r]=P;function o(){switch(this.type){case"datetime-local":this.siT.textContent=utils.formatDate(utils.fromDateTimeBox(this));break;case"select-one":this.siT.textContent=u(this);break;case"select-multiple":this.siT.textContent=a(this)}}function u(t){let e=t.options;return -1!=e.selectedIndex?e[e.selectedIndex].label:"No Options Selected"}function a(t){let e=t.options,i="";for(let l=0,n=e.length;l<n;++l)e[l].selected&&(i+=(i?", ":"")+e[l].label);return i||"No Options Selected"}function c(t){return t<=9?"0"+t:t}utils.define=(t,e,i,l)=>{let n={};if(i&&(n.get=i),l&&(n.set=l),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.proto=(t,e,i,l)=>{let n={value:i};if(l||(t=t.prototype),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.setCookie=(t,e,i,l)=>{let n=`${encodeURIComponent(t)}=${null==e?"":encodeURIComponent(e)};path=/`;if(null!=i&&(-1===i&&(i=new Date(Number.MAX_SAFE_INTEGER/10)),i instanceof Date?n+=";expires="+i.toUTCString():n+=";max-age="+i),l&&(n+=";secure"),_uNJS)return n;document.cookie=n},utils.remCookie=t=>{let e=encodeURIComponent(t)+"=;max-age=0";if(_uNJS)return e;document.cookie=e},utils.getCookies=t=>{if(null==t&&(t=document.cookie),!t)return{};let e=t.split("; "),i,l,n={};for(i of e)l=i.indexOf("="),n[decodeURIComponent(i.slice(0,l))]=decodeURIComponent(i.slice(l+1));return n},utils.getCookie=(t,e)=>{null==e&&(e=document.cookie),t=encodeURIComponent(t)+"=";let i=e.split("; "),l;for(l of i)if(l.startsWith(t))return decodeURIComponent(l.slice(t.length))},utils.proto(Function,"wrap",function(){let t=this,e=arguments;return function(){return t.apply(arguments,e)}}),utils.copy=(t,e)=>{if(0===e||"object"!=typeof t)return t;e=e>0?e-1:null;let i;if(Array.isArray(t))i=Array(t.length),t.forEach((t,l)=>{i[l]=utils.copy(t,e)});else for(let l in i={},t)i[l]=utils.copy(t[l],e);return i},utils.deviceInfo=t=>{let e={};if(t||(t=navigator.userAgent),!t.startsWith("Mozilla/5.0 "))return e;let i=t.indexOf(")"),l=e.rawOS=t.slice(13,i),n,s;return l.startsWith("Windows")?(n=l.split("; "),e.os="Windows",e.type=-1!=n.indexOf("WOW64")?"x64 PC; x86 Browser":-1!=n.indexOf("x64")?"x64 PC":"x86 PC",n=l.indexOf("Windows NT "),e.version=l.slice(n+11,l.indexOf(";",n+12))):l.startsWith("iP")?(n=l.indexOf("OS"),e.os="iOS",e.type=l.slice(0,l.indexOf(";")),e.version=l.slice(n+3,l.indexOf(" ",n+4)).replace(/_/g,".")):l.startsWith("Macintosh;")?(n=l.indexOf(" Mac OS X"),e.os="MacOS",e.type=l.slice(11,n)+" Mac",e.version=l.slice(n+10).replace(/_/g,".")):-1!=(n=l.indexOf("Android"))?(e.os="Android",e.version=l.slice(n+8,l.indexOf(";",n+9)),n=l.lastIndexOf(";"),s=l.indexOf(" Build",n+2),e.type=l.slice(n+2,-1==s?void 0:s)):l.startsWith("X11;")&&(n=(l=l.slice(5).split(/[;\s]+/)).length,e.os=("Linux"==l[0]?"":"Linux ")+l[0],e.type=l[n-2],e.version=l[n-1]),(n=Number(e.version))&&(e.version=n),n=t.indexOf(" ",i+2),s=-1==(s=t.indexOf(")",n+1))?n+1:s+2,e.engine=t.slice(i+2,n),e.browser=t.slice(s),e.mobile=!!t.match(/Mobi/i),e},_uNJS||(utils.device=utils.deviceInfo(),utils.mobile=utils.device.mobile),t.TouchList&&utils.proto(TouchList,"get",function(t){for(let e in this)if(this[e].identifier==t)return this[e];return 0}),utils.skinnedInput=t=>{let e=utils.mkDiv(null,t.className),i=t.style,l=t.type;if(t.className+=" isSub","datetime-local"==l||"select-one"==l||"select-multiple"==l){i.opacity=0,i.top="-100%",t.siT=utils.mkEl("span",e,"isText"),utils.mkEl("span",e,"isArrow",{borderTopColor:getComputedStyle(t).color});let n=o.bind(t);t.addEventListener("change",n),t.forceUpdate=n,n()}t.replaceWith(e),e.appendChild(t),document.isStyles||(document.isStyles=!0,utils.mkEl("style",document.body,null,null,".isSub {width:100% !important; height:100% !important; border:none !important; display:inline-block !important;position:relative !important; box-shadow:none !important; margin:0 !important; padding:initial !important;} .isText {display:inline-block; height:100%; max-width:95%;overflow:hidden; text-overflow:ellipsis; white-space:nowrap;} .isArrow {width:0; height:0; display:inline-block; float:right; top:38%; position:relative;border-left:3px solid transparent; border-right:3px solid transparent;border-top:6px solid #000; vertical-align:middle;}"))},utils.numField=(t,e,i,l,n)=>{let s=RegExp(`[,${n?RegExp.escape(n):""}]`,"g");return t.type=utils.mobile||l||n?"tel":"number",t.setAttribute("pattern","\\d*"),null==e&&(e=Number.MIN_SAFE_INTEGER),null==i&&(i=Number.MAX_SAFE_INTEGER),null==l&&(l=n?2:0),t.step||(t.step=1),t.num=Math.max(0,e),t.ns="",t.value=n?utils.formatCost(t.num,n):t.num.toString(),t.addEventListener("keydown",s=>{if(s.ctrlKey)return;let r=s.key,o=1==r.length&&Number.isFinite(Number(r)),u=t.ns,a=u.length,c=u.indexOf(".");if("Tab"!=r&&"Enter"!=r){if(o?(-1==c||a-c<l+1)&&(u+=r):"."==r||"*"==r?l&&-1==c&&t.num!=i&&(e>=0||t.num!=e)&&(!a&&e>0?u=Math.floor(e)+".":u+="."):"Backspace"==r||"Delete"==r?u=e>0&&t.num==e&&u.endsWith(".")?"":u.slice(0,-1):"-"==r||"#"==r?e<0&&!a&&(u="-"):"ArrowUp"==r?(u=null,t.set(t.num+Number(t.step))):"ArrowDown"==r&&(u=null,t.set(t.num-Number(t.step))),null!==u&&u!==t.ns){let d="-"==u||"-."==u,f=Number(d?"0":u+(u.endsWith(".")?"0":"")),h=Math.min(i,Math.max(e,f));(!o||t.num!==h||f===e)&&(t.ns=u,t.num=h,t.value=n?d?n+"-0.00":utils.formatCost(h,n):(d?"-":"")+h+(u.endsWith(".")&&(e<=0||h!=e)?".0":""),t.onnuminput&&t.onnuminput.call(t))}s.preventDefault()}}),t.set=r=>{"string"==typeof r&&(r=r.replace(s,"")),r=Math.min(i,Math.max(e,Number(r)||0)),t.num=l?Number(r.toFixed(l)):Math.round(r),t.ns=t.num.toString(),t.value=n?utils.formatCost(t.num,n):t.ns,t.ns=t.ns.replace(/^(-?)0+/,"$1"),t.onnuminput&&t.onnuminput.call(t)},t.setRange=(t,n,s)=>{e=t,i=n,l=s},t.addEventListener("input",()=>t.set(t.value)),t.addEventListener("paste",e=>{t.set(e.clipboardData.getData("text")),e.preventDefault()}),t},utils.autosize=(t,e=5,i=1)=>{t.set=e=>{t.value=e,n()};let l=t.style;function n(){if(0===t.scrollHeight)return setTimeout(n,1);t.setAttribute("rows",1);let s=getComputedStyle(t);l.setProperty("overflow","hidden","important"),l.width=t.innerRect.w+"px",l.boxSizing="content-box",l.borderWidth=l.paddingInline=0;let r=parseFloat(s.paddingTop)+parseFloat(s.paddingBottom),o="normal"===s.lineHeight?parseFloat(s.height):parseFloat(s.lineHeight),u=Math.round((Math.round(t.scrollHeight)-r)/o);l.overflow=l.width=l.boxSizing=l.borderWidth=l.paddingInline="",t.setAttribute("rows",utils.bounds(u,i,e))}l.maxHeight=l.resize="none",l.minHeight=0,l.height="auto",t.setAttribute("rows",i),t.addEventListener("input",n)},utils.formatCost=(t,e="$")=>{if(!t)return e+"0.00";let i=t.toFixed(2).split(".");return e+i[0].split("").reverse().reduce((t,e,i)=>"-"==e?e+t:e+(i&&!(i%3)?",":"")+t,"")+"."+i[1]},utils.fromDateTimeBox=t=>{let e=t.value;return e?new Date(e.replace(/-/g,"/").replace(/T/g," ")):new Date},utils.fixedNum=function(t,e,i=10){let l=Math.abs(t).toString(i).toUpperCase();return(t<0?"-":"")+(16==i?"0x":2==i?"0b":"")+"0".repeat(Math.max(e-l.length,0))+l},utils.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],utils.toDateTimeBox=(t,e)=>t.getFullYear()+"-"+c(t.getMonth()+1)+"-"+c(t.getDate())+"T"+c(t.getHours())+":"+c(t.getMinutes())+(e?":"+c(t.getSeconds()):""),utils.formatDate=(t,e={})=>{let i="",l,n;if(null==t||!t.getDate||!((l=t.getFullYear())>1969))return"[Invalid Date]";if(null==e.time||e.time){let s=t.getHours(),r="";if(e.h24||(r=" AM",s>=12&&(r=" PM",s-=12),s||(s=12)),i=s+":"+c(t.getMinutes())+(e.sec?":"+c(t.getSeconds())+(e.ms?(t.getMilliseconds()/1e3).toFixed(Number.isFinite(e.ms)?e.ms:3).slice(1):""):""),i+=r,e.time)return i}return n=t.getDate(),n=utils.months[t.getMonth()]+" "+(null==e.suf||e.suf?utils.suffix(n):n),(null==e.year||e.year)&&e.year!==l&&(n=n+", "+l),e.df?n+(i&&" "+i):(i&&i+" ")+n},utils.suffix=t=>{let e=t%10,i=t%100;return 1==e&&11!=i?t+"st":2==e&&12!=i?t+"nd":3==e&&13!=i?t+"rd":t+"th"};let d=e;function f(t){utils.onNav&&utils.onNav.call(null,t)}function h(t,e,i){let n=this.length,s=Math.max(e<0?n+e:e||0,0),r;for(null!=i&&(n=Math.min(i<0?n+i:i,n));s<n;++s)if("!"===(r=t(this[s],s,n)))this instanceof l?this[s].remove():this.splice(s,1),--s,--n;else if(null!=r)return r}async function p(t,e,i,n=!0){let s=this.length,r=e=Math.max(e<0?s+e:e||0,0),o,u=[];for(null!=i&&(s=Math.min(i<0?s+i:i,s));r<s;++r){if(o=t(this[r],r,s),!n&&"!"!==(o=await o)&&null!=o)return o;u.push(o)}for(n&&(u=await Promise.all(u)),r=e,o=0;r<s;++r,++o)if("!"===u[o])this instanceof l?this[r].remove():this.splice(r,1),--r,--s;else if(null!=u[o])return u[o]}utils.goBack=d.back.bind(d),utils.goForward=d.forward.bind(d),utils.go=(t,e)=>{d.pushState(e,"",t||location.pathname),f(e)},r("popstate",t=>f(t.state)),r("load",()=>setTimeout(f.wrap(d.state),1)),utils.mkEl=(t,e,i,l,n)=>{let s=document.createElement(t);if(null!=i&&(s.className=i),null!=n&&(s.innerHTML=n),l&&"object"==typeof l)for(let r in l)r in s.style?s.style[r]=l[r]:s.style.setProperty(r,l[r]);return null!=e&&e.appendChild(s),s},utils.mkDiv=(t,e,i,l)=>utils.mkEl("div",t,e,i,l),utils.addText=(t,e)=>t.appendChild(document.createTextNode(e)),utils.textWidth=(e,i)=>{let l=t.TWCanvas||(t.TWCanvas=utils.mkEl("canvas")),n=l.getContext("2d");return n.font=i,n.measureText(e).width},utils.define(utils,"w",()=>innerWidth),utils.define(utils,"h",()=>innerHeight),utils.setPropSafe=(t,e,i,l=!1)=>{"string"==typeof e&&(e=e.split("."));let n=e.length-1;return(e.each(e=>{t="object"==typeof t[e]?t[e]:t[e]={}},0,n),n=e[n],l&&null!=t[n])?t[n]:t[n]=i},utils.getPropSafe=(t,e)=>{"string"==typeof e&&(e=e.split("."));try{for(let i of e)t=t[i];return t}catch(l){}},utils.proto(Array,"clean",function(t){for(let e=0,i,l=this.length;e<l;++e)i=this[e],(utils.isBlank(i)||!1===i||!t&&0===i)&&(this.splice(e--,1),l--);return this}),utils.proto(Array,"remove",function(t){let e=this.indexOf(t);return -1!=e&&(this.splice(e,1),!0)}),[Array,l,s].forEach(t=>{utils.proto(t,"each",h),utils.proto(t,"eachAsync",p)});let $="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_=$.replace("+/","-_"),m={43:62,47:63,48:52,49:53,50:54,51:55,52:56,53:57,54:58,55:59,56:60,57:61,65:0,66:1,67:2,68:3,69:4,70:5,71:6,72:7,73:8,74:9,75:10,76:11,77:12,78:13,79:14,80:15,81:16,82:17,83:18,84:19,85:20,86:21,87:22,88:23,89:24,90:25,97:26,98:27,99:28,100:29,101:30,102:31,103:32,104:33,105:34,106:35,107:36,108:37,109:38,110:39,111:40,112:41,113:42,114:43,115:44,116:45,117:46,118:47,119:48,120:49,121:50,122:51,45:62,95:63};function g(t,e){if(null==(t=m[t.charCodeAt(e)]))throw"Bad char at "+e;return t}"toBase64"in Uint8Array.prototype||utils.proto(Uint8Array,"toBase64",function(t){let e=this.byteLength,i=e%3,l=t&&"base64url"===t.alphabet?_:$,n=0,s="",r;for(e-=i;n<e;n+=3)s+=l[(16515072&(r=this[n]<<16|this[n+1]<<8|this[n+2]))>>18]+l[(258048&r)>>12]+l[(4032&r)>>6]+l[63&r];return 1==i?(s+=l[(252&(r=this[e]))>>2]+l[(3&r)<<4],t&&t.omitPadding||(s+="=")):2!=i||(s+=l[(64512&(r=this[e]<<8|this[e+1]))>>10]+l[(1008&r)>>4]+l[(15&r)<<2],t&&t.omitPadding||(s+="==")),s}),"fromBase64"in Uint8Array||utils.proto(Uint8Array,"fromBase64",t=>{let e=t.length,i=e-1;for(;i>=0&&61===t.charCodeAt(i);--i);e=i+1,i=0;let l=e%4;if(e-=l,1==l)throw"Bad b64 len";let n=new Uint8Array(3*e/4+(l?l-1:0)),s=-1,r;for(;i<e;i+=4)r=g(t,i)<<18|g(t,i+1)<<12|g(t,i+2)<<6|g(t,i+3),n[++s]=r>>16,n[++s]=r>>8,n[++s]=r;return 2==l?n[++s]=g(t,i)<<2|g(t,i+1)>>4:3==l&&(r=g(t,i)<<10|g(t,i+1)<<4|g(t,i+2)>>2,n[++s]=r>>8,n[++s]=r),n},1);let y=/[|\\{}()[\]^$+*?.]/g,x=/-/g;function b(t,e){for(;t>=e;)t-=e;return t}function w(){let t=document.styleSheets;for(let e=0,i=t.length;e<i;++e)try{return t[e].cssRules,t[e]}catch(l){}let n=utils.mkEl("style",document.head);return utils.addText(n,""),n.sheet}function v(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}"escape"in RegExp||utils.proto(RegExp,"escape",t=>t.replace(y,"\\$&").replace(x,"\\x2d"),1),utils.define(n.prototype,"index",function(){let t=this.parentElement;return t?Array.prototype.indexOf.call(t.children,this):-1}),utils.proto(n,"insertChildAt",function(t,e){e<0&&(e=0),e>=this.children.length?this.appendChild(t):this.insertBefore(t,this.children[e])}),utils.boundingRect=t=>new UtilRect(t.getBoundingClientRect()),utils.innerRect=t=>{let e=t.getBoundingClientRect(),i=getComputedStyle(t);return new UtilRect(e.top+parseFloat(i.paddingTop)+parseFloat(i.borderTopWidth),e.bottom-parseFloat(i.paddingBottom)-parseFloat(i.borderBottomWidth),e.left+parseFloat(i.paddingLeft)+parseFloat(i.borderLeftWidth),e.right-parseFloat(i.paddingRight)-parseFloat(i.borderRightWidth))},utils.define(n.prototype,"boundingRect",function(){return utils.boundingRect(this)}),utils.define(n.prototype,"innerRect",function(){return utils.innerRect(this)}),Math.cot=t=>1/Math.tan(t),utils.isBlank=t=>null==t||("string"==typeof t?!/\S/.test(t):"object"==typeof t&&("number"==typeof t.length?0===t.length:0===Object.keys(t).length)),utils.firstEmpty=t=>{let e=t.length;for(let i=0;i<e;++i)if(null==t[i])return i;return e},utils.firstEmptyChar=t=>{let e=Object.keys(t),i=e.length;for(let l=0;l<i;++l)if(null==t[e[l]])return e[l];return utils.numToChar(i)},utils.numToChar=t=>{if(t<=25)return String.fromCharCode(t+97);if(t>=26&&t<=51)return String.fromCharCode(t+39);let e,i;if(t<2756)e=b(Math.floor(t/52)-1,52),i=b(t,52);else if(t<143364)e=b(Math.floor((t-52)/2704)-1,52),i=b(t-52,2704)+52;else{if(!(t<7454980))return!1;e=b(Math.floor((t-2756)/140608)-1,52),i=b(t-2756,140608)+2756}return utils.numToChar(e)+utils.numToChar(i)},utils.merge=function(t){for(let e=1,i=arguments.length,l,n,s;e<i;++e)for(let r in l=arguments[e]){if(n=t[r],s=l[r],n&&s){if(n.length>=0&&s.length>=0){for(let o=0,u=s.length,a=n.length;o<u;++o)n[o+a]=s[o];continue}if("object"==typeof n&&"object"==typeof s){for(let c in s)n[c]=s[c];continue}}t[r]=s}return t},utils.bounds=(t,e=0,i=1)=>t>=e?t<=i?t:i:e,utils.norm=utils.normalize=(t,e=0,i=1)=>{let l=Math.abs(i-e);if(t<e)for(;t<e;)t+=l;else for(;t>=i;)t-=l;return t},utils.cutStr=(t,e)=>{let i;for(;-1!=(i=t.indexOf(e));)t=t.slice(0,i)+t.slice(i+e.length);return t},utils.dCut=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutToLast=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.lastIndexOf(i);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutLast=(t,e,i,l,n)=>{let s=t.lastIndexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.parseCSS=t=>{let e={},i="",l=0;function n(t){if(-1!==t.indexOf(",")){let e=utils.clean(t.split(","));for(let i=0,l=e.length;i<l;++i)e[i]=e[i].trim();return e}return t.trim()}for(t=t.trim();t.length>0;)if("("==t[0]&&-1!==t.indexOf(")")&&i){let s=t.indexOf(")"),r=t.slice(1,s);e[i]=n(r),i="",t=t.slice(s+1)}else if(0==t.search(/[#!\w]/)){i&&(e[l++]=i);let o=t.search(/[^#!\w-%]/);-1==o&&(o=t.length),i=t.slice(0,o),t=t.slice(o)}else t=t.slice(1);return i&&(e[l]=i),e},utils.buildCSS=t=>{let e=Object.keys(t),i=e.length,l="",n=0;for(;n<i;){let s=e[n],r=t[e[n]];++n,0<=Number(s)?l+=r+" ":l+=`${s}(${r}) `}return l.slice(0,-1)},utils.addClass=(t,e)=>{let i=w(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=v(l[s])+":"+e[l[s]]+";";i.addRule("."+t,n)},utils.addId=(t,e)=>{let i=w(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=v(l[s])+":"+e[l[s]]+";";i.addRule("#"+t,n)},utils.addKeyframe=(t,e)=>{w().addRule("@keyframes "+t,e)},utils.removeSelector=t=>{for(let e=0,i,l,n=document.styleSheets.length;e<n;++e){i=document.styleSheets[e];try{l=i.cssRules}catch(s){continue}for(let r in l)"CSSStyleRule"==l[r].constructor.name&&l[r].selectorText==t&&i.deleteRule(r)}},utils.hexToRgb=t=>{let e=parseInt(t.slice(1),16);return[e>>16&255,e>>8&255,255&e]},utils.rgbToHsl=(t,e,i)=>{t/=255;let l=Math.max(t,e/=255,i/=255),n=Math.min(t,e,i),s,r,o=(l+n)/2;if(l===n)s=r=0;else{let u=l-n;switch(r=o>.5?u/(2-l-n):u/(l+n),l){case t:s=(e-i)/u+(e<i?6:0);break;case e:s=(i-t)/u+2;break;case i:s=(t-e)/u+4}s/=6}return[360*s,100*r,100*o]},utils.rand=(t,e,i,l)=>{e*=i=i||1,t*=i;let n=Math.random();return Math.round((l?l(n):n)*(e-t)+t)/i},utils.fromQuery=t=>{function e(t,i){let l=i[0],n=l.indexOf("="),s=decodeURIComponent(l.slice(0,n)),r=decodeURIComponent(l.slice(n+1));return null==t[s]?t[s]=r:Array.isArray(t[s])?t[s].push(r):t[s]=[t[s],r],1===i.length?t:e(t,i.slice(1))}return t.startsWith("?")&&(t=t.slice(1)),t?e({},t.split("&")):{}},utils.toQuery=t=>{let e="",i,l;if("object"!=typeof t)return encodeURIComponent(t);for(i in t)"object"==typeof(l=t[i])&&null!=l&&(l=JSON.stringify(l)),e+="&"+i+"="+encodeURIComponent(l);return e.slice(1)},utils.center=(t,e,i)=>{let l=t.style;if("trans"==i){l.position||(l.position="absolute");let n=utils.cutStr(l.transform,"translateX(-50%)");n=utils.cutStr(n,"translateY(-50%)"),e&&"x"!=e||(l.left="50%",n+="translateX(-50%)"),e&&"y"!=e||(l.top="50%",n+="translateY(-50%)"),n&&(l.transform=n)}else{let s=utils.mkDiv(t.parentNode,null,{display:"flex",top:0,left:0});s.appendChild(t),s=s.style,e&&"x"!=e||(s.justifyContent="center",s.width="100%"),e&&"y"!=e||(s.alignItems="center",s.height="100%",s.position="absolute")}},utils.loadAjax=(t,e,i,l,n)=>{let s;try{s=new XMLHttpRequest}catch(r){return e(r)}if(n)for(let o in n)s.setRequestHeader(o,n[o]);s.open(i||"GET",t),s.onreadystatechange=()=>{let t=s.status||-1;s.readyState==s.DONE&&e(200==t?0:t,s.response,s)},s.send(l||void 0)},utils.loadFile=(t,e,i)=>{let l=utils.mkEl("object",document.body,null,{position:"fixed",opacity:0});l.data=t;let n=setTimeout(()=>{l.remove(),n=null,e(!1)},i||4e3);l.onload=()=>{n&&(clearTimeout(n),e(l.contentDocument.documentElement.outerHTML),l.remove())}},utils.loadJSONP=(t,e,i)=>{let l=utils.mkEl("script",document.head),n=utils.firstEmptyChar(utils.lJSONCall);l.type="application/javascript",l.src=t+(-1==t.indexOf("?")?"?":"&")+"callback=utils.lJSONCall."+n;let s=setTimeout(()=>{delete utils.lJSONCall[n],e(!1)},i||4e3);utils.lJSONCall[n]=t=>{s&&clearTimeout(s),delete utils.lJSONCall[n],e(t)},document.head.removeChild(l)},utils.lJSONCall=[],utils.dlFile=(t,e)=>fetch(e).then(t=>{if(200!=t.status)throw"Code "+t.status;return t.blob()}).then(e=>{utils.dlData(t,e)}),utils.dlData=(t,e)=>{let i,l=utils.mkEl("a",document.body,null,{display:"none"});"string"==typeof e?i=e:(e instanceof Blob||(e=Blob(e)),i=URL.createObjectURL(e)),l.href=i,l.download=t,l.click(),l.remove(),URL.revokeObjectURL(i)},utils.deg=t=>180*t/Math.PI,utils.rad=t=>t*Math.PI/180,utils.map=(t,e,i,l,n,s)=>{let r=(t-e)/(i-e);return(s?s(r):r)*(n-l)+l},utils.delay=t=>new Promise(e=>setTimeout(e,t)),UtilRect=function(t,e,l,n){if(!(this instanceof UtilRect))return new UtilRect(t,e,l,n);let s=Number.isFinite,r=0,o=0,u=0,a=0;utils.define(this,"x",()=>u,t=>{s(t)&&(a+=t-u,u=t)}),utils.define(this,"y",()=>r,t=>{s(t)&&(o+=t-r,r=t)}),utils.define(this,"top",()=>r,t=>{r=s(t)?t:0}),utils.define(this,["bottom","y2"],()=>o,t=>{o=s(t)?t:0}),utils.define(this,"left",()=>u,t=>{u=s(t)?t:0}),utils.define(this,["right","x2"],()=>a,t=>{a=s(t)?t:0}),utils.define(this,["width","w"],()=>a-u,t=>{a=t>=0?u+t:0}),utils.define(this,["height","h"],()=>o-r,t=>{o=t>=0?r+t:0}),utils.define(this,"centerX",()=>u/2+a/2),utils.define(this,"centerY",()=>r/2+o/2),t instanceof i||t instanceof UtilRect?(r=t.top,o=t.bottom,u=t.left,a=t.right):(r=t,o=e,u=l,a=n)},utils.proto(UtilRect,"contains",function(t,e){return t instanceof n?this.contains(t.boundingRect):t instanceof UtilRect?t.x>=this.x&&t.x2<=this.x2&&t.y>=this.y&&t.y2<=this.y2:t>=this.x&&t<=this.x2&&e>=this.y&&e<=this.y2}),utils.proto(UtilRect,"overlaps",function(t){if(t instanceof n)return this.overlaps(t.boundingRect);if(!(t instanceof UtilRect))return 0;let e,i;return e=t.x2-t.x>=this.x2-this.x?this.x>=t.x&&this.x<=t.x2||this.x2>=t.x&&this.x2<=t.x2:t.x>=this.x&&t.x<=this.x2||t.x2>=this.x&&t.x2<=this.x2,i=t.y2-t.y>=this.y2-this.y?this.y>=t.y&&this.y<=t.y2||this.y2>=t.y&&this.y2<=t.y2:t.y>=this.y&&t.y<=this.y2||t.y2>=this.y&&t.y2<=this.y2,e&&i}),utils.proto(UtilRect,"dist",function(t,e){if(t instanceof n)return this.dist(t.boundingRect);let i=t instanceof UtilRect;return e=Math.abs((i?t.centerY:e)-this.centerY),Math.sqrt((t=Math.abs((i?t.centerX:t)-this.centerX))*t+e*e)}),utils.proto(UtilRect,"expand",function(t){return this.top-=t,this.left-=t,this.bottom+=t,this.right+=t,this})})();const Easing={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>t*(2-t),easeInOutQuad:t=>t<.5?2*t*t:-1+(4-2*t)*t,easeInCubic:t=>t*t*t,easeOutCubic:t=>--t*t*t+1,easeInOutCubic:t=>t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1- --t*t*t*t,easeInOutQuart:t=>t<.5?8*t*t*t*t:1-8*--t*t*t*t,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1+--t*t*t*t*t,easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t};if(_uNJS&&!global.utils){let t=import("os").then(e=>t=e);utils.getIPs=()=>{let e=[],i=t.networkInterfaces();for(let l in i)i[l].forEach(t=>{!t.internal&&"IPv4"==t.family&&"00:00:00:00:00:00"!=t.mac&&t.address&&e.push(t.address)});return e.length?e:0},utils.getOS=()=>{let e,i,l;switch(t.platform()){case"win32":e="Windows";break;case"darwin":e="MacOS";break;case"linux":e="Linux";break;default:e=t.platform()}switch(t.arch()){case"ia32":i="32-bit";break;case"x64":i="64-bit";break;case"arm":i="ARM";break;default:i=t.arch()}return[e,i,l=t.cpus()[0].model]},global.utils=utils,global.UtilRect=UtilRect,global.Easing=Easing}
|
|
2
|
+
"use strict";const utils={VER:"v8.7.8"},_uNJS="undefined"!=typeof global;let UtilRect,P="undefined"==typeof window?[{},{back(){},forward(){}},class{},class{},class{},class{},()=>{}]:[window,history,DOMRect,HTMLCollection,Element,NodeList,addEventListener];(()=>{let[t,e,i,l,n,s,r]=P;utils.define=(t,e,i,l)=>{let n={};if(i&&(n.get=i),l&&(n.set=l),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.proto=(t,e,i,l)=>{let n={value:i};if(l||(t=t.prototype),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.setCookie=(t,e,i,l)=>{let n=`${encodeURIComponent(t)}=${null==e?"":encodeURIComponent(e)};path=/`;if(null!=i&&(-1===i&&(i=new Date(Number.MAX_SAFE_INTEGER/10)),i instanceof Date?n+=";expires="+i.toUTCString():n+=";max-age="+i),l&&(n+=";secure"),_uNJS)return n;document.cookie=n},utils.remCookie=t=>{let e=encodeURIComponent(t)+"=;max-age=0";if(_uNJS)return e;document.cookie=e},utils.getCookies=t=>{if(null==t&&(t=document.cookie),!t)return{};let e=t.split("; "),i,l,n={};for(i of e)l=i.indexOf("="),n[decodeURIComponent(i.slice(0,l))]=decodeURIComponent(i.slice(l+1));return n},utils.getCookie=(t,e)=>{null==e&&(e=document.cookie),t=encodeURIComponent(t)+"=";let i=e.split("; "),l;for(l of i)if(l.startsWith(t))return decodeURIComponent(l.slice(t.length))},utils.proto(Function,"wrap",function(){let t=this,e=arguments;return function(){return t.apply(arguments,e)}}),utils.copy=(t,e)=>{if(0===e||"object"!=typeof t)return t;e=e>0?e-1:null;let i;if(Array.isArray(t))i=Array(t.length),t.forEach((t,l)=>{i[l]=utils.copy(t,e)});else for(let l in i={},t)i[l]=utils.copy(t[l],e);return i},utils.deviceInfo=t=>{let e={};if(t||(t=navigator.userAgent),!t.startsWith("Mozilla/5.0 "))return e;let i=t.indexOf(")"),l=e.rawOS=t.slice(13,i),n,s;return l.startsWith("Windows")?(n=l.split("; "),e.os="Windows",e.type=-1!=n.indexOf("WOW64")?"x64 PC; x86 Browser":-1!=n.indexOf("x64")?"x64 PC":"x86 PC",n=l.indexOf("Windows NT "),e.version=l.slice(n+11,l.indexOf(";",n+12))):l.startsWith("iP")?(n=l.indexOf("OS"),e.os="iOS",e.type=l.slice(0,l.indexOf(";")),e.version=l.slice(n+3,l.indexOf(" ",n+4)).replace(/_/g,".")):l.startsWith("Macintosh;")?(n=l.indexOf(" Mac OS X"),e.os="MacOS",e.type=l.slice(11,n)+" Mac",e.version=l.slice(n+10).replace(/_/g,".")):-1!=(n=l.indexOf("Android"))?(e.os="Android",e.version=l.slice(n+8,l.indexOf(";",n+9)),n=l.lastIndexOf(";"),s=l.indexOf(" Build",n+2),e.type=l.slice(n+2,-1==s?void 0:s)):l.startsWith("X11;")&&(n=(l=l.slice(5).split(/[;\s]+/)).length,e.os=("Linux"==l[0]?"":"Linux ")+l[0],e.type=l[n-2],e.version=l[n-1]),(n=Number(e.version))&&(e.version=n),n=t.indexOf(" ",i+2),s=-1==(s=t.indexOf(")",n+1))?n+1:s+2,e.engine=t.slice(i+2,n),e.browser=t.slice(s),e.mobile=!!t.match(/Mobi/i),e},_uNJS||(utils.device=utils.deviceInfo(),utils.mobile=utils.device.mobile),t.TouchList&&utils.proto(TouchList,"get",function(t){for(let e in this)if(this[e].identifier==t)return this[e];return 0});let u=/\.0*$/;function o(t){return t<=9?"0"+t:t}utils.numField=(t,e,i,l,n)=>{let s=RegExp(`[,${n?RegExp.escape(n):""}]`,"g");function r(t){return"string"==typeof t&&(t=t.replace(s,"")),t=Math.min(i,Math.max(e,Number(t)||0)),l?Number(t.toFixed(l)):Math.round(t)}return t.type=utils.mobile||l||n?"tel":"number",t.setAttribute("pattern","\\d*"),t.step||(t.step=1),t.addEventListener("keydown",s=>{if(s.ctrlKey)return;let r=s.key,o=1===r.length&&Number.isFinite(Number(r)),a=t.ns,f=a.length,c=a.indexOf(".");if("Tab"!==r&&"Enter"!==r){if(o?(-1===c||f-c<l+1)&&(a+=r):"."===r||"*"===r?l&&-1==c&&t.num!=i&&(e>=0||t.num!=e)&&(!f&&e>0?a=Math.floor(e)+".":a+="."):"Backspace"===r||"Delete"===r?a=e>0&&t.num===e&&a.endsWith(".")?"":a.slice(0,-1):"-"===r||"#"===r?e<0&&!f&&(a="-"):"ArrowUp"===r?(a=null,t.set(t.num+Number(t.step))):"ArrowDown"===r&&(a=null,t.set(t.num-Number(t.step))),null!==a&&a!==t.ns){f=a.length,c=a.indexOf(".");let d="-"===a||"-."===a,h=Math.min(i,Math.max(e,Number(d?"0":a+(a.endsWith(".")?"0":""))));(!o||!a||t.num!==h||-1!==c&&f-c<l+1)&&(t.ns=a,t.num=h,t.value=n?d?n+"-0.00":utils.formatCost(h,n):("-"===a[0]?"-":"")+Math.floor(Math.abs(h))+(-1!==c?a.slice(c)+(u.test(a)?"0":""):""),t.onnuminput&&t.onnuminput.call(t))}s.preventDefault()}}),t.set=e=>{t.num=r(e),t.ns=t.num.toString(),t.value=n?utils.formatCost(t.num,n):t.ns,t.ns=t.ns.replace(/^(-?)0+/,"$1"),t.onnuminput&&t.onnuminput.call(t)},t.setRange=(s,u,o)=>{e=null==s?Number.MIN_SAFE_INTEGER:s,i=null==u?Number.MAX_SAFE_INTEGER:u,l=null==o?n?2:0:o,r(t.num)!==t.num&&t.set(t.num)},t.addEventListener("input",()=>t.set(t.value)),t.addEventListener("paste",e=>{t.set(e.clipboardData.getData("text")),e.preventDefault()}),t.setRange(e,i,l),t},utils.autosize=(t,e=5,i=1)=>{t.set=e=>{t.value=e,n()};let l=t.style;function n(){if(0===t.scrollHeight)return setTimeout(n,1);t.setAttribute("rows",1);let s=getComputedStyle(t);l.setProperty("overflow","hidden","important"),l.width=t.innerRect.w+"px",l.boxSizing="content-box",l.borderWidth=l.paddingInline=0;let r=parseFloat(s.paddingTop)+parseFloat(s.paddingBottom),u="normal"===s.lineHeight?parseFloat(s.height):parseFloat(s.lineHeight),o=Math.round((Math.round(t.scrollHeight)-r)/u);l.overflow=l.width=l.boxSizing=l.borderWidth=l.paddingInline="",t.setAttribute("rows",utils.bounds(o,i,e))}l.maxHeight=l.resize="none",l.minHeight=0,l.height="auto",t.setAttribute("rows",i),t.addEventListener("input",n)},utils.formatCost=(t,e="$")=>{if(!t)return e+"0.00";let i=t.toFixed(2).split(".");return e+i[0].split("").reverse().reduce((t,e,i)=>"-"==e?e+t:e+(i&&!(i%3)?",":"")+t,"")+"."+i[1]},utils.fixedNum=function(t,e,i=10){let l=Math.abs(t).toString(i).toUpperCase();return(t<0?"-":"")+(16==i?"0x":2==i?"0b":"")+"0".repeat(Math.max(e-l.length,0))+l},utils.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],utils.setDateTime=(t,e)=>{e instanceof Date||(e=new Date(e)),t.value=new Date(e.getTime()-6e4*e.getTimezoneOffset()).toISOString().slice(0,"date"===t.type?10:19)},utils.getDateTime=t=>new Date(t.value+("date"===t.type?"T00:00":"")),utils.formatDate=(t,e={})=>{let i="",l,n;if(null==t||!t.getDate||!((l=t.getFullYear())>1969))return"[Invalid Date]";if(null==e.time||e.time){let s=t.getHours(),r="";if(e.h24||(r=" AM",s>=12&&(r=" PM",s-=12),s||(s=12)),i=s+":"+o(t.getMinutes())+(e.sec?":"+o(t.getSeconds())+(e.ms?(t.getMilliseconds()/1e3).toFixed(Number.isFinite(e.ms)?e.ms:3).slice(1):""):""),i+=r,e.time)return i}return n=t.getDate(),n=utils.months[t.getMonth()]+" "+(null==e.suf||e.suf?utils.suffix(n):n),(null==e.year||e.year)&&e.year!==l&&(n=n+", "+l),e.df?n+(i&&" "+i):(i&&i+" ")+n},utils.suffix=t=>{let e=t%10,i=t%100;return 1==e&&11!=i?t+"st":2==e&&12!=i?t+"nd":3==e&&13!=i?t+"rd":t+"th"};let a=e;function f(t){utils.onNav&&utils.onNav.call(null,t)}function c(t,e,i){let n=this.length,s=Math.max(e<0?n+e:e||0,0),r;for(null!=i&&(n=Math.min(i<0?n+i:i,n));s<n;++s)if("!"===(r=t(this[s],s,n)))this instanceof l?this[s].remove():this.splice(s,1),--s,--n;else if(null!=r)return r}async function d(t,e,i,n=!0){let s=this.length,r=e=Math.max(e<0?s+e:e||0,0),u,o=[];for(null!=i&&(s=Math.min(i<0?s+i:i,s));r<s;++r){if(u=t(this[r],r,s),!n&&"!"!==(u=await u)&&null!=u)return u;o.push(u)}for(n&&(o=await Promise.all(o)),r=e,u=0;r<s;++r,++u)if("!"===o[u])this instanceof l?this[r].remove():this.splice(r,1),--r,--s;else if(null!=o[u])return o[u]}utils.goBack=a.back.bind(a),utils.goForward=a.forward.bind(a),utils.go=(t,e)=>{a.pushState(e,"",t||location.pathname),f(e)},r("popstate",t=>f(t.state)),r("load",()=>setTimeout(f.wrap(a.state),1)),utils.mkEl=(t,e,i,l,n)=>{let s=document.createElement(t);if(null!=i&&(s.className=i),null!=n&&(s.innerHTML=n),l&&"object"==typeof l)for(let r in l)r in s.style?s.style[r]=l[r]:s.style.setProperty(r,l[r]);return null!=e&&e.appendChild(s),s},utils.mkDiv=(t,e,i,l)=>utils.mkEl("div",t,e,i,l),utils.addText=(t,e)=>t.appendChild(document.createTextNode(e)),utils.textWidth=(e,i)=>{let l=t.TWCanvas||(t.TWCanvas=utils.mkEl("canvas")),n=l.getContext("2d");return n.font=i,n.measureText(e).width},utils.define(utils,"w",()=>innerWidth),utils.define(utils,"h",()=>innerHeight),utils.setPropSafe=(t,e,i,l=!1)=>{"string"==typeof e&&(e=e.split("."));let n=e.length-1;return(e.each(e=>{t="object"==typeof t[e]?t[e]:t[e]={}},0,n),n=e[n],l&&null!=t[n])?t[n]:t[n]=i},utils.getPropSafe=(t,e)=>{"string"==typeof e&&(e=e.split("."));try{for(let i of e)t=t[i];return t}catch(l){}},utils.proto(Array,"clean",function(t){for(let e=0,i,l=this.length;e<l;++e)i=this[e],(utils.isBlank(i)||!1===i||!t&&0===i)&&(this.splice(e--,1),l--);return this}),utils.proto(Array,"remove",function(t){let e=this.indexOf(t);return -1!=e&&(this.splice(e,1),!0)}),[Array,l,s].forEach(t=>{utils.proto(t,"each",c),utils.proto(t,"eachAsync",d)});let h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",$=h.replace("+/","-_"),_={43:62,47:63,48:52,49:53,50:54,51:55,52:56,53:57,54:58,55:59,56:60,57:61,65:0,66:1,67:2,68:3,69:4,70:5,71:6,72:7,73:8,74:9,75:10,76:11,77:12,78:13,79:14,80:15,81:16,82:17,83:18,84:19,85:20,86:21,87:22,88:23,89:24,90:25,97:26,98:27,99:28,100:29,101:30,102:31,103:32,104:33,105:34,106:35,107:36,108:37,109:38,110:39,111:40,112:41,113:42,114:43,115:44,116:45,117:46,118:47,119:48,120:49,121:50,122:51,45:62,95:63};function p(t,e){if(null==(t=_[t.charCodeAt(e)]))throw"Bad char at "+e;return t}"toBase64"in Uint8Array.prototype||utils.proto(Uint8Array,"toBase64",function(t){let e=this.byteLength,i=e%3,l=t&&"base64url"===t.alphabet?$:h,n=0,s="",r;for(e-=i;n<e;n+=3)s+=l[(16515072&(r=this[n]<<16|this[n+1]<<8|this[n+2]))>>18]+l[(258048&r)>>12]+l[(4032&r)>>6]+l[63&r];return 1==i?(s+=l[(252&(r=this[e]))>>2]+l[(3&r)<<4],t&&t.omitPadding||(s+="=")):2!=i||(s+=l[(64512&(r=this[e]<<8|this[e+1]))>>10]+l[(1008&r)>>4]+l[(15&r)<<2],t&&t.omitPadding||(s+="==")),s}),"fromBase64"in Uint8Array||utils.proto(Uint8Array,"fromBase64",t=>{let e=t.length,i=e-1;for(;i>=0&&61===t.charCodeAt(i);--i);e=i+1,i=0;let l=e%4;if(e-=l,1==l)throw"Bad b64 len";let n=new Uint8Array(3*e/4+(l?l-1:0)),s=-1,r;for(;i<e;i+=4)r=p(t,i)<<18|p(t,i+1)<<12|p(t,i+2)<<6|p(t,i+3),n[++s]=r>>16,n[++s]=r>>8,n[++s]=r;return 2==l?n[++s]=p(t,i)<<2|p(t,i+1)>>4:3==l&&(r=p(t,i)<<10|p(t,i+1)<<4|p(t,i+2)>>2,n[++s]=r>>8,n[++s]=r),n},1);let g=/[|\\{}()[\]^$+*?.]/g,m=/-/g;function y(t,e){for(;t>=e;)t-=e;return t}function x(){let t=document.styleSheets;for(let e=0,i=t.length;e<i;++e)try{return t[e].cssRules,t[e]}catch(l){}let n=utils.mkEl("style",document.head);return utils.addText(n,""),n.sheet}function b(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}"escape"in RegExp||utils.proto(RegExp,"escape",t=>t.replace(g,"\\$&").replace(m,"\\x2d"),1),utils.define(n.prototype,"index",function(){let t=this.parentElement;return t?Array.prototype.indexOf.call(t.children,this):-1}),utils.proto(n,"insertChildAt",function(t,e){e<0&&(e=0),e>=this.children.length?this.appendChild(t):this.insertBefore(t,this.children[e])}),utils.boundingRect=t=>new UtilRect(t.getBoundingClientRect()),utils.innerRect=t=>{let e=t.getBoundingClientRect(),i=getComputedStyle(t);return new UtilRect(e.top+parseFloat(i.paddingTop)+parseFloat(i.borderTopWidth),e.bottom-parseFloat(i.paddingBottom)-parseFloat(i.borderBottomWidth),e.left+parseFloat(i.paddingLeft)+parseFloat(i.borderLeftWidth),e.right-parseFloat(i.paddingRight)-parseFloat(i.borderRightWidth))},utils.define(n.prototype,"boundingRect",function(){return utils.boundingRect(this)}),utils.define(n.prototype,"innerRect",function(){return utils.innerRect(this)}),Math.cot=t=>1/Math.tan(t),utils.isBlank=t=>null==t||("string"==typeof t?!/\S/.test(t):"object"==typeof t&&("number"==typeof t.length?0===t.length:0===Object.keys(t).length)),utils.firstEmpty=t=>{let e=t.length;for(let i=0;i<e;++i)if(null==t[i])return i;return e},utils.firstEmptyChar=t=>{let e=Object.keys(t),i=e.length;for(let l=0;l<i;++l)if(null==t[e[l]])return e[l];return utils.numToChar(i)},utils.numToChar=t=>{if(t<=25)return String.fromCharCode(t+97);if(t>=26&&t<=51)return String.fromCharCode(t+39);let e,i;if(t<2756)e=y(Math.floor(t/52)-1,52),i=y(t,52);else if(t<143364)e=y(Math.floor((t-52)/2704)-1,52),i=y(t-52,2704)+52;else{if(!(t<7454980))return!1;e=y(Math.floor((t-2756)/140608)-1,52),i=y(t-2756,140608)+2756}return utils.numToChar(e)+utils.numToChar(i)},utils.merge=function(t){for(let e=1,i=arguments.length,l,n,s;e<i;++e)for(let r in l=arguments[e]){if(n=t[r],s=l[r],n&&s){if(n.length>=0&&s.length>=0){for(let u=0,o=s.length,a=n.length;u<o;++u)n[u+a]=s[u];continue}if("object"==typeof n&&"object"==typeof s){for(let f in s)n[f]=s[f];continue}}t[r]=s}return t},utils.bounds=(t,e=0,i=1)=>t>=e?t<=i?t:i:e,utils.norm=utils.normalize=(t,e=0,i=1)=>{let l=Math.abs(i-e);if(t<e)for(;t<e;)t+=l;else for(;t>=i;)t-=l;return t},utils.cutStr=(t,e)=>{let i;for(;-1!=(i=t.indexOf(e));)t=t.slice(0,i)+t.slice(i+e.length);return t},utils.dCut=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutToLast=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.lastIndexOf(i);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutLast=(t,e,i,l,n)=>{let s=t.lastIndexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.parseCSS=t=>{let e={},i="",l=0;function n(t){if(-1!==t.indexOf(",")){let e=utils.clean(t.split(","));for(let i=0,l=e.length;i<l;++i)e[i]=e[i].trim();return e}return t.trim()}for(t=t.trim();t.length>0;)if("("==t[0]&&-1!==t.indexOf(")")&&i){let s=t.indexOf(")"),r=t.slice(1,s);e[i]=n(r),i="",t=t.slice(s+1)}else if(0==t.search(/[#!\w]/)){i&&(e[l++]=i);let u=t.search(/[^#!\w-%]/);-1==u&&(u=t.length),i=t.slice(0,u),t=t.slice(u)}else t=t.slice(1);return i&&(e[l]=i),e},utils.buildCSS=t=>{let e=Object.keys(t),i=e.length,l="",n=0;for(;n<i;){let s=e[n],r=t[e[n]];++n,0<=Number(s)?l+=r+" ":l+=`${s}(${r}) `}return l.slice(0,-1)},utils.addClass=(t,e)=>{let i=x(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=b(l[s])+":"+e[l[s]]+";";i.addRule("."+t,n)},utils.addId=(t,e)=>{let i=x(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=b(l[s])+":"+e[l[s]]+";";i.addRule("#"+t,n)},utils.addKeyframe=(t,e)=>{x().addRule("@keyframes "+t,e)},utils.removeSelector=t=>{for(let e=0,i,l,n=document.styleSheets.length;e<n;++e){i=document.styleSheets[e];try{l=i.cssRules}catch(s){continue}for(let r in l)"CSSStyleRule"==l[r].constructor.name&&l[r].selectorText==t&&i.deleteRule(r)}},utils.hexToRgb=t=>{let e=parseInt(t.slice(1),16);return[e>>16&255,e>>8&255,255&e]},utils.rgbToHsl=(t,e,i)=>{t/=255;let l=Math.max(t,e/=255,i/=255),n=Math.min(t,e,i),s,r,u=(l+n)/2;if(l===n)s=r=0;else{let o=l-n;switch(r=u>.5?o/(2-l-n):o/(l+n),l){case t:s=(e-i)/o+(e<i?6:0);break;case e:s=(i-t)/o+2;break;case i:s=(t-e)/o+4}s/=6}return[360*s,100*r,100*u]},utils.rand=(t,e,i,l)=>{e*=i=i||1,t*=i;let n=Math.random();return Math.round((l?l(n):n)*(e-t)+t)/i},utils.fromQuery=t=>{function e(t,i){let l=i[0],n=l.indexOf("="),s=decodeURIComponent(l.slice(0,n)),r=decodeURIComponent(l.slice(n+1));return null==t[s]?t[s]=r:Array.isArray(t[s])?t[s].push(r):t[s]=[t[s],r],1===i.length?t:e(t,i.slice(1))}return t.startsWith("?")&&(t=t.slice(1)),t?e({},t.split("&")):{}},utils.toQuery=t=>{let e="",i,l;if("object"!=typeof t)return encodeURIComponent(t);for(i in t)"object"==typeof(l=t[i])&&null!=l&&(l=JSON.stringify(l)),e+="&"+i+"="+encodeURIComponent(l);return e.slice(1)},utils.center=(t,e,i)=>{let l=t.style;if("trans"==i){l.position||(l.position="absolute");let n=utils.cutStr(l.transform,"translateX(-50%)");n=utils.cutStr(n,"translateY(-50%)"),e&&"x"!=e||(l.left="50%",n+="translateX(-50%)"),e&&"y"!=e||(l.top="50%",n+="translateY(-50%)"),n&&(l.transform=n)}else{let s=utils.mkDiv(t.parentNode,null,{display:"flex",top:0,left:0});s.appendChild(t),s=s.style,e&&"x"!=e||(s.justifyContent="center",s.width="100%"),e&&"y"!=e||(s.alignItems="center",s.height="100%",s.position="absolute")}},utils.loadAjax=(t,e,i,l,n)=>{let s;try{s=new XMLHttpRequest}catch(r){return e(r)}if(n)for(let u in n)s.setRequestHeader(u,n[u]);s.open(i||"GET",t),s.onreadystatechange=()=>{let t=s.status||-1;s.readyState==s.DONE&&e(200==t?0:t,s.response,s)},s.send(l||void 0)},utils.loadFile=(t,e,i)=>{let l=utils.mkEl("object",document.body,null,{position:"fixed",opacity:0});l.data=t;let n=setTimeout(()=>{l.remove(),n=null,e(!1)},i||4e3);l.onload=()=>{n&&(clearTimeout(n),e(l.contentDocument.documentElement.outerHTML),l.remove())}},utils.loadJSONP=(t,e,i)=>{let l=utils.mkEl("script",document.head),n=utils.firstEmptyChar(utils.lJSONCall);l.type="application/javascript",l.src=t+(-1==t.indexOf("?")?"?":"&")+"callback=utils.lJSONCall."+n;let s=setTimeout(()=>{delete utils.lJSONCall[n],e(!1)},i||4e3);utils.lJSONCall[n]=t=>{s&&clearTimeout(s),delete utils.lJSONCall[n],e(t)},document.head.removeChild(l)},utils.lJSONCall=[],utils.dlFile=(t,e)=>fetch(e).then(t=>{if(200!=t.status)throw"Code "+t.status;return t.blob()}).then(e=>{utils.dlData(t,e)}),utils.dlData=(t,e)=>{let i,l=utils.mkEl("a",document.body,null,{display:"none"});"string"==typeof e?i=e:(e instanceof Blob||(e=Blob(e)),i=URL.createObjectURL(e)),l.href=i,l.download=t,l.click(),l.remove(),URL.revokeObjectURL(i)},utils.deg=t=>180*t/Math.PI,utils.rad=t=>t*Math.PI/180,utils.map=(t,e,i,l,n,s)=>{let r=(t-e)/(i-e);return(s?s(r):r)*(n-l)+l},utils.delay=t=>new Promise(e=>setTimeout(e,t)),UtilRect=function(t,e,l,n){if(!(this instanceof UtilRect))return new UtilRect(t,e,l,n);let s=Number.isFinite,r=0,u=0,o=0,a=0;utils.define(this,"x",()=>o,t=>{s(t)&&(a+=t-o,o=t)}),utils.define(this,"y",()=>r,t=>{s(t)&&(u+=t-r,r=t)}),utils.define(this,"top",()=>r,t=>{r=s(t)?t:0}),utils.define(this,["bottom","y2"],()=>u,t=>{u=s(t)?t:0}),utils.define(this,"left",()=>o,t=>{o=s(t)?t:0}),utils.define(this,["right","x2"],()=>a,t=>{a=s(t)?t:0}),utils.define(this,["width","w"],()=>a-o,t=>{a=t>=0?o+t:0}),utils.define(this,["height","h"],()=>u-r,t=>{u=t>=0?r+t:0}),utils.define(this,"centerX",()=>o/2+a/2),utils.define(this,"centerY",()=>r/2+u/2),t instanceof i||t instanceof UtilRect?(r=t.top,u=t.bottom,o=t.left,a=t.right):(r=t,u=e,o=l,a=n)},utils.proto(UtilRect,"contains",function(t,e){return t instanceof n?this.contains(t.boundingRect):t instanceof UtilRect?t.x>=this.x&&t.x2<=this.x2&&t.y>=this.y&&t.y2<=this.y2:t>=this.x&&t<=this.x2&&e>=this.y&&e<=this.y2}),utils.proto(UtilRect,"overlaps",function(t){if(t instanceof n)return this.overlaps(t.boundingRect);if(!(t instanceof UtilRect))return 0;let e,i;return e=t.x2-t.x>=this.x2-this.x?this.x>=t.x&&this.x<=t.x2||this.x2>=t.x&&this.x2<=t.x2:t.x>=this.x&&t.x<=this.x2||t.x2>=this.x&&t.x2<=this.x2,i=t.y2-t.y>=this.y2-this.y?this.y>=t.y&&this.y<=t.y2||this.y2>=t.y&&this.y2<=t.y2:t.y>=this.y&&t.y<=this.y2||t.y2>=this.y&&t.y2<=this.y2,e&&i}),utils.proto(UtilRect,"dist",function(t,e){if(t instanceof n)return this.dist(t.boundingRect);let i=t instanceof UtilRect;return e=Math.abs((i?t.centerY:e)-this.centerY),Math.sqrt((t=Math.abs((i?t.centerX:t)-this.centerX))*t+e*e)}),utils.proto(UtilRect,"expand",function(t){return this.top-=t,this.left-=t,this.bottom+=t,this.right+=t,this})})();const Easing={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>t*(2-t),easeInOutQuad:t=>t<.5?2*t*t:-1+(4-2*t)*t,easeInCubic:t=>t*t*t,easeOutCubic:t=>--t*t*t+1,easeInOutCubic:t=>t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1- --t*t*t*t,easeInOutQuart:t=>t<.5?8*t*t*t*t:1-8*--t*t*t*t,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1+--t*t*t*t*t,easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t};if(_uNJS&&!global.utils){let t=import("os").then(e=>t=e);utils.getIPs=()=>{let e=[],i=t.networkInterfaces();for(let l in i)i[l].forEach(t=>{!t.internal&&"IPv4"==t.family&&"00:00:00:00:00:00"!=t.mac&&t.address&&e.push(t.address)});return e.length?e:0},utils.getOS=()=>{let e,i,l;switch(t.platform()){case"win32":e="Windows";break;case"darwin":e="MacOS";break;case"linux":e="Linux";break;default:e=t.platform()}switch(t.arch()){case"ia32":i="32-bit";break;case"x64":i="64-bit";break;case"arm":i="ARM";break;default:i=t.arch()}return[e,i,l=t.cpus()[0].model]},global.utils=utils,global.UtilRect=UtilRect,global.Easing=Easing}
|