cradova 3.0.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,22 @@
1
+
2
+ /*
3
+ ============================================================================="
4
+ ██████╗ ██████╗ █████═╗ ███████╗ ███████╗ ██╗ ██╗ █████╗
5
+ ██╔════╝ ██╔══██╗ ██╔═╗██║ █ ██ ██╔═════╝█ ██║ ██║ ██╔═╗██
6
+ ██║ ██████╔╝ ███████║ █ ██ ██║ ██ ██║ ██║ ██████╗
7
+ ██║ ██╔══██╗ ██║ ██║ █ ██ ██║ ██ ╚██╗ ██╔╝ ██║ ██╗
8
+ ╚██████╗ ██║ ██║ ██║ ██║ ███████╔╝ ████████ ╚███╔╝ ██║ ██║
9
+ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚════╝ ╚══╝ ╚═╝ ╚═╝
10
+ =============================================================================
11
+ Cradova FrameWork
12
+ @version 3.0.0
13
+ License: Apache V2
14
+ Copyright 2022 Friday Candour.
15
+ Repository - https://github.com/fridaycandour/cradova
16
+ =============================================================================
17
+ */
1
18
  // lib/parts/fns.ts
2
- var isNode = (node) => typeof node === "object" && typeof node.nodeType === "number";
19
+ var isNode = (element) => element instanceof HTMLElement || element instanceof DocumentFragment;
3
20
  var cradovaEvent = class {
4
21
  constructor() {
5
22
  this.listeners = {};
@@ -10,6 +27,9 @@ var cradovaEvent = class {
10
27
  }
11
28
  this.listeners[eventName].push(callback);
12
29
  }
30
+ // removeEventListener(eventName: string, num: number) {
31
+ // this.listeners[eventName].splice(num, 1);
32
+ // }
13
33
  dispatchEvent(eventName, eventArgs) {
14
34
  const eventListeners = this.listeners[eventName] || [];
15
35
  for (; eventListeners.length !== 0; ) {
@@ -71,6 +91,12 @@ function assert(condition, ...elements) {
71
91
  }
72
92
  return void 0;
73
93
  }
94
+ function assertOr(condition, ifTrue, ifFalse) {
95
+ if (condition) {
96
+ return ifTrue;
97
+ }
98
+ return ifFalse;
99
+ }
74
100
  function loop(datalist2, component) {
75
101
  if (typeof component !== "function") {
76
102
  throw new Error(
@@ -79,87 +105,81 @@ function loop(datalist2, component) {
79
105
  }
80
106
  return Array.isArray(datalist2) ? datalist2.map(component) : void 0;
81
107
  }
82
- function assertOr(condition, ifTrue, ifFalse) {
83
- if (condition) {
84
- return ifTrue;
85
- }
86
- return ifFalse;
87
- }
88
108
  var Ref = class {
89
109
  constructor(component) {
90
110
  this.effects = [];
91
111
  this.effectuate = null;
92
112
  this.rendered = false;
93
113
  this.published = false;
94
- this.hasFirstStateUpdateRun = false;
95
114
  this.preRendered = null;
96
115
  this.reference = new reference();
116
+ // hooks management
117
+ this._state = [];
118
+ this._state_track = {};
119
+ this._state_index = 0;
97
120
  this.component = component.bind(this);
98
121
  }
99
122
  preRender(data2) {
100
- let ihtml = this.component(data2);
101
- let phtml;
102
- if (typeof ihtml === "function") {
103
- phtml = ihtml;
104
- ihtml = phtml();
123
+ let html = this.component(data2);
124
+ if (typeof html === "function") {
125
+ html = html();
105
126
  }
106
- if (ihtml instanceof HTMLElement) {
107
- this.preRendered = ihtml;
127
+ if (isNode(html)) {
128
+ this.preRendered = html;
108
129
  }
109
130
  if (!this.preRendered) {
110
131
  throw new Error(
111
132
  " \u2718 Cradova err : Invalid component type for cradova Ref got - " + this.preRendered
112
133
  );
113
134
  }
114
- this.reference._appendDomForce("element", this.preRendered);
135
+ this.reference._appendDomForce("html", this.preRendered);
115
136
  }
116
137
  destroyPreRendered() {
117
138
  this.preRendered = null;
118
139
  }
140
+ /**
141
+ * Cradova Ref
142
+ * ---
143
+ * returns html with cradova reference
144
+ * @param data
145
+ * @returns () => HTMLElement
146
+ */
119
147
  render(data2, stash) {
120
148
  this.effects = [];
121
149
  this.rendered = false;
122
- this.hasFirstStateUpdateRun = false;
123
- let element = null;
124
- if (!this.preRendered) {
125
- let ihtml = this.component(data2);
126
- let phtml;
127
- if (typeof ihtml === "function") {
128
- phtml = ihtml;
129
- ihtml = phtml();
130
- }
131
- if (ihtml instanceof HTMLElement) {
132
- element = ihtml;
133
- }
134
- if (!element) {
135
- throw new Error(
136
- " \u2718 Cradova err : Invalid component type for cradova Ref, got - " + element
137
- );
138
- }
150
+ let html = this.component(data2);
151
+ if (typeof html === "function") {
152
+ html = html();
153
+ }
154
+ if (!html) {
155
+ html = this.preRendered;
139
156
  }
140
157
  if (stash) {
141
158
  this.stash = data2;
142
159
  }
143
- const av = async () => {
144
- await this.effector.apply(this);
145
- };
146
- CradovaEvent.addEventListener("onmountEvent", av);
147
- this.effector();
148
- this.published = true;
149
- this.rendered = true;
150
- if (!element) {
151
- element = this.preRendered;
152
- }
153
- this.reference._appendDomForce("element", element);
154
- return element;
160
+ if (isNode(html)) {
161
+ this.reference._appendDomForce("html", html);
162
+ this.effector.apply(this);
163
+ this.rendered = true;
164
+ this.published = true;
165
+ } else {
166
+ console.error(" \u2718 Cradova err : Invalid html content, got - " + html);
167
+ }
168
+ return html;
155
169
  }
156
170
  instance() {
157
- return this.reference.element;
171
+ return this.reference.html;
158
172
  }
159
173
  _setExtra(Extra) {
160
174
  this.Signal = Extra;
161
175
  }
162
- effect(fn) {
176
+ _roll_state(data2, idx, get = false) {
177
+ if (!get) {
178
+ this._state[idx] = data2;
179
+ }
180
+ return this._state[idx];
181
+ }
182
+ _effect(fn) {
163
183
  if (!this.rendered) {
164
184
  this.effects.push(fn.bind(this));
165
185
  }
@@ -169,29 +189,30 @@ var Ref = class {
169
189
  for (let i2 = 0; i2 < this.effects.length; i2++) {
170
190
  await this.effects[i2].apply(this);
171
191
  }
192
+ this.effects = [];
172
193
  }
173
- if (!this.hasFirstStateUpdateRun && this.effectuate) {
174
- await this.effectuate();
194
+ if (this.effectuate) {
195
+ this.effectuate();
196
+ this.effectuate = null;
175
197
  }
176
- this.hasFirstStateUpdateRun = true;
177
198
  }
199
+ /**
200
+ * Cradova Ref
201
+ * ---
202
+ * update ref component with new data and update the dom.
203
+ * @param data
204
+ * @returns
205
+ */
178
206
  updateState(data2, stash) {
179
- if (!this) {
180
- console.error(
181
- " \u2718 Cradova err: Ref.updateState has is passed out of scope"
182
- );
183
- return;
184
- }
185
207
  if (!this.rendered) {
186
- async function updateState(data3) {
187
- await this.Activate(data3);
188
- }
189
- this.effectuate = updateState.bind(this, data2);
208
+ this.effectuate = () => {
209
+ if (this.published) {
210
+ this.Activate(data2);
211
+ }
212
+ };
190
213
  } else {
191
214
  if (this.published) {
192
- (async () => {
193
- await this.Activate(data2);
194
- })();
215
+ this.Activate(data2);
195
216
  }
196
217
  }
197
218
  if (stash) {
@@ -199,40 +220,24 @@ var Ref = class {
199
220
  }
200
221
  }
201
222
  async Activate(data2) {
202
- if (!data2) {
203
- return;
204
- }
223
+ this._state_index = 0;
205
224
  this.published = false;
206
- if (!this.reference.element) {
225
+ if (!this.rendered) {
207
226
  return;
208
227
  }
209
- let ihtml = this.component(data2);
210
- let element;
211
- let phtml;
212
- if (typeof ihtml === "function") {
213
- phtml = ihtml;
214
- ihtml = phtml();
215
- }
216
- if (ihtml instanceof HTMLElement) {
217
- element = ihtml;
228
+ let html = this.component(data2);
229
+ if (typeof html === "function") {
230
+ html = html();
218
231
  }
219
- if (!element) {
220
- throw new Error(
221
- " \u2718 Cradova err : Invalid component type for cradova Ref, got - " + element
222
- );
223
- }
224
- this.reference.element.insertAdjacentElement("beforebegin", element);
225
- if (this.reference.element.parentElement) {
226
- this.reference.element.parentElement.removeChild(this.reference.element);
232
+ if (isNode(html)) {
233
+ this.reference.html.insertAdjacentElement("beforebegin", html);
234
+ this.reference.html.remove();
235
+ this.published = true;
236
+ this.reference._appendDomForce("html", html);
237
+ CradovaEvent.dispatchEvent("onmountEvent");
227
238
  } else {
228
- this.reference.element.remove();
239
+ console.error(" \u2718 Cradova err : Invalid html content, got - " + html);
229
240
  }
230
- this.reference._appendDomForce("element", element);
231
- this.published = true;
232
- CradovaEvent.dispatchEvent("onmountEvent");
233
- }
234
- remove() {
235
- this.reference.element.remove();
236
241
  }
237
242
  };
238
243
  var frag = function(children) {
@@ -280,6 +285,25 @@ var reference = class {
280
285
  this[name] = Element;
281
286
  }
282
287
  };
288
+ function useState(initialValue, ActiveRef) {
289
+ ActiveRef._state_index += 1;
290
+ const idx = ActiveRef._state_index;
291
+ if (!ActiveRef._state_track[idx]) {
292
+ ActiveRef._roll_state(initialValue, idx);
293
+ ActiveRef._state_track[idx] = true;
294
+ }
295
+ function setState(newState) {
296
+ ActiveRef._roll_state(newState, idx);
297
+ ActiveRef.updateState(newState);
298
+ }
299
+ return [ActiveRef._roll_state(null, idx, true), setState];
300
+ }
301
+ function useEffect(effect, ActiveRef) {
302
+ ActiveRef._effect(effect);
303
+ }
304
+ function useRef() {
305
+ return new reference();
306
+ }
283
307
 
284
308
  // lib/parts/track.ts
285
309
  function dispatch(element, state) {
@@ -365,6 +389,13 @@ var createSignal = class {
365
389
  }
366
390
  }
367
391
  }
392
+ /**
393
+ * Cradova Signal
394
+ * ----
395
+ * set signal value
396
+ * @param value - signal value
397
+ * @returns void
398
+ */
368
399
  set(value, shouldRefRender) {
369
400
  if (typeof value === "function") {
370
401
  this.value = value(this.value);
@@ -381,6 +412,14 @@ var createSignal = class {
381
412
  this.callback(this.value);
382
413
  }
383
414
  }
415
+ /**
416
+ * Cradova Signal
417
+ * ----
418
+ * set a key value if it's an object
419
+ * @param key - key of the key
420
+ * @param value - value of the key
421
+ * @returns void
422
+ */
384
423
  setKey(key, value, shouldRefRender) {
385
424
  if (typeof this.value === "object" && !Array.isArray(this.value)) {
386
425
  this.value[key] = value;
@@ -401,6 +440,13 @@ var createSignal = class {
401
440
  );
402
441
  }
403
442
  }
443
+ /**
444
+ * Cradova Signal
445
+ * ----
446
+ * set a key to signal an action
447
+ * @param name - name of the action
448
+ * @param action function to execute
449
+ */
404
450
  createAction(name, action) {
405
451
  if (typeof name === "string" && typeof action === "function") {
406
452
  this.actions[name] = action;
@@ -410,6 +456,13 @@ var createSignal = class {
410
456
  );
411
457
  }
412
458
  }
459
+ /**
460
+ * Cradova Signal
461
+ * ----
462
+ * creates man y actions at a time
463
+ * @param name - name of the action
464
+ * @param action function to execute
465
+ */
413
466
  createActions(Actions) {
414
467
  for (const [name, action] of Object.entries(Actions)) {
415
468
  if (typeof name === "string" && typeof action === "function") {
@@ -421,14 +474,29 @@ var createSignal = class {
421
474
  }
422
475
  }
423
476
  }
477
+ /**
478
+ * Cradova Signal
479
+ * ----
480
+ * fires an action if available
481
+ * @param key - string key of the action
482
+ * @param data - data for the action
483
+ */
424
484
  fireAction(key, data2) {
425
485
  this._updateState(key, data2);
426
486
  if (typeof this.actions[key] === "function") {
427
- this.actions[key].call(this, data2);
487
+ return this.actions[key].call(this, data2);
428
488
  } else {
429
489
  throw Error("\u2718 Cradova err : action " + key + " does not exist!");
430
490
  }
431
491
  }
492
+ /**
493
+ * Cradova
494
+ * ---
495
+ * is used to bind signal data to elements and Refs
496
+ *
497
+ * @param prop
498
+ * @returns something
499
+ */
432
500
  bind(prop) {
433
501
  if (typeof this.value === "object" && typeof this.value[prop] !== "undefined") {
434
502
  return [this, prop];
@@ -486,6 +554,14 @@ var createSignal = class {
486
554
  }
487
555
  }
488
556
  }
557
+ /**
558
+ * Cradova Signal
559
+ * ----
560
+ * set a auto - rendering component for this store
561
+ *
562
+ * @param Ref component to bind to.
563
+ * @param path a property in the object to send to attached ref
564
+ */
489
565
  bindRef(ref, binding = { signalProperty: "", _element_property: "" }) {
490
566
  if (ref.render) {
491
567
  ref.render = ref.render.bind(ref, this.value);
@@ -506,9 +582,21 @@ var createSignal = class {
506
582
  "\u2718 Cradova err : Invalid parameters for binding ref to Signal"
507
583
  );
508
584
  }
585
+ /**
586
+ * Cradova Signal
587
+ * ----
588
+ * set a update listener on value changes
589
+ * @param callback
590
+ */
509
591
  listen(callback) {
510
592
  this.callback = callback;
511
593
  }
594
+ /**
595
+ * Cradova Signal
596
+ * ----
597
+ * clear the history on local storage
598
+ *
599
+ */
512
600
  clearPersist() {
513
601
  if (this.persistName) {
514
602
  localStorage.removeItem(this.persistName);
@@ -520,7 +608,13 @@ var createSignal = class {
520
608
  var localTree = new reference();
521
609
  var Screen = class {
522
610
  constructor(cradova_screen_initials) {
611
+ /**
612
+ * this is a set of added html to the screen
613
+ */
523
614
  this._secondaryChildren = [];
615
+ /**
616
+ * error handler for the screen
617
+ */
524
618
  this._errorHandler = null;
525
619
  this._packed = false;
526
620
  this._template = document.createElement("div");
@@ -533,6 +627,7 @@ var Screen = class {
533
627
  this._template.setAttribute("id", "cradova-screen-set");
534
628
  if (renderInParallel === true) {
535
629
  this._delegatedRoutesCount = 0;
630
+ this._persist = false;
536
631
  } else {
537
632
  if (typeof persist === "boolean") {
538
633
  this._persist = persist;
@@ -555,7 +650,7 @@ var Screen = class {
555
650
  }
556
651
  async _package() {
557
652
  if (typeof this._html === "function") {
558
- let fuc = await this._html.apply(this, this._data);
653
+ let fuc = await this._html.apply(this);
559
654
  if (typeof fuc === "function") {
560
655
  fuc = fuc();
561
656
  if (isNode(fuc)) {
@@ -566,6 +661,10 @@ var Screen = class {
566
661
  if (isNode(fuc)) {
567
662
  this._template.innerHTML = "";
568
663
  this._template.appendChild(fuc);
664
+ } else {
665
+ throw new Error(
666
+ ` \u2718 Cradova err: template function for the screen with name '${this._name}' returned ${fuc} instead of html`
667
+ );
569
668
  }
570
669
  }
571
670
  }
@@ -586,33 +685,25 @@ var Screen = class {
586
685
  if (this._deCallBack) {
587
686
  await this._deCallBack();
588
687
  }
589
- if (this._transition) {
590
- this._template.classList.remove(this._transition);
591
- }
592
688
  }
593
689
  async _Activate(force = false) {
594
690
  if (!this._persist || force || !this._packed) {
595
691
  await this._package();
596
692
  this._packed = true;
597
693
  }
598
- if (!localTree._doc) {
599
- localTree._appendDomForce(
600
- "_doc",
601
- document.querySelector("[data-wrapper=app]")
602
- );
603
- }
604
- if (!localTree._doc) {
605
- throw new Error(
606
- " \u2718 Cradova err: Unable to render, cannot find cradova root <div data-wrapper='app'> ... </div>"
607
- );
608
- }
609
694
  if (this._transition) {
610
695
  this._template.classList.add(this._transition);
611
696
  }
612
- localTree._doc.innerHTML = "";
613
- localTree._doc.appendChild(this._template);
614
697
  document.title = this._name;
698
+ localTree.doc.innerHTML = "";
699
+ localTree.doc.appendChild(this._template);
615
700
  CradovaEvent.dispatchEvent("onmountEvent");
701
+ window.scrollTo({
702
+ top: 0,
703
+ left: 0,
704
+ // @ts-ignore
705
+ behavior: "instant"
706
+ });
616
707
  if (this._callBack) {
617
708
  await this._callBack();
618
709
  }
@@ -627,16 +718,16 @@ RouterBox["lastNavigatedRoute"] = null;
627
718
  RouterBox["pageShow"] = null;
628
719
  RouterBox["pageHide"] = null;
629
720
  RouterBox["errorHandler"] = null;
630
- RouterBox["loadingScreen"] = {};
721
+ RouterBox["loadingScreen"] = null;
631
722
  RouterBox["params"] = {};
632
723
  RouterBox["routes"] = {};
633
724
  RouterBox["pageevents"] = [];
634
- RouterBox["start_pageevents"] = async function(lastR, newR) {
725
+ RouterBox["start_pageevents"] = async function(url) {
635
726
  setTimeout(() => {
636
727
  for (let ci = 0; ci < RouterBox["pageevents"].length; ci++) {
637
- RouterBox["pageevents"][ci](lastR, newR);
728
+ RouterBox["pageevents"][ci](url);
638
729
  }
639
- }, 300);
730
+ }, 100);
640
731
  };
641
732
  var checker = (url) => {
642
733
  if (RouterBox.routes[url]) {
@@ -732,6 +823,7 @@ RouterBox.router = async function(_e, _force) {
732
823
  RouterBox.params.params = params;
733
824
  }
734
825
  await route._Activate(_force);
826
+ RouterBox["start_pageevents"](url);
735
827
  RouterBox["lastNavigatedRouteController"] && RouterBox["lastNavigatedRouteController"]._deActivate();
736
828
  RouterBox["lastNavigatedRoute"] = url;
737
829
  RouterBox["lastNavigatedRouteController"] = route;
@@ -750,12 +842,21 @@ RouterBox.router = async function(_e, _force) {
750
842
  }
751
843
  }
752
844
  } else {
753
- if (RouterBox.routes["/404"]) {
754
- await RouterBox.routes["/404"]._Activate(_force);
845
+ if (RouterBox.routes["/*"]) {
846
+ await RouterBox.routes["/*"]._Activate(_force);
755
847
  }
756
848
  }
757
849
  };
758
850
  var RouterClass = class {
851
+ /** cradova router
852
+ * ---
853
+ * Registers a route.
854
+ *
855
+ * accepts an object containing
856
+ *
857
+ * @param {string} path Route path.
858
+ * @param screen the cradova screen.
859
+ */
759
860
  BrowserRoutes(obj) {
760
861
  for (const path in obj) {
761
862
  let screen = obj[path];
@@ -770,12 +871,28 @@ var RouterClass = class {
770
871
  }
771
872
  this._mount();
772
873
  }
874
+ /**
875
+ Go back in Navigation history
876
+ */
773
877
  back() {
774
878
  history.go(-1);
775
879
  }
880
+ /**
881
+ Go forward in Navigation history
882
+ */
776
883
  forward() {
777
884
  history.go(1);
778
885
  }
886
+ /**
887
+ * Cradova Router
888
+ * ------
889
+ *
890
+ * Navigates to a designated screen in your app
891
+ *
892
+ * @param href string
893
+ * @param data object
894
+ * @param force boolean
895
+ */
779
896
  navigate(href, data2 = null, force = false) {
780
897
  if (typeof href !== "string") {
781
898
  throw new TypeError(
@@ -786,8 +903,7 @@ var RouterClass = class {
786
903
  if (href.includes("://")) {
787
904
  window.location.href = href;
788
905
  } else {
789
- const lastR = window.location.pathname;
790
- if (href === lastR) {
906
+ if (href === window.location.pathname) {
791
907
  return;
792
908
  }
793
909
  [route, params] = checker(href);
@@ -798,9 +914,17 @@ var RouterClass = class {
798
914
  RouterBox.params.params = params;
799
915
  RouterBox.params.data = data2;
800
916
  RouterBox.router(null, force);
801
- RouterBox["start_pageevents"](lastR, href);
802
917
  }
803
918
  }
919
+ /**
920
+ * Cradova
921
+ * ---
922
+ * Loading screen for your app
923
+ *
924
+ * lazy loaded loading use
925
+ *
926
+ * @param screen
927
+ */
804
928
  setLoadingScreen(screen) {
805
929
  if (screen instanceof Screen) {
806
930
  RouterBox["LoadingScreen"] = screen;
@@ -810,6 +934,12 @@ var RouterClass = class {
810
934
  );
811
935
  }
812
936
  }
937
+ /** cradova router
938
+ * ---
939
+ * Listen for navigation events
940
+ *
941
+ * @param callback () => void
942
+ */
813
943
  onPageEvent(callback) {
814
944
  if (typeof callback === "function") {
815
945
  RouterBox["pageevents"].push(callback);
@@ -819,6 +949,13 @@ var RouterClass = class {
819
949
  );
820
950
  }
821
951
  }
952
+ /** cradova router
953
+ * ---
954
+ * get a screen ready before time.
955
+ *
956
+ * @param {string} path Route path.
957
+ * @param data data for the screen.
958
+ */
822
959
  async packageScreen(path, data2 = {}) {
823
960
  if (!RouterBox.routes[path]) {
824
961
  console.error(" \u2718 Cradova err: no screen with path " + path);
@@ -830,17 +967,43 @@ var RouterClass = class {
830
967
  if (!route._Activate && typeof route === "function") {
831
968
  route = await route();
832
969
  }
970
+ if (route._delegatedRoutes !== -1) {
971
+ route._delegatedRoutes = true;
972
+ route = new Screen({
973
+ name: route._name,
974
+ template: route._html
975
+ });
976
+ RouterBox.routes[path] = route;
977
+ }
833
978
  route._package(Object.assign(data2, params || {}));
834
979
  route._packed = true;
835
980
  }
981
+ /**
982
+ * Cradova Router
983
+ * ------
984
+ *
985
+ * return last set router params
986
+ *
987
+ * .
988
+ */
836
989
  getParams() {
837
990
  return RouterBox["params"];
838
991
  }
992
+ /**
993
+ * Cradova
994
+ * ---
995
+ * Error Handler for your app
996
+ *
997
+ * @param callback
998
+ * @param path? page path
999
+ */
839
1000
  addErrorHandler(callback) {
840
1001
  if (typeof callback === "function") {
841
1002
  RouterBox["errorHandler"] = callback;
842
1003
  } else {
843
- throw new Error(" \u2718 Cradova err: callback for event is not a function");
1004
+ throw new Error(
1005
+ " \u2718 Cradova err: callback for error event is not a function"
1006
+ );
844
1007
  }
845
1008
  }
846
1009
  _mount() {
@@ -850,9 +1013,12 @@ var RouterClass = class {
850
1013
  doc.setAttribute("data-wrapper", "app");
851
1014
  document.body.appendChild(doc);
852
1015
  localTree._appendDomForce("doc", doc);
1016
+ } else {
1017
+ localTree._appendDomForce("doc", doc);
853
1018
  }
854
1019
  window.addEventListener("pageshow", RouterBox.router);
855
1020
  window.addEventListener("popstate", (_e) => {
1021
+ _e.preventDefault();
856
1022
  RouterBox.router();
857
1023
  });
858
1024
  }
@@ -865,12 +1031,12 @@ var makeElement = (element, ElementChildrenAndPropertyList) => {
865
1031
  if (ElementChildrenAndPropertyList.length !== 0) {
866
1032
  for (let i2 = 0; i2 < ElementChildrenAndPropertyList.length; i2++) {
867
1033
  let child = ElementChildrenAndPropertyList[i2];
868
- if (child instanceof Ref) {
869
- child = child.render();
870
- }
871
1034
  if (typeof child === "function") {
872
1035
  child = child();
873
1036
  }
1037
+ if (child instanceof Ref) {
1038
+ child = child.render();
1039
+ }
874
1040
  if (isNode(child)) {
875
1041
  element.appendChild(child);
876
1042
  continue;
@@ -900,52 +1066,27 @@ var makeElement = (element, ElementChildrenAndPropertyList) => {
900
1066
  if (typeof props === "object" && element) {
901
1067
  for (const [prop, value] of Object.entries(props)) {
902
1068
  if (prop === "style" && typeof value === "object") {
903
- for (const [k, v] of Object.entries(value)) {
904
- if (typeof element.style[k] !== "undefined" && k !== "src") {
905
- element.style[k] = v;
906
- } else {
907
- throw new Error(
908
- "\u2718 Cradova err : " + k + " is not a valid css style property"
909
- );
910
- }
911
- }
912
- continue;
913
- }
914
- if (typeof element.style[prop] !== "undefined" && prop !== "src") {
915
- element.style[prop] = value;
916
- continue;
917
- }
918
- if (prop === "text" && typeof value === "string" && value !== "") {
919
- text = value;
920
- continue;
921
- }
922
- if (prop === "href" && typeof value === "string") {
923
- const href = value || "";
924
- if (!href.includes("://")) {
925
- element.addEventListener(
926
- "click",
927
- (e) => {
928
- e.preventDefault();
929
- Router.navigate(element.pathname);
930
- }
931
- );
932
- }
933
- element.setAttribute(prop, value);
1069
+ Object.assign(element.style, value);
934
1070
  continue;
935
1071
  }
936
1072
  if (Array.isArray(value)) {
937
- const clas = value;
938
- if (clas[0] instanceof createSignal) {
1073
+ if (value[0] instanceof createSignal) {
939
1074
  element["updateState"] = dispatch.bind(null, element);
940
- clas[0].bindRef(element, {
941
- _element_property: prop,
942
- signalProperty: clas[1]
943
- });
1075
+ value[0].bindRef(
1076
+ element,
1077
+ {
1078
+ _element_property: prop,
1079
+ signalProperty: value[1]
1080
+ }
1081
+ );
944
1082
  continue;
945
1083
  }
946
- if (prop == "reference" && clas[0] instanceof reference) {
1084
+ if (prop == "reference" && value[0] instanceof reference) {
947
1085
  element["updateState"] = dispatch.bind(null, element);
948
- clas[0]._appendDomForce(clas[1], element);
1086
+ value[0]._appendDomForce(
1087
+ value[1],
1088
+ element
1089
+ );
949
1090
  continue;
950
1091
  }
951
1092
  }
@@ -965,6 +1106,30 @@ var makeElement = (element, ElementChildrenAndPropertyList) => {
965
1106
  element.setAttribute(prop, value);
966
1107
  continue;
967
1108
  }
1109
+ if (prop === "href" && typeof value === "string") {
1110
+ const href = value || "";
1111
+ if (!href.includes("://")) {
1112
+ element.addEventListener(
1113
+ "click",
1114
+ (e) => {
1115
+ e.preventDefault();
1116
+ Router.navigate(
1117
+ element.pathname
1118
+ );
1119
+ if (href.includes("#")) {
1120
+ const l = href.split("#").at(-1);
1121
+ document.getElementById("#" + l)?.scrollIntoView();
1122
+ }
1123
+ }
1124
+ );
1125
+ }
1126
+ element.setAttribute(prop, value);
1127
+ continue;
1128
+ }
1129
+ if (typeof element.style[prop] !== "undefined" && prop !== "src") {
1130
+ element.style[prop] = value;
1131
+ continue;
1132
+ }
968
1133
  element[prop] = value;
969
1134
  }
970
1135
  }
@@ -973,46 +1138,89 @@ var makeElement = (element, ElementChildrenAndPropertyList) => {
973
1138
  }
974
1139
  return element;
975
1140
  };
976
- var cra = (element_initials) => {
977
- return (...initials) => {
978
- return makeElement(document.createElement(element_initials), initials);
979
- };
1141
+ var make = function(descriptor) {
1142
+ if (!descriptor.length) {
1143
+ return ["DIV"];
1144
+ }
1145
+ if (Array.isArray(descriptor)) {
1146
+ descriptor = descriptor[0];
1147
+ }
1148
+ let innerValue = "";
1149
+ if (descriptor.includes("|")) {
1150
+ [descriptor, innerValue] = descriptor.split("|");
1151
+ if (!descriptor) {
1152
+ return ["P", void 0, void 0, innerValue];
1153
+ }
1154
+ }
1155
+ let tag;
1156
+ if (!descriptor.includes("#")) {
1157
+ descriptor = descriptor.split(".");
1158
+ tag = descriptor.shift();
1159
+ if (!tag) {
1160
+ tag = "DIV";
1161
+ }
1162
+ return [tag, void 0, descriptor.join(" "), innerValue];
1163
+ } else {
1164
+ if (!descriptor.includes(".")) {
1165
+ descriptor = descriptor.split("#");
1166
+ tag = descriptor.shift();
1167
+ if (!tag) {
1168
+ tag = "DIV";
1169
+ }
1170
+ if (descriptor[0].includes(" ")) {
1171
+ descriptor = [descriptor[0].split(" ")[1]];
1172
+ }
1173
+ return [tag, descriptor[0], void 0, innerValue];
1174
+ }
1175
+ }
1176
+ descriptor = descriptor.split(".");
1177
+ const classes = [];
1178
+ const IDs = [];
1179
+ tag = !descriptor[0].includes("#") && descriptor.shift();
1180
+ if (!tag) {
1181
+ tag = "DIV";
1182
+ }
1183
+ for (let i2 = 0; i2 < descriptor.length; i2++) {
1184
+ if (descriptor[i2].includes("#")) {
1185
+ const item = descriptor[i2].split("#");
1186
+ IDs.push(item[1]);
1187
+ if (i2 === 0) {
1188
+ tag = item[0];
1189
+ continue;
1190
+ }
1191
+ classes.push(item[0]);
1192
+ continue;
1193
+ }
1194
+ classes.push(descriptor[i2]);
1195
+ }
1196
+ return [tag || "DIV", IDs[0], classes.join(" "), innerValue];
1197
+ };
1198
+ var cra = (tag) => {
1199
+ const extend = (...Children_and_Properties) => makeElement(document.createElement(tag), Children_and_Properties);
1200
+ return extend;
980
1201
  };
981
1202
  var a = cra("a");
982
- var abbr = cra("abbr");
983
- var address = cra("address");
984
1203
  var area = cra("area");
985
1204
  var article = cra("article");
986
1205
  var aside = cra("aside");
987
1206
  var audio = cra("audio");
988
1207
  var b = cra("b");
989
1208
  var base = cra("base");
990
- var bdi = cra("bdi");
991
- var bdo = cra("bdo");
992
1209
  var blockquote = cra("blockquote");
993
- var body = cra("body");
994
1210
  var br = cra("br");
995
1211
  var button = cra("button");
996
1212
  var canvas = cra("canvas");
997
1213
  var caption = cra("caption");
998
- var cite = cra("cite");
999
1214
  var code = cra("code");
1000
1215
  var col = cra("col");
1001
1216
  var colgroup = cra("colgroup");
1002
1217
  var data = cra("data");
1003
1218
  var datalist = cra("datalist");
1004
- var dd = cra("dd");
1005
- var del = cra("del");
1006
1219
  var details = cra("details");
1007
- var dfn = cra("dfn");
1008
1220
  var dialog = cra("dialog");
1009
1221
  var div = cra("div");
1010
- var dl = cra("dl");
1011
- var dt = cra("dt");
1012
1222
  var em = cra("em");
1013
1223
  var embed = cra("embed");
1014
- var fieldset = cra("fieldset");
1015
- var figcaption = cra("figcaption");
1016
1224
  var figure = cra("figure");
1017
1225
  var footer = cra("footer");
1018
1226
  var form = cra("form");
@@ -1025,70 +1233,43 @@ var h6 = cra("h6");
1025
1233
  var head = cra("head");
1026
1234
  var header = cra("header");
1027
1235
  var hr = cra("hr");
1028
- var html = cra("html");
1029
1236
  var i = cra("i");
1030
1237
  var iframe = cra("iframe");
1031
1238
  var img = cra("img");
1032
1239
  var input = cra("input");
1033
- var ins = cra("ins");
1034
- var kbd = cra("kbd");
1035
1240
  var label = cra("label");
1036
1241
  var legend = cra("legend");
1037
1242
  var li = cra("li");
1038
1243
  var link = cra("link");
1039
1244
  var main = cra("main");
1040
- var map = cra("map");
1041
- var mark = cra("mark");
1042
- var math = cra("math");
1043
1245
  var menu = cra("menu");
1044
- var meta = cra("meta");
1045
- var meter = cra("meter");
1046
1246
  var nav = cra("nav");
1047
1247
  var object = cra("object");
1048
1248
  var ol = cra("ol");
1049
1249
  var optgroup = cra("optgroup");
1050
1250
  var option = cra("option");
1051
- var output = cra("output");
1052
1251
  var p = cra("p");
1053
- var picture = cra("picture");
1054
- var portal = cra("portal");
1055
1252
  var pre = cra("pre");
1056
1253
  var progress = cra("progress");
1057
1254
  var q = cra("q");
1058
- var rp = cra("rp");
1059
- var rt = cra("rt");
1060
- var ruby = cra("ruby");
1061
- var s = cra("s");
1062
- var samp = cra("samp");
1063
- var script = cra("script");
1064
1255
  var section = cra("section");
1065
1256
  var select = cra("select");
1066
- var slot = cra("slot");
1067
- var small = cra("small");
1068
1257
  var source = cra("source");
1069
1258
  var span = cra("span");
1070
1259
  var strong = cra("strong");
1071
- var style = cra("style");
1072
- var sub = cra("sub");
1073
1260
  var summary = cra("summary");
1074
- var sup = cra("sup");
1075
1261
  var table = cra("table");
1076
1262
  var tbody = cra("tbody");
1077
1263
  var td = cra("td");
1078
1264
  var template = cra("template");
1079
1265
  var textarea = cra("textarea");
1080
- var tfoot = cra("tfoot");
1081
1266
  var th = cra("th");
1082
- var thead = cra("thead");
1083
- var time = cra("time");
1084
1267
  var title = cra("title");
1085
1268
  var tr = cra("tr");
1086
1269
  var track = cra("track");
1087
1270
  var u = cra("u");
1088
1271
  var ul = cra("ul");
1089
- var val = cra("val");
1090
1272
  var video = cra("video");
1091
- var wbr = cra("wbr");
1092
1273
 
1093
1274
  // lib/parts/ajax.ts
1094
1275
  function Ajax(url, opts = {}) {
@@ -1096,7 +1277,7 @@ function Ajax(url, opts = {}) {
1096
1277
  if (typeof url !== "string") {
1097
1278
  throw new Error("\u2718 Cradova err : Ajax invalid url " + url);
1098
1279
  }
1099
- return new Promise(function(resolve) {
1280
+ return new Promise(function(resolve, reject) {
1100
1281
  const ajax = new XMLHttpRequest();
1101
1282
  const formData = new FormData();
1102
1283
  if (callbacks && typeof callbacks === "object") {
@@ -1120,18 +1301,14 @@ function Ajax(url, opts = {}) {
1120
1301
  }
1121
1302
  }
1122
1303
  ajax.addEventListener("error", () => {
1123
- console.error(
1124
- "\u2718 Cradova Ajax err : ",
1125
- ajax.response || "ERR_INTERNET_DISCONNECTED"
1126
- );
1127
1304
  if (!navigator.onLine) {
1128
- resolve(
1305
+ reject(
1129
1306
  JSON.stringify({
1130
1307
  message: `this device is offline!`
1131
1308
  })
1132
1309
  );
1133
1310
  } else {
1134
- resolve(
1311
+ reject(
1135
1312
  JSON.stringify({
1136
1313
  message: `problem with the action, please try again!`
1137
1314
  })
@@ -1153,67 +1330,6 @@ function Ajax(url, opts = {}) {
1153
1330
  }
1154
1331
 
1155
1332
  // lib/index.ts
1156
- var make = function(txx) {
1157
- if (Array.isArray(txx)) {
1158
- txx = txx[0];
1159
- }
1160
- if (typeof txx !== "string") {
1161
- return [];
1162
- }
1163
- if (Array.isArray(txx)) {
1164
- txx = txx[0];
1165
- }
1166
- let innerValue = "";
1167
- if (txx.includes("|")) {
1168
- [txx, innerValue] = txx.split("|");
1169
- if (!txx) {
1170
- return ["P", void 0, void 0, innerValue];
1171
- }
1172
- }
1173
- let tag;
1174
- let teak;
1175
- if (!txx.includes("#")) {
1176
- teak = txx.split(".");
1177
- tag = teak.shift();
1178
- if (!tag) {
1179
- tag = "DIV";
1180
- }
1181
- return [tag, void 0, teak.join(" "), innerValue];
1182
- } else {
1183
- if (!txx.includes(".")) {
1184
- teak = txx.split("#");
1185
- tag = teak.shift();
1186
- if (!tag) {
1187
- tag = "DIV";
1188
- }
1189
- if (teak[0].includes(" ")) {
1190
- teak = [teak[0].split(" ")[1]];
1191
- }
1192
- return [tag, teak[0], void 0, innerValue];
1193
- }
1194
- }
1195
- teak = txx.split(".");
1196
- const classes = [];
1197
- const IDs = [];
1198
- tag = !teak[0].includes("#") && teak.shift();
1199
- if (!tag) {
1200
- tag = "DIV";
1201
- }
1202
- for (let i2 = 0; i2 < teak.length; i2++) {
1203
- if (teak[i2].includes("#")) {
1204
- const item = teak[i2].split("#");
1205
- IDs.push(item[1]);
1206
- if (i2 === 0) {
1207
- tag = item[0];
1208
- continue;
1209
- }
1210
- classes.push(item[0]);
1211
- continue;
1212
- }
1213
- classes.push(teak[i2]);
1214
- }
1215
- return [tag || "DIV", IDs[0], classes.join(" "), innerValue];
1216
- };
1217
1333
  var _2 = (...element_initials) => {
1218
1334
  const {
1219
1335
  0: tag,
@@ -1221,149 +1337,22 @@ var _2 = (...element_initials) => {
1221
1337
  2: className,
1222
1338
  3: innerText
1223
1339
  } = make(element_initials[0]);
1224
- let props = {};
1225
1340
  const element = tag ? document.createElement(tag) : new DocumentFragment();
1226
- if (element.tagName) {
1341
+ if (tag) {
1227
1342
  if (className) {
1228
- props["className"] = className;
1343
+ element.className = className;
1229
1344
  }
1230
1345
  if (id) {
1231
- props["id"] = id;
1346
+ element.id = id;
1232
1347
  }
1233
1348
  if (innerText) {
1234
- props["innerText"] = innerText;
1349
+ element.innerText = innerText;
1235
1350
  }
1351
+ element_initials.shift();
1236
1352
  }
1237
- typeof tag === "string" && element_initials.shift();
1238
- props && element_initials.push(props);
1239
1353
  return makeElement(element, element_initials);
1240
1354
  };
1241
1355
  var lib_default = _2;
1242
- export {
1243
- Ajax,
1244
- Ref,
1245
- Router,
1246
- Screen,
1247
- a,
1248
- abbr,
1249
- address,
1250
- area,
1251
- article,
1252
- aside,
1253
- assert,
1254
- assertOr,
1255
- audio,
1256
- b,
1257
- base,
1258
- bdi,
1259
- bdo,
1260
- blockquote,
1261
- body,
1262
- br,
1263
- button,
1264
- canvas,
1265
- caption,
1266
- cite,
1267
- code,
1268
- col,
1269
- colgroup,
1270
- createSignal,
1271
- css,
1272
- data,
1273
- datalist,
1274
- dd,
1275
- lib_default as default,
1276
- del,
1277
- details,
1278
- dfn,
1279
- dialog,
1280
- div,
1281
- dl,
1282
- dt,
1283
- em,
1284
- embed,
1285
- fieldset,
1286
- figcaption,
1287
- figure,
1288
- footer,
1289
- form,
1290
- h1,
1291
- h2,
1292
- h3,
1293
- h4,
1294
- h5,
1295
- h6,
1296
- head,
1297
- header,
1298
- hr,
1299
- html,
1300
- i,
1301
- iframe,
1302
- img,
1303
- input,
1304
- ins,
1305
- kbd,
1306
- label,
1307
- lazy,
1308
- legend,
1309
- li,
1310
- link,
1311
- loop,
1312
- main,
1313
- makeElement,
1314
- map,
1315
- mark,
1316
- math,
1317
- menu,
1318
- meta,
1319
- meter,
1320
- nav,
1321
- object,
1322
- ol,
1323
- optgroup,
1324
- option,
1325
- output,
1326
- p,
1327
- picture,
1328
- portal,
1329
- pre,
1330
- progress,
1331
- q,
1332
- reference,
1333
- rp,
1334
- rt,
1335
- ruby,
1336
- s,
1337
- samp,
1338
- script,
1339
- section,
1340
- select,
1341
- slot,
1342
- small,
1343
- source,
1344
- span,
1345
- strong,
1346
- style,
1347
- sub,
1348
- summary,
1349
- sup,
1350
- table,
1351
- tbody,
1352
- td,
1353
- template,
1354
- textarea,
1355
- tfoot,
1356
- th,
1357
- thead,
1358
- time,
1359
- title,
1360
- tr,
1361
- track,
1362
- u,
1363
- ul,
1364
- val,
1365
- video,
1366
- wbr
1367
- };
1368
- //! always starts events a moment later
1369
- //! value could be a promise
1356
+ //! get url hash here and scroll into view
1357
+
1358
+ export { Ajax, CradovaEvent, Ref, Rhoda, Router, Screen, a, area, article, aside, assert, assertOr, audio, b, base, blockquote, br, button, canvas, caption, code, col, colgroup, cradovaEvent, createSignal, css, data, datalist, lib_default as default, details, dialog, div, em, embed, figure, footer, form, frag, h1, h2, h3, h4, h5, h6, head, header, hr, i, iframe, img, input, isNode, label, lazy, legend, li, link, loop, main, make, makeElement, menu, nav, object, ol, optgroup, option, p, pre, progress, q, reference, section, select, source, span, strong, summary, table, tbody, td, template, textarea, th, title, tr, track, u, ul, useEffect, useRef, useState, video };