ziko 1.4.0 → 1.6.0

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.
Files changed (34) hide show
  1. package/dist/ziko.cjs +396 -117
  2. package/dist/ziko.js +396 -117
  3. package/dist/ziko.min.js +2 -2
  4. package/dist/ziko.mjs +369 -118
  5. package/package.json +1 -1
  6. package/src/dom/components/for/index.js +17 -0
  7. package/src/dom/components/index.js +2 -1
  8. package/src/dom/components/swap/index.js +3 -3
  9. package/src/dom/constructors/UIElement.js +23 -4
  10. package/src/dom/constructors/UIElementCore.js +2 -1
  11. package/src/dom/constructors/mixins/dom.js +31 -22
  12. package/src/math/complex/index.d.ts +207 -30
  13. package/src/math/functions/arithmetic/index.d.ts +95 -0
  14. package/src/math/functions/conversions/index.d.ts +101 -0
  15. package/src/math/functions/index.d.ts +97 -90
  16. package/src/math/functions/logic/index.d.ts +50 -8
  17. package/src/math/functions/logic/index.js +1 -1
  18. package/src/math/functions/mapfun/index.d.ts +46 -80
  19. package/src/math/functions/mapfun/index.d.ts.txt +162 -0
  20. package/src/math/functions/signal/index.d.ts +146 -0
  21. package/src/math/functions/stats/index.js +33 -33
  22. package/src/math/functions/ufunc/index.d.ts +96 -0
  23. package/src/math/functions/utils/index.d.ts +118 -1
  24. package/src/math/index.d.ts +4 -0
  25. package/src/math/index.js +1 -16
  26. package/src/math/random/index.d.ts +162 -0
  27. package/src/math/random/index.js +4 -4
  28. package/src/math/stats/accum/index.d.ts +43 -0
  29. package/src/math/stats/average/index.d.ts +123 -0
  30. package/src/math/stats/index.d.ts +5 -0
  31. package/src/math/stats/percentile/index.d.ts +66 -0
  32. package/src/math/stats/rolling/index.d.ts +47 -0
  33. package/src/math/stats/variability/index.d.ts +93 -0
  34. package/src/math/index.d.ts.txt +0 -5
package/dist/ziko.js CHANGED
@@ -2,7 +2,7 @@
2
2
  /*
3
3
  Project: ziko.js
4
4
  Author: Zakaria Elalaoui
5
- Date : Thu Jul 30 2026 20:50:03 GMT+0100 (UTC+01:00)
5
+ Date : Fri Jul 31 2026 17:26:32 GMT+0100 (UTC+01:00)
6
6
  Git-Repo : https://github.com/zakarialaoui10/ziko.js
7
7
  Git-Wiki : https://github.com/zakarialaoui10/ziko.js/wiki
8
8
  Released under MIT License
@@ -60,122 +60,212 @@
60
60
  return dec.toString(toBase);
61
61
  };
62
62
 
63
- const arithmetic_helper=(op, x, y)=>{
64
- if(typeof x === 'number'){
65
- if(typeof y === 'number'){
66
- switch(op){
67
- case 'add' : return x + y;
68
- case 'sub' : return x - y;
69
- case 'mul' : return x * y;
70
- case 'div' : return x / y;
71
- case 'modulo' : return x % y;
72
- }
73
- }
74
- if(y?.isComplex?.()) x = new y.constructor(x, 0);
75
- if(y?.isMatrix?.()) x = y.constructor.nums(y.rows, y.cols, x);
76
- return x[op](y)
77
- }
78
- if(x?.isComplex?.()){
79
- if(typeof y === 'number' || y?.isComplex?.()) return x.clone()[op](y);
80
- if(y?.isMatrix?.()){
81
- x = y.constructor.nums(y.rows, y.cols, x);
82
- return x.clone()[op](y)
83
- }
84
- }
85
- if(x?.isMatrix?.()){
86
- return x.clone()[op](y)
87
- }
63
+ const percentile = (X, p) => {
64
+ if (X.length === 0)
65
+ return NaN;
66
+ let a = X.sort((x, y) => x - y);
67
+ let index = (p / 100) * (a.length - 1);
68
+ let i = Math.floor(index);
69
+ let f = index - i;
70
+ if (i === a.length - 1)
71
+ return a[i];
72
+ return a[i] * (1 - f) + a[i + 1] * f;
88
73
  };
89
- const add=(a,...b)=>{
90
- let res = a;
91
- for(let i=0; i<b.length; i++)
92
- res = arithmetic_helper('add', res, b[i]);
93
- return res;
74
+
75
+ const q1 = X => percentile(X, 25);
76
+ const median = X => percentile(X, 50);
77
+ const q3 = X => percentile(X, 75);
78
+
79
+ // Interquartile Range
80
+ const iqr = X => q3(X) - q1(X);
81
+
82
+ // Mean
83
+ const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
84
+ const geo_mean = (...x) => (x.reduce((a, b) => a * b)) ** (1/x.length);
85
+ // Quadratic Mean
86
+ const rms = (...x) => {
87
+ const n = x.length;
88
+ return (Math.hypot(...x)/n)**(1/n)
94
89
  };
95
- const sub=(a,...b)=>{
96
- let res = a;
97
- for(let i=0; i<b.length; i++)
98
- res = arithmetic_helper('sub', res, b[i]);
99
- return res;
90
+
91
+ const weighted_mean=(values, weights)=>{
92
+ let sum = 0, sw = 0;
93
+ for (let i = 0; i < values.length; i++) {
94
+ sum += values[i] * weights[i];
95
+ sw += weights[i];
96
+ }
97
+ return sum / sw;
100
98
  };
101
- const mul=(a,...b)=>{
102
- let res = a;
103
- for(let i=0; i<b.length; i++)
104
- res = arithmetic_helper('mul', res, b[i]);
105
- return res;
99
+
100
+ const harmonic_mean = (...x) => {
101
+ let s = 0, i = 0;
102
+ for(i=0; i<x.length; i++)
103
+ s += 1/x[i];
104
+ return x.length / s;
106
105
  };
107
- const div=(a,...b)=>{
108
- let res = a;
109
- for(let i=0; i<b.length; i++)
110
- res = arithmetic_helper('div', res, b[i]);
111
- return res;
106
+
107
+ const power_mean = (X, p) =>{
108
+ let s = 0, i = 0, l = X.length;
109
+ for(i=0; i < l; i++)
110
+ s+= X[i]**p;
111
+ return (s / l) ** (1 / p);
112
112
  };
113
- const modulo=(a,...b)=>{
114
- let res = a;
115
- for(let i=0; i<b.length; i++)
116
- res = arithmetic_helper('modulo', res, b[i]);
117
- return res;
118
- };
119
-
120
- const min = (...x) => Math.min(...x);
121
- const max = (...x) => Math.max(...x);
122
113
 
123
- const binomial = (n, k) =>{
124
- if(n !== Math.floor(n)) return TypeError('n must be an integer');
125
- if(k !== Math.floor(k)) return TypeError('k must be an integer');
126
- if (n < 0) return TypeError('n must be non-negative');
127
- if (k < 0 || n < 0 || k > n) return 0;
128
- if (k > n - k) k = n - k;
129
- let c = 1, i;
130
- for (i = 0; i < k; i++)
131
- c = c * (n - i) / (i + 1);
132
- return c;
114
+ const trimmed_mean = (X, k) =>{
115
+ let a = [...X].sort((a,b)=>a-b).slice(k, X.length - k);
116
+ return mean(...a);
133
117
  };
134
118
 
135
- const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
119
+ const winsorized_mean = (X, k) =>{
120
+ let a = [...X].sort((a,b)=>a-b);
121
+ let low = a[k], high = a[a.length - k - 1];
122
+ a = a.map(x => Math.max(low, Math.min(high, x)));
123
+ return mean(a);
124
+ };
125
+
126
+ const midrange = (x) =>{
127
+ let min = Math.min(...x);
128
+ let max = Math.max(...x);
129
+ return (min + max) / 2;
130
+ };
131
+
132
+ const midhinge = (...x) =>{
133
+ let a = x.sort((a,b)=>a-b);
134
+ let q1 = a[Math.floor((a.length - 1) * 0.25)];
135
+ let q3 = a[Math.floor((a.length - 1) * 0.75)];
136
+ return (q1 + q3) / 2;
137
+ };
136
138
 
139
+
140
+ const interquartile_mean = (...x) =>{
141
+ let a = x.sort((a,b)=>a-b);
142
+ let q1 = a[Math.floor((a.length - 1) * 0.25)];
143
+ let q3 = a[Math.floor((a.length - 1) * 0.75)];
144
+ let m = a.filter(x => x >= q1 && x <= q3);
145
+ return mean(m);
146
+ };
147
+
148
+
149
+ const contraharmonic_mean = (...x) =>{
150
+ let num = 0, den = 0, i, l = x.length;
151
+ for(i = 0; i < l; i++){
152
+ num += x[i]**2;
153
+ den += x[i];
154
+ }
155
+ return num / den;
156
+ };
157
+
158
+ // Population Variance
137
159
  const variance = (...x) => {
138
160
  const n = x.length;
139
161
  if (n === 0) return NaN;
140
162
  const x_mean = mean(...x);
141
163
  return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / n;
142
164
  };
143
-
144
165
  const std = (...x) => Math.sqrt(variance(...x));
145
166
 
146
- const accum_sum = (...x) => {
167
+ const sample_variance = (...x) => {
168
+ const n = x.length;
169
+ if (n < 2) return NaN;
170
+ const x_mean = mean(...x);
171
+ return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / (n - 1);
172
+ };
173
+ const sample_std = (...x) => Math.sqrt(sample_variance(...x));
174
+
175
+ const weighted_variance = (X, weights) => {
176
+ const n = X.length;
177
+ if (n === 0 || weights.length !== n) return NaN;
178
+ const sw = weights.reduce((sum, w) => sum + w, 0);
179
+ const mean = X.reduce((sum, x, i) => sum + x * weights[i], 0) / sw;
180
+ return X.reduce((sum, x, i) => sum + weights[i] * (x - mean) ** 2, 0) / sw;
181
+ };
182
+ const weighted_std = (X, weights) => Math.sqrt(weighted_variance(X, weights));
183
+
184
+ const rolling_variance = (X, windowSize) => {
185
+ if (windowSize < 1 || X.length < windowSize) return [];
147
186
  let result = [];
148
- let total = 0, i, n = x.length;
149
- for(i = 0; i < n ; i++){
150
- total = add(total, x[i]);
187
+ for (let i = 0; i <= X.length - windowSize; i++) {
188
+ const w = X.slice(i, i + windowSize);
189
+ result.push(sample_variance(w)); // usually sample variance for rolling
190
+ }
191
+ return result;
192
+ };
193
+ const rolling_std = (X, windowSize) => Math.sqrt(rolling_variance(X, windowSize));
194
+
195
+ // Simple Moving Average
196
+ const sma = (X, w) =>{
197
+ let r = [];
198
+ for (let i = 0; i <= X.length - w; i++) {
199
+ let s = 0;
200
+ for (let j = 0; j < w; j++) s += X[i + j];
201
+ r.push(s / w);
202
+ }
203
+ return r;
204
+ };
205
+
206
+ // exponential Moving Average
207
+ const ema = (X, alpha) =>{
208
+ let r = [], prev = X[0];
209
+ r.push(prev);
210
+ for (let i = 1; i < X.length; i++) {
211
+ prev = alpha * X[i] + (1 - alpha) * prev;
212
+ r.push(prev);
213
+ }
214
+ return r;
215
+ };
216
+
217
+ // weightedMovingAverage
218
+ const wma = (X, weights) =>{
219
+ let k = weights.length;
220
+ let sw = weights.reduce((a,b)=>a+b, 0);
221
+ let r = [];
222
+ for (let i = 0; i <= X.length - k; i++) {
223
+ let s = 0;
224
+ for (let j = 0; j < k; j++) s += X[i+j] * weights[j];
225
+ r.push(s / sw);
226
+ }
227
+ return r;
228
+ };
229
+
230
+ const accum_sum = (arr) => {
231
+ let result = [];
232
+ let total = 0;
233
+ for (let x of arr) {
234
+ total += x;
151
235
  result.push(total);
152
236
  }
153
237
  return result;
154
238
  };
155
239
 
156
- const accum_prod = (...x) => {
240
+ const accum_product = (arr) => {
157
241
  let result = [];
158
- let prod = 1, i, n = x.length;
159
- for(i = 0; i < n ; i++){
160
- prod = mul(prod, x[i]);
242
+ let prod = 1;
243
+ for (let x of arr) {
244
+ prod *= x;
161
245
  result.push(prod);
162
246
  }
163
247
  return result;
164
248
  };
165
249
 
166
- const percentile = (X, p) => {
167
- if (X.length === 0)
168
- return NaN;
169
- let a = [...X].sort((x, y) => x - y);
170
- let index = (p / 100) * (a.length - 1);
171
- let i = Math.floor(index);
172
- let f = index - i;
173
- if (i === a.length - 1)
174
- return a[i];
175
- return a[i] * (1 - f) + a[i + 1] * f;
250
+ const accum_max = (arr) => {
251
+ let result = [];
252
+ let m = -Infinity;
253
+ for (let x of arr) {
254
+ m = Math.max(m, x);
255
+ result.push(m);
256
+ }
257
+ return result;
176
258
  };
177
259
 
178
- const median = X => percentile(X, 50);
260
+ const accum_min = (arr) => {
261
+ let result = [];
262
+ let m = Infinity;
263
+ for (let x of arr) {
264
+ m = Math.min(m, x);
265
+ result.push(m);
266
+ }
267
+ return result;
268
+ };
179
269
 
180
270
  class Random {
181
271
  static int(a, b){
@@ -250,9 +340,9 @@
250
340
  static get sample(){
251
341
  const R = this;
252
342
  return {
253
- int : (n,a,b) => Array.from({length:n}, () => R.int(a,b)),
254
- float : (n,a,b) => Array.from({length:n}, () => R.float(a,b)),
255
- char : (n,upper=false) => Array.from({length:n}, () => R.char(upper)),
343
+ int : (n, a, b) => Array.from({length:n}, () => R.int(a, b)),
344
+ float : (n, a, b) => Array.from({length:n}, () => R.float(a, b)),
345
+ char : (n, upper=false) => Array.from({length:n}, () => R.char(upper)),
256
346
  bool : n => Array.from({length:n}, () => R.bool()),
257
347
  bin : n => Array.from({length:n}, () => R.bin()),
258
348
  oct : n => Array.from({length:n}, () => R.oct()),
@@ -893,6 +983,63 @@
893
983
  ...x
894
984
  );
895
985
 
986
+ const arithmetic_helper=(op, x, y)=>{
987
+ if(typeof x === 'number'){
988
+ if(typeof y === 'number'){
989
+ switch(op){
990
+ case 'add' : return x + y;
991
+ case 'sub' : return x - y;
992
+ case 'mul' : return x * y;
993
+ case 'div' : return x / y;
994
+ case 'modulo' : return x % y;
995
+ }
996
+ }
997
+ if(y?.isComplex?.()) x = new y.constructor(x, 0);
998
+ if(y?.isMatrix?.()) x = y.constructor.nums(y.rows, y.cols, x);
999
+ return x[op](y)
1000
+ }
1001
+ if(x?.isComplex?.()){
1002
+ if(typeof y === 'number' || y?.isComplex?.()) return x.clone()[op](y);
1003
+ if(y?.isMatrix?.()){
1004
+ x = y.constructor.nums(y.rows, y.cols, x);
1005
+ return x.clone()[op](y)
1006
+ }
1007
+ }
1008
+ if(x?.isMatrix?.()){
1009
+ return x.clone()[op](y)
1010
+ }
1011
+ };
1012
+ const add=(a,...b)=>{
1013
+ let res = a;
1014
+ for(let i=0; i<b.length; i++)
1015
+ res = arithmetic_helper('add', res, b[i]);
1016
+ return res;
1017
+ };
1018
+ const sub=(a,...b)=>{
1019
+ let res = a;
1020
+ for(let i=0; i<b.length; i++)
1021
+ res = arithmetic_helper('sub', res, b[i]);
1022
+ return res;
1023
+ };
1024
+ const mul=(a,...b)=>{
1025
+ let res = a;
1026
+ for(let i=0; i<b.length; i++)
1027
+ res = arithmetic_helper('mul', res, b[i]);
1028
+ return res;
1029
+ };
1030
+ const div=(a,...b)=>{
1031
+ let res = a;
1032
+ for(let i=0; i<b.length; i++)
1033
+ res = arithmetic_helper('div', res, b[i]);
1034
+ return res;
1035
+ };
1036
+ const modulo=(a,...b)=>{
1037
+ let res = a;
1038
+ for(let i=0; i<b.length; i++)
1039
+ res = arithmetic_helper('modulo', res, b[i]);
1040
+ return res;
1041
+ };
1042
+
896
1043
  const deg2rad = (...deg) => mapfun$1(x => x * Math.PI / 180, ...deg);
897
1044
  const rad2deg = (...rad) => mapfun$1(x => x / Math.PI * 180, ...rad);
898
1045
 
@@ -937,6 +1084,66 @@
937
1084
  return rad ? phi : phi * 180 / Math.PI;
938
1085
  };
939
1086
 
1087
+ const min = (...x) => Math.min(...x);
1088
+ const max = (...x) => Math.max(...x);
1089
+
1090
+ const binomial = (n, k) =>{
1091
+ if(n !== Math.floor(n)) return TypeError('n must be an integer');
1092
+ if(k !== Math.floor(k)) return TypeError('k must be an integer');
1093
+ if (n < 0) return TypeError('n must be non-negative');
1094
+ if (k < 0 || n < 0 || k > n) return 0;
1095
+ if (k > n - k) k = n - k;
1096
+ let c = 1, i;
1097
+ for (i = 0; i < k; i++)
1098
+ c = c * (n - i) / (i + 1);
1099
+ return c;
1100
+ };
1101
+
1102
+ // export const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
1103
+
1104
+ // export const variance = (...x) => {
1105
+ // const n = x.length;
1106
+ // if (n === 0) return NaN;
1107
+ // const x_mean = mean(...x);
1108
+ // return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / n;
1109
+ // };
1110
+
1111
+ // export const std = (...x) => Math.sqrt(variance(...x));
1112
+
1113
+ // export const accum_sum = (...x) => {
1114
+ // let result = [];
1115
+ // let total = 0, i, n = x.length;
1116
+ // for(i = 0; i < n ; i++){
1117
+ // total = add(total, x[i])
1118
+ // result.push(total);
1119
+ // }
1120
+ // return result;
1121
+ // };
1122
+
1123
+ const accum_prod = (...x) => {
1124
+ let result = [];
1125
+ let prod = 1, i, n = x.length;
1126
+ for(i = 0; i < n ; i++){
1127
+ prod = mul(prod, x[i]);
1128
+ result.push(prod);
1129
+ }
1130
+ return result;
1131
+ };
1132
+
1133
+ // export const percentile = (X, p) => {
1134
+ // if (X.length === 0)
1135
+ // return NaN;
1136
+ // let a = [...X].sort((x, y) => x - y);
1137
+ // let index = (p / 100) * (a.length - 1);
1138
+ // let i = Math.floor(index);
1139
+ // let f = index - i;
1140
+ // if (i === a.length - 1)
1141
+ // return a[i];
1142
+ // return a[i] * (1 - f) + a[i + 1] * f;
1143
+ // }
1144
+
1145
+ // export const median = X => percentile(X, 50);
1146
+
940
1147
  const not = x => {
941
1148
  if(x.isComplex?.()) return new x.constructor(not(x.a), not(x.b))
942
1149
  if(x.isMatrix?.()) return new x.constructor(x.rows, x.cols, x.arr.flat(1).map(not))
@@ -2049,6 +2256,7 @@
2049
2256
  else this.target = element?.parentElement;
2050
2257
  Object.assign(this.cache, {
2051
2258
  name,
2259
+ itemsTarget : this,
2052
2260
  isInteractive : false,
2053
2261
  parent:null,
2054
2262
  isBody:false,
@@ -2085,7 +2293,7 @@
2085
2293
  get element(){
2086
2294
  return this.cache.element;
2087
2295
  }
2088
- [Symbol.iterator]() {
2296
+ [Symbol.iterator](){
2089
2297
  return this.items[Symbol.iterator]();
2090
2298
  }
2091
2299
  maintain() {
@@ -2311,12 +2519,6 @@
2311
2519
  }
2312
2520
  const text = (...str) => new ZikoUIText(...str);
2313
2521
 
2314
- // import { isStateGetter } from "../../../hooks/use-state.js";
2315
- // import {
2316
- // is_camelcase,
2317
- // camel2hyphencase
2318
- // } from '../../../data/string/index.js';
2319
-
2320
2522
  function append(...ele) {
2321
2523
  __addItem__.call(this, "append", "push", ...ele);
2322
2524
  return this;
@@ -2326,19 +2528,30 @@
2326
2528
  return this;
2327
2529
  }
2328
2530
  function insertAt(index, ...ele) {
2329
- if (index >= this.element.children.length) this.append(...ele);
2330
- else
2531
+ const target = this.itemsTarget;
2532
+
2533
+ if (index >= target.items.length) return this.append(...ele);
2534
+
2331
2535
  for (let i = 0; i < ele.length; i++) {
2332
- if (["number", "string"].includes(typeof ele[i])) ele[i] = text(ele[i]);
2333
- this.element?.insertBefore(ele[i].element, this.items[index].element);
2334
- this.items.splice(index, 0, ele[i]);
2536
+ if (["number", "string"].includes(typeof ele[i]))
2537
+ ele[i] = text(ele[i]);
2538
+
2539
+ target.element?.insertBefore(
2540
+ ele[i].element,
2541
+ target.items[index].element
2542
+ );
2543
+
2544
+ target.items.splice(index, 0, ele[i]);
2335
2545
  }
2336
- return this;
2546
+
2547
+ target.maintain();
2548
+
2549
+ return this;
2337
2550
  }
2338
2551
  function remove(...ele) {
2339
2552
  const remove = (ele) => {
2340
2553
  if (typeof ele === "number") ele = this.items[ele];
2341
- if (ele?.isUIElement) this.element?.removeChild(ele.element);
2554
+ if (ele?.isUIElement) this.itemsTarget.element?.removeChild(ele.element);
2342
2555
  this.items = this.items.filter((n) => n !== ele);
2343
2556
  };
2344
2557
  for (let i = 0; i < ele.length; i++) remove(ele[i]);
@@ -2349,7 +2562,7 @@
2349
2562
  }
2350
2563
  function clear(){
2351
2564
  this?.items?.forEach(n=>n.unmount());
2352
- this.element.innerHTML = "";
2565
+ this.itemsTarget.element.innerHTML = '';
2353
2566
  return this;
2354
2567
  }
2355
2568
  function replaceElementWith(new_element){
@@ -2361,12 +2574,12 @@
2361
2574
  }
2362
2575
  function after(ui){
2363
2576
  if(ui?.isUIElement) ui=ui.element;
2364
- this.element?.after(ui);
2577
+ this.itemsTarget.element?.after(ui);
2365
2578
  return this;
2366
2579
  }
2367
2580
  function before(ui){
2368
2581
  if(ui?.isUIElement) ui=ui.element;
2369
- this.element?.before(ui);
2582
+ this.itemsTarget.element?.before(ui);
2370
2583
  return this;
2371
2584
  }
2372
2585
 
@@ -2374,6 +2587,9 @@
2374
2587
 
2375
2588
 
2376
2589
  async function __addItem__(adder, pusher, ...ele) {
2590
+ const itemsTarget_el = this.itemsTarget.element;
2591
+ const itemsTarget = this.itemsTarget;
2592
+
2377
2593
  if (this.cache.isFrozzen) {
2378
2594
  console.warn("You can't append new item to frozzen element");
2379
2595
  return this;
@@ -2389,22 +2605,22 @@
2389
2605
  (newValue) => (ele[i].element.textContent = newValue),
2390
2606
  ele[i]
2391
2607
  );
2392
- // this.element.appendChild(textNode);
2608
+ // this.itemsTarget.element.appendChild(textNode);
2393
2609
  }
2394
2610
  }
2395
2611
  if (typeof globalThis?.Node === "function" && ele[i] instanceof globalThis?.Node) ele[i] = new this.constructor(ele[i]);
2396
2612
  if (ele[i]?.isUINode) {
2397
2613
  ele[i].cache.parent = this;
2398
- this.element?.[adder](ele[i].element);
2399
- ele[i].target = this.element;
2400
- this.items[pusher](ele[i]);
2614
+ itemsTarget_el?.[adder](ele[i].element);
2615
+ ele[i].target = this.itemsTarget.element;
2616
+ itemsTarget.items[pusher](ele[i]);
2401
2617
  }
2402
2618
  else if(ele[i] instanceof Promise){
2403
2619
  const UIEle = await ele[i];
2404
2620
  UIEle.cache.parent = this;
2405
- this.element?.[adder](UIEle.element);
2406
- UIEle.target = this.element;
2407
- this.items[pusher](UIEle);
2621
+ itemsTarget_el?.[adder](UIEle.element);
2622
+ UIEle.target = this.itemsTarget.element;
2623
+ itemsTarget.items[pusher](UIEle);
2408
2624
  }
2409
2625
  else if (ele[i] instanceof Object) {
2410
2626
  if (ele[i]?.style) this.style(ele[i]?.style);
@@ -2895,7 +3111,14 @@
2895
3111
 
2896
3112
  if(element)this.init(element, name, type, render);
2897
3113
  }
2898
- on(event_name, callback, {details_setter, category = 'global', isCustom = false,preventDefault = false} = {}){
3114
+ on(event_name, callback, {details_setter, category = 'global', isCustom = false, preventDefault = false} = {}){
3115
+ if(event_name instanceof Array) event_name.forEach(
3116
+ event => this.on(
3117
+ event,
3118
+ callback,
3119
+ {details_setter, category, isCustom, preventDefault}
3120
+ )
3121
+ );
2899
3122
  if(category && !this.exp.events.hasOwnProperty(category)) this.exp.events[category] = new EventController(this, category);
2900
3123
  isCustom && this.exp.events[category].cache.customEvents.add(event_name);
2901
3124
  const EVENT = this.exp.events[category];
@@ -2909,10 +3132,22 @@
2909
3132
  }
2910
3133
  _off(event, category = 'global'){
2911
3134
  this.exp.events[category].removeListener(event);
3135
+ return this
2912
3136
  }
2913
3137
  get element(){
2914
3138
  return this.cache.element;
2915
3139
  }
3140
+ get itemsTarget(){
3141
+ return this.cache.itemsTarget;
3142
+ }
3143
+ get itemsTargetElement(){
3144
+ return this.itemsTarget.element;
3145
+ }
3146
+ setItemsTarget(parent){
3147
+ this.cache.itemsTarget = parent;
3148
+ this.items = parent.items;
3149
+ return this;
3150
+ }
2916
3151
  isInteractive(){
2917
3152
  return this.cache.isInteractive;
2918
3153
  }
@@ -3519,14 +3754,14 @@
3519
3754
  };
3520
3755
 
3521
3756
  this.append(...items);
3522
- this.#setup();
3757
+ this.render();
3523
3758
  }
3524
3759
  get activeItem(){
3525
3760
  return this.items[this.states.activeIndex]
3526
3761
  }
3527
- #setup() {
3762
+ render() {
3528
3763
  this.items.forEach((n, i) => {
3529
- // Store initial display style (fallback to empty string or default)
3764
+
3530
3765
  const initialDisplay = n.element?.style?.display || '';
3531
3766
  this.#DISPLAYS_MAP.set(n, initialDisplay);
3532
3767
 
@@ -3577,6 +3812,22 @@
3577
3812
 
3578
3813
  const Fragment = (...items) => new UIFragment(...items);
3579
3814
 
3815
+ class UIFor extends UIFragment{
3816
+ constructor({each, fallback, mapFn = () => {}} = {}){
3817
+ super();
3818
+ this.config = {
3819
+ each,
3820
+ fallback,
3821
+ mapFn
3822
+ };
3823
+ this.append(
3824
+ ...this.config.each.map((n,i) => this.config.mapFn(n, i))
3825
+ );
3826
+ }
3827
+ }
3828
+
3829
+ const For = ({each, fallback, mapFn} = {}) => new UIFor({each, fallback, mapFn});
3830
+
3580
3831
  const { PI, sqrt: sqrt$1, cos: cos$2, sin: sin$2, acos, pow } = Math;
3581
3832
 
3582
3833
  const linear = t => t;
@@ -4993,6 +5244,7 @@
4993
5244
  exports.EventController = EventController;
4994
5245
  exports.FileBasedRouting = FileBasedRouting;
4995
5246
  exports.Flex = Flex;
5247
+ exports.For = For;
4996
5248
  exports.Fragment = Fragment;
4997
5249
  exports.HTMLWrapper = HTMLWrapper;
4998
5250
  exports.KeyListeners = KeyListeners;
@@ -5030,7 +5282,10 @@
5030
5282
  exports.ZikoUISuspense = ZikoUISuspense;
5031
5283
  exports.ZikoUIText = ZikoUIText;
5032
5284
  exports.abs = abs;
5285
+ exports.accum_max = accum_max;
5286
+ exports.accum_min = accum_min;
5033
5287
  exports.accum_prod = accum_prod;
5288
+ exports.accum_product = accum_product;
5034
5289
  exports.accum_sum = accum_sum;
5035
5290
  exports.acos = acos$1;
5036
5291
  exports.acosh = acosh;
@@ -5056,6 +5311,7 @@
5056
5311
  exports.clock = clock;
5057
5312
  exports.cloneUI = cloneUI;
5058
5313
  exports.complex = complex;
5314
+ exports.contraharmonic_mean = contraharmonic_mean;
5059
5315
  exports.cos = cos$3;
5060
5316
  exports.cosh = cosh$2;
5061
5317
  exports.coth = coth;
@@ -5072,9 +5328,12 @@
5072
5328
  exports.discret = discret;
5073
5329
  exports.div = div;
5074
5330
  exports.elastic = elastic;
5331
+ exports.ema = ema;
5075
5332
  exports.exp = exp$1;
5076
5333
  exports.floor = floor;
5077
5334
  exports.fract = fract;
5335
+ exports.geo_mean = geo_mean;
5336
+ exports.harmonic_mean = harmonic_mean;
5078
5337
  exports.hypot = hypot;
5079
5338
  exports.in_back = in_back;
5080
5339
  exports.in_bounce = in_bounce;
@@ -5096,6 +5355,8 @@
5096
5355
  exports.in_quart = in_quart;
5097
5356
  exports.in_quint = in_quint;
5098
5357
  exports.in_sin = in_sin;
5358
+ exports.interquartile_mean = interquartile_mean;
5359
+ exports.iqr = iqr;
5099
5360
  exports.isPrimitive = isPrimitive;
5100
5361
  exports.isStateGetter = isStateGetter;
5101
5362
  exports.json2arr = json2arr;
@@ -5120,6 +5381,8 @@
5120
5381
  exports.max = max;
5121
5382
  exports.mean = mean;
5122
5383
  exports.median = median;
5384
+ exports.midhinge = midhinge;
5385
+ exports.midrange = midrange;
5123
5386
  exports.min = min;
5124
5387
  exports.modulo = modulo;
5125
5388
  exports.mul = mul;
@@ -5127,6 +5390,7 @@
5127
5390
  exports.nor = nor;
5128
5391
  exports.norm = norm;
5129
5392
  exports.normalize_css_value = normalize_css_value;
5393
+ exports.not = not;
5130
5394
  exports.nthr = nthr;
5131
5395
  exports.or = or;
5132
5396
  exports.out_back = out_back;
@@ -5141,12 +5405,20 @@
5141
5405
  exports.out_sin = out_sin;
5142
5406
  exports.percentile = percentile;
5143
5407
  exports.pow = pow$1;
5408
+ exports.power_mean = power_mean;
5409
+ exports.q1 = q1;
5410
+ exports.q3 = q3;
5144
5411
  exports.rad2deg = rad2deg;
5145
5412
  exports.register_click_away_event = register_click_away_event;
5146
5413
  exports.register_swipe_event = register_swipe_event;
5147
5414
  exports.register_view_event = register_view_event;
5148
5415
  exports.remove_class = remove_class;
5416
+ exports.rms = rms;
5417
+ exports.rolling_std = rolling_std;
5418
+ exports.rolling_variance = rolling_variance;
5149
5419
  exports.round = round;
5420
+ exports.sample_std = sample_std;
5421
+ exports.sample_variance = sample_variance;
5150
5422
  exports.script = script;
5151
5423
  exports.sec = sec;
5152
5424
  exports.sig = sig;
@@ -5154,6 +5426,7 @@
5154
5426
  exports.sin = sin$3;
5155
5427
  exports.sinh = sinh$1;
5156
5428
  exports.sleep = sleep;
5429
+ exports.sma = sma;
5157
5430
  exports.sqrt = sqrt$2;
5158
5431
  exports.std = std;
5159
5432
  exports.step = step;
@@ -5173,6 +5446,7 @@
5173
5446
  exports.timeTaken = timeTaken;
5174
5447
  exports.time_memory_Taken = time_memory_Taken;
5175
5448
  exports.timeout = timeout;
5449
+ exports.trimmed_mean = trimmed_mean;
5176
5450
  exports.trunc = trunc;
5177
5451
  exports.useDerived = useDerived;
5178
5452
  exports.useEventEmitter = useEventEmitter;
@@ -5192,6 +5466,11 @@
5192
5466
  exports.waitForUIElm = waitForUIElm;
5193
5467
  exports.waitForUIElmSync = waitForUIElmSync;
5194
5468
  exports.watchQueryParams = watchQueryParams;
5469
+ exports.weighted_mean = weighted_mean;
5470
+ exports.weighted_std = weighted_std;
5471
+ exports.weighted_variance = weighted_variance;
5472
+ exports.winsorized_mean = winsorized_mean;
5473
+ exports.wma = wma;
5195
5474
  exports.xnor = xnor;
5196
5475
  exports.xor = xor;
5197
5476