native-document 1.0.35 → 1.0.37

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.
@@ -1,22 +1,20 @@
1
1
  import {ElementCreator} from "./ElementCreator";
2
2
  import {createTextNode} from "./HtmlElementWrapper";
3
- import PluginsManager from "../utils/plugins-manager";
4
3
 
5
4
  const cloneBindingsDataCache = new WeakMap();
6
5
 
7
6
 
8
7
  const bindAttributes = (node, bindDingData, data) => {
9
- if(!bindDingData) {
10
- return null;
11
- }
12
- const attributes = { };
8
+ let attributes = null;
13
9
  if(bindDingData.attributes) {
10
+ attributes = attributes || {};
14
11
  for (const attr in bindDingData.attributes) {
15
12
  attributes[attr] = bindDingData.attributes[attr](...data);
16
13
  }
17
14
  }
18
15
 
19
16
  if(bindDingData.classes) {
17
+ attributes = attributes || {};
20
18
  attributes.class = {};
21
19
  for (const className in bindDingData.classes) {
22
20
  attributes.class[className] = bindDingData.classes[className](...data);
@@ -24,49 +22,69 @@ const bindAttributes = (node, bindDingData, data) => {
24
22
  }
25
23
 
26
24
  if(bindDingData.styles) {
25
+ attributes = attributes || {};
27
26
  attributes.style = {};
28
27
  for (const property in bindDingData.styles) {
29
28
  attributes.style[property] = bindDingData.styles[property](...data);
30
29
  }
31
30
  }
32
31
 
33
- if(Object.keys(attributes)) {
32
+ if(attributes) {
34
33
  ElementCreator.processAttributes(node, attributes);
35
- return attributes;
34
+ return true;
36
35
  }
37
36
 
38
37
  return null;
39
38
  };
40
39
 
41
-
42
- const bindAttachesMethods = function(node, bindDingData, data) {
43
- if(!bindDingData?.attaches) {
44
- return null;
40
+ const $hydrateFn = function(hydrateFunction, target, element, property) {
41
+ if(!cloneBindingsDataCache.has(element)) {
42
+ // { classes, styles, attributes, value, attach }
43
+ cloneBindingsDataCache.set(element, {});
44
+ }
45
+ const hydrationState = cloneBindingsDataCache.get(element);
46
+ if(target === 'value') {
47
+ hydrationState.value = hydrateFunction;
48
+ return;
45
49
  }
46
- for(const methodName in bindDingData.attaches) {
47
- node.nd[methodName](function(...args) {
48
- bindDingData.attaches[methodName].call(this, ...[...args, ...data]);
49
- });
50
+ if(target === 'attach') {
51
+ hydrationState.attach = hydrateFunction;
52
+ return;
50
53
  }
54
+ hydrationState[target] = hydrationState[target] || {};
55
+ hydrationState[target][property] = hydrateFunction;
51
56
  }
52
57
 
58
+ const bindAttachMethods = function(node, bindDingData, data) {
59
+ if(!bindDingData.attach) {
60
+ return null;
61
+ }
62
+ bindDingData.attach(node, ...data);
63
+ };
64
+
53
65
  export function TemplateCloner($fn) {
54
66
  let $node = null;
67
+ let $hasBindingData = false;
55
68
 
56
69
  const clone = (node, data) => {
57
70
  const bindDingData = cloneBindingsDataCache.get(node);
58
- if(node instanceof Text) {
59
- if(bindDingData?.value) {
71
+ if(node.nodeType === 3) {
72
+ if(bindDingData && bindDingData.value) {
60
73
  return bindDingData.value(data);
61
74
  }
62
75
  return node.cloneNode(true);
63
76
  }
64
- const nodeCloned = node.cloneNode();
65
- bindAttributes(nodeCloned, bindDingData, data);
66
- bindAttachesMethods(nodeCloned, bindDingData, data);
67
-
68
- for(let i = 0, length = node.childNodes.length; i < length; i++) {
69
- const childNode = node.childNodes[i];
77
+ const nodeCloned = node.cloneNode(node.fullCloneNode);
78
+ if(bindDingData) {
79
+ bindAttributes(nodeCloned, bindDingData, data);
80
+ bindAttachMethods(nodeCloned, bindDingData, data);
81
+ }
82
+ if(node.fullCloneNode) {
83
+ return nodeCloned;
84
+ }
85
+ const childNodes = node.childNodes;
86
+ for(let i = 0, length = childNodes.length; i < length; i++) {
87
+ const childNode = childNodes[i];
70
88
  const childNodeCloned = clone(childNode, data);
71
89
  nodeCloned.appendChild(childNodeCloned);
72
90
  }
@@ -76,27 +94,25 @@ export function TemplateCloner($fn) {
76
94
  this.clone = (data) => {
77
95
  if(!$node) {
78
96
  $node = $fn(this);
97
+ if(!$hasBindingData) {
98
+ const nodeCloned = $node.cloneNode(true);
99
+ nodeCloned.fullCloneNode = true;
100
+ return nodeCloned;
101
+ }
102
+ }
103
+ if(!$hasBindingData) {
104
+ return $node.cloneNode(true);
79
105
  }
80
- const cloneNode = clone($node, data);
81
- PluginsManager.emit('NodeTemplateInstanceCreated', cloneNode);
82
- return cloneNode;
106
+ return clone($node, data);
83
107
  };
84
108
 
109
+
85
110
  const createBinding = (hydrateFunction, target) => {
86
111
  return {
87
- $hydrate : function(element, property) {
88
- if(!cloneBindingsDataCache.has(element)) {
89
- // { classes, styles, attributes, value, attaches }
90
- cloneBindingsDataCache.set(element, {});
91
- }
92
- const hydrationState = cloneBindingsDataCache.get(element);
93
- if(target === 'value') {
94
- hydrationState.value = hydrateFunction;
95
- return;
96
- }
97
- hydrationState[target] = hydrationState[target] || {};
98
- hydrationState[target][property] = hydrateFunction;
99
- }
112
+ $hydrate : (element, property) => {
113
+ $hasBindingData = true;
114
+ $hydrateFn(hydrateFunction, target, element, property)
115
+ },
100
116
  }
101
117
  };
102
118
 
@@ -106,29 +122,44 @@ export function TemplateCloner($fn) {
106
122
  this.class = (fn) => {
107
123
  return createBinding(fn, 'classes');
108
124
  };
109
- this.value = (fn) => {
125
+ this.property = (propertyName) => {
126
+ return this.value(propertyName);
127
+ }
128
+ this.value = (callbackOrProperty) => {
129
+ if(typeof callbackOrProperty !== 'function') {
130
+ return createBinding(function(data) {
131
+ const firstArgument = data[0];
132
+ return createTextNode(firstArgument[callbackOrProperty]);
133
+ }, 'value');
134
+ }
110
135
  return createBinding(function(data) {
111
- return createTextNode(fn(...data));
136
+ return createTextNode(callbackOrProperty(...data));
112
137
  }, 'value');
113
138
  };
114
139
  this.attr = (fn) => {
115
140
  return createBinding(fn, 'attributes');
116
141
  };
117
142
  this.attach = (fn) => {
118
- return createBinding(fn, 'attaches');
143
+ return createBinding(fn, 'attach');
119
144
  };
120
145
  }
121
146
 
122
147
  export function useCache(fn) {
123
148
  let $cache = null;
124
- PluginsManager.emit('NodeTemplateStored', fn);
125
149
 
126
- return function(...args) {
150
+ const wrapper = function(args) {
127
151
  if(!$cache) {
128
152
  $cache = new TemplateCloner(fn);
129
- PluginsManager.emit('NodeTemplateCreated', $cache);
130
153
  }
131
-
132
154
  return $cache.clone(args);
133
155
  };
134
- }
156
+
157
+ if(fn.length < 2) {
158
+ return function(...args) {
159
+ return wrapper(args);
160
+ };
161
+ }
162
+ return function(_, __, ...args) {
163
+ return wrapper([_, __, ...args]);
164
+ };
165
+ }
@@ -30,14 +30,15 @@ export interface WhenFunction {
30
30
  export interface ForEachFunction {
31
31
  <T>(data: T[] | Record<string, T> | ObservableItem<T[]> | ObservableItem<Record<string, T>>,
32
32
  callback: (item: T, index?: ObservableItem<number>) => ValidChild,
33
- key?: string | ((item: T, defaultKey: string | number) => string)): DocumentFragment;
33
+ key?: string | ((item: T, defaultKey: string | number) => string),
34
+ configs?: { shouldKeepItemsInCache: boolean, isParentUniqueChild: boolean }): DocumentFragment,
34
35
  }
35
36
 
36
37
  export interface ForEachArrayFunction {
37
38
  <T>(data: ObservableArray<T>,
38
39
  callback: (item: T, index?: ObservableItem<number>) => ValidChild,
39
40
  key?: string | ((item: T, defaultKey: number) => string),
40
- configs?: { pushDelay?: (items: T[]) => number }): DocumentFragment;
41
+ configs?: { pushDelay?: (items: T[]) => number, isParentUniqueChild: boolean }): DocumentFragment;
41
42
  }
42
43
 
43
44
  // Control Flow Components
@@ -412,6 +412,204 @@ export interface NDElement {
412
412
  onPreventStopCopy(callback: (event: ClipboardEvent) => void): this;
413
413
  onPreventStopCut(callback: (event: ClipboardEvent) => void): this;
414
414
  onPreventStopPaste(callback: (event: ClipboardEvent) => void): this;
415
+
416
+ // DELEGATION METHODS - WHEN (for children)
417
+
418
+ // When versions for Mouse Events
419
+ whenClick(callback: (event: MouseEvent) => void): this;
420
+ whenDblClick(callback: (event: MouseEvent) => void): this;
421
+ whenMouseDown(callback: (event: MouseEvent) => void): this;
422
+ whenMouseEnter(callback: (event: MouseEvent) => void): this;
423
+ whenMouseLeave(callback: (event: MouseEvent) => void): this;
424
+ whenMouseMove(callback: (event: MouseEvent) => void): this;
425
+ whenMouseOut(callback: (event: MouseEvent) => void): this;
426
+ whenMouseOver(callback: (event: MouseEvent) => void): this;
427
+ whenMouseUp(callback: (event: MouseEvent) => void): this;
428
+ whenWheel(callback: (event: WheelEvent) => void): this;
429
+ whenContextMenu(callback: (event: MouseEvent) => void): this;
430
+
431
+ // When versions for Keyboard Events
432
+ whenKeyDown(callback: (event: KeyboardEvent) => void): this;
433
+ whenKeyPress(callback: (event: KeyboardEvent) => void): this;
434
+ whenKeyUp(callback: (event: KeyboardEvent) => void): this;
435
+
436
+ // When versions for Form Events
437
+ whenBlur(callback: (event: FocusEvent) => void): this;
438
+ whenChange(callback: (event: Event) => void): this;
439
+ whenFocus(callback: (event: FocusEvent) => void): this;
440
+ whenFocusIn(callback: (event: FocusEvent) => void): this;
441
+ whenFocusOut(callback: (event: FocusEvent) => void): this;
442
+ whenInput(callback: (event: Event) => void): this;
443
+ whenInvalid(callback: (event: Event) => void): this;
444
+ whenReset(callback: (event: Event) => void): this;
445
+ whenSearch(callback: (event: Event) => void): this;
446
+ whenSelect(callback: (event: Event) => void): this;
447
+ whenSubmit(callback: (event: Event) => void): this;
448
+
449
+ // When versions for Drag Events
450
+ whenDrag(callback: (event: DragEvent) => void): this;
451
+ whenDragEnd(callback: (event: DragEvent) => void): this;
452
+ whenDragEnter(callback: (event: DragEvent) => void): this;
453
+ whenDragLeave(callback: (event: DragEvent) => void): this;
454
+ whenDragOver(callback: (event: DragEvent) => void): this;
455
+ whenDragStart(callback: (event: DragEvent) => void): this;
456
+ whenDrop(callback: (event: DragEvent) => void): this;
457
+
458
+ // When versions for Window/Page Events
459
+ whenAfterPrint(callback: (event: Event) => void): this;
460
+ whenBeforePrint(callback: (event: Event) => void): this;
461
+ whenBeforeUnload(callback: (event: BeforeUnloadEvent) => void): this;
462
+ whenError(callback: (event: Event) => void): this;
463
+ whenHashChange(callback: (event: HashChangeEvent) => void): this;
464
+ whenLoad(callback: (event: Event) => void): this;
465
+ whenOffline(callback: (event: Event) => void): this;
466
+ whenOnline(callback: (event: Event) => void): this;
467
+ whenPageHide(callback: (event: PageTransitionEvent) => void): this;
468
+ whenPageShow(callback: (event: PageTransitionEvent) => void): this;
469
+ whenResize(callback: (event: UIEvent) => void): this;
470
+ whenScroll(callback: (event: Event) => void): this;
471
+ whenUnload(callback: (event: Event) => void): this;
472
+
473
+ // When versions for Media Events
474
+ whenAbort(callback: (event: Event) => void): this;
475
+ whenCanPlay(callback: (event: Event) => void): this;
476
+ whenCanPlayThrough(callback: (event: Event) => void): this;
477
+ whenDurationChange(callback: (event: Event) => void): this;
478
+ whenEmptied(callback: (event: Event) => void): this;
479
+ whenEnded(callback: (event: Event) => void): this;
480
+ whenLoadedData(callback: (event: Event) => void): this;
481
+ whenLoadedMetadata(callback: (event: Event) => void): this;
482
+ whenLoadStart(callback: (event: Event) => void): this;
483
+ whenPause(callback: (event: Event) => void): this;
484
+ whenPlay(callback: (event: Event) => void): this;
485
+ whenPlaying(callback: (event: Event) => void): this;
486
+ whenProgress(callback: (event: ProgressEvent) => void): this;
487
+ whenRateChange(callback: (event: Event) => void): this;
488
+ whenSeeked(callback: (event: Event) => void): this;
489
+ whenSeeking(callback: (event: Event) => void): this;
490
+ whenStalled(callback: (event: Event) => void): this;
491
+ whenSuspend(callback: (event: Event) => void): this;
492
+ whenTimeUpdate(callback: (event: Event) => void): this;
493
+ whenVolumeChange(callback: (event: Event) => void): this;
494
+ whenWaiting(callback: (event: Event) => void): this;
495
+
496
+ // When versions for Touch Events
497
+ whenTouchCancel(callback: (event: TouchEvent) => void): this;
498
+ whenTouchEnd(callback: (event: TouchEvent) => void): this;
499
+ whenTouchMove(callback: (event: TouchEvent) => void): this;
500
+ whenTouchStart(callback: (event: TouchEvent) => void): this;
501
+
502
+ // When versions for Animation Events
503
+ whenAnimationEnd(callback: (event: AnimationEvent) => void): this;
504
+ whenAnimationIteration(callback: (event: AnimationEvent) => void): this;
505
+ whenAnimationStart(callback: (event: AnimationEvent) => void): this;
506
+
507
+ // When versions for Transition Events
508
+ whenTransitionEnd(callback: (event: TransitionEvent) => void): this;
509
+
510
+ // When versions for Clipboard Events
511
+ whenCopy(callback: (event: ClipboardEvent) => void): this;
512
+ whenCut(callback: (event: ClipboardEvent) => void): this;
513
+ whenPaste(callback: (event: ClipboardEvent) => void): this;
514
+
515
+ // CAPTURE METHODS (for parents)
516
+
517
+ // Capture versions for Mouse Events
518
+ captureClick(directHandler?: (event: MouseEvent) => void): this;
519
+ captureDblClick(directHandler?: (event: MouseEvent) => void): this;
520
+ captureMouseDown(directHandler?: (event: MouseEvent) => void): this;
521
+ captureMouseEnter(directHandler?: (event: MouseEvent) => void): this;
522
+ captureMouseLeave(directHandler?: (event: MouseEvent) => void): this;
523
+ captureMouseMove(directHandler?: (event: MouseEvent) => void): this;
524
+ captureMouseOut(directHandler?: (event: MouseEvent) => void): this;
525
+ captureMouseOver(directHandler?: (event: MouseEvent) => void): this;
526
+ captureMouseUp(directHandler?: (event: MouseEvent) => void): this;
527
+ captureWheel(directHandler?: (event: WheelEvent) => void): this;
528
+ captureContextMenu(directHandler?: (event: MouseEvent) => void): this;
529
+
530
+ // Capture versions for Keyboard Events
531
+ captureKeyDown(directHandler?: (event: KeyboardEvent) => void): this;
532
+ captureKeyPress(directHandler?: (event: KeyboardEvent) => void): this;
533
+ captureKeyUp(directHandler?: (event: KeyboardEvent) => void): this;
534
+
535
+ // Capture versions for Form Events
536
+ captureBlur(directHandler?: (event: FocusEvent) => void): this;
537
+ captureChange(directHandler?: (event: Event) => void): this;
538
+ captureFocus(directHandler?: (event: FocusEvent) => void): this;
539
+ captureFocusIn(directHandler?: (event: FocusEvent) => void): this;
540
+ captureFocusOut(directHandler?: (event: FocusEvent) => void): this;
541
+ captureInput(directHandler?: (event: Event) => void): this;
542
+ captureInvalid(directHandler?: (event: Event) => void): this;
543
+ captureReset(directHandler?: (event: Event) => void): this;
544
+ captureSearch(directHandler?: (event: Event) => void): this;
545
+ captureSelect(directHandler?: (event: Event) => void): this;
546
+ captureSubmit(directHandler?: (event: Event) => void): this;
547
+
548
+ // Capture versions for Drag Events
549
+ captureDrag(directHandler?: (event: DragEvent) => void): this;
550
+ captureDragEnd(directHandler?: (event: DragEvent) => void): this;
551
+ captureDragEnter(directHandler?: (event: DragEvent) => void): this;
552
+ captureDragLeave(directHandler?: (event: DragEvent) => void): this;
553
+ captureDragOver(directHandler?: (event: DragEvent) => void): this;
554
+ captureDragStart(directHandler?: (event: DragEvent) => void): this;
555
+ captureDrop(directHandler?: (event: DragEvent) => void): this;
556
+
557
+ // Capture versions for Window/Page Events
558
+ captureAfterPrint(directHandler?: (event: Event) => void): this;
559
+ captureBeforePrint(directHandler?: (event: Event) => void): this;
560
+ captureBeforeUnload(directHandler?: (event: BeforeUnloadEvent) => void): this;
561
+ captureError(directHandler?: (event: Event) => void): this;
562
+ captureHashChange(directHandler?: (event: HashChangeEvent) => void): this;
563
+ captureLoad(directHandler?: (event: Event) => void): this;
564
+ captureOffline(directHandler?: (event: Event) => void): this;
565
+ captureOnline(directHandler?: (event: Event) => void): this;
566
+ capturePageHide(directHandler?: (event: PageTransitionEvent) => void): this;
567
+ capturePageShow(directHandler?: (event: PageTransitionEvent) => void): this;
568
+ captureResize(directHandler?: (event: UIEvent) => void): this;
569
+ captureScroll(directHandler?: (event: Event) => void): this;
570
+ captureUnload(directHandler?: (event: Event) => void): this;
571
+
572
+ // Capture versions for Media Events
573
+ captureAbort(directHandler?: (event: Event) => void): this;
574
+ captureCanPlay(directHandler?: (event: Event) => void): this;
575
+ captureCanPlayThrough(directHandler?: (event: Event) => void): this;
576
+ captureDurationChange(directHandler?: (event: Event) => void): this;
577
+ captureEmptied(directHandler?: (event: Event) => void): this;
578
+ captureEnded(directHandler?: (event: Event) => void): this;
579
+ captureLoadedData(directHandler?: (event: Event) => void): this;
580
+ captureLoadedMetadata(directHandler?: (event: Event) => void): this;
581
+ captureLoadStart(directHandler?: (event: Event) => void): this;
582
+ capturePause(directHandler?: (event: Event) => void): this;
583
+ capturePlay(directHandler?: (event: Event) => void): this;
584
+ capturePlaying(directHandler?: (event: Event) => void): this;
585
+ captureProgress(directHandler?: (event: ProgressEvent) => void): this;
586
+ captureRateChange(directHandler?: (event: Event) => void): this;
587
+ captureSeeked(directHandler?: (event: Event) => void): this;
588
+ captureSeeking(directHandler?: (event: Event) => void): this;
589
+ captureStalled(directHandler?: (event: Event) => void): this;
590
+ captureSuspend(directHandler?: (event: Event) => void): this;
591
+ captureTimeUpdate(directHandler?: (event: Event) => void): this;
592
+ captureVolumeChange(directHandler?: (event: Event) => void): this;
593
+ captureWaiting(directHandler?: (event: Event) => void): this;
594
+
595
+ // Capture versions for Touch Events
596
+ captureTouchCancel(directHandler?: (event: TouchEvent) => void): this;
597
+ captureTouchEnd(directHandler?: (event: TouchEvent) => void): this;
598
+ captureTouchMove(directHandler?: (event: TouchEvent) => void): this;
599
+ captureTouchStart(directHandler?: (event: TouchEvent) => void): this;
600
+
601
+ // Capture versions for Animation Events
602
+ captureAnimationEnd(directHandler?: (event: AnimationEvent) => void): this;
603
+ captureAnimationIteration(directHandler?: (event: AnimationEvent) => void): this;
604
+ captureAnimationStart(directHandler?: (event: AnimationEvent) => void): this;
605
+
606
+ // Capture versions for Transition Events
607
+ captureTransitionEnd(directHandler?: (event: TransitionEvent) => void): this;
608
+
609
+ // Capture versions for Clipboard Events
610
+ captureCopy(directHandler?: (event: ClipboardEvent) => void): this;
611
+ captureCut(directHandler?: (event: ClipboardEvent) => void): this;
612
+ capturePaste(directHandler?: (event: ClipboardEvent) => void): this;
415
613
  }
416
614
 
417
615
  export type ValidChild =
@@ -424,7 +622,9 @@ export type ValidChild =
424
622
  | Text
425
623
  | ObservableItem
426
624
  | NDElement
427
- | ValidChild[];
625
+ | BindingHydrator
626
+ | ValidChild[]
627
+ | ((...args: any[]) => ValidChild);
428
628
 
429
629
  export type Attributes = Record<string, any> & {
430
630
  class?: string | Record<string, boolean | ObservableItem<boolean>>;
@@ -81,6 +81,7 @@ export interface BatchFunction<TArgs extends any[] = any[], TReturn = any> {
81
81
  readonly $observer: ObservableItem<number>;
82
82
  }
83
83
 
84
+ export type ValidComputedDependencies = Array<ObservableItem | ObservableArray<any> | ObservableChecker | ObservableProxy<any>>;
84
85
  export interface ObservableStatic {
85
86
  <T>(value: T): ObservableItem<T>;
86
87
  array<T>(target: T[]): ObservableArray<T>;
@@ -88,7 +89,7 @@ export interface ObservableStatic {
88
89
  object<T extends Record<string, any>>(value: T): ObservableProxy<T>;
89
90
  json<T extends Record<string, any>>(value: T): ObservableProxy<T>;
90
91
 
91
- computed<T>(callback: () => T, dependencies?: ObservableItem[]): ObservableItem<T>;
92
+ computed<T>(callback: () => T, dependencies?: ValidComputedDependencies): ObservableItem<T>;
92
93
  computed<T>(callback: () => T, batchFunction?: BatchFunction): ObservableItem<T>;
93
94
 
94
95
  batch(callback: Function): BatchFunction;
@@ -1,64 +0,0 @@
1
-
2
-
3
- /**
4
- *
5
- * @param {HTMLElement} element
6
- * @returns {HTMLElement}
7
- */
8
- function HtmlElementPreventEventsWrapper(element) {
9
- const events = {};
10
- return new Proxy(events, {
11
- get(target, property) {
12
- if(events[property]) {
13
- return events[property];
14
- }
15
- events[property] = function(callback) {
16
- element.addEventListener(property.toLowerCase(), function(event) {
17
- event.preventDefault();
18
- callback.apply(this, [event]);
19
- });
20
- return element
21
- };
22
- return events[property];
23
- },
24
- set(target, property, newValue, receiver) {
25
- //...
26
- this.get(target, property)(newValue);
27
- return element;
28
- }
29
- });
30
- }
31
-
32
- /**
33
- *
34
- * @param {HTMLElement} element
35
- * @returns {HTMLElement}
36
- */
37
- export default function HtmlElementEventsWrapper(element) {
38
- const events = {};
39
- return new Proxy(events, {
40
- get(target, property) {
41
- if(events[property]) {
42
- return events[property];
43
- }
44
- if(property === 'prevent') {
45
- events[property] = HtmlElementPreventEventsWrapper(element);
46
- return events[property];
47
- }
48
- if(property === 'removeAll') {
49
-
50
- return;
51
- }
52
- events[property] = function(callback) {
53
- element.addEventListener(property.toLowerCase(), callback);
54
- return element
55
- };
56
- return events[property];
57
- },
58
- set(target, property, newValue, receiver) {
59
- //...
60
- this.get(target, property)(newValue);
61
- return element;
62
- }
63
- });
64
- }