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.cjs 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
@@ -56,122 +56,212 @@ const base2base = (value, fromBase, toBase) => {
56
56
  return dec.toString(toBase);
57
57
  };
58
58
 
59
- const arithmetic_helper=(op, x, y)=>{
60
- if(typeof x === 'number'){
61
- if(typeof y === 'number'){
62
- switch(op){
63
- case 'add' : return x + y;
64
- case 'sub' : return x - y;
65
- case 'mul' : return x * y;
66
- case 'div' : return x / y;
67
- case 'modulo' : return x % y;
68
- }
69
- }
70
- if(y?.isComplex?.()) x = new y.constructor(x, 0);
71
- if(y?.isMatrix?.()) x = y.constructor.nums(y.rows, y.cols, x);
72
- return x[op](y)
73
- }
74
- if(x?.isComplex?.()){
75
- if(typeof y === 'number' || y?.isComplex?.()) return x.clone()[op](y);
76
- if(y?.isMatrix?.()){
77
- x = y.constructor.nums(y.rows, y.cols, x);
78
- return x.clone()[op](y)
79
- }
80
- }
81
- if(x?.isMatrix?.()){
82
- return x.clone()[op](y)
83
- }
59
+ const percentile = (X, p) => {
60
+ if (X.length === 0)
61
+ return NaN;
62
+ let a = X.sort((x, y) => x - y);
63
+ let index = (p / 100) * (a.length - 1);
64
+ let i = Math.floor(index);
65
+ let f = index - i;
66
+ if (i === a.length - 1)
67
+ return a[i];
68
+ return a[i] * (1 - f) + a[i + 1] * f;
84
69
  };
85
- const add=(a,...b)=>{
86
- let res = a;
87
- for(let i=0; i<b.length; i++)
88
- res = arithmetic_helper('add', res, b[i]);
89
- return res;
70
+
71
+ const q1 = X => percentile(X, 25);
72
+ const median = X => percentile(X, 50);
73
+ const q3 = X => percentile(X, 75);
74
+
75
+ // Interquartile Range
76
+ const iqr = X => q3(X) - q1(X);
77
+
78
+ // Mean
79
+ const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
80
+ const geo_mean = (...x) => (x.reduce((a, b) => a * b)) ** (1/x.length);
81
+ // Quadratic Mean
82
+ const rms = (...x) => {
83
+ const n = x.length;
84
+ return (Math.hypot(...x)/n)**(1/n)
90
85
  };
91
- const sub=(a,...b)=>{
92
- let res = a;
93
- for(let i=0; i<b.length; i++)
94
- res = arithmetic_helper('sub', res, b[i]);
95
- return res;
86
+
87
+ const weighted_mean=(values, weights)=>{
88
+ let sum = 0, sw = 0;
89
+ for (let i = 0; i < values.length; i++) {
90
+ sum += values[i] * weights[i];
91
+ sw += weights[i];
92
+ }
93
+ return sum / sw;
96
94
  };
97
- const mul=(a,...b)=>{
98
- let res = a;
99
- for(let i=0; i<b.length; i++)
100
- res = arithmetic_helper('mul', res, b[i]);
101
- return res;
95
+
96
+ const harmonic_mean = (...x) => {
97
+ let s = 0, i = 0;
98
+ for(i=0; i<x.length; i++)
99
+ s += 1/x[i];
100
+ return x.length / s;
102
101
  };
103
- const div=(a,...b)=>{
104
- let res = a;
105
- for(let i=0; i<b.length; i++)
106
- res = arithmetic_helper('div', res, b[i]);
107
- return res;
102
+
103
+ const power_mean = (X, p) =>{
104
+ let s = 0, i = 0, l = X.length;
105
+ for(i=0; i < l; i++)
106
+ s+= X[i]**p;
107
+ return (s / l) ** (1 / p);
108
108
  };
109
- const modulo=(a,...b)=>{
110
- let res = a;
111
- for(let i=0; i<b.length; i++)
112
- res = arithmetic_helper('modulo', res, b[i]);
113
- return res;
114
- };
115
-
116
- const min = (...x) => Math.min(...x);
117
- const max = (...x) => Math.max(...x);
118
109
 
119
- const binomial = (n, k) =>{
120
- if(n !== Math.floor(n)) return TypeError('n must be an integer');
121
- if(k !== Math.floor(k)) return TypeError('k must be an integer');
122
- if (n < 0) return TypeError('n must be non-negative');
123
- if (k < 0 || n < 0 || k > n) return 0;
124
- if (k > n - k) k = n - k;
125
- let c = 1, i;
126
- for (i = 0; i < k; i++)
127
- c = c * (n - i) / (i + 1);
128
- return c;
110
+ const trimmed_mean = (X, k) =>{
111
+ let a = [...X].sort((a,b)=>a-b).slice(k, X.length - k);
112
+ return mean(...a);
129
113
  };
130
114
 
131
- const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
115
+ const winsorized_mean = (X, k) =>{
116
+ let a = [...X].sort((a,b)=>a-b);
117
+ let low = a[k], high = a[a.length - k - 1];
118
+ a = a.map(x => Math.max(low, Math.min(high, x)));
119
+ return mean(a);
120
+ };
121
+
122
+ const midrange = (x) =>{
123
+ let min = Math.min(...x);
124
+ let max = Math.max(...x);
125
+ return (min + max) / 2;
126
+ };
127
+
128
+ const midhinge = (...x) =>{
129
+ let a = x.sort((a,b)=>a-b);
130
+ let q1 = a[Math.floor((a.length - 1) * 0.25)];
131
+ let q3 = a[Math.floor((a.length - 1) * 0.75)];
132
+ return (q1 + q3) / 2;
133
+ };
132
134
 
135
+
136
+ const interquartile_mean = (...x) =>{
137
+ let a = x.sort((a,b)=>a-b);
138
+ let q1 = a[Math.floor((a.length - 1) * 0.25)];
139
+ let q3 = a[Math.floor((a.length - 1) * 0.75)];
140
+ let m = a.filter(x => x >= q1 && x <= q3);
141
+ return mean(m);
142
+ };
143
+
144
+
145
+ const contraharmonic_mean = (...x) =>{
146
+ let num = 0, den = 0, i, l = x.length;
147
+ for(i = 0; i < l; i++){
148
+ num += x[i]**2;
149
+ den += x[i];
150
+ }
151
+ return num / den;
152
+ };
153
+
154
+ // Population Variance
133
155
  const variance = (...x) => {
134
156
  const n = x.length;
135
157
  if (n === 0) return NaN;
136
158
  const x_mean = mean(...x);
137
159
  return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / n;
138
160
  };
139
-
140
161
  const std = (...x) => Math.sqrt(variance(...x));
141
162
 
142
- const accum_sum = (...x) => {
163
+ const sample_variance = (...x) => {
164
+ const n = x.length;
165
+ if (n < 2) return NaN;
166
+ const x_mean = mean(...x);
167
+ return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / (n - 1);
168
+ };
169
+ const sample_std = (...x) => Math.sqrt(sample_variance(...x));
170
+
171
+ const weighted_variance = (X, weights) => {
172
+ const n = X.length;
173
+ if (n === 0 || weights.length !== n) return NaN;
174
+ const sw = weights.reduce((sum, w) => sum + w, 0);
175
+ const mean = X.reduce((sum, x, i) => sum + x * weights[i], 0) / sw;
176
+ return X.reduce((sum, x, i) => sum + weights[i] * (x - mean) ** 2, 0) / sw;
177
+ };
178
+ const weighted_std = (X, weights) => Math.sqrt(weighted_variance(X, weights));
179
+
180
+ const rolling_variance = (X, windowSize) => {
181
+ if (windowSize < 1 || X.length < windowSize) return [];
143
182
  let result = [];
144
- let total = 0, i, n = x.length;
145
- for(i = 0; i < n ; i++){
146
- total = add(total, x[i]);
183
+ for (let i = 0; i <= X.length - windowSize; i++) {
184
+ const w = X.slice(i, i + windowSize);
185
+ result.push(sample_variance(w)); // usually sample variance for rolling
186
+ }
187
+ return result;
188
+ };
189
+ const rolling_std = (X, windowSize) => Math.sqrt(rolling_variance(X, windowSize));
190
+
191
+ // Simple Moving Average
192
+ const sma = (X, w) =>{
193
+ let r = [];
194
+ for (let i = 0; i <= X.length - w; i++) {
195
+ let s = 0;
196
+ for (let j = 0; j < w; j++) s += X[i + j];
197
+ r.push(s / w);
198
+ }
199
+ return r;
200
+ };
201
+
202
+ // exponential Moving Average
203
+ const ema = (X, alpha) =>{
204
+ let r = [], prev = X[0];
205
+ r.push(prev);
206
+ for (let i = 1; i < X.length; i++) {
207
+ prev = alpha * X[i] + (1 - alpha) * prev;
208
+ r.push(prev);
209
+ }
210
+ return r;
211
+ };
212
+
213
+ // weightedMovingAverage
214
+ const wma = (X, weights) =>{
215
+ let k = weights.length;
216
+ let sw = weights.reduce((a,b)=>a+b, 0);
217
+ let r = [];
218
+ for (let i = 0; i <= X.length - k; i++) {
219
+ let s = 0;
220
+ for (let j = 0; j < k; j++) s += X[i+j] * weights[j];
221
+ r.push(s / sw);
222
+ }
223
+ return r;
224
+ };
225
+
226
+ const accum_sum = (arr) => {
227
+ let result = [];
228
+ let total = 0;
229
+ for (let x of arr) {
230
+ total += x;
147
231
  result.push(total);
148
232
  }
149
233
  return result;
150
234
  };
151
235
 
152
- const accum_prod = (...x) => {
236
+ const accum_product = (arr) => {
153
237
  let result = [];
154
- let prod = 1, i, n = x.length;
155
- for(i = 0; i < n ; i++){
156
- prod = mul(prod, x[i]);
238
+ let prod = 1;
239
+ for (let x of arr) {
240
+ prod *= x;
157
241
  result.push(prod);
158
242
  }
159
243
  return result;
160
244
  };
161
245
 
162
- const percentile = (X, p) => {
163
- if (X.length === 0)
164
- return NaN;
165
- let a = [...X].sort((x, y) => x - y);
166
- let index = (p / 100) * (a.length - 1);
167
- let i = Math.floor(index);
168
- let f = index - i;
169
- if (i === a.length - 1)
170
- return a[i];
171
- return a[i] * (1 - f) + a[i + 1] * f;
246
+ const accum_max = (arr) => {
247
+ let result = [];
248
+ let m = -Infinity;
249
+ for (let x of arr) {
250
+ m = Math.max(m, x);
251
+ result.push(m);
252
+ }
253
+ return result;
172
254
  };
173
255
 
174
- const median = X => percentile(X, 50);
256
+ const accum_min = (arr) => {
257
+ let result = [];
258
+ let m = Infinity;
259
+ for (let x of arr) {
260
+ m = Math.min(m, x);
261
+ result.push(m);
262
+ }
263
+ return result;
264
+ };
175
265
 
176
266
  class Random {
177
267
  static int(a, b){
@@ -246,9 +336,9 @@ class Random {
246
336
  static get sample(){
247
337
  const R = this;
248
338
  return {
249
- int : (n,a,b) => Array.from({length:n}, () => R.int(a,b)),
250
- float : (n,a,b) => Array.from({length:n}, () => R.float(a,b)),
251
- char : (n,upper=false) => Array.from({length:n}, () => R.char(upper)),
339
+ int : (n, a, b) => Array.from({length:n}, () => R.int(a, b)),
340
+ float : (n, a, b) => Array.from({length:n}, () => R.float(a, b)),
341
+ char : (n, upper=false) => Array.from({length:n}, () => R.char(upper)),
252
342
  bool : n => Array.from({length:n}, () => R.bool()),
253
343
  bin : n => Array.from({length:n}, () => R.bin()),
254
344
  oct : n => Array.from({length:n}, () => R.oct()),
@@ -889,6 +979,63 @@ const sig = (...x) => mapfun$1(
889
979
  ...x
890
980
  );
891
981
 
982
+ const arithmetic_helper=(op, x, y)=>{
983
+ if(typeof x === 'number'){
984
+ if(typeof y === 'number'){
985
+ switch(op){
986
+ case 'add' : return x + y;
987
+ case 'sub' : return x - y;
988
+ case 'mul' : return x * y;
989
+ case 'div' : return x / y;
990
+ case 'modulo' : return x % y;
991
+ }
992
+ }
993
+ if(y?.isComplex?.()) x = new y.constructor(x, 0);
994
+ if(y?.isMatrix?.()) x = y.constructor.nums(y.rows, y.cols, x);
995
+ return x[op](y)
996
+ }
997
+ if(x?.isComplex?.()){
998
+ if(typeof y === 'number' || y?.isComplex?.()) return x.clone()[op](y);
999
+ if(y?.isMatrix?.()){
1000
+ x = y.constructor.nums(y.rows, y.cols, x);
1001
+ return x.clone()[op](y)
1002
+ }
1003
+ }
1004
+ if(x?.isMatrix?.()){
1005
+ return x.clone()[op](y)
1006
+ }
1007
+ };
1008
+ const add=(a,...b)=>{
1009
+ let res = a;
1010
+ for(let i=0; i<b.length; i++)
1011
+ res = arithmetic_helper('add', res, b[i]);
1012
+ return res;
1013
+ };
1014
+ const sub=(a,...b)=>{
1015
+ let res = a;
1016
+ for(let i=0; i<b.length; i++)
1017
+ res = arithmetic_helper('sub', res, b[i]);
1018
+ return res;
1019
+ };
1020
+ const mul=(a,...b)=>{
1021
+ let res = a;
1022
+ for(let i=0; i<b.length; i++)
1023
+ res = arithmetic_helper('mul', res, b[i]);
1024
+ return res;
1025
+ };
1026
+ const div=(a,...b)=>{
1027
+ let res = a;
1028
+ for(let i=0; i<b.length; i++)
1029
+ res = arithmetic_helper('div', res, b[i]);
1030
+ return res;
1031
+ };
1032
+ const modulo=(a,...b)=>{
1033
+ let res = a;
1034
+ for(let i=0; i<b.length; i++)
1035
+ res = arithmetic_helper('modulo', res, b[i]);
1036
+ return res;
1037
+ };
1038
+
892
1039
  const deg2rad = (...deg) => mapfun$1(x => x * Math.PI / 180, ...deg);
893
1040
  const rad2deg = (...rad) => mapfun$1(x => x / Math.PI * 180, ...rad);
894
1041
 
@@ -933,6 +1080,66 @@ const atan2 = (y, x, rad = true) => {
933
1080
  return rad ? phi : phi * 180 / Math.PI;
934
1081
  };
935
1082
 
1083
+ const min = (...x) => Math.min(...x);
1084
+ const max = (...x) => Math.max(...x);
1085
+
1086
+ const binomial = (n, k) =>{
1087
+ if(n !== Math.floor(n)) return TypeError('n must be an integer');
1088
+ if(k !== Math.floor(k)) return TypeError('k must be an integer');
1089
+ if (n < 0) return TypeError('n must be non-negative');
1090
+ if (k < 0 || n < 0 || k > n) return 0;
1091
+ if (k > n - k) k = n - k;
1092
+ let c = 1, i;
1093
+ for (i = 0; i < k; i++)
1094
+ c = c * (n - i) / (i + 1);
1095
+ return c;
1096
+ };
1097
+
1098
+ // export const mean = (...x) => x.reduce((a, b) => a + b) / x.length;
1099
+
1100
+ // export const variance = (...x) => {
1101
+ // const n = x.length;
1102
+ // if (n === 0) return NaN;
1103
+ // const x_mean = mean(...x);
1104
+ // return x.reduce((sum, xi) => sum + (xi - x_mean) ** 2, 0) / n;
1105
+ // };
1106
+
1107
+ // export const std = (...x) => Math.sqrt(variance(...x));
1108
+
1109
+ // export const accum_sum = (...x) => {
1110
+ // let result = [];
1111
+ // let total = 0, i, n = x.length;
1112
+ // for(i = 0; i < n ; i++){
1113
+ // total = add(total, x[i])
1114
+ // result.push(total);
1115
+ // }
1116
+ // return result;
1117
+ // };
1118
+
1119
+ const accum_prod = (...x) => {
1120
+ let result = [];
1121
+ let prod = 1, i, n = x.length;
1122
+ for(i = 0; i < n ; i++){
1123
+ prod = mul(prod, x[i]);
1124
+ result.push(prod);
1125
+ }
1126
+ return result;
1127
+ };
1128
+
1129
+ // export const percentile = (X, p) => {
1130
+ // if (X.length === 0)
1131
+ // return NaN;
1132
+ // let a = [...X].sort((x, y) => x - y);
1133
+ // let index = (p / 100) * (a.length - 1);
1134
+ // let i = Math.floor(index);
1135
+ // let f = index - i;
1136
+ // if (i === a.length - 1)
1137
+ // return a[i];
1138
+ // return a[i] * (1 - f) + a[i + 1] * f;
1139
+ // }
1140
+
1141
+ // export const median = X => percentile(X, 50);
1142
+
936
1143
  const not = x => {
937
1144
  if(x.isComplex?.()) return new x.constructor(not(x.a), not(x.b))
938
1145
  if(x.isMatrix?.()) return new x.constructor(x.rows, x.cols, x.arr.flat(1).map(not))
@@ -2045,6 +2252,7 @@ class UIElementCore extends UINode{
2045
2252
  else this.target = element?.parentElement;
2046
2253
  Object.assign(this.cache, {
2047
2254
  name,
2255
+ itemsTarget : this,
2048
2256
  isInteractive : false,
2049
2257
  parent:null,
2050
2258
  isBody:false,
@@ -2081,7 +2289,7 @@ class UIElementCore extends UINode{
2081
2289
  get element(){
2082
2290
  return this.cache.element;
2083
2291
  }
2084
- [Symbol.iterator]() {
2292
+ [Symbol.iterator](){
2085
2293
  return this.items[Symbol.iterator]();
2086
2294
  }
2087
2295
  maintain() {
@@ -2307,12 +2515,6 @@ class ZikoUIText extends UINode {
2307
2515
  }
2308
2516
  const text = (...str) => new ZikoUIText(...str);
2309
2517
 
2310
- // import { isStateGetter } from "../../../hooks/use-state.js";
2311
- // import {
2312
- // is_camelcase,
2313
- // camel2hyphencase
2314
- // } from '../../../data/string/index.js';
2315
-
2316
2518
  function append(...ele) {
2317
2519
  __addItem__.call(this, "append", "push", ...ele);
2318
2520
  return this;
@@ -2322,19 +2524,30 @@ function prepend(...ele) {
2322
2524
  return this;
2323
2525
  }
2324
2526
  function insertAt(index, ...ele) {
2325
- if (index >= this.element.children.length) this.append(...ele);
2326
- else
2527
+ const target = this.itemsTarget;
2528
+
2529
+ if (index >= target.items.length) return this.append(...ele);
2530
+
2327
2531
  for (let i = 0; i < ele.length; i++) {
2328
- if (["number", "string"].includes(typeof ele[i])) ele[i] = text(ele[i]);
2329
- this.element?.insertBefore(ele[i].element, this.items[index].element);
2330
- this.items.splice(index, 0, ele[i]);
2532
+ if (["number", "string"].includes(typeof ele[i]))
2533
+ ele[i] = text(ele[i]);
2534
+
2535
+ target.element?.insertBefore(
2536
+ ele[i].element,
2537
+ target.items[index].element
2538
+ );
2539
+
2540
+ target.items.splice(index, 0, ele[i]);
2331
2541
  }
2332
- return this;
2542
+
2543
+ target.maintain();
2544
+
2545
+ return this;
2333
2546
  }
2334
2547
  function remove(...ele) {
2335
2548
  const remove = (ele) => {
2336
2549
  if (typeof ele === "number") ele = this.items[ele];
2337
- if (ele?.isUIElement) this.element?.removeChild(ele.element);
2550
+ if (ele?.isUIElement) this.itemsTarget.element?.removeChild(ele.element);
2338
2551
  this.items = this.items.filter((n) => n !== ele);
2339
2552
  };
2340
2553
  for (let i = 0; i < ele.length; i++) remove(ele[i]);
@@ -2345,7 +2558,7 @@ function remove(...ele) {
2345
2558
  }
2346
2559
  function clear(){
2347
2560
  this?.items?.forEach(n=>n.unmount());
2348
- this.element.innerHTML = "";
2561
+ this.itemsTarget.element.innerHTML = '';
2349
2562
  return this;
2350
2563
  }
2351
2564
  function replaceElementWith(new_element){
@@ -2357,12 +2570,12 @@ function replaceElementWith(new_element){
2357
2570
  }
2358
2571
  function after(ui){
2359
2572
  if(ui?.isUIElement) ui=ui.element;
2360
- this.element?.after(ui);
2573
+ this.itemsTarget.element?.after(ui);
2361
2574
  return this;
2362
2575
  }
2363
2576
  function before(ui){
2364
2577
  if(ui?.isUIElement) ui=ui.element;
2365
- this.element?.before(ui);
2578
+ this.itemsTarget.element?.before(ui);
2366
2579
  return this;
2367
2580
  }
2368
2581
 
@@ -2370,6 +2583,9 @@ function before(ui){
2370
2583
 
2371
2584
 
2372
2585
  async function __addItem__(adder, pusher, ...ele) {
2586
+ const itemsTarget_el = this.itemsTarget.element;
2587
+ const itemsTarget = this.itemsTarget;
2588
+
2373
2589
  if (this.cache.isFrozzen) {
2374
2590
  console.warn("You can't append new item to frozzen element");
2375
2591
  return this;
@@ -2385,22 +2601,22 @@ async function __addItem__(adder, pusher, ...ele) {
2385
2601
  (newValue) => (ele[i].element.textContent = newValue),
2386
2602
  ele[i]
2387
2603
  );
2388
- // this.element.appendChild(textNode);
2604
+ // this.itemsTarget.element.appendChild(textNode);
2389
2605
  }
2390
2606
  }
2391
2607
  if (typeof globalThis?.Node === "function" && ele[i] instanceof globalThis?.Node) ele[i] = new this.constructor(ele[i]);
2392
2608
  if (ele[i]?.isUINode) {
2393
2609
  ele[i].cache.parent = this;
2394
- this.element?.[adder](ele[i].element);
2395
- ele[i].target = this.element;
2396
- this.items[pusher](ele[i]);
2610
+ itemsTarget_el?.[adder](ele[i].element);
2611
+ ele[i].target = this.itemsTarget.element;
2612
+ itemsTarget.items[pusher](ele[i]);
2397
2613
  }
2398
2614
  else if(ele[i] instanceof Promise){
2399
2615
  const UIEle = await ele[i];
2400
2616
  UIEle.cache.parent = this;
2401
- this.element?.[adder](UIEle.element);
2402
- UIEle.target = this.element;
2403
- this.items[pusher](UIEle);
2617
+ itemsTarget_el?.[adder](UIEle.element);
2618
+ UIEle.target = this.itemsTarget.element;
2619
+ itemsTarget.items[pusher](UIEle);
2404
2620
  }
2405
2621
  else if (ele[i] instanceof Object) {
2406
2622
  if (ele[i]?.style) this.style(ele[i]?.style);
@@ -2891,7 +3107,14 @@ let UIElement$1 = class UIElement extends UIElementCore{
2891
3107
 
2892
3108
  if(element)this.init(element, name, type, render);
2893
3109
  }
2894
- on(event_name, callback, {details_setter, category = 'global', isCustom = false,preventDefault = false} = {}){
3110
+ on(event_name, callback, {details_setter, category = 'global', isCustom = false, preventDefault = false} = {}){
3111
+ if(event_name instanceof Array) event_name.forEach(
3112
+ event => this.on(
3113
+ event,
3114
+ callback,
3115
+ {details_setter, category, isCustom, preventDefault}
3116
+ )
3117
+ );
2895
3118
  if(category && !this.exp.events.hasOwnProperty(category)) this.exp.events[category] = new EventController(this, category);
2896
3119
  isCustom && this.exp.events[category].cache.customEvents.add(event_name);
2897
3120
  const EVENT = this.exp.events[category];
@@ -2905,10 +3128,22 @@ let UIElement$1 = class UIElement extends UIElementCore{
2905
3128
  }
2906
3129
  _off(event, category = 'global'){
2907
3130
  this.exp.events[category].removeListener(event);
3131
+ return this
2908
3132
  }
2909
3133
  get element(){
2910
3134
  return this.cache.element;
2911
3135
  }
3136
+ get itemsTarget(){
3137
+ return this.cache.itemsTarget;
3138
+ }
3139
+ get itemsTargetElement(){
3140
+ return this.itemsTarget.element;
3141
+ }
3142
+ setItemsTarget(parent){
3143
+ this.cache.itemsTarget = parent;
3144
+ this.items = parent.items;
3145
+ return this;
3146
+ }
2912
3147
  isInteractive(){
2913
3148
  return this.cache.isInteractive;
2914
3149
  }
@@ -3515,14 +3750,14 @@ class UISwap extends UIElement$1 {
3515
3750
  };
3516
3751
 
3517
3752
  this.append(...items);
3518
- this.#setup();
3753
+ this.render();
3519
3754
  }
3520
3755
  get activeItem(){
3521
3756
  return this.items[this.states.activeIndex]
3522
3757
  }
3523
- #setup() {
3758
+ render() {
3524
3759
  this.items.forEach((n, i) => {
3525
- // Store initial display style (fallback to empty string or default)
3760
+
3526
3761
  const initialDisplay = n.element?.style?.display || '';
3527
3762
  this.#DISPLAYS_MAP.set(n, initialDisplay);
3528
3763
 
@@ -3573,6 +3808,22 @@ class UIFragment extends UIElement$1{
3573
3808
 
3574
3809
  const Fragment = (...items) => new UIFragment(...items);
3575
3810
 
3811
+ class UIFor extends UIFragment{
3812
+ constructor({each, fallback, mapFn = () => {}} = {}){
3813
+ super();
3814
+ this.config = {
3815
+ each,
3816
+ fallback,
3817
+ mapFn
3818
+ };
3819
+ this.append(
3820
+ ...this.config.each.map((n,i) => this.config.mapFn(n, i))
3821
+ );
3822
+ }
3823
+ }
3824
+
3825
+ const For = ({each, fallback, mapFn} = {}) => new UIFor({each, fallback, mapFn});
3826
+
3576
3827
  const { PI, sqrt: sqrt$1, cos: cos$2, sin: sin$2, acos, pow } = Math;
3577
3828
 
3578
3829
  const linear = t => t;
@@ -4989,6 +5240,7 @@ exports.EPSILON = EPSILON;
4989
5240
  exports.EventController = EventController;
4990
5241
  exports.FileBasedRouting = FileBasedRouting;
4991
5242
  exports.Flex = Flex;
5243
+ exports.For = For;
4992
5244
  exports.Fragment = Fragment;
4993
5245
  exports.HTMLWrapper = HTMLWrapper;
4994
5246
  exports.KeyListeners = KeyListeners;
@@ -5026,7 +5278,10 @@ exports.ZikoSPA = ZikoSPA;
5026
5278
  exports.ZikoUISuspense = ZikoUISuspense;
5027
5279
  exports.ZikoUIText = ZikoUIText;
5028
5280
  exports.abs = abs;
5281
+ exports.accum_max = accum_max;
5282
+ exports.accum_min = accum_min;
5029
5283
  exports.accum_prod = accum_prod;
5284
+ exports.accum_product = accum_product;
5030
5285
  exports.accum_sum = accum_sum;
5031
5286
  exports.acos = acos$1;
5032
5287
  exports.acosh = acosh;
@@ -5052,6 +5307,7 @@ exports.clamp = clamp;
5052
5307
  exports.clock = clock;
5053
5308
  exports.cloneUI = cloneUI;
5054
5309
  exports.complex = complex;
5310
+ exports.contraharmonic_mean = contraharmonic_mean;
5055
5311
  exports.cos = cos$3;
5056
5312
  exports.cosh = cosh$2;
5057
5313
  exports.coth = coth;
@@ -5068,9 +5324,12 @@ exports.deg2rad = deg2rad;
5068
5324
  exports.discret = discret;
5069
5325
  exports.div = div;
5070
5326
  exports.elastic = elastic;
5327
+ exports.ema = ema;
5071
5328
  exports.exp = exp$1;
5072
5329
  exports.floor = floor;
5073
5330
  exports.fract = fract;
5331
+ exports.geo_mean = geo_mean;
5332
+ exports.harmonic_mean = harmonic_mean;
5074
5333
  exports.hypot = hypot;
5075
5334
  exports.in_back = in_back;
5076
5335
  exports.in_bounce = in_bounce;
@@ -5092,6 +5351,8 @@ exports.in_quad = in_quad;
5092
5351
  exports.in_quart = in_quart;
5093
5352
  exports.in_quint = in_quint;
5094
5353
  exports.in_sin = in_sin;
5354
+ exports.interquartile_mean = interquartile_mean;
5355
+ exports.iqr = iqr;
5095
5356
  exports.isPrimitive = isPrimitive;
5096
5357
  exports.isStateGetter = isStateGetter;
5097
5358
  exports.json2arr = json2arr;
@@ -5116,6 +5377,8 @@ exports.matrix4 = matrix4;
5116
5377
  exports.max = max;
5117
5378
  exports.mean = mean;
5118
5379
  exports.median = median;
5380
+ exports.midhinge = midhinge;
5381
+ exports.midrange = midrange;
5119
5382
  exports.min = min;
5120
5383
  exports.modulo = modulo;
5121
5384
  exports.mul = mul;
@@ -5123,6 +5386,7 @@ exports.nand = nand;
5123
5386
  exports.nor = nor;
5124
5387
  exports.norm = norm;
5125
5388
  exports.normalize_css_value = normalize_css_value;
5389
+ exports.not = not;
5126
5390
  exports.nthr = nthr;
5127
5391
  exports.or = or;
5128
5392
  exports.out_back = out_back;
@@ -5137,12 +5401,20 @@ exports.out_quint = out_quint;
5137
5401
  exports.out_sin = out_sin;
5138
5402
  exports.percentile = percentile;
5139
5403
  exports.pow = pow$1;
5404
+ exports.power_mean = power_mean;
5405
+ exports.q1 = q1;
5406
+ exports.q3 = q3;
5140
5407
  exports.rad2deg = rad2deg;
5141
5408
  exports.register_click_away_event = register_click_away_event;
5142
5409
  exports.register_swipe_event = register_swipe_event;
5143
5410
  exports.register_view_event = register_view_event;
5144
5411
  exports.remove_class = remove_class;
5412
+ exports.rms = rms;
5413
+ exports.rolling_std = rolling_std;
5414
+ exports.rolling_variance = rolling_variance;
5145
5415
  exports.round = round;
5416
+ exports.sample_std = sample_std;
5417
+ exports.sample_variance = sample_variance;
5146
5418
  exports.script = script;
5147
5419
  exports.sec = sec;
5148
5420
  exports.sig = sig;
@@ -5150,6 +5422,7 @@ exports.sign = sign;
5150
5422
  exports.sin = sin$3;
5151
5423
  exports.sinh = sinh$1;
5152
5424
  exports.sleep = sleep;
5425
+ exports.sma = sma;
5153
5426
  exports.sqrt = sqrt$2;
5154
5427
  exports.std = std;
5155
5428
  exports.step = step;
@@ -5169,6 +5442,7 @@ exports.tick = tick;
5169
5442
  exports.timeTaken = timeTaken;
5170
5443
  exports.time_memory_Taken = time_memory_Taken;
5171
5444
  exports.timeout = timeout;
5445
+ exports.trimmed_mean = trimmed_mean;
5172
5446
  exports.trunc = trunc;
5173
5447
  exports.useDerived = useDerived;
5174
5448
  exports.useEventEmitter = useEventEmitter;
@@ -5188,5 +5462,10 @@ exports.waitElm = waitElm;
5188
5462
  exports.waitForUIElm = waitForUIElm;
5189
5463
  exports.waitForUIElmSync = waitForUIElmSync;
5190
5464
  exports.watchQueryParams = watchQueryParams;
5465
+ exports.weighted_mean = weighted_mean;
5466
+ exports.weighted_std = weighted_std;
5467
+ exports.weighted_variance = weighted_variance;
5468
+ exports.winsorized_mean = winsorized_mean;
5469
+ exports.wma = wma;
5191
5470
  exports.xnor = xnor;
5192
5471
  exports.xor = xor;