@twobirds/microcomponents 0.0.84 → 0.0.85

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 (74) hide show
  1. package/README.md +22 -6
  2. package/assets/documentation/MC.md +60 -81
  3. package/assets/documentation/elements.md +6 -9
  4. package/assets/documentation/observables.md +97 -11
  5. package/dist/MC.d.ts +6 -9
  6. package/dist/MC.d.ts.map +1 -1
  7. package/dist/MC.js +33 -69
  8. package/dist/MC.min.js +33 -69
  9. package/dist/MC.ts +55 -102
  10. package/dist/elements.min.js +1 -1
  11. package/dist/formValues.min.js +1 -1
  12. package/dist/microcomponents.min.js +1 -1
  13. package/dist/observables.min.js +1 -1
  14. package/package.json +1 -1
  15. package/public/MC.d.ts +6 -9
  16. package/public/MC.d.ts.map +1 -1
  17. package/public/MC.js +33 -69
  18. package/public/MC.js.map +1 -1
  19. package/public/MC.min.js +33 -69
  20. package/public/MC.ts +55 -102
  21. package/public/documentation/MC.md +60 -81
  22. package/public/documentation/elements.md +6 -9
  23. package/public/documentation/observables.md +97 -11
  24. package/public/elements.min.js +1 -1
  25. package/public/formValues.min.js +1 -1
  26. package/public/microcomponents.min.js +1 -1
  27. package/public/observables.min.js +1 -1
  28. package/public/src/MC.d.ts +6 -9
  29. package/public/src/MC.d.ts.map +1 -1
  30. package/public/src/MC.js +33 -69
  31. package/public/src/MC.js.map +1 -1
  32. package/public/src/MC.ts +55 -102
  33. package/public/src/test/test/grandparent.js +1 -1
  34. package/public/src/test/test/testform.js +1 -1
  35. package/public/src/test/test.js +1 -1
  36. package/public/src/test/test.js.map +1 -1
  37. package/public/src/test/test.ts +2 -1
  38. package/public/test/MC.d.ts +6 -9
  39. package/public/test/MC.d.ts.map +1 -1
  40. package/public/test/MC.js +33 -69
  41. package/public/test/MC.min.js +33 -69
  42. package/public/test/MC.ts +55 -102
  43. package/public/test/elements.min.js +1 -1
  44. package/public/test/formValues.min.js +1 -1
  45. package/public/test/microcomponents.min.js +1 -1
  46. package/public/test/observables.min.js +1 -1
  47. package/public/test/test/grandparent.js +1 -1
  48. package/public/test/test/testform.js +1 -1
  49. package/public/test/test.js +1 -1
  50. package/public/test/test.js.map +1 -1
  51. package/public/test/test.ts +2 -1
  52. package/public/typedoc/assets/navigation.js +1 -1
  53. package/public/typedoc/assets/search.js +1 -1
  54. package/public/typedoc/classes/MC.DC.html +3 -4
  55. package/public/typedoc/classes/MC.MC.html +2 -4
  56. package/public/typedoc/classes/MC.McBase.html +2 -2
  57. package/public/typedoc/functions/MC.autoload.html +1 -1
  58. package/public/typedoc/functions/MC.off.html +1 -1
  59. package/public/typedoc/functions/MC.on.html +1 -1
  60. package/public/typedoc/functions/MC.one.html +1 -1
  61. package/public/typedoc/functions/MC.trigger.html +1 -0
  62. package/public/typedoc/functions/elements.defineCE.html +1 -1
  63. package/public/typedoc/functions/elements.getCE.html +1 -1
  64. package/public/typedoc/functions/formValues.formValues.html +1 -1
  65. package/public/typedoc/functions/observables.observe.html +1 -1
  66. package/public/typedoc/index.html +21 -10
  67. package/public/typedoc/interfaces/MC.HTMLMcElement.html +2 -2
  68. package/public/typedoc/modules/MC.html +3 -3
  69. package/public/typedoc/modules/elements.html +1 -1
  70. package/public/typedoc/modules/formValues.html +1 -1
  71. package/public/typedoc/modules/observables.html +1 -1
  72. package/public/typedoc/types/observables.Observable.html +1 -1
  73. package/src/MC.ts +55 -102
  74. package/src/test/test.ts +2 -1
package/dist/MC.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
- var isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
2
+ const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
3
3
  function getNativeEventNames(domNode) {
4
4
  let nativeEventNames = [];
5
5
  if (isBrowser()) {
@@ -9,51 +9,13 @@ function getNativeEventNames(domNode) {
9
9
  }
10
10
  return nativeEventNames;
11
11
  }
12
- function getMicroComponents(elements, search) {
13
- let mcValues = [];
14
- elements.forEach((e) => {
15
- if (e) {
16
- if (e instanceof HTMLElement) {
17
- const _mc = e?._mc;
18
- if (!search && _mc) {
19
- mcValues = mcValues.concat(Object.values(e._mc));
20
- }
21
- else if (search && _mc && _mc[search]) {
22
- mcValues.push(_mc[search]);
23
- }
24
- }
25
- }
26
- });
27
- return mcValues;
28
- }
29
- function traverseNodes(node, search, firstonly = true) {
30
- let mcValues = [];
31
- while (node) {
32
- if (node._mc) {
33
- if (!search) {
34
- mcValues = mcValues.concat(Object.values(node._mc));
35
- }
36
- else if (search && node._mc[search]) {
37
- mcValues.push(node._mc[search]);
38
- }
39
- if (firstonly)
40
- return mcValues;
41
- }
42
- node = node.parentNode;
43
- }
44
- return mcValues;
45
- }
46
12
  function isDOM(element) {
47
13
  return element && element instanceof HTMLElement;
48
14
  }
49
15
  function add(target, key, element = {}) {
50
16
  let node = target;
51
17
  if (!node._mc) {
52
- let debug = DC?.debug;
53
- DC.debug = false;
54
18
  node._mc = new DC(target);
55
- DC.debug = debug;
56
- delete node._mc._mc;
57
19
  }
58
20
  const _mc = node._mc;
59
21
  if (key.length && !_mc[key]) {
@@ -62,7 +24,7 @@ function add(target, key, element = {}) {
62
24
  target.setAttribute('data-mc', '');
63
25
  }
64
26
  }
65
- return element;
27
+ return node;
66
28
  }
67
29
  function remove(target, key) {
68
30
  if (!key)
@@ -79,9 +41,9 @@ function remove(target, key) {
79
41
  return;
80
42
  }
81
43
  function init(element) {
82
- if (element.constructor === DC)
83
- return;
84
44
  setTimeout(() => {
45
+ if (element.constructor === DC)
46
+ return;
85
47
  element.trigger('Init');
86
48
  }, 0);
87
49
  }
@@ -122,7 +84,7 @@ function bubbleEvent(domNode, ev) {
122
84
  .map((c) => c?.target));
123
85
  targets.forEach((target) => {
124
86
  if (target)
125
- DC.trigger(target, ev);
87
+ target._mc.trigger(target, ev);
126
88
  });
127
89
  }
128
90
  }, 0);
@@ -154,13 +116,15 @@ function getMcChildNodes(domNode) {
154
116
  const id = Math.random().toString().replace('.', '');
155
117
  const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
156
118
  domNode.setAttribute('temp_id', id);
157
- const myDomElements = domNode.querySelectorAll(selector);
119
+ const mcArray = [...domNode.querySelectorAll(selector)]
120
+ .filter((e) => !!e._mc)
121
+ .map(e => e._mc);
158
122
  domNode.removeAttribute('temp_id');
159
- return myDomElements;
123
+ return mcArray.length ? mcArray : null;
160
124
  }
161
125
  class McBase {
162
126
  _target;
163
- constructor(target, debug = false) {
127
+ constructor(target) {
164
128
  let element = this;
165
129
  this._target = new WeakRef(target || {});
166
130
  init(element);
@@ -174,9 +138,6 @@ class MC extends McBase {
174
138
  constructor(target) {
175
139
  super(target);
176
140
  }
177
- static trigger = trigger;
178
- trigger(ev, data = {}, bubble = 'l') {
179
- }
180
141
  }
181
142
  class DC extends McBase {
182
143
  constructor(target, debug = false) {
@@ -184,7 +145,6 @@ class DC extends McBase {
184
145
  }
185
146
  static add = add;
186
147
  static remove = remove;
187
- static trigger = trigger;
188
148
  off(eventName, handler) {
189
149
  off(this.target, eventName, handler);
190
150
  }
@@ -194,36 +154,40 @@ class DC extends McBase {
194
154
  one(eventName, handler) {
195
155
  one(this.target, eventName, handler);
196
156
  }
197
- trigger(ev, data = {}, bubble = 'l') {
198
- if (typeof ev === 'string') {
199
- }
157
+ trigger(eventName, data = {}, bubble = 'l') {
158
+ trigger(this.target, eventName, data, bubble);
200
159
  }
201
- parent(search = '') {
160
+ parent() {
202
161
  let target = this.target;
203
162
  if (!isDOM(target))
204
- return [];
205
- return traverseNodes(target.parentNode, search, true);
163
+ return null;
164
+ return target.closest('[data-mc]')?._mc || null;
206
165
  }
207
- ancestors(search = '') {
208
- let target = this?.target;
209
- if (!isDOM(target))
166
+ ancestors() {
167
+ let currentNode = this?.target, result = [];
168
+ if (!isDOM(currentNode))
210
169
  return [];
211
- return traverseNodes(this.target.parentNode, search, false);
170
+ while (currentNode = (currentNode.closest('[data-mc]'))) {
171
+ if (currentNode?._mc) {
172
+ result.push(currentNode?._mc);
173
+ }
174
+ }
175
+ return result.length ? result : null;
212
176
  }
213
- children(search = '') {
177
+ children() {
214
178
  let target = this?.target;
215
179
  if (!isDOM(target))
216
- return [];
217
- const myDomElements = getMcChildNodes(target);
218
- const mcValues = getMicroComponents([...myDomElements], search);
219
- return mcValues;
180
+ return null;
181
+ return getMcChildNodes(target);
220
182
  }
221
- descendants(search = '') {
222
- let target = this?.target;
183
+ descendants() {
184
+ const target = this?.target;
223
185
  if (!isDOM(target))
224
186
  return [];
225
- const myDomElements = target.querySelectorAll('*[data-mc]');
226
- return getMicroComponents([...myDomElements], search);
187
+ const mcArray = [...target.querySelectorAll('[data-mc]')]
188
+ .filter((e) => !!e._mc)
189
+ .map(e => e._mc);
190
+ return mcArray.length ? mcArray : null;
227
191
  }
228
192
  }
229
193
  const loadingDCs = new Set();
package/dist/MC.min.js CHANGED
@@ -56,7 +56,7 @@ __webpack_require__.r(__webpack_exports__);
56
56
  /* harmony export */ trigger: () => (/* binding */ trigger)
57
57
  /* harmony export */ });
58
58
 
59
- var isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
59
+ const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
60
60
  function getNativeEventNames(domNode) {
61
61
  let nativeEventNames = [];
62
62
  if (isBrowser()) {
@@ -66,51 +66,13 @@ function getNativeEventNames(domNode) {
66
66
  }
67
67
  return nativeEventNames;
68
68
  }
69
- function getMicroComponents(elements, search) {
70
- let mcValues = [];
71
- elements.forEach((e) => {
72
- if (e) {
73
- if (e instanceof HTMLElement) {
74
- const _mc = e?._mc;
75
- if (!search && _mc) {
76
- mcValues = mcValues.concat(Object.values(e._mc));
77
- }
78
- else if (search && _mc && _mc[search]) {
79
- mcValues.push(_mc[search]);
80
- }
81
- }
82
- }
83
- });
84
- return mcValues;
85
- }
86
- function traverseNodes(node, search, firstonly = true) {
87
- let mcValues = [];
88
- while (node) {
89
- if (node._mc) {
90
- if (!search) {
91
- mcValues = mcValues.concat(Object.values(node._mc));
92
- }
93
- else if (search && node._mc[search]) {
94
- mcValues.push(node._mc[search]);
95
- }
96
- if (firstonly)
97
- return mcValues;
98
- }
99
- node = node.parentNode;
100
- }
101
- return mcValues;
102
- }
103
69
  function isDOM(element) {
104
70
  return element && element instanceof HTMLElement;
105
71
  }
106
72
  function add(target, key, element = {}) {
107
73
  let node = target;
108
74
  if (!node._mc) {
109
- let debug = DC?.debug;
110
- DC.debug = false;
111
75
  node._mc = new DC(target);
112
- DC.debug = debug;
113
- delete node._mc._mc;
114
76
  }
115
77
  const _mc = node._mc;
116
78
  if (key.length && !_mc[key]) {
@@ -119,7 +81,7 @@ function add(target, key, element = {}) {
119
81
  target.setAttribute('data-mc', '');
120
82
  }
121
83
  }
122
- return element;
84
+ return node;
123
85
  }
124
86
  function remove(target, key) {
125
87
  if (!key)
@@ -136,9 +98,9 @@ function remove(target, key) {
136
98
  return;
137
99
  }
138
100
  function init(element) {
139
- if (element.constructor === DC)
140
- return;
141
101
  setTimeout(() => {
102
+ if (element.constructor === DC)
103
+ return;
142
104
  element.trigger('Init');
143
105
  }, 0);
144
106
  }
@@ -179,7 +141,7 @@ function bubbleEvent(domNode, ev) {
179
141
  .map((c) => c?.target));
180
142
  targets.forEach((target) => {
181
143
  if (target)
182
- DC.trigger(target, ev);
144
+ target._mc.trigger(target, ev);
183
145
  });
184
146
  }
185
147
  }, 0);
@@ -211,13 +173,15 @@ function getMcChildNodes(domNode) {
211
173
  const id = Math.random().toString().replace('.', '');
212
174
  const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
213
175
  domNode.setAttribute('temp_id', id);
214
- const myDomElements = domNode.querySelectorAll(selector);
176
+ const mcArray = [...domNode.querySelectorAll(selector)]
177
+ .filter((e) => !!e._mc)
178
+ .map(e => e._mc);
215
179
  domNode.removeAttribute('temp_id');
216
- return myDomElements;
180
+ return mcArray.length ? mcArray : null;
217
181
  }
218
182
  class McBase {
219
183
  _target;
220
- constructor(target, debug = false) {
184
+ constructor(target) {
221
185
  let element = this;
222
186
  this._target = new WeakRef(target || {});
223
187
  init(element);
@@ -231,9 +195,6 @@ class MC extends McBase {
231
195
  constructor(target) {
232
196
  super(target);
233
197
  }
234
- static trigger = trigger;
235
- trigger(ev, data = {}, bubble = 'l') {
236
- }
237
198
  }
238
199
  class DC extends McBase {
239
200
  constructor(target, debug = false) {
@@ -241,7 +202,6 @@ class DC extends McBase {
241
202
  }
242
203
  static add = add;
243
204
  static remove = remove;
244
- static trigger = trigger;
245
205
  off(eventName, handler) {
246
206
  off(this.target, eventName, handler);
247
207
  }
@@ -251,36 +211,40 @@ class DC extends McBase {
251
211
  one(eventName, handler) {
252
212
  one(this.target, eventName, handler);
253
213
  }
254
- trigger(ev, data = {}, bubble = 'l') {
255
- if (typeof ev === 'string') {
256
- }
214
+ trigger(eventName, data = {}, bubble = 'l') {
215
+ trigger(this.target, eventName, data, bubble);
257
216
  }
258
- parent(search = '') {
217
+ parent() {
259
218
  let target = this.target;
260
219
  if (!isDOM(target))
261
- return [];
262
- return traverseNodes(target.parentNode, search, true);
220
+ return null;
221
+ return target.closest('[data-mc]')?._mc || null;
263
222
  }
264
- ancestors(search = '') {
265
- let target = this?.target;
266
- if (!isDOM(target))
223
+ ancestors() {
224
+ let currentNode = this?.target, result = [];
225
+ if (!isDOM(currentNode))
267
226
  return [];
268
- return traverseNodes(this.target.parentNode, search, false);
227
+ while (currentNode = (currentNode.closest('[data-mc]'))) {
228
+ if (currentNode?._mc) {
229
+ result.push(currentNode?._mc);
230
+ }
231
+ }
232
+ return result.length ? result : null;
269
233
  }
270
- children(search = '') {
234
+ children() {
271
235
  let target = this?.target;
272
236
  if (!isDOM(target))
273
- return [];
274
- const myDomElements = getMcChildNodes(target);
275
- const mcValues = getMicroComponents([...myDomElements], search);
276
- return mcValues;
237
+ return null;
238
+ return getMcChildNodes(target);
277
239
  }
278
- descendants(search = '') {
279
- let target = this?.target;
240
+ descendants() {
241
+ const target = this?.target;
280
242
  if (!isDOM(target))
281
243
  return [];
282
- const myDomElements = target.querySelectorAll('*[data-mc]');
283
- return getMicroComponents([...myDomElements], search);
244
+ const mcArray = [...target.querySelectorAll('[data-mc]')]
245
+ .filter((e) => !!e._mc)
246
+ .map(e => e._mc);
247
+ return mcArray.length ? mcArray : null;
284
248
  }
285
249
  }
286
250
  const loadingDCs = new Set();
package/dist/MC.ts CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { LooseObject } from './helpers.js';
4
4
 
5
- var isBrowser = new Function(
5
+ const isBrowser = new Function(
6
6
  'try {return this===window;}catch(e){ return false;}'
7
7
  );
8
8
 
@@ -21,61 +21,17 @@ export interface HTMLMcElement extends HTMLElement {
21
21
  _mc: LooseObject;
22
22
  }
23
23
 
24
- // get all microcomponents from a list of HTMLElements
25
- function getMicroComponents(elements: any[], search: string): any[] {
26
- let mcValues: any[] = [];
27
-
28
- elements.forEach((e) => {
29
- if (e) {
30
- if (e instanceof HTMLElement) {
31
- const _mc = (e as any)?._mc;
32
- if (!search && _mc) {
33
- mcValues = mcValues.concat(Object.values((e as any)._mc));
34
- } else if (search && _mc && _mc[search]) {
35
- mcValues.push(_mc[search]);
36
- }
37
- }
38
- }
39
- });
40
- return mcValues;
41
- }
42
-
43
- // get all ancestor DOM nodes up to the document root
44
- function traverseNodes(
45
- node: { [key: string]: any },
46
- search: string,
47
- firstonly = true
48
- ): any[] {
49
- let mcValues: any[] = [];
50
- while (node) {
51
- if (node._mc) {
52
- if (!search) {
53
- mcValues = mcValues.concat(Object.values(node._mc));
54
- } else if (search && node._mc[search]) {
55
- mcValues.push(node._mc[search]);
56
- }
57
- if (firstonly) return mcValues;
58
- }
59
- node = node.parentNode;
60
- }
61
- return mcValues;
62
- }
63
-
64
24
  function isDOM(element: { [key: string]: any }) {
65
25
  return element && element instanceof HTMLElement;
66
26
  }
67
27
 
68
28
  // add a microcomponent to a target DOM node
69
- function add(target: HTMLElement, key: string, element = {}): any {
29
+ function add( target: HTMLElement, key: string, element: any = {} ): HTMLMcElement {
70
30
  let node = target as HTMLMcElement;
71
31
 
72
32
  // create the _mc property if necessary
73
33
  if (!node._mc) {
74
- let debug = (DC as any)?.debug;
75
- (DC as any).debug = false;
76
34
  node._mc = new (DC as any)(target);
77
- (DC as any).debug = debug;
78
- delete node._mc._mc; // NOT NEEDED on the top level _mc property of a DOM HTMLElement
79
35
  }
80
36
 
81
37
  const _mc = node._mc;
@@ -88,7 +44,8 @@ function add(target: HTMLElement, key: string, element = {}): any {
88
44
  target.setAttribute('data-mc', '');
89
45
  }
90
46
  }
91
- return element;
47
+
48
+ return node;
92
49
  }
93
50
 
94
51
  // remove a micro component from the DOM
@@ -114,27 +71,14 @@ function remove(target: HTMLMcElement, key: string) {
114
71
  }
115
72
 
116
73
  // run the "init" lifecycle event on the complete _mc structure
117
- function init(element: MC | DC) {
118
- if (element.constructor === DC) return;
119
-
74
+ function init(element: DC) {
120
75
  setTimeout(() => {
76
+ if (element.constructor === DC) return;
121
77
  element.trigger('Init');
122
- /*
123
- let keys = Object.keys( ( element as any)?._mc );
124
- if ( keys.length ){
125
- //console.log( 'inner Inits on [', mc.constructor.name, ']', keys );
126
- keys?.forEach( (key: string) => {
127
- let mc = ( element as any)?._mc?.[key];
128
- //console.log( key, typeof mc?.oneInit, mc );
129
- if ( ( mc as any )['oneInit'] && typeof ( mc as any ).oneInit == 'function' ){
130
- ( mc as any ).oneInit( new McEvent('Init') );
131
- }
132
- });
133
- };
134
- */
135
78
  }, 0);
136
79
  }
137
80
 
81
+ // 'eventName' => '_mcEventName'
138
82
  function getMcEventName( eventName: string ): string {
139
83
  return '_mc' + eventName[0].toUpperCase() + eventName.substring(1);
140
84
  }
@@ -156,8 +100,8 @@ function one( domNode: Node, eventName: string, handler: EventListenerOrEventLis
156
100
 
157
101
  // create and dispatch custom event
158
102
  function trigger(
159
- domNode: HTMLElement,
160
- event: CustomEvent | string,
103
+ domNode: HTMLElement,
104
+ event: CustomEvent | string,
161
105
  data: any = {},
162
106
  bubble: string = 'l'
163
107
  ){
@@ -199,7 +143,7 @@ function bubbleEvent( domNode: HTMLElement, ev: CustomEvent) {
199
143
  .map((c: unknown) => (c as any)?.target)
200
144
  );
201
145
  targets.forEach((target: HTMLMcElement) => {
202
- if (target) DC.trigger(target, ev);
146
+ if (target) target._mc.trigger(target, ev);
203
147
  });
204
148
  }
205
149
 
@@ -241,24 +185,27 @@ function autoAttachListeners(element: MC | DC) {
241
185
  }
242
186
  }
243
187
 
244
- function getMcChildNodes(domNode: HTMLElement): NodeListOf<Element> {
188
+ function getMcChildNodes(domNode: HTMLElement): DC[] | null {
245
189
  const id = Math.random().toString().replace('.', '');
246
190
  const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
247
191
  domNode.setAttribute('temp_id', id);
248
- const myDomElements = domNode.querySelectorAll(selector);
192
+ const mcArray: unknown[] =
193
+ ( [ ...domNode.querySelectorAll(selector) ] as HTMLMcElement[])
194
+ .filter( (e) => !!e._mc )
195
+ .map( e => e._mc );
249
196
  domNode.removeAttribute('temp_id');
250
- return myDomElements;
197
+ return mcArray.length ? mcArray as DC[] : null;
251
198
  }
252
199
 
253
200
  class McBase {
254
201
  private _target: WeakRef<any>; // avoid circular reference
255
202
 
256
- constructor(target?: { [key: string]: any }, debug: boolean = false) {
203
+ constructor(target?: { [key: string]: any } ) {
257
204
  let element = this as unknown as MC | DC;
258
205
 
259
206
  this._target = new WeakRef(target || {});
260
207
 
261
- init(element); // async lifecycle event
208
+ init(element as DC); // async lifecycle event
262
209
 
263
210
  autoAttachListeners(element);
264
211
  }
@@ -273,12 +220,6 @@ class MC extends McBase {
273
220
  constructor(target?: any) {
274
221
  super(target);
275
222
  }
276
-
277
- static trigger = trigger;
278
-
279
- trigger(ev: string, data: any = {}, bubble: string = 'l') {
280
- // TBD
281
- }
282
223
  }
283
224
 
284
225
  class DC extends McBase {
@@ -288,8 +229,8 @@ class DC extends McBase {
288
229
 
289
230
  static add: Function = add;
290
231
  static remove: Function = remove;
291
- static trigger: Function = trigger;
292
232
 
233
+ /* event handling */
293
234
  off( eventName: string, handler: EventListenerOrEventListenerObject ) {
294
235
  off( this.target, eventName, handler );
295
236
  }
@@ -302,45 +243,57 @@ class DC extends McBase {
302
243
  one( this.target, eventName, handler );
303
244
  }
304
245
 
305
- trigger(ev: CustomEvent | string, data: any = {}, bubble: string = 'l') {
306
- if ( typeof ev === 'string' ){
307
-
308
- }
309
- //trigger( this.target, ev, data, bubble);
246
+ trigger( eventName: string, data: any = {}, bubble: string = 'l') {
247
+ trigger( this.target, eventName, data, bubble);
310
248
  }
311
249
 
312
- parent(search: string = ''): any[] {
313
- let target: HTMLElement = (this as any).target;
314
- if (!isDOM(target)) return [];
315
- return traverseNodes((target as any).parentNode, search, true);
250
+ /* DOM traversal */
251
+ parent(): DC | null {
252
+ let
253
+ target: HTMLElement = (this as DC).target;
254
+ if (!isDOM(target)) return null;
255
+ return (target.closest('[data-mc]') as HTMLMcElement)?._mc as DC || null;
316
256
  }
317
257
 
318
- ancestors(search: string = ''): any[] {
319
- let target: any = (this as any)?.target;
320
- if (!isDOM(target)) return [];
321
- return traverseNodes((this as any).target.parentNode, search, false);
258
+ ancestors(): DC[] | null {
259
+ let
260
+ currentNode: HTMLElement | null = (this as DC)?.target as HTMLMcElement,
261
+ result: DC[] = [];
262
+
263
+ if (!isDOM( currentNode )) return [];
264
+
265
+ while ( currentNode = (currentNode.closest('[data-mc]') ) ){
266
+ if ( (currentNode as HTMLMcElement)?._mc ){
267
+ result.push( (currentNode as HTMLMcElement)?._mc as DC );
268
+ }
269
+ }
270
+
271
+ return result.length ? result : null;
322
272
  }
323
273
 
324
- children(search: string = ''): any[] {
274
+ children(): DC[] | null {
325
275
  let target: any = (this as any)?.target;
326
- if (!isDOM(target)) return [];
327
- const myDomElements = getMcChildNodes(target);
328
- const mcValues = getMicroComponents([...myDomElements], search);
329
- return mcValues;
276
+ if (!isDOM(target)) return null;
277
+ return getMcChildNodes(target);
330
278
  }
331
279
 
332
- descendants(search: string = ''): any[] {
333
- let target: any = (this as any)?.target;
280
+ descendants(): DC[] | null {
281
+ const target: any = (this as DC)?.target;
334
282
  if (!isDOM(target)) return [];
335
- const myDomElements = target.querySelectorAll('*[data-mc]');
336
- return getMicroComponents([...myDomElements], search);
283
+ const mcArray: unknown[] =
284
+ ( [ ...target.querySelectorAll( '[data-mc]' ) ] as HTMLMcElement[])
285
+ .filter( (e) => !!e._mc )
286
+ .map( e => e._mc );
287
+ return mcArray.length ? mcArray as DC[] : null;
337
288
  }
338
289
  }
339
290
 
291
+ /*
292
+ Autoload Section...
293
+ */
294
+
340
295
  const loadingDCs = new Set<string>();
341
296
 
342
- // this only applies to DCs defined in the data-mc attribute,
343
- // since they need to be attached manually
344
297
  function attachDC(element: string): Function {
345
298
 
346
299
  //@ts-ignore
@@ -1 +1 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.elements=e():t.elements=e()}(this,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{defineCE:()=>b,getCE:()=>h});var n=new Function("try {return this===window;}catch(e){ return false;}");function r(t,e){let n=[];return t.forEach((t=>{if(t&&t instanceof HTMLElement){const r=t?._mc;!e&&r?n=n.concat(Object.values(t._mc)):e&&r&&r[e]&&n.push(r[e])}})),n}function o(t,e,n=!0){let r=[];for(;t;){if(t._mc&&(e?e&&t._mc[e]&&r.push(t._mc[e]):r=r.concat(Object.values(t._mc)),n))return r;t=t.parentNode}return r}function c(t){return t&&t instanceof HTMLElement}function s(t,e,n={}){let r=t;if(!r._mc){let e=m?.debug;m.debug=!1,r._mc=new m(t),m.debug=e,delete r._mc._mc}const o=r._mc;return e.length&&!o[e]&&(o[e]=n,t instanceof HTMLElement&&!t.getAttribute("data-mc")&&t.setAttribute("data-mc","")),n}function a(t,e){if(!e)return;const n=t?._mc||{};n&&n[e]&&delete n[e],!Object.keys(n).length&&t instanceof HTMLElement&&t.hasAttribute("data-mc")&&t.removeAttribute("data-mc")}function i(t){return"_mc"+t[0].toUpperCase()+t.substring(1)}function u(t,e,n,r=!1){t.addEventListener(i(e),n,{capture:!1,once:r})}function l(t,e,n={},r="l"){const o="string"==typeof e?new CustomEvent(i(e),{detail:{data:n,bubble:r}}):e;r.length&&r.indexOf("l")>-1&&t.dispatchEvent(o),/[u|d]/.test(r)&&function(t,e){setTimeout((()=>{-1===e.detail.bubble.indexOf("l")&&(e.detail.bubble+="l"),e.detail.bubble.indexOf("u")>-1&&t.closest("[data-mc]")?.dispatchEvent(e),e.detail.bubble.indexOf("d")>-1&&new Set(t._mc.children().map((t=>t?.target))).forEach((t=>{t&&m.trigger(t,e)}))}),0)}(t,o)}class d{_target;constructor(t,e=!1){var r;this._target=new WeakRef(t||{}),(r=this).constructor!==m&&setTimeout((()=>{r.trigger("Init")}),0),function(t){if(!n()||t.constructor===m)return;const e=t.target;if(e instanceof HTMLElement){let n=t;Object.getOwnPropertyNames(n.constructor.prototype).filter((t=>/^on[A-Z]|one[A-Z]/.test(t)&&"function"==typeof n.constructor.prototype[t])).forEach((t=>{let r=/^one/.test(t),o=t.replace(/^on[e]{0,1}/,""),c=o.toLowerCase(),s=e=>{n[t](e)};e["on"+c]?e.addEventListener(c,s):u(e,o,s,r)}))}}(this)}get target(){return this._target.deref()}}class m extends d{constructor(t,e=!1){super(t)}static add=s;static remove=a;static trigger=l;off(t,e){!function(t,e,n){t.removeEventListener(i(e),n)}(this.target,t,e)}on(t,e){u(this.target,t,e)}one(t,e){!function(t,e,n){u(t,e,n,!0)}(this.target,t,e)}trigger(t,e={},n="l"){}parent(t=""){let e=this.target;return c(e)?o(e.parentNode,t,!0):[]}ancestors(t=""){let e=this?.target;return c(e)?o(this.target.parentNode,t,!1):[]}children(t=""){let e=this?.target;return c(e)?r([...function(t){const e=Math.random().toString().replace(".",""),n='[data-mc]:not([temp_id="'+e+'"] [data-mc] [data-mc])';t.setAttribute("temp_id",e);const r=t.querySelectorAll(n);return t.removeAttribute("temp_id"),r}(e)],t):[]}descendants(t=""){let e=this?.target;return c(e)?r([...e.querySelectorAll("*[data-mc]")],t):[]}}new Set;class f extends HTMLElement{constructor(){super()}connectedCallback(){this.dispatchEvent(new CustomEvent("_mcConnected"))}connectedMoveCallback(){this.dispatchEvent(new CustomEvent("_mcConnectedMove"))}disconnectedCallback(){this.dispatchEvent(new CustomEvent("_mcDisconnected"))}adoptedCallback(){this.dispatchEvent(new CustomEvent("_mcAdopted"))}attributeChangedCallback(t,e,n){this.dispatchEvent(new CustomEvent("_mcAttributeChanged",{detail:{name:t,oldValue:e,newValue:n}}))}formResetCallback(){this.dispatchEvent(new CustomEvent("_mcFormReset"))}}function p(t){return"function"==typeof t&&/^class\s/.test(Function.prototype.toString.call(t))}function b(t,e,n=[]){if(customElements.get(t))return void console.warn(`IGNORED: Custom element "${t}" is already defined!`);if(!t.includes("-"))throw new Error('createCustomElement: tagName must contain at least one hyphen ("-").');let r=t.split("-").map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("");p(e.prototype.constructor)&&e.prototype instanceof d?customElements.define(t,function(t,e){return Object.defineProperty(e,"name",{value:t})}(r,class extends f{instance;constructor(t){super();const n=p(e)?new e(this,t):e;m.add(this,r,n)}static get observedAttributes(){return n}})):customElements.define(t,e)}function h(t){return customElements.get(t)}return e})()));
1
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.elements=e():t.elements=e()}(this,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{defineCE:()=>m,getCE:()=>f});const n=new Function("try {return this===window;}catch(e){ return false;}");function r(t){return t&&t instanceof HTMLElement}function o(t,e,n={}){let r=t;r._mc||(r._mc=new l(t));const o=r._mc;return e.length&&!o[e]&&(o[e]=n,t instanceof HTMLElement&&!t.getAttribute("data-mc")&&t.setAttribute("data-mc","")),r}function c(t,e){if(!e)return;const n=t?._mc||{};n&&n[e]&&delete n[e],!Object.keys(n).length&&t instanceof HTMLElement&&t.hasAttribute("data-mc")&&t.removeAttribute("data-mc")}function s(t){return"_mc"+t[0].toUpperCase()+t.substring(1)}function a(t,e,n,r=!1){t.addEventListener(s(e),n,{capture:!1,once:r})}class i{_target;constructor(t){var e;this._target=new WeakRef(t||{}),e=this,setTimeout((()=>{e.constructor!==l&&e.trigger("Init")}),0),function(t){if(!n()||t.constructor===l)return;const e=t.target;if(e instanceof HTMLElement){let n=t;Object.getOwnPropertyNames(n.constructor.prototype).filter((t=>/^on[A-Z]|one[A-Z]/.test(t)&&"function"==typeof n.constructor.prototype[t])).forEach((t=>{let r=/^one/.test(t),o=t.replace(/^on[e]{0,1}/,""),c=o.toLowerCase(),s=e=>{n[t](e)};e["on"+c]?e.addEventListener(c,s):a(e,o,s,r)}))}}(this)}get target(){return this._target.deref()}}class l extends i{constructor(t,e=!1){super(t)}static add=o;static remove=c;off(t,e){!function(t,e,n){t.removeEventListener(s(e),n)}(this.target,t,e)}on(t,e){a(this.target,t,e)}one(t,e){!function(t,e,n){a(t,e,n,!0)}(this.target,t,e)}trigger(t,e={},n="l"){!function(t,e,n={},r="l"){const o="string"==typeof e?new CustomEvent(s(e),{detail:{data:n,bubble:r}}):e;r.length&&r.indexOf("l")>-1&&t.dispatchEvent(o),/[u|d]/.test(r)&&function(t,e){setTimeout((()=>{-1===e.detail.bubble.indexOf("l")&&(e.detail.bubble+="l"),e.detail.bubble.indexOf("u")>-1&&t.closest("[data-mc]")?.dispatchEvent(e),e.detail.bubble.indexOf("d")>-1&&new Set(t._mc.children().map((t=>t?.target))).forEach((t=>{t&&t._mc.trigger(t,e)}))}),0)}(t,o)}(this.target,t,e,n)}parent(){let t=this.target;return r(t)&&t.closest("[data-mc]")?._mc||null}ancestors(){let t=this?.target,e=[];if(!r(t))return[];for(;t=t.closest("[data-mc]");)t?._mc&&e.push(t?._mc);return e.length?e:null}children(){let t=this?.target;return r(t)?function(t){const e=Math.random().toString().replace(".",""),n='[data-mc]:not([temp_id="'+e+'"] [data-mc] [data-mc])';t.setAttribute("temp_id",e);const r=[...t.querySelectorAll(n)].filter((t=>!!t._mc)).map((t=>t._mc));return t.removeAttribute("temp_id"),r.length?r:null}(t):null}descendants(){const t=this?.target;if(!r(t))return[];const e=[...t.querySelectorAll("[data-mc]")].filter((t=>!!t._mc)).map((t=>t._mc));return e.length?e:null}}new Set;class u extends HTMLElement{constructor(){super()}connectedCallback(){this.dispatchEvent(new CustomEvent("_mcConnected"))}connectedMoveCallback(){this.dispatchEvent(new CustomEvent("_mcConnectedMove"))}disconnectedCallback(){this.dispatchEvent(new CustomEvent("_mcDisconnected"))}adoptedCallback(){this.dispatchEvent(new CustomEvent("_mcAdopted"))}attributeChangedCallback(t,e,n){this.dispatchEvent(new CustomEvent("_mcAttributeChanged",{detail:{name:t,oldValue:e,newValue:n}}))}formResetCallback(){this.dispatchEvent(new CustomEvent("_mcFormReset"))}}function d(t){return"function"==typeof t&&/^class\s/.test(Function.prototype.toString.call(t))}function m(t,e,n=[]){if(customElements.get(t))return void console.warn(`IGNORED: Custom element "${t}" is already defined!`);if(!t.includes("-"))throw new Error('createCustomElement: tagName must contain at least one hyphen ("-").');let r=t.split("-").map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("");d(e.prototype.constructor)&&e.prototype instanceof i?customElements.define(t,function(t,e){return Object.defineProperty(e,"name",{value:t})}(r,class extends u{instance;constructor(t){super();const n=d(e)?new e(this,t):e;l.add(this,r,n)}static get observedAttributes(){return n}})):customElements.define(t,e)}function f(t){return customElements.get(t)}return e})()));