@twobirds/microcomponents 0.0.37 → 0.0.41

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 (55) hide show
  1. package/assets/my-tag.css +10 -2
  2. package/assets/test.html +21 -12
  3. package/dist/MC.d.ts +1 -1
  4. package/dist/MC.d.ts.map +1 -1
  5. package/dist/MC.min.js +49 -28
  6. package/dist/MC.ts +69 -32
  7. package/dist/elements.min.js +1 -1
  8. package/dist/microcomponents.min.js +1 -1
  9. package/dist/observables.d.ts.map +1 -1
  10. package/dist/observables.min.js +1 -1
  11. package/dist/observables.ts +21 -14
  12. package/dist/test.ts +25 -17
  13. package/package.json +1 -1
  14. package/public/MC.js +49 -28
  15. package/public/MC.js.map +1 -1
  16. package/public/MC.min.js +49 -28
  17. package/public/assets/search.js +1 -1
  18. package/public/classes/MC.DC.html +13 -13
  19. package/public/classes/MC.MC.html +14 -12
  20. package/public/classes/MC.McBase.html +4 -4
  21. package/public/classes/MC.McEvent.html +13 -13
  22. package/public/elements.min.js +1 -1
  23. package/public/functions/MC.addListener.html +1 -1
  24. package/public/functions/MC.removeListener.html +1 -1
  25. package/public/functions/elements.defineCE.html +1 -1
  26. package/public/functions/elements.getCE.html +1 -1
  27. package/public/functions/formValues.formValues.html +1 -1
  28. package/public/functions/observables.observe.html +1 -1
  29. package/public/functions/selectors._d.html +1 -1
  30. package/public/functions/selectors._t.html +1 -1
  31. package/public/interfaces/MC.HTMLMcElement.html +2 -2
  32. package/public/interfaces/selectors.DSelector.html +55 -55
  33. package/public/interfaces/selectors.TSelector.html +37 -37
  34. package/public/microcomponents.min.js +1 -1
  35. package/public/modules/MC.html +1 -1
  36. package/public/modules/elements.html +1 -1
  37. package/public/modules/formValues.html +1 -1
  38. package/public/modules/observables.html +1 -1
  39. package/public/modules/selectors.html +1 -1
  40. package/public/my-tag.css +10 -2
  41. package/public/observables.js +20 -9
  42. package/public/observables.js.map +1 -1
  43. package/public/observables.min.js +1 -1
  44. package/public/src/MC.ts +69 -32
  45. package/public/src/observables.ts +21 -14
  46. package/public/src/test.ts +25 -17
  47. package/public/test.html +21 -12
  48. package/public/test.js +18 -25
  49. package/public/test.js.map +1 -1
  50. package/public/types/observables.Observable.html +5 -5
  51. package/public/types/selectors.selection.html +1 -1
  52. package/public/types/selectors.singleSelector.html +1 -1
  53. package/src/MC.ts +69 -32
  54. package/src/observables.ts +21 -14
  55. package/src/test.ts +25 -17
package/public/test.js CHANGED
@@ -23,11 +23,12 @@ class Translator extends DC {
23
23
  that.Translation = { lang: that.#translations[lang] }; // set translation
24
24
  }
25
25
  });
26
- that.Translation.bind(target);
26
+ that.Translation.bind(translationTargetObject);
27
27
  this.target.setAttribute('language', 'en');
28
+ this.Language.notify();
28
29
  }
29
30
  oneInit() {
30
- this.Language.notify(); // trigger translation
31
+ //(this.Language as Observable).notify(); // trigger translation
31
32
  }
32
33
  onAttributeChanged(ev) {
33
34
  if (!ev.data.newValue)
@@ -43,7 +44,7 @@ class Translator extends DC {
43
44
  defineCE(
44
45
  // equivalent to custom element registry .define()
45
46
  'my-tag', class MyTag extends DC {
46
- #template = '{lang.click} {counter}';
47
+ #template = '<button>{lang.click} {counter}</button>';
47
48
  #languages = {
48
49
  en: {
49
50
  click: 'click me',
@@ -56,6 +57,8 @@ defineCE(
56
57
  constructor(target) {
57
58
  super(target);
58
59
  let that = this; // minifier help
60
+ // hide
61
+ target.setAttribute('style', 'display:none');
59
62
  // render
60
63
  target.innerHTML = this.#template;
61
64
  // add public translator
@@ -69,53 +72,43 @@ defineCE(
69
72
  observe(that);
70
73
  // bind Dom to target
71
74
  that.Dom.bind(that.target);
75
+ // show
76
+ setTimeout(() => that.target.removeAttribute('style'), 100);
72
77
  }
73
78
  onAttributeChanged(ev) {
74
79
  //console.log(ev);
75
80
  this.target._mc.translator.Language = ev.data.newValue;
76
81
  }
77
82
  onClick(ev) {
78
- this.Dom.counter++;
83
+ const that = this, c = this.Dom.counter++;
84
+ ev.data.stopPropagation();
85
+ this.target.classList.remove('clicked');
86
+ this.target.classList.add(that.Dom.counter > 9 ? 'overClicked' : 'clicked');
79
87
  }
80
88
  }, ['language']);
81
89
  let MyTag = getCE('my-tag'), fragment = new DocumentFragment();
82
90
  /*
83
91
  stress test
84
92
  */
85
- /*
86
93
  let start = new Date().getTime();
87
-
88
- // create 1000 elements
89
- for (let x = 0; x < 1000; x++) {
90
- let mt = new MyTag('my-data');
91
- fragment.append(mt);
94
+ // create 100 elements
95
+ for (let x = 0; x < 100; x++) {
96
+ fragment.append(new MyTag());
92
97
  }
93
-
94
98
  let end = new Date().getTime();
95
-
96
99
  // and put them into the DOM
97
100
  document.body.appendChild(fragment);
98
-
99
- document.querySelectorAll('my-tag').forEach((e) => e.remove());
100
- */
101
+ //document.querySelectorAll('my-tag').forEach((e) => e.remove());
101
102
  /*
102
103
  console test
103
104
  */
104
105
  setTimeout(() => {
105
106
  console.clear();
106
- /*
107
- console.log(
108
- '%c \n\nStress Test:\n\n %cInstancing 1000 web components: %c %s ms.',
109
- 'font-weight: bold; color: black;',
110
- 'font-weight: normal;',
111
- 'font-weight: bold; color: blue;',
112
- 0
113
- );
114
- */
107
+ console.log('%c \n\nStress Test:\n\n %cInstancing 100 web components: %c %s ms.', 'font-weight: bold; color: black;', 'font-weight: normal;', 'font-weight: bold; color: blue;', end - start);
115
108
  document.body.appendChild(new MyTag());
116
109
  let element = document.querySelector('my-tag');
117
110
  console.log("\n\n%cInspect this tag:%c \n( ...to see the inner structure in the '._mc' property )\n\n %O %c %s", 'font-weight: bold;', 'font-weight: normal;', element, 'font-weight: bold;', '\n\nLook up code in the debugger: test.js\n\n');
118
111
  // will trigger the event on all micro components contained in <my-tag>
119
112
  DC.trigger(element, 'doSomething');
120
- }, 20);
113
+ }, 500);
121
114
  //# sourceMappingURL=test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
@@ -16,22 +16,22 @@
16
16
  <li><a href="../modules/observables.html">observables</a></li>
17
17
  <li><a href="observables.Observable.html">Observable</a></li></ul>
18
18
  <h1>Type alias Observable</h1></div>
19
- <div class="tsd-signature">Observable<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span><br/><span>    </span>bind<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span>    </span>notify<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span>    </span>observe<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>cb<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Callback</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span class="tsd-signature-symbol">}</span></div>
19
+ <div class="tsd-signature">Observable<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span><br/><span>    </span>bind<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">DocumentFragment</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span>    </span>notify<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span>    </span>observe<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>cb<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Callback</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">; </span><br/><span class="tsd-signature-symbol">}</span></div>
20
20
  <div class="tsd-type-declaration">
21
21
  <h4>Type declaration</h4>
22
22
  <ul class="tsd-parameters">
23
23
  <li class="tsd-parameter">
24
- <h5>bind<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span></h5>
24
+ <h5>bind<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">DocumentFragment</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span></h5>
25
25
  <ul class="tsd-parameters">
26
26
  <li class="tsd-parameter-signature">
27
27
  <ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-property">
28
- <li class="tsd-signature" id="__type.bind.__type-1.__type-2"><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li>
28
+ <li class="tsd-signature" id="__type.bind.__type-1.__type-2"><span class="tsd-signature-symbol">(</span>target<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">DocumentFragment</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li>
29
29
  <li class="tsd-description">
30
30
  <div class="tsd-parameters">
31
31
  <h4 class="tsd-parameters-title">Parameters</h4>
32
32
  <ul class="tsd-parameter-list">
33
33
  <li>
34
- <h5>target: <span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span></h5></li></ul></div>
34
+ <h5>target: <span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">DocumentFragment</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span></h5></li></ul></div>
35
35
  <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></li>
36
36
  <li class="tsd-parameter">
37
37
  <h5>notify<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">)</span></h5>
@@ -55,7 +55,7 @@
55
55
  <h5>cb: <span class="tsd-signature-type">Callback</span></h5></li></ul></div>
56
56
  <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></li></ul></div><aside class="tsd-sources">
57
57
  <ul>
58
- <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/84a05c1/src/observables.ts#L344">src/observables.ts:344</a></li></ul></aside></div>
58
+ <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/a01d81a/src/observables.ts#L169">src/observables.ts:169</a></li></ul></aside></div>
59
59
  <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
60
60
  <div class="tsd-navigation settings">
61
61
  <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
@@ -18,7 +18,7 @@
18
18
  <h1>Type alias selection</h1></div>
19
19
  <div class="tsd-signature">selection<span class="tsd-signature-symbol">:</span> <a href="selectors.singleSelector.html" class="tsd-signature-type" data-tsd-kind="Type alias">singleSelector</a><span class="tsd-signature-symbol"> | </span><a href="selectors.singleSelector.html" class="tsd-signature-type" data-tsd-kind="Type alias">singleSelector</a><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources">
20
20
  <ul>
21
- <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/84a05c1/src/selectors.ts#L1634">src/selectors.ts:1634</a></li></ul></aside></div>
21
+ <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/a01d81a/src/selectors.ts#L1634">src/selectors.ts:1634</a></li></ul></aside></div>
22
22
  <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
23
23
  <div class="tsd-navigation settings">
24
24
  <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
@@ -18,7 +18,7 @@
18
18
  <h1>Type alias singleSelector</h1></div>
19
19
  <div class="tsd-signature">single<wbr/>Selector<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ShadowRoot</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLElement</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">HTMLCollection</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">NodeList</span><span class="tsd-signature-symbol"> | </span><a href="../interfaces/selectors.DSelector.html" class="tsd-signature-type" data-tsd-kind="Interface">DSelector</a><span class="tsd-signature-symbol"> | </span><a href="../classes/MC.MC.html" class="tsd-signature-type" data-tsd-kind="Class">MC</a><span class="tsd-signature-symbol"> | </span><a href="../classes/MC.DC.html" class="tsd-signature-type" data-tsd-kind="Class">DC</a><span class="tsd-signature-symbol"> | </span><a href="../interfaces/selectors.TSelector.html" class="tsd-signature-type" data-tsd-kind="Interface">TSelector</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">undefined</span></div><aside class="tsd-sources">
20
20
  <ul>
21
- <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/84a05c1/src/selectors.ts#L1632">src/selectors.ts:1632</a></li></ul></aside></div>
21
+ <li>Defined in <a href="https://gitlab.com/twoBirds/microcomponents/-/blob/a01d81a/src/selectors.ts#L1632">src/selectors.ts:1632</a></li></ul></aside></div>
22
22
  <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
23
23
  <div class="tsd-navigation settings">
24
24
  <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
package/src/MC.ts CHANGED
@@ -141,15 +141,33 @@ function remove(target: HTMLMcElement, key: string) {
141
141
  }
142
142
 
143
143
  // trigger an event
144
- function trigger(target: unknown, ev: McEvent | string, data: any = {}) {
144
+ function trigger(
145
+ target: HTMLElement,
146
+ ev: McEvent | string,
147
+ data: any = {},
148
+ bubble: string = 'l'
149
+ ) {
145
150
  let _mc = (target as any)?._mc;
146
151
  if (!_mc) return;
152
+
153
+ let event =
154
+ ev instanceof McEvent
155
+ ? new McEvent(ev.type, ev.data, 'l')
156
+ : new McEvent(ev, data, 'l'),
157
+ mcEvent: McEvent =
158
+ typeof ev !== 'string' ? (ev as McEvent) : new McEvent(ev, data, bubble);
159
+
147
160
  [...Object.values(_mc)].forEach((mc: any) => {
148
161
  //console.log( 'mc [', mc.constructor.name, ']', mc.constructor.prototype?.oneInit );
149
162
  if ((mc as any)?.trigger && typeof (mc as any)?.trigger === 'function') {
150
- (mc as any)?.trigger(ev, data);
163
+ (mc as any)?.trigger(event);
151
164
  }
152
165
  });
166
+
167
+ if (/[ud]/.test(mcEvent.bubble)) {
168
+ bubbleEvent(target, mcEvent);
169
+ }
170
+
153
171
  return;
154
172
  }
155
173
 
@@ -217,6 +235,37 @@ function autoAttachListeners(element: MC | DC) {
217
235
  }
218
236
  }
219
237
 
238
+ function bubbleEvent(target: HTMLElement, ev: McEvent) {
239
+ // at this point, either 'u' or 'd' bubbling should be indicated
240
+ // mcEvent bubbling is asynchronous, and the order of target MC execution in case of multiple matches is not guaranteed!
241
+ if (/[ud]/.test(ev.bubble)) {
242
+ setTimeout(() => {
243
+ // bubbling must include 'l' for local, or else no handlers are executed'
244
+ if (ev.bubble.indexOf('l') === -1) {
245
+ ev.bubble += 'l';
246
+ }
247
+
248
+ // bubble up towards root
249
+ if (ev.bubble.indexOf('u') > -1) {
250
+ let parent = traverseNodes(target, '', true)?.[0].target;
251
+ if (parent) DC.trigger(parent, ev);
252
+ }
253
+
254
+ // bubble down
255
+ if (ev.bubble.indexOf('d') > -1) {
256
+ let targets = new Set<HTMLMcElement>(
257
+ (target as HTMLMcElement)._mc
258
+ .children()
259
+ .map((c: unknown) => (c as any)?.target)
260
+ );
261
+ targets.forEach((target: HTMLMcElement) => {
262
+ if (target) DC.trigger(target, ev);
263
+ });
264
+ }
265
+ }, 0);
266
+ }
267
+ }
268
+
220
269
  class McBase {
221
270
  #target: WeakRef<any>; // avoid circular reference
222
271
 
@@ -245,22 +294,34 @@ class MC extends McBase {
245
294
 
246
295
  static trigger = trigger;
247
296
 
248
- trigger(ev: McEvent | string, data: any = {}, bubble?: string) {
297
+ trigger(ev: McEvent | string, data: any = {}, bubble: string = 'l') {
249
298
  let that = this;
250
299
 
251
300
  //console.log( that, '.trigger(', ev, data, bubble, ')' );
252
- bubble = bubble || 'l';
253
301
 
254
302
  // run all triggers
255
303
  if (that.constructor === MC || that.constructor === DC) {
304
+ let event =
305
+ ev instanceof McEvent
306
+ ? new McEvent(ev.type, ev.data, 'l')
307
+ : new McEvent(ev, data, 'l'),
308
+ mcEvent: McEvent =
309
+ typeof ev !== 'string'
310
+ ? (ev as McEvent)
311
+ : new McEvent(ev, data, bubble);
256
312
  [...Object.getOwnPropertyNames(that)].forEach((mc) => {
257
313
  if (
258
314
  (that as any)[mc]?.trigger &&
259
315
  typeof (that as any)[mc]?.trigger === 'function'
260
316
  ) {
261
- (that as any)[mc]?.trigger(ev, data, bubble);
317
+ (that as any)[mc]?.trigger(event);
262
318
  }
263
319
  });
320
+
321
+ if (/[ud]/.test(mcEvent.bubble)) {
322
+ bubbleEvent(that.target, mcEvent);
323
+ }
324
+
264
325
  return; // must return here!
265
326
  }
266
327
 
@@ -294,33 +355,9 @@ class MC extends McBase {
294
355
  return that;
295
356
  }
296
357
 
297
- // at this point, either 'u' or 'd' bubbling should be indicated
298
- // mcEvent bubbling is asynchronous, and the order of target MC execution in case of multiple matches is not guaranteed!
299
- if (
300
- isBrowser() &&
301
- /[ud]/.test(mcEvent.bubble) &&
302
- (that as any) instanceof MC
303
- ) {
304
- setTimeout(() => {
305
- // bubbling must include 'l' for local, or else no handlers are executed'
306
- if (mcEvent.bubble.indexOf('l') === -1) {
307
- mcEvent.bubble += 'l';
308
- }
309
-
310
- // bubble up towards root
311
- if (mcEvent.bubble.indexOf('u') > -1) {
312
- (that as any).parent().forEach((mc: any) => {
313
- mc instanceof MC ? (mc as any).trigger(mcEvent) : null;
314
- });
315
- }
316
-
317
- // bubble down
318
- if (mcEvent.bubble.indexOf('d') > -1) {
319
- (that as any).children().forEach((mc: any) => {
320
- mc instanceof MC ? (mc as any).trigger(mcEvent) : null;
321
- });
322
- }
323
- }, 0);
358
+ //console.log('bubble', mcEvent);
359
+ if (/[ud]/.test(mcEvent.bubble)) {
360
+ bubbleEvent(that.target, mcEvent);
324
361
  }
325
362
  }
326
363
  }
@@ -18,16 +18,15 @@ function isObservableObject(value: any): boolean {
18
18
  type Callback = (value: any) => void;
19
19
 
20
20
  function getPlaceholders(target: HTMLElement): string[] {
21
- let placeholders: Set<string> = new Set();
21
+ let placeholders: Set<string> = new Set(),
22
+ regEx = /\{[^\{\}]*\}/g;
22
23
 
23
24
  // scan attributes
24
25
  target
25
26
  .getAttributeNames()
26
- .filter((attr) => target.getAttribute(attr)?.match(/\{[^\{\}]*\}/g)) // extract placeholder(s)
27
+ .filter((attr) => target.getAttribute(attr)?.match(regEx)) // extract placeholder(s)
27
28
  .forEach((attr) => {
28
- let phs: Set<string> = new Set(
29
- target.getAttribute(attr)?.match(/\{[^\{\}]*\}/g)
30
- );
29
+ let phs: Set<string> = new Set(target.getAttribute(attr)?.match(regEx));
31
30
  phs.forEach((placeholder) =>
32
31
  placeholders.add(placeholder.replace(/[\{\}]/g, ''))
33
32
  );
@@ -39,12 +38,12 @@ function getPlaceholders(target: HTMLElement): string[] {
39
38
  return (
40
39
  // is text node and has placeholders
41
40
  childNode.nodeType === 3 &&
42
- ((childNode as any).nodeValue || '').match(/\{[^\{\}]*\}/g)
41
+ ((childNode as any).nodeValue || '').match(regEx)
43
42
  );
44
43
  })
45
44
  .forEach((childNode) => {
46
45
  ((childNode as any).nodeValue || '')
47
- .match(/\{[^\{\}]*\}/g)
46
+ .match(regEx)
48
47
  .forEach((placeholder: string) => {
49
48
  placeholders.add(placeholder.replace(/[\{\}]/g, ''));
50
49
  });
@@ -150,7 +149,9 @@ class Placeholders extends DC {
150
149
  function getPlaceholderElements(
151
150
  target: HTMLElement | DocumentFragment | ShadowRoot
152
151
  ): HTMLElement[] {
153
- let elements: Array<HTMLElement | DocumentFragment | ShadowRoot> = [target]
152
+ let elements: Array<HTMLElement> = (
153
+ target instanceof HTMLElement ? [target] : []
154
+ )
154
155
  .concat([...(target.querySelectorAll('*') as unknown as HTMLElement[])])
155
156
  .filter((e) => !!getPlaceholders(e as HTMLElement).length);
156
157
  return elements as HTMLElement[];
@@ -159,9 +160,10 @@ function getPlaceholderElements(
159
160
  function makePlaceHolders(
160
161
  element: HTMLElement | DocumentFragment | ShadowRoot
161
162
  ): void {
162
- getPlaceholderElements(element).forEach((e) =>
163
- DC.add(e, '_placeholders', new Placeholders(e))
164
- );
163
+ getPlaceholderElements(element).forEach((e: HTMLElement) => {
164
+ if ((e as HTMLMcElement)?._mc?._placeholders) return;
165
+ DC.add(e, '_placeholders', new Placeholders(e));
166
+ });
165
167
  }
166
168
 
167
169
  export type Observable = {
@@ -225,14 +227,19 @@ export const observe = (target: LooseObject, propertyName?: string) => {
225
227
 
226
228
  bind(target: HTMLElement | DocumentFragment | ShadowRoot) {
227
229
  const that = this,
228
- iso = isObservableObject(that.valueOf()),
229
- bound = (that.constructor as any).bound;
230
+ iso = isObservableObject(that.valueOf());
230
231
  //console.log('bind', iso, target);
231
232
 
232
233
  if (iso) {
233
234
  makePlaceHolders(target);
234
235
  (this.constructor as any).callbacks.push((data: LooseObject) => {
235
- DC.trigger(target, 'data', flattenObject(data), 'ld');
236
+ // avoid bubbling for speed
237
+ new DC(target as HTMLMcElement)
238
+ .descendants('_placeholders')
239
+ .forEach((e) => {
240
+ if (!e) return;
241
+ e.trigger('data', flattenObject(data));
242
+ });
236
243
  });
237
244
  that.notify();
238
245
  } else {
package/src/test.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  import {
4
- HTMLMcElement,
5
4
  LooseObject,
6
5
  MC,
7
6
  DC,
@@ -48,13 +47,15 @@ class Translator extends DC {
48
47
  }
49
48
  });
50
49
 
51
- (that.Translation as Observable).bind(target);
50
+ (that.Translation as Observable).bind(translationTargetObject);
52
51
 
53
52
  this.target.setAttribute('language', 'en');
53
+
54
+ (this.Language as Observable).notify();
54
55
  }
55
56
 
56
57
  oneInit() {
57
- (this.Language as Observable).notify(); // trigger translation
58
+ //(this.Language as Observable).notify(); // trigger translation
58
59
  }
59
60
 
60
61
  onAttributeChanged(ev: McEvent) {
@@ -74,7 +75,7 @@ defineCE(
74
75
  // equivalent to custom element registry .define()
75
76
  'my-tag',
76
77
  class MyTag extends DC {
77
- #template: string = '{lang.click} {counter}';
78
+ #template: string = '<button>{lang.click} {counter}</button>';
78
79
 
79
80
  #languages = {
80
81
  en: {
@@ -92,6 +93,9 @@ defineCE(
92
93
 
93
94
  let that = this; // minifier help
94
95
 
96
+ // hide
97
+ target.setAttribute('style', 'display:none');
98
+
95
99
  // render
96
100
  target.innerHTML = this.#template;
97
101
 
@@ -114,6 +118,9 @@ defineCE(
114
118
 
115
119
  // bind Dom to target
116
120
  (that.Dom as Observable).bind(that.target);
121
+
122
+ // show
123
+ setTimeout(() => that.target.removeAttribute('style'), 100);
117
124
  }
118
125
 
119
126
  onAttributeChanged(ev: McEvent) {
@@ -122,7 +129,13 @@ defineCE(
122
129
  }
123
130
 
124
131
  onClick(ev: McEvent) {
125
- this.Dom.counter++;
132
+ const that = this,
133
+ c = this.Dom.counter++;
134
+ (ev.data as PointerEvent).stopPropagation();
135
+ (this.target as HTMLElement).classList.remove('clicked');
136
+ (this.target as HTMLElement).classList.add(
137
+ that.Dom.counter > 9 ? 'overClicked' : 'clicked'
138
+ );
126
139
  }
127
140
  },
128
141
  ['language']
@@ -135,13 +148,11 @@ let MyTag: CustomElementConstructor = getCE('my-tag')!,
135
148
  stress test
136
149
  */
137
150
 
138
- /*
139
151
  let start = new Date().getTime();
140
152
 
141
- // create 1000 elements
142
- for (let x = 0; x < 1000; x++) {
143
- let mt = new MyTag('my-data');
144
- fragment.append(mt);
153
+ // create 100 elements
154
+ for (let x = 0; x < 100; x++) {
155
+ fragment.append(new MyTag());
145
156
  }
146
157
 
147
158
  let end = new Date().getTime();
@@ -149,8 +160,7 @@ let end = new Date().getTime();
149
160
  // and put them into the DOM
150
161
  document.body.appendChild(fragment);
151
162
 
152
- document.querySelectorAll('my-tag').forEach((e) => e.remove());
153
- */
163
+ //document.querySelectorAll('my-tag').forEach((e) => e.remove());
154
164
 
155
165
  /*
156
166
  console test
@@ -159,15 +169,13 @@ console test
159
169
  setTimeout(() => {
160
170
  console.clear();
161
171
 
162
- /*
163
172
  console.log(
164
- '%c \n\nStress Test:\n\n %cInstancing 1000 web components: %c %s ms.',
173
+ '%c \n\nStress Test:\n\n %cInstancing 100 web components: %c %s ms.',
165
174
  'font-weight: bold; color: black;',
166
175
  'font-weight: normal;',
167
176
  'font-weight: bold; color: blue;',
168
- 0
177
+ end - start
169
178
  );
170
- */
171
179
 
172
180
  document.body.appendChild(new MyTag());
173
181
 
@@ -184,4 +192,4 @@ setTimeout(() => {
184
192
 
185
193
  // will trigger the event on all micro components contained in <my-tag>
186
194
  DC.trigger(element, 'doSomething');
187
- }, 20);
195
+ }, 500);