ziko 0.67.0 → 0.68.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 (42) hide show
  1. package/dist/ziko.cjs +276 -805
  2. package/dist/ziko.js +276 -805
  3. package/dist/ziko.min.js +2 -2
  4. package/dist/ziko.mjs +276 -791
  5. package/package.json +1 -1
  6. package/src/events/controller/index.js +57 -0
  7. package/src/events/custom-events-registry/click-away.js +1 -0
  8. package/src/events/index.js +1 -3
  9. package/src/{exp-events → events-dep}/custom-events-registry/click-away.js +0 -1
  10. package/src/events-dep/index.js +3 -0
  11. package/src/ui/constructors/UIElement.js +17 -7
  12. package/src/ui/constructors/mixins/attrs.js +19 -5
  13. package/src/ui/constructors/mixins/dom.js +53 -1
  14. package/src/ui/constructors/mixins/events/click.js +22 -0
  15. package/src/ui/constructors/mixins/events/index.js +3 -0
  16. package/src/ui/constructors/mixins/events/key.js +24 -0
  17. package/src/ui/constructors/mixins/events/ptr.js +44 -0
  18. package/src/ui/constructors/mixins/events/utils/index.js +15 -0
  19. package/src/ui/constructors/mixins/index.js +4 -2
  20. package/src/exp-events/controller/index.js +0 -41
  21. package/src/exp-events/index.js +0 -1
  22. package/src/ui/constructors/mixins/events.js +0 -57
  23. package/src/ui/constructors/mixins/utils/index.js +0 -64
  24. /package/src/{events → events-dep}/binders/coordinates-based-event.js +0 -0
  25. /package/src/{events → events-dep}/binders/custom-event.js +0 -0
  26. /package/src/{events → events-dep}/binders/index.js +0 -0
  27. /package/src/{exp-events → events-dep}/custom-events-registry/index.js +0 -0
  28. /package/src/{exp-events → events-dep}/custom-events-registry/swipe.js +0 -0
  29. /package/src/{exp-events → events-dep}/custom-events-registry/view.js +0 -0
  30. /package/src/{events → events-dep}/customizers/normalise-coordinates.js +0 -0
  31. /package/src/{exp-events → events-dep}/details-setter/index.js +0 -0
  32. /package/src/{exp-events → events-dep}/details-setter/key.js +0 -0
  33. /package/src/{exp-events → events-dep}/details-setter/mouse.js +0 -0
  34. /package/src/{exp-events → events-dep}/details-setter/pointer.js +0 -0
  35. /package/src/{exp-events → events-dep}/details-setter/touch.js +0 -0
  36. /package/src/{events → events-dep}/events-map/index.js +0 -0
  37. /package/src/{events → events-dep}/types/__Shared__.d.ts +0 -0
  38. /package/src/{events → events-dep}/types/clipboard.d.ts +0 -0
  39. /package/src/{events → events-dep}/types/focus.d.ts +0 -0
  40. /package/src/{events → events-dep}/types/pointer.d.ts +0 -0
  41. /package/src/{events → events-dep}/utils.js +0 -0
  42. /package/src/{events → events-dep}/ziko-event.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ziko",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "description": "A versatile JavaScript library offering a rich set of Hyperscript Based UI components, advanced mathematical utilities, interactivity ,animations, client side routing and more ...",
5
5
  "keywords": [
6
6
  "front-end",
@@ -0,0 +1,57 @@
1
+ export class EventController {
2
+ constructor(target, category){
3
+ this.cache = {
4
+ category,
5
+ target,
6
+ listeners : {},
7
+ currentEvent : null,
8
+ event : null
9
+ }
10
+ }
11
+ get event(){
12
+ return this.cache.event
13
+ }
14
+ get element(){
15
+ return this.cache.target.element;
16
+ }
17
+ get currentEvent(){
18
+ return this.cache.currentEvent;
19
+ }
20
+ addListener(event_name, callback, {preventDefault = false, paused = false} = {}){
21
+ this.cache.listeners[event_name] = {
22
+ callback : e =>{
23
+ this.cache.event = e;
24
+ if(this.cache.listeners[event_name].preventDefault) e.preventDefault()
25
+ if(!this.cache.listeners[event_name].paused) {
26
+ this.cache.currentEvent = event_name;
27
+ callback.call(this, this)
28
+ }
29
+ },
30
+ preventDefault,
31
+ paused,
32
+ };
33
+ this.element.addEventListener(event_name, this.cache.listeners[event_name].callback);
34
+ return this;
35
+ }
36
+ removeListener(event_name){
37
+ this.element.removeEventListener(event_name, this.cache.listeners[event_name].callback);
38
+ return this;
39
+ }
40
+ pause(event_name){
41
+ this.cache.listeners[event_name].paused = true;
42
+ return this;
43
+ }
44
+ resume(event_name){
45
+ this.cache.listeners[event_name].paused = false;
46
+ return this;
47
+ }
48
+ preventDefault(event_name){
49
+ // if(!event_name)
50
+ this.cache.listeners[event_name].preventDefault = true;
51
+ return this;
52
+ }
53
+ useDefault(event_name){
54
+ this.cache.listeners[event_name].preventDefault = false;
55
+ return this;
56
+ }
57
+ }
@@ -7,6 +7,7 @@ class ClickAwayEvent extends Event {
7
7
  }
8
8
 
9
9
  function register_click_away_event(element) {
10
+ // console.log(element)
10
11
  function handler(e) {
11
12
  if (!element.contains(e.target)) {
12
13
  const clickAwayEvent = new ClickAwayEvent(e, element);
@@ -1,3 +1 @@
1
- export * from './binders/index.js'
2
- export * from "./ziko-event.js"
3
- export * from "./utils.js";
1
+ export * from './controller/index.js'
@@ -7,7 +7,6 @@ class ClickAwayEvent extends Event {
7
7
  }
8
8
 
9
9
  function register_click_away_event(element) {
10
- // console.log(element)
11
10
  function handler(e) {
12
11
  if (!element.contains(e.target)) {
13
12
  const clickAwayEvent = new ClickAwayEvent(e, element);
@@ -0,0 +1,3 @@
1
+ // export * from './binders/index.js'
2
+ // export * from "./ziko-event.js"
3
+ // export * from "./utils.js";
@@ -5,13 +5,16 @@ import {
5
5
  AttrsMethods,
6
6
  DomMethods,
7
7
  IndexingMethods,
8
- EventsMethodes,
9
- StyleMethods
8
+ // EventsMethodes,
9
+ StyleMethods,
10
+ PtrListeners,
11
+ ClickListeners,
12
+ KeyListeners,
10
13
  } from "./mixins/index.js";
11
14
 
12
15
  import {
13
16
  EventController
14
- } from '../../exp-events/index.js'
17
+ } from '../../events/index.js'
15
18
  class UIElement extends UIElementCore{
16
19
  constructor({element, name ='', type='html', render = __Ziko__.__Config__.default.render}={}){
17
20
  super()
@@ -27,16 +30,23 @@ class UIElement extends UIElementCore{
27
30
  DomMethods,
28
31
  StyleMethods,
29
32
  IndexingMethods,
30
- EventsMethodes
33
+ PtrListeners,
34
+ ClickListeners,
35
+ KeyListeners
31
36
  );
32
37
 
33
38
  if(element)this.init(element, name, type, render)
34
39
  }
35
- _on(event, callback, {details_setter, category = 'global'} = {}){
40
+ _on(event, callback, {details_setter, category = 'global', preventDefault = false} = {}){
36
41
  if(category && !this.exp.events.hasOwnProperty(category)) this.exp.events[category] = new EventController(this, category);
37
42
  const EVENT = this.exp.events[category]
38
- EVENT.addListener(event, callback);
39
- if(details_setter) details_setter.call(EVENT);
43
+ EVENT.addListener(event, (e)=>{
44
+ if(details_setter) details_setter(EVENT);
45
+ callback(e)
46
+ },{
47
+ preventDefault
48
+ });
49
+
40
50
  }
41
51
  _off(event, category = 'global'){
42
52
  this.exp.events[category].removeListener(event)
@@ -1,8 +1,8 @@
1
- import { _set_attrs_ } from "./utils/index.js";
2
- // import {
3
- // is_camelcase,
4
- // camel2hyphencase
5
- // } from '../../data/string/index.js'
1
+ import { isStateGetter } from "../../../hooks/use-state.js";
2
+ import {
3
+ is_camelcase,
4
+ camel2hyphencase
5
+ } from '../../../data/string/index.js'
6
6
 
7
7
  export function setAttr(name, value) {
8
8
  if(name instanceof Object){
@@ -31,3 +31,17 @@ export function setContentEditable(bool = true) {
31
31
  return this;
32
32
  }
33
33
 
34
+
35
+ export function _set_attrs_(name, value){
36
+ if(globalThis.SVGAElement && this.element instanceof globalThis.SVGAElement) name = is_camelcase(name) ? camel2hyphencase(name) : name;
37
+ if(this?.attr[name] && this?.attr[name]===value) return;
38
+ if(isStateGetter(value)){
39
+ const getter = value()
40
+ getter._subscribe(
41
+ (newValue) => this.element?.setAttribute(name, newValue),
42
+ this
43
+ );
44
+ }
45
+ else this.element?.setAttribute(name, value)
46
+ Object.assign(this.cache.attributes, {[name]:value});
47
+ }
@@ -1,5 +1,10 @@
1
+ // import { isStateGetter } from "../../../hooks/use-state.js";
2
+ // import {
3
+ // is_camelcase,
4
+ // camel2hyphencase
5
+ // } from '../../../data/string/index.js';
1
6
  import { text } from "../../text/index.js";
2
- import { __addItem__ } from "./utils/index.js";
7
+
3
8
  export function append(...ele) {
4
9
  __addItem__.call(this, "append", "push", ...ele);
5
10
  return this;
@@ -54,3 +59,50 @@ export function before(ui){
54
59
  }
55
60
 
56
61
 
62
+
63
+
64
+ export async function __addItem__(adder, pusher, ...ele) {
65
+ if (this.cache.isFrozzen) {
66
+ console.warn("You can't append new item to frozzen element");
67
+ return this;
68
+ }
69
+ for (let i = 0; i < ele.length; i++) {
70
+ if (["number", "string"].includes(typeof ele[i])) ele[i] = text(ele[i]);
71
+ // Fix Items Latter
72
+ if (ele[i] instanceof Function) {
73
+ const getter = ele[i]();
74
+ if (getter.isStateGetter) {
75
+ ele[i] = text(getter.value);
76
+ getter._subscribe(
77
+ (newValue) => (ele[i].element.textContent = newValue),
78
+ ele[i]
79
+ );
80
+ // this.element.appendChild(textNode);
81
+ }
82
+ }
83
+ if (typeof globalThis?.Node === "function" && ele[i] instanceof globalThis?.Node) ele[i] = new this.constructor(ele[i]);
84
+ if (ele[i]?.isUINode) {
85
+ ele[i].cache.parent = this;
86
+ this.element?.[adder](ele[i].element);
87
+ ele[i].target = this.element;
88
+ this.items[pusher](ele[i]);
89
+ }
90
+ else if(ele[i] instanceof Promise){
91
+ const UIEle = await ele[i]
92
+ UIEle.cache.parent = this;
93
+ this.element?.[adder](UIEle.element);
94
+ UIEle.target = this.element;
95
+ this.items[pusher](UIEle)
96
+ }
97
+ else if (ele[i] instanceof Object) {
98
+ if (ele[i]?.style) this.style(ele[i]?.style);
99
+ if (ele[i]?.attr) {
100
+ Object.entries(ele[i].attr).forEach((n) =>
101
+ this.setAttr("" + n[0], n[1]),
102
+ );
103
+ }
104
+ }
105
+ }
106
+ this.maintain();
107
+ return this;
108
+ }
@@ -0,0 +1,22 @@
1
+ const CATEGORY = 'click';
2
+ import {register_click_away_event} from '../../../../events/custom-events-registry/click-away.js'
3
+ export const ClickListeners = {
4
+ onClick(callback){
5
+ this._on(
6
+ 'click', callback,
7
+ { category : CATEGORY })
8
+ },
9
+ onDblClick(callback){
10
+ this._on(
11
+ 'dblclick', callback,
12
+ { category : CATEGORY})
13
+ },
14
+ onClickAway(callback){
15
+ register_click_away_event(this.element)
16
+ this._on(
17
+ 'clickaway', callback,
18
+ { category : CATEGORY})
19
+ },
20
+ }
21
+
22
+
@@ -0,0 +1,3 @@
1
+ export * from './click.js'
2
+ export * from './ptr.js'
3
+ export * from './key.js'
@@ -0,0 +1,24 @@
1
+ const CATEGORY = 'key'
2
+ export const KeyListeners = {
3
+ onKeyDown(callback){
4
+ this._on(
5
+ 'keydown', callback,
6
+ { category : CATEGORY, details_setter : ctx=> { ctx.kd = ctx.event.key }
7
+ })
8
+ },
9
+ onKeyPress(callback){
10
+ this._on(
11
+ 'keypress', callback,
12
+ { category : CATEGORY, details_setter : ctx=> { ctx.kp = ctx.event.key }
13
+ })
14
+ },
15
+ onKeyUp(callback){
16
+ this._on(
17
+ 'keydown', callback,
18
+ { category : CATEGORY, details_setter : ctx=> { ctx.ku = ctx.event.key }
19
+ })
20
+ },
21
+
22
+ }
23
+
24
+
@@ -0,0 +1,44 @@
1
+ import { getCoordinates } from "./utils/index.js";
2
+ const CATEGORY = 'ptr';
3
+ export const PtrListeners = {
4
+ onPtrDown(callback, useNormalizedCoordinates = false){
5
+ this._on(
6
+ 'pointerdown', callback,
7
+ { category : CATEGORY, details_setter : (ctx)=> {
8
+ const {x, y} = getCoordinates(ctx, useNormalizedCoordinates);
9
+ ctx.dx = x;
10
+ ctx.dy = y;
11
+ ctx.isDown = true;
12
+ ctx.isDragging = ctx.isMoving ?? false
13
+ }}
14
+ )
15
+ },
16
+ onPtrMove(callback, useNormalizedCoordinates = false){
17
+ this._on(
18
+ 'pointermove', callback,
19
+ { category : CATEGORY, details_setter : (ctx)=> {
20
+ const {x, y} = getCoordinates(ctx, useNormalizedCoordinates);
21
+ ctx.mx = x;
22
+ ctx.my = y;
23
+ ctx.isMoving = true;
24
+ ctx.isDragging = ctx.isDown ?? false
25
+ }}
26
+ )
27
+ },
28
+ onPtrUp(callback, useNormalizedCoordinates = false){
29
+ this._on(
30
+ 'pointerup', callback,
31
+ { category : CATEGORY, details_setter : (ctx)=> {
32
+ const {x, y} = getCoordinates(ctx, useNormalizedCoordinates);
33
+ ctx.ux = x;
34
+ ctx.uy = y;
35
+ ctx.isDown = false;
36
+ ctx.isMoving = false;
37
+ ctx.isDragging = false;
38
+ }}
39
+ )
40
+ }
41
+ }
42
+
43
+
44
+
@@ -0,0 +1,15 @@
1
+ export const getCoordinates = (ctx, normalized = false) =>{
2
+ const rect = ctx.element.getBoundingClientRect();
3
+ const e = ctx.event;
4
+ let x = (e?.clientX - rect.left) | 0;
5
+ let y = (e?.clientY - rect.top) | 0;
6
+
7
+ if(normalized){
8
+ const w = ctx.element.clientWidth;
9
+ const h = ctx.element.clientHeight;
10
+ x = +((x / w) * 2 - 1).toFixed(8);
11
+ y = +((y / h) * -2 + 1).toFixed(8);
12
+ }
13
+
14
+ return {x, y};
15
+ }
@@ -7,11 +7,13 @@ export * as AttrsMethods from './attrs.js'
7
7
  export * from './dom.js'
8
8
  export * as DomMethods from './dom.js'
9
9
 
10
- export * from './events.js'
10
+ // export * from './events.js'
11
11
 
12
12
  export * from './indexing.js'
13
13
  export * as IndexingMethods from './indexing.js'
14
14
 
15
15
 
16
16
  export * from './style.js'
17
- export * as StyleMethods from './style.js'
17
+ export * as StyleMethods from './style.js'
18
+
19
+ export * from './events/index.js'
@@ -1,41 +0,0 @@
1
- export class EventController {
2
- constructor(target, category){
3
- this.cache = {
4
- category,
5
- target,
6
- listeners : {},
7
- currentEvent : null
8
- }
9
- }
10
- get element(){
11
- return this.cache.target.element;
12
- }
13
- get currentEvent(){
14
- return this.cache.currentEvent;
15
- }
16
- addListener(event, callback){
17
- this.cache.listeners[event] = {
18
- paused : false,
19
- callback : ()=>{
20
- if(!this.cache.listeners[event].paused) {
21
- this.cache.currentEvent = event
22
- callback.call(this, this)
23
- }
24
- },
25
- };
26
- this.element.addEventListener(event, this.cache.listeners[event].callback);
27
- return this;
28
- }
29
- removeListener(event){
30
- this.element.removeEventListener(event, this.cache.listeners[event].callback);
31
- return this;
32
- }
33
- pause(event){
34
- this.cache.listeners[event].paused = true;
35
- return this;
36
- }
37
- resume(event){
38
- this.cache.listeners[event].paused = false;
39
- return this;
40
- }
41
- }
@@ -1 +0,0 @@
1
- export * from './controller/index.js'
@@ -1,57 +0,0 @@
1
- import { EventsMap } from "../../../events/events-map/index.js";
2
- import {
3
- bind_pointer_event,
4
- bind_mouse_event,
5
- bind_key_event,
6
- bind_click_event,
7
- bind_drag_event,
8
- bind_clipboard_event,
9
- bind_focus_event,
10
- bind_wheel_event,
11
- bind_view_event,
12
- bind_swipe_event
13
- } from "../../../events/binders/index.js";
14
-
15
- import { bind_custom_event } from "../../../events/binders/custom-event.js";
16
-
17
- const binderMap = {
18
- ptr: bind_pointer_event,
19
- mouse : bind_mouse_event,
20
- key: bind_key_event,
21
- click : bind_click_event,
22
- drag : bind_drag_event,
23
- clipboard : bind_clipboard_event,
24
- focus : bind_focus_event,
25
- wheel : bind_wheel_event,
26
- view : bind_view_event,
27
- swipe : bind_swipe_event
28
- };
29
-
30
- const EventsMethodes = {
31
- on(event_name,...callbacks){
32
- if(!this.events.custom)this.events.custom = bind_custom_event(this);
33
- this.events.custom.on(event_name,...callbacks);
34
- return this;
35
- },
36
- emit(event_name,detail={}){
37
- if(!this.events.custom)this.events.custom = bind_custom_event(this);
38
- this.events.custom.emit(event_name,detail);
39
- return this;
40
- }
41
- };
42
-
43
- Object.entries(EventsMap).forEach(([name, eventList]) => {
44
- const lname = name.toLowerCase()
45
- eventList.forEach(event => {
46
- const methodName = `on${event}`;
47
- EventsMethodes[methodName] = function (callbacks) {
48
- if (!this.events[lname]) this.events[lname] = binderMap[lname](this);
49
- this.events[lname][methodName](callbacks);
50
- return this;
51
- };
52
- });
53
- });
54
-
55
-
56
-
57
- export {EventsMethodes}
@@ -1,64 +0,0 @@
1
- import { isStateGetter } from "../../../../hooks/use-state.js";
2
- import {
3
- is_camelcase,
4
- camel2hyphencase
5
- } from '../../../../data/string/index.js'
6
- import { text } from "../../../text/index.js";
7
- export async function __addItem__(adder, pusher, ...ele) {
8
- if (this.cache.isFrozzen) {
9
- console.warn("You can't append new item to frozzen element");
10
- return this;
11
- }
12
- for (let i = 0; i < ele.length; i++) {
13
- if (["number", "string"].includes(typeof ele[i])) ele[i] = text(ele[i]);
14
- // Fix Items Latter
15
- if (ele[i] instanceof Function) {
16
- const getter = ele[i]();
17
- if (getter.isStateGetter) {
18
- ele[i] = text(getter.value);
19
- getter._subscribe(
20
- (newValue) => (ele[i].element.textContent = newValue),
21
- ele[i]
22
- );
23
- // this.element.appendChild(textNode);
24
- }
25
- }
26
- if (typeof globalThis?.Node === "function" && ele[i] instanceof globalThis?.Node) ele[i] = new this.constructor(ele[i]);
27
- if (ele[i]?.isUINode) {
28
- ele[i].cache.parent = this;
29
- this.element?.[adder](ele[i].element);
30
- ele[i].target = this.element;
31
- this.items[pusher](ele[i]);
32
- }
33
- else if(ele[i] instanceof Promise){
34
- const UIEle = await ele[i]
35
- UIEle.cache.parent = this;
36
- this.element?.[adder](UIEle.element);
37
- UIEle.target = this.element;
38
- this.items[pusher](UIEle)
39
- }
40
- else if (ele[i] instanceof Object) {
41
- if (ele[i]?.style) this.style(ele[i]?.style);
42
- if (ele[i]?.attr) {
43
- Object.entries(ele[i].attr).forEach((n) =>
44
- this.setAttr("" + n[0], n[1]),
45
- );
46
- }
47
- }
48
- }
49
- this.maintain();
50
- return this;
51
- }
52
- export function _set_attrs_(name, value){
53
- if(globalThis.SVGAElement && this.element instanceof globalThis.SVGAElement) name = is_camelcase(name) ? camel2hyphencase(name) : name;
54
- if(this?.attr[name] && this?.attr[name]===value) return;
55
- if(isStateGetter(value)){
56
- const getter = value()
57
- getter._subscribe(
58
- (newValue) => this.element?.setAttribute(name, newValue),
59
- this
60
- );
61
- }
62
- else this.element?.setAttribute(name, value)
63
- Object.assign(this.cache.attributes, {[name]:value});
64
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes