@twobirds/microcomponents 0.0.82 → 0.0.83

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 (233) hide show
  1. package/assets/documentation/MC.md +0 -1
  2. package/dist/MC.d.ts +3 -3
  3. package/dist/MC.d.ts.map +1 -1
  4. package/dist/MC.js +43 -74
  5. package/dist/MC.min.js +43 -74
  6. package/dist/MC.ts +67 -143
  7. package/dist/elements.d.ts +1 -1
  8. package/dist/elements.d.ts.map +1 -1
  9. package/dist/elements.js +16 -2
  10. package/dist/elements.min.js +1 -1
  11. package/dist/elements.ts +33 -3
  12. package/dist/formValues.min.js +1 -1
  13. package/dist/microcomponents.min.js +1 -1
  14. package/dist/observables.d.ts.map +1 -1
  15. package/dist/observables.js +40 -47
  16. package/dist/observables.min.js +1 -1
  17. package/dist/observables.ts +54 -59
  18. package/dist/selectors.d.ts +2 -4
  19. package/dist/selectors.d.ts.map +1 -1
  20. package/dist/selectors.js +2 -214
  21. package/dist/selectors.min.js +1 -1
  22. package/dist/selectors.ts +2 -367
  23. package/package.json +6 -5
  24. package/public/MC.d.ts +3 -3
  25. package/public/MC.d.ts.map +1 -1
  26. package/public/MC.js +43 -74
  27. package/public/MC.js.map +1 -1
  28. package/public/MC.min.js +43 -74
  29. package/public/MC.ts +67 -143
  30. package/public/documentation/MC.md +0 -1
  31. package/public/elements.d.ts +1 -1
  32. package/public/elements.d.ts.map +1 -1
  33. package/public/elements.js +16 -2
  34. package/public/elements.js.map +1 -1
  35. package/public/elements.min.js +1 -1
  36. package/public/elements.ts +33 -3
  37. package/public/formValues.min.js +1 -1
  38. package/public/microcomponents.min.js +1 -1
  39. package/public/observables.d.ts.map +1 -1
  40. package/public/observables.js +40 -47
  41. package/public/observables.js.map +1 -1
  42. package/public/observables.min.js +1 -1
  43. package/public/observables.ts +54 -59
  44. package/public/selectors.d.ts +2 -4
  45. package/public/selectors.d.ts.map +1 -1
  46. package/public/selectors.js +2 -214
  47. package/public/selectors.js.map +1 -1
  48. package/public/selectors.min.js +1 -1
  49. package/public/selectors.ts +2 -367
  50. package/public/src/MC.d.ts +36 -0
  51. package/public/src/MC.d.ts.map +1 -0
  52. package/public/src/MC.js +348 -0
  53. package/public/src/MC.js.map +1 -0
  54. package/public/src/MC.ts +67 -143
  55. package/public/src/McEvent.d.ts +15 -0
  56. package/public/src/McEvent.d.ts.map +1 -0
  57. package/public/src/McEvent.js +71 -0
  58. package/public/src/elements.d.ts +5 -0
  59. package/public/src/elements.d.ts.map +1 -0
  60. package/public/src/elements.js +62 -0
  61. package/public/src/elements.js.map +1 -0
  62. package/public/src/elements.ts +33 -3
  63. package/public/src/formValues.d.ts +3 -0
  64. package/public/src/formValues.d.ts.map +1 -0
  65. package/public/src/formValues.js +162 -0
  66. package/public/src/helpers.d.ts +14 -0
  67. package/public/src/helpers.d.ts.map +1 -0
  68. package/public/src/helpers.js +113 -0
  69. package/public/src/microcomponents.d.ts +7 -0
  70. package/public/src/microcomponents.d.ts.map +1 -0
  71. package/public/src/microcomponents.js +8 -0
  72. package/public/src/observables.d.ts +11 -0
  73. package/public/src/observables.d.ts.map +1 -0
  74. package/public/src/observables.js +242 -0
  75. package/public/src/observables.js.map +1 -0
  76. package/public/src/observables.ts +54 -59
  77. package/public/src/selectors.d.ts +106 -0
  78. package/public/src/selectors.d.ts.map +1 -0
  79. package/public/src/selectors.js +759 -0
  80. package/public/src/selectors.js.map +1 -0
  81. package/public/src/selectors.ts +2 -367
  82. package/public/src/test/grandparent.css +11 -0
  83. package/public/src/test/test/child.d.ts +2 -0
  84. package/public/src/test/test/child.d.ts.map +1 -0
  85. package/public/src/test/test/child.js +15 -0
  86. package/public/src/test/test/child.js.map +1 -0
  87. package/public/src/test/test/child.ts +21 -0
  88. package/public/src/test/test/grandchild.d.ts +2 -0
  89. package/public/src/test/test/grandchild.d.ts.map +1 -0
  90. package/public/src/test/test/grandchild.js +15 -0
  91. package/public/src/test/test/grandchild.js.map +1 -0
  92. package/public/src/test/test/grandchild.ts +21 -0
  93. package/public/src/test/test/grandparent.d.ts +2 -0
  94. package/public/src/test/test/grandparent.d.ts.map +1 -0
  95. package/public/src/test/test/grandparent.js +1 -0
  96. package/public/src/test/test/grandparent.js.map +1 -0
  97. package/public/src/test/test/grandparent.ts +21 -0
  98. package/public/src/test/test/greatgrandchild.d.ts +2 -0
  99. package/public/src/test/test/greatgrandchild.d.ts.map +1 -0
  100. package/public/src/test/test/greatgrandchild.js +29 -0
  101. package/public/src/test/test/greatgrandchild.js.map +1 -0
  102. package/public/src/test/test/greatgrandchild.ts +42 -0
  103. package/public/src/test/test/parent.d.ts +2 -0
  104. package/public/src/test/test/parent.d.ts.map +1 -0
  105. package/public/src/test/test/parent.js +15 -0
  106. package/public/src/test/test/parent.js.map +1 -0
  107. package/public/src/test/test/parent.ts +21 -0
  108. package/public/src/test/test/testform.d.ts +2 -0
  109. package/public/src/test/test/testform.d.ts.map +1 -0
  110. package/public/src/test/test/testform.js +1 -0
  111. package/public/src/test/test/testform.js.map +1 -0
  112. package/public/src/test/test/testform.ts +155 -0
  113. package/public/src/test/test/testfunction.d.ts +3 -0
  114. package/public/src/test/test/testfunction.d.ts.map +1 -0
  115. package/public/src/test/test/testfunction.js +7 -0
  116. package/public/src/test/test/testfunction.js.map +1 -0
  117. package/public/src/test/test/testfunction.ts +12 -0
  118. package/public/src/test/test/testmc.d.ts +3 -0
  119. package/public/src/test/test/testmc.d.ts.map +1 -0
  120. package/public/src/test/test/testmc.js +10 -0
  121. package/public/src/test/test/testmc.js.map +1 -0
  122. package/public/src/test/test/testmc.ts +16 -0
  123. package/public/src/test/test/testsimpleclass.d.ts +3 -0
  124. package/public/src/test/test/testsimpleclass.d.ts.map +1 -0
  125. package/public/src/test/test/testsimpleclass.js +9 -0
  126. package/public/src/test/test/testsimpleclass.js.map +1 -0
  127. package/public/src/test/test/testsimpleclass.ts +15 -0
  128. package/public/src/test/test.d.ts +2 -0
  129. package/public/src/test/test.d.ts.map +1 -0
  130. package/public/src/test/test.js +79 -0
  131. package/public/src/test/test.js.map +1 -0
  132. package/public/src/test/test.ts +188 -0
  133. package/public/src/test/testform.css +47 -0
  134. package/public/src/test/testform.html +56 -0
  135. package/public/src/test/testform.json +27 -0
  136. package/public/test/MC.d.ts +3 -3
  137. package/public/test/MC.d.ts.map +1 -1
  138. package/public/test/MC.js +43 -74
  139. package/public/test/MC.min.js +485 -0
  140. package/public/test/MC.ts +67 -143
  141. package/public/test/elements.d.ts +1 -1
  142. package/public/test/elements.d.ts.map +1 -1
  143. package/public/test/elements.js +16 -2
  144. package/public/test/elements.min.js +1 -0
  145. package/public/test/elements.ts +33 -3
  146. package/public/test/formValues.min.js +1 -0
  147. package/public/test/grandparent.css +1 -3
  148. package/public/test/microcomponents.min.js +1 -1
  149. package/public/test/observables.d.ts.map +1 -1
  150. package/public/test/observables.js +40 -47
  151. package/public/test/observables.min.js +1 -0
  152. package/public/test/observables.ts +54 -59
  153. package/public/test/selectors.d.ts +2 -4
  154. package/public/test/selectors.d.ts.map +1 -1
  155. package/public/test/selectors.js +2 -214
  156. package/public/test/selectors.min.js +1 -0
  157. package/public/test/selectors.ts +2 -367
  158. package/public/test/test/child.ts +21 -0
  159. package/public/test/test/grandchild.ts +21 -0
  160. package/public/test/test/grandparent.js +1 -1
  161. package/public/test/test/grandparent.ts +21 -0
  162. package/public/test/test/greatgrandchild.ts +42 -0
  163. package/public/test/test/parent.ts +21 -0
  164. package/public/test/test/testform.js +1 -1
  165. package/public/test/test/testform.js.map +1 -1
  166. package/public/test/test/testform.ts +155 -0
  167. package/public/test/test/testfunction.d.ts +3 -0
  168. package/public/test/test/testfunction.d.ts.map +1 -0
  169. package/public/test/test/testfunction.js +7 -0
  170. package/public/test/test/testfunction.js.map +1 -0
  171. package/public/test/test/testfunction.ts +12 -0
  172. package/public/test/test/testmc.d.ts +2 -5
  173. package/public/test/test/testmc.d.ts.map +1 -1
  174. package/public/test/test/testmc.js +4 -4
  175. package/public/test/test/testmc.js.map +1 -1
  176. package/public/test/test/testmc.ts +16 -0
  177. package/public/test/test/testsimpleclass.d.ts +3 -0
  178. package/public/test/test/testsimpleclass.d.ts.map +1 -0
  179. package/public/test/test/testsimpleclass.js +9 -0
  180. package/public/test/test/testsimpleclass.js.map +1 -0
  181. package/public/test/test/testsimpleclass.ts +15 -0
  182. package/public/test/test.js +0 -2
  183. package/public/test/test.js.map +1 -1
  184. package/public/test/test.ts +188 -0
  185. package/public/test/testform.css +47 -0
  186. package/public/test/testform.html +56 -0
  187. package/public/test/testform.json +3 -3
  188. package/public/typedoc/assets/navigation.js +1 -1
  189. package/public/typedoc/assets/search.js +1 -1
  190. package/public/typedoc/classes/MC.DC.html +5 -5
  191. package/public/typedoc/classes/MC.MC.html +5 -5
  192. package/public/typedoc/classes/MC.McBase.html +4 -3
  193. package/public/typedoc/classes/MC.McEvent.html +2 -2
  194. package/public/typedoc/functions/MC.addListener.html +1 -1
  195. package/public/typedoc/functions/MC.autoload.html +1 -1
  196. package/public/typedoc/functions/MC.removeListener.html +1 -1
  197. package/public/typedoc/functions/elements.defineCE.html +1 -1
  198. package/public/typedoc/functions/elements.getCE.html +1 -1
  199. package/public/typedoc/functions/formValues.formValues.html +1 -1
  200. package/public/typedoc/functions/observables.observe.html +1 -1
  201. package/public/typedoc/functions/selectors._d.html +1 -0
  202. package/public/typedoc/functions/selectors._t.html +1 -0
  203. package/public/typedoc/interfaces/MC.HTMLMcElement.html +2 -2
  204. package/public/typedoc/interfaces/selectors.DSelector.html +48 -0
  205. package/public/typedoc/interfaces/selectors.TSelector.html +34 -0
  206. package/public/typedoc/modules/MC.html +1 -1
  207. package/public/typedoc/modules/elements.html +1 -1
  208. package/public/typedoc/modules/formValues.html +1 -1
  209. package/public/typedoc/modules/observables.html +1 -1
  210. package/public/typedoc/modules/selectors.html +7 -0
  211. package/public/typedoc/modules.html +1 -0
  212. package/public/typedoc/types/observables.Observable.html +1 -1
  213. package/public/typedoc/types/selectors.selection.html +1 -0
  214. package/public/typedoc/types/selectors.singleSelector.html +1 -0
  215. package/src/MC.ts +67 -143
  216. package/src/elements.ts +33 -3
  217. package/src/observables.ts +54 -59
  218. package/src/selectors.ts +2 -367
  219. package/src/test/test/testform.ts +7 -3
  220. package/src/test/test/testfunction.ts +12 -0
  221. package/src/test/test/testmc.ts +13 -9
  222. package/src/test/test/testsimpleclass.ts +15 -0
  223. package/src/test/test.ts +0 -12
  224. package/tasks.md +36 -0
  225. package/typedoc.json +1 -1
  226. package/public/test/MC.js.map +0 -1
  227. package/public/test/elements.js.map +0 -1
  228. package/public/test/observables.js.map +0 -1
  229. package/public/test/selectors.js.map +0 -1
  230. /package/public/{test → src}/McEvent.js.map +0 -0
  231. /package/public/{test → src}/formValues.js.map +0 -0
  232. /package/public/{test → src}/helpers.js.map +0 -0
  233. /package/public/{test → src}/microcomponents.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MC.d.ts","sourceRoot":"","sources":["../src/MC.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAevC,MAAM,WAAW,aAAc,SAAQ,WAAW;IACjD,GAAG,EAAE,WAAW,CAAC;CACjB;AA8CD,iBAAS,WAAW,CACnB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kCAAkC,GAAG,IAAI,EAClD,OAAO,GAAE,OAAe,EACxB,IAAI,GAAE,OAAe,QAarB;AAED,iBAAS,cAAc,CACtB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kCAAkC,GAAG,IAAI,QAGlD;AAmDD,iBAAS,OAAO,CACf,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,OAAO,GAAG,MAAM,EACpB,IAAI,GAAE,GAAQ,EACd,MAAM,GAAE,MAAY,QAwBpB;AAiGD,cAAM,MAAM;IACX,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,IAAI,CAAmB;gBAEnB,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,KAAK,GAAE,OAAe;IAWnE,IAAI,MAAM,IAAI,GAAG,CAEhB;IAED,IAAI,GAAG,IAAI,GAAG,CAEb;CACD;AAED,cAAM,EAAG,SAAQ,MAAM;gBACV,MAAM,CAAC,EAAE,GAAG;IAIxB,MAAM,CAAC,OAAO,iBAAW;IAEzB,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,GAAE,GAAQ,EAAE,MAAM,GAAE,MAAY;CAmElE;AAED,cAAM,EAAG,SAAQ,MAAM;gBACV,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,OAAe;IAIvD,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAO;IAC3B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAU;IACjC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAW;IAEnC,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,GAAE,GAAQ,EAAE,MAAM,CAAC,EAAE,MAAM;IAI7D,MAAM,CAAC,MAAM,GAAE,MAAW,GAAG,GAAG,EAAE;IAMlC,SAAS,CAAC,MAAM,GAAE,MAAW,GAAG,GAAG,EAAE;IAMrC,QAAQ,CAAC,MAAM,GAAE,MAAW,GAAG,GAAG,EAAE;IAYpC,WAAW,CAAC,MAAM,GAAE,MAAW,GAAG,GAAG,EAAE;CAMvC;AAgGD,iBAAS,QAAQ,CAAC,MAAM,GAAE,OAAc,GAAG,OAAO,CAmBjD;AAID,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,348 @@
1
+ 'use strict';
2
+ import { McEvent } from './McEvent.js';
3
+ var isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
4
+ let nativeEventNames = new Set();
5
+ if (isBrowser()) {
6
+ Object.keys(HTMLElement.prototype)
7
+ .filter((key) => /^on/.test(key))
8
+ .forEach((eventName) => nativeEventNames.add(eventName));
9
+ }
10
+ function getMicroComponents(elements, search) {
11
+ let mcValues = [];
12
+ elements.forEach((e) => {
13
+ if (e) {
14
+ if (e instanceof HTMLElement) {
15
+ const _mc = e?._mc;
16
+ if (!search && _mc) {
17
+ mcValues = mcValues.concat(Object.values(e._mc));
18
+ }
19
+ else if (search && _mc && _mc[search]) {
20
+ mcValues.push(_mc[search]);
21
+ }
22
+ }
23
+ }
24
+ });
25
+ return mcValues;
26
+ }
27
+ function traverseNodes(node, search, firstonly = true) {
28
+ let mcValues = [];
29
+ while (node) {
30
+ if (node._mc) {
31
+ if (!search) {
32
+ mcValues = mcValues.concat(Object.values(node._mc));
33
+ }
34
+ else if (search && node._mc[search]) {
35
+ mcValues.push(node._mc[search]);
36
+ }
37
+ if (firstonly)
38
+ return mcValues;
39
+ }
40
+ node = node.parentNode;
41
+ }
42
+ return mcValues;
43
+ }
44
+ function isDOM(element) {
45
+ return element && element instanceof HTMLElement;
46
+ }
47
+ function addListener(domNode, eventName, handler, capture = false, once = false) {
48
+ let options = { once: false };
49
+ if (capture) {
50
+ options.capture = capture;
51
+ }
52
+ if (once) {
53
+ options.once = once;
54
+ }
55
+ domNode.addEventListener(eventName, handler, options);
56
+ }
57
+ function removeListener(domNode, eventName, handler) {
58
+ domNode.removeEventListener(eventName, handler);
59
+ }
60
+ function add(target, key, element = {}) {
61
+ let node = target;
62
+ if (!node._mc) {
63
+ let debug = DC?.debug;
64
+ DC.debug = false;
65
+ node._mc = new DC(target);
66
+ DC.debug = debug;
67
+ delete node._mc._mc;
68
+ }
69
+ const _mc = node._mc;
70
+ if (key.length && !_mc[key]) {
71
+ _mc[key] = element;
72
+ if (target instanceof HTMLElement && !target.getAttribute('_mc')) {
73
+ target.setAttribute('_mc', '');
74
+ }
75
+ }
76
+ return element;
77
+ }
78
+ function remove(target, key) {
79
+ if (!key)
80
+ return;
81
+ const _mc = target?._mc || {};
82
+ if (_mc && _mc[key]) {
83
+ delete _mc[key];
84
+ }
85
+ if (!Object.keys(_mc).length &&
86
+ target instanceof HTMLElement &&
87
+ target.hasAttribute('_mc')) {
88
+ target.removeAttribute('_mc');
89
+ }
90
+ return;
91
+ }
92
+ function trigger(target, ev, data = {}, bubble = 'l') {
93
+ let _mc = target?._mc;
94
+ if (!_mc)
95
+ return;
96
+ let event = ev instanceof McEvent
97
+ ? new McEvent(ev.type, ev.data, 'l')
98
+ : new McEvent(ev, data, 'l'), mcEvent = typeof ev !== 'string' ? ev : new McEvent(ev, data, bubble);
99
+ [...Object.values(_mc)].forEach((mc) => {
100
+ if (mc?.trigger && typeof mc?.trigger === 'function') {
101
+ mc?.trigger(event);
102
+ }
103
+ });
104
+ if (/[ud]/.test(mcEvent.bubble)) {
105
+ bubbleEvent(target, mcEvent);
106
+ }
107
+ return;
108
+ }
109
+ function init(element) {
110
+ if (element.constructor === DC)
111
+ return;
112
+ setTimeout(() => {
113
+ element.trigger('Init');
114
+ }, 0);
115
+ }
116
+ function autoAttachListeners(element) {
117
+ if (!isBrowser() || element.constructor === DC)
118
+ return;
119
+ const target = element.target;
120
+ if (target instanceof HTMLElement) {
121
+ let that = element;
122
+ Object.getOwnPropertyNames(that.constructor.prototype)
123
+ .filter((key) => /^on[A-Z]|one[A-Z]/.test(key) &&
124
+ typeof that.constructor.prototype[key] === 'function')
125
+ .forEach((key) => {
126
+ let once = /^one/.test(key), withoutOnOne = key.replace(/^on[e]{0,1}/, ''), nativeEventName = withoutOnOne.toLowerCase(), listener = (ev) => {
127
+ that.trigger(withoutOnOne, ev);
128
+ };
129
+ if (once) {
130
+ Object.defineProperty(element, 'on' + withoutOnOne, {
131
+ configurable: true,
132
+ enumerable: false,
133
+ writable: true,
134
+ value: (ev) => {
135
+ that.constructor.prototype[key].bind(that)(ev);
136
+ },
137
+ });
138
+ }
139
+ if (nativeEventNames.has('on' + nativeEventName)) {
140
+ addListener(target, nativeEventName, listener, false, once);
141
+ }
142
+ });
143
+ }
144
+ }
145
+ function bubbleEvent(target, ev) {
146
+ if (/[ud]/.test(ev.bubble)) {
147
+ setTimeout(() => {
148
+ if (ev.bubble.indexOf('l') === -1) {
149
+ ev.bubble += 'l';
150
+ }
151
+ if (ev.bubble.indexOf('u') > -1) {
152
+ let parent = traverseNodes(target, '', true)?.[0].target;
153
+ if (parent)
154
+ DC.trigger(parent, ev);
155
+ }
156
+ if (ev.bubble.indexOf('d') > -1) {
157
+ let targets = new Set(target._mc
158
+ .children()
159
+ .map((c) => c?.target));
160
+ targets.forEach((target) => {
161
+ if (target)
162
+ DC.trigger(target, ev);
163
+ });
164
+ }
165
+ }, 0);
166
+ }
167
+ }
168
+ class McBase {
169
+ _target;
170
+ __mc = {};
171
+ constructor(target, debug = false) {
172
+ let that = this, element = that;
173
+ this._target = new WeakRef(target || {});
174
+ init(element);
175
+ autoAttachListeners(element);
176
+ }
177
+ get target() {
178
+ return this._target.deref();
179
+ }
180
+ get _mc() {
181
+ return this.__mc;
182
+ }
183
+ }
184
+ class MC extends McBase {
185
+ constructor(target) {
186
+ super(target);
187
+ }
188
+ static trigger = trigger;
189
+ trigger(ev, data = {}, bubble = 'l') {
190
+ let that = this;
191
+ if (that.constructor === MC || that.constructor === DC) {
192
+ let event = ev instanceof McEvent
193
+ ? new McEvent(ev.type, ev.data, 'l')
194
+ : new McEvent(ev, data, 'l'), mcEvent = typeof ev !== 'string'
195
+ ? ev
196
+ : new McEvent(ev, data, bubble);
197
+ [...Object.getOwnPropertyNames(that)].forEach((mc) => {
198
+ if (that[mc]?.trigger &&
199
+ typeof that[mc]?.trigger === 'function') {
200
+ that[mc]?.trigger(event);
201
+ }
202
+ });
203
+ if (/[ud]/.test(mcEvent.bubble)) {
204
+ bubbleEvent(that.target, mcEvent);
205
+ }
206
+ return;
207
+ }
208
+ if (that instanceof MC || that instanceof DC) {
209
+ const that = this, mcEvent = typeof ev !== 'string'
210
+ ? ev
211
+ : new McEvent(ev, data, bubble), handlerName = 'on' + mcEvent.type[0].toUpperCase() + mcEvent.type.slice(1);
212
+ if (mcEvent.bubble.indexOf('l') > -1) {
213
+ if (!mcEvent.immediateStopped &&
214
+ typeof that[handlerName] === 'function') {
215
+ that[handlerName](mcEvent);
216
+ if (that.hasOwnProperty(handlerName)) {
217
+ delete that[handlerName];
218
+ }
219
+ }
220
+ }
221
+ if (mcEvent.stopped || mcEvent.bubble === 'l') {
222
+ return that;
223
+ }
224
+ if (/[ud]/.test(mcEvent.bubble)) {
225
+ bubbleEvent(that.target, mcEvent);
226
+ }
227
+ }
228
+ }
229
+ }
230
+ class DC extends McBase {
231
+ constructor(target, debug = false) {
232
+ super(target);
233
+ }
234
+ static add = add;
235
+ static remove = remove;
236
+ static trigger = trigger;
237
+ trigger(ev, data = {}, bubble) {
238
+ MC.prototype.trigger.call(this, ev, data, bubble);
239
+ }
240
+ parent(search = '') {
241
+ let target = this.target;
242
+ if (!isDOM(target))
243
+ return [];
244
+ return traverseNodes(target.parentNode, search, true);
245
+ }
246
+ ancestors(search = '') {
247
+ let target = this?.target;
248
+ if (!isDOM(target))
249
+ return [];
250
+ return traverseNodes(this.target.parentNode, search, false);
251
+ }
252
+ children(search = '') {
253
+ let target = this?.target;
254
+ if (!isDOM(target))
255
+ return [];
256
+ const id = Math.random().toString().replace('.', '');
257
+ const selector = '[_mc]:not([temp_id="' + id + '"] [_mc] [_mc])';
258
+ target.setAttribute('temp_id', id);
259
+ const myDomElements = target.querySelectorAll(selector);
260
+ const mcValues = getMicroComponents([...myDomElements], search);
261
+ target.removeAttribute('temp_id');
262
+ return mcValues;
263
+ }
264
+ descendants(search = '') {
265
+ let target = this?.target;
266
+ if (!isDOM(target))
267
+ return [];
268
+ const myDomElements = target.querySelectorAll('*[_mc]');
269
+ return getMicroComponents([...myDomElements], search);
270
+ }
271
+ }
272
+ const loadingMCs = new Set();
273
+ function makeLoadScript(element) {
274
+ if (loadingMCs.has(element))
275
+ return;
276
+ loadingMCs.add(element);
277
+ const fileName = './' + element.split('-').join('/') + '.js';
278
+ const se = document.createElement('script');
279
+ se.setAttribute('src', fileName);
280
+ se.setAttribute('blocking', 'render');
281
+ se.async = true;
282
+ se.setAttribute('type', 'module');
283
+ se.setAttribute('data-name', element);
284
+ se.setAttribute('loading', '');
285
+ const loadedPromise = customElements.whenDefined(element);
286
+ loadedPromise.then(() => {
287
+ const elements = Array
288
+ .from(document.querySelectorAll(`[_mc*="${element}"]`))
289
+ .filter(element => element instanceof HTMLElement);
290
+ if (elements.length === 0)
291
+ return;
292
+ const klass = customElements.get(element);
293
+ elements.forEach((node) => {
294
+ DC.add(node, klass.name, new klass(node));
295
+ const new_mc = node
296
+ .getAttribute('_mc')
297
+ .split(' ')
298
+ .filter((name) => name !== element && name !== '')
299
+ .join(' ');
300
+ node.setAttribute('_mc', new_mc);
301
+ });
302
+ document.head.querySelector('script[data-name="${elementName}]"')?.remove();
303
+ });
304
+ addListener(se, 'load', (ev) => {
305
+ loadingMCs.delete(element);
306
+ });
307
+ addListener(se, 'error', (ev) => {
308
+ console.error('could not load MC code from', fileName);
309
+ });
310
+ document.head.append(se);
311
+ }
312
+ function loadUndefinedMCs() {
313
+ [...document.querySelectorAll(':not(:defined)')]
314
+ .filter((element) => !!element
315
+ && !customElements.get(element.tagName.toLowerCase())
316
+ && !loadingMCs.has(element.tagName.toLowerCase()))
317
+ .forEach((el) => {
318
+ makeLoadScript(el.tagName.toLowerCase());
319
+ });
320
+ [...document.querySelectorAll('[_mc]:not([_mc=""]')]
321
+ .filter((element) => !!element)
322
+ .forEach((el) => {
323
+ const _mc = el.getAttribute('_mc')?.split(' ').filter(name => name !== '');
324
+ _mc?.forEach(dc => {
325
+ makeLoadScript(dc);
326
+ });
327
+ });
328
+ }
329
+ let autoloadEnabled = false;
330
+ let observer = null;
331
+ function autoload(enable = true) {
332
+ if (!enable) {
333
+ observer?.disconnect();
334
+ observer = null;
335
+ return autoloadEnabled;
336
+ }
337
+ autoloadEnabled = enable;
338
+ observer = new MutationObserver(loadUndefinedMCs);
339
+ setTimeout(() => {
340
+ observer.observe(document.body, { childList: true, subtree: true });
341
+ loadUndefinedMCs();
342
+ }, 5);
343
+ window.autoload = window.autoload || autoload;
344
+ return autoloadEnabled;
345
+ }
346
+ autoload.state = { loadingMCs };
347
+ export { addListener, removeListener, McBase, MC, DC, McEvent, autoload };
348
+ //# sourceMappingURL=MC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MC.js","sourceRoot":"","sources":["../src/MC.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,IAAI,SAAS,GAAG,IAAI,QAAQ,CAC3B,qDAAqD,CACrD,CAAC;AAEF,IAAI,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;AAG9C,IAAI,SAAS,EAAE,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;SAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAChC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,CAAC;AAOD,SAAS,kBAAkB,CAAC,QAAe,EAAE,MAAc;IAC1D,IAAI,QAAQ,GAAU,EAAE,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,EAAE,CAAC;YACP,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAI,CAAS,EAAE,GAAG,CAAC;gBAC5B,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAE,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3D,CAAC;qBAAM,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACjB,CAAC;AAGD,SAAS,aAAa,CACrB,IAA4B,EAC5B,MAAc,EACd,SAAS,GAAG,IAAI;IAEhB,IAAI,QAAQ,GAAU,EAAE,CAAC;IACzB,OAAO,IAAI,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,SAAS;gBAAE,OAAO,QAAQ,CAAC;QAChC,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,OAA+B;IAC7C,OAAO,OAAO,IAAI,OAAO,YAAY,WAAW,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CACnB,OAAa,EACb,SAAiB,EACjB,OAAkD,EAClD,UAAmB,KAAK,EACxB,OAAgB,KAAK;IAErB,IAAI,OAAO,GAA6C,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxE,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAGD,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACtB,OAAa,EACb,SAAiB,EACjB,OAAkD;IAElD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAGD,SAAS,GAAG,CAAC,MAAmB,EAAE,GAAW,EAAE,OAAO,GAAG,EAAE;IAC1D,IAAI,IAAI,GAAG,MAAuB,CAAC;IAGnC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,IAAI,KAAK,GAAI,EAAU,EAAE,KAAK,CAAC;QAC9B,EAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAK,EAAU,CAAC,MAAM,CAAC,CAAC;QAClC,EAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACrB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IAGrB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAEnB,IAAI,MAAM,YAAY,WAAW,IAAI,CAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAG,CAAC;YACpE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAGD,SAAS,MAAM,CAAC,MAAqB,EAAE,GAAW;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IAG9B,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAGD,IACC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM;QACxB,MAAM,YAAY,WAAW;QAC7B,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EACzB,CAAC;QACF,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO;AACR,CAAC;AAGD,SAAS,OAAO,CACf,MAAmB,EACnB,EAAoB,EACpB,OAAY,EAAE,EACd,SAAiB,GAAG;IAEpB,IAAI,GAAG,GAAI,MAAc,EAAE,GAAG,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,KAAK,GACP,EAAE,YAAY,OAAO;QACpB,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAC9B,OAAO,GACN,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAE,EAAc,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE3E,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAO,EAAE,EAAE;QAE3C,IAAK,EAAU,EAAE,OAAO,IAAI,OAAQ,EAAU,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;YACvE,EAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;AACR,CAAC;AAGD,SAAS,IAAI,CAAC,OAAgB;IAC7B,IAAI,OAAO,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO;IAEvC,UAAU,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAczB,CAAC,EAAE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC5C,IAAI,CAAC,SAAS,EAAE,IAAI,OAAO,CAAC,WAAW,KAAK,EAAE;QAAE,OAAO;IAEvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9B,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;QACnC,IAAI,IAAI,GAAgB,OAAO,CAAC;QAChC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;aACpD,MAAM,CACN,CAAC,GAAG,EAAE,EAAE,CACP,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,UAAU,CACtD;aACA,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1B,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAC7C,eAAe,GAAG,YAAY,CAAC,WAAW,EAAE,EAC5C,QAAQ,GAAG,CAAC,EAAiC,EAAE,EAAE;gBAChD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC;YACH,IAAI,IAAI,EAAE,CAAC;gBAEV,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,GAAG,YAAY,EAAE;oBACnD,YAAY,EAAE,IAAI;oBAClB,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,CAAC,EAAO,EAAE,EAAE;wBAElB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBAChD,CAAC;iBACD,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC;gBAGlD,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;QACF,CAAC,CAAC,CAAC;IACL,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB,EAAE,EAAW;IAGpD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,UAAU,CAAC,GAAG,EAAE;YAEf,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnC,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;YAClB,CAAC;YAGD,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjC,IAAI,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzD,IAAI,MAAM;oBAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;YAGD,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjC,IAAI,OAAO,GAAG,IAAI,GAAG,CACnB,MAAwB,CAAC,GAAG;qBAC3B,QAAQ,EAAE;qBACV,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAE,CAAS,EAAE,MAAM,CAAC,CACzC,CAAC;gBACF,OAAO,CAAC,OAAO,CAAC,CAAC,MAAqB,EAAE,EAAE;oBACzC,IAAI,MAAM;wBAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,EAAE,CAAC,CAAC,CAAC;IACP,CAAC;AACF,CAAC;AAED,MAAM,MAAM;IACH,OAAO,CAAe;IACtB,IAAI,GAAgB,EAAE,CAAC;IAE/B,YAAY,MAA+B,EAAE,QAAiB,KAAK;QAClE,IAAI,IAAI,GAAY,IAAI,EACvB,OAAO,GAAG,IAAe,CAAC;QAE3B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEd,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,GAAG;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;CACD;AAED,MAAM,EAAG,SAAQ,MAAM;IACtB,YAAY,MAAY;QACvB,KAAK,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAEzB,OAAO,CAAC,EAAoB,EAAE,OAAY,EAAE,EAAE,SAAiB,GAAG;QACjE,IAAI,IAAI,GAAG,IAAI,CAAC;QAKhB,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;YACxD,IAAI,KAAK,GACP,EAAE,YAAY,OAAO;gBACpB,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;gBACpC,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAC9B,OAAO,GACN,OAAO,EAAE,KAAK,QAAQ;gBACrB,CAAC,CAAE,EAAc;gBACjB,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBACpD,IACE,IAAY,CAAC,EAAE,CAAC,EAAE,OAAO;oBAC1B,OAAQ,IAAY,CAAC,EAAE,CAAC,EAAE,OAAO,KAAK,UAAU,EAC/C,CAAC;oBACD,IAAY,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;YACF,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,CAAC;YAED,OAAO;QACR,CAAC;QAGD,IAAK,IAAY,YAAY,EAAE,IAAK,IAAY,YAAY,EAAE,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,IAAI,EAChB,OAAO,GACN,OAAO,EAAE,KAAK,QAAQ;gBACrB,CAAC,CAAE,EAAc;gBACjB,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,EACjC,WAAW,GACV,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAG/D,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtC,IACC,CAAC,OAAO,CAAC,gBAAgB;oBACzB,OAAQ,IAAY,CAAC,WAAW,CAAC,KAAK,UAAU,EAC/C,CAAC;oBAED,IAAY,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC;oBACpC,IAAK,IAAY,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;wBAE/C,OAAQ,IAAY,CAAC,WAAW,CAAC,CAAC;oBACnC,CAAC;gBACF,CAAC;YACF,CAAC;YAGD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC/C,OAAO,IAAI,CAAC;YACb,CAAC;YAGD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,CAAC;QACF,CAAC;IACF,CAAC;;AAGF,MAAM,EAAG,SAAQ,MAAM;IACtB,YAAY,MAAmB,EAAE,QAAiB,KAAK;QACtD,KAAK,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAG,GAAa,GAAG,CAAC;IAC3B,MAAM,CAAC,MAAM,GAAa,MAAM,CAAC;IACjC,MAAM,CAAC,OAAO,GAAa,OAAO,CAAC;IAEnC,OAAO,CAAC,EAAoB,EAAE,OAAY,EAAE,EAAE,MAAe;QAC5D,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE;QACzB,IAAI,MAAM,GAAiB,IAAY,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,aAAa,CAAE,MAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE;QAC5B,IAAI,MAAM,GAAS,IAAY,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,aAAa,CAAE,IAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,QAAQ,CAAC,SAAiB,EAAE;QAC3B,IAAI,MAAM,GAAS,IAAY,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,sBAAsB,GAAG,EAAE,GAAG,iBAAiB,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE;QAC9B,IAAI,MAAM,GAAS,IAAY,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO,kBAAkB,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;;AAGF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAErC,SAAS,cAAc,CAAE,OAAe;IAEvC,IAAK,UAAU,CAAC,GAAG,CAAE,OAAO,CAAE;QAAG,OAAO;IAExC,UAAU,CAAC,GAAG,CAAE,OAAO,CAAE,CAAC;IAG1B,MAAM,QAAQ,GAAW,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAC,KAAK,CAAC;IAEnE,MAAM,EAAE,GAAsB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE/D,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAChB,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,EAAE,CAAC,YAAY,CAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACvC,EAAE,CAAC,YAAY,CAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAEhC,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAE,OAAO,CAAE,CAAC;IAE5D,aAAa,CAAC,IAAI,CAAE,GAAG,EAAE;QACxB,MAAM,QAAQ,GAAkB,KAAK;aACjC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;aACtD,MAAM,CAAE,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,WAAW,CAAE,CAAC;QAExD,IAAK,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAG,OAAO;QAIpC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAE,OAAO,CAAE,CAAC;QAE5C,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAiB,EAAE,EAAE;YAEtC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAM,CAAC,IAAI,EAAE,IAAI,KAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAG5C,MAAM,MAAM,GAAG,IAAI;iBACjB,YAAY,CAAE,KAAK,CAAE;iBACrB,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,EAAE,CAAE;iBACnD,IAAI,CAAC,GAAG,CAAC,CAAC;YAGZ,IAAI,CAAC,YAAY,CAChB,KAAK,EAEL,MAAM,CACN,CAAA;QACF,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,WAAW,CAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;QAC/B,UAAU,CAAC,MAAM,CAAE,OAAO,CAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,WAAW,CAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB;IAGxB,CAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAE;SAChD,MAAM,CAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;WAC3B,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;WAClD,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CACjD;SACA,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAEf,cAAc,CAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAGJ,CAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAE;SACpD,MAAM,CAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAE;SAChC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAE,CAAC;QAC7E,GAAG,EAAE,OAAO,CAAE,EAAE,CAAC,EAAE;YAElB,cAAc,CAAE,EAAE,CAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,eAAe,GAAY,KAAK,CAAC;AACrC,IAAI,QAAQ,GAA4B,IAAI,CAAC;AAE7C,SAAS,QAAQ,CAAC,SAAkB,IAAI;IAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,eAAe,CAAC;IACxB,CAAC;IAED,eAAe,GAAG,MAAM,CAAC;IACzB,QAAQ,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAElD,UAAU,CAAC,GAAG,EAAE;QACf,QAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,gBAAgB,EAAE,CAAC;IACpB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEL,MAAc,CAAC,QAAQ,GAAI,MAAc,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAEhE,OAAO,eAAe,CAAC;AACxB,CAAC;AAEA,QAAwB,CAAC,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/public/src/MC.ts CHANGED
@@ -267,13 +267,14 @@ function bubbleEvent(target: HTMLElement, ev: McEvent) {
267
267
  }
268
268
 
269
269
  class McBase {
270
- #target: WeakRef<any>; // avoid circular reference
270
+ private _target: WeakRef<any>; // avoid circular reference
271
+ private __mc: LooseObject = {};
271
272
 
272
273
  constructor(target?: { [key: string]: any }, debug: boolean = false) {
273
274
  let that: unknown = this,
274
275
  element = that as MC | DC;
275
276
 
276
- this.#target = new WeakRef(target || {});
277
+ this._target = new WeakRef(target || {});
277
278
 
278
279
  init(element); // async lifecycle event
279
280
 
@@ -281,13 +282,15 @@ class McBase {
281
282
  }
282
283
 
283
284
  get target(): any {
284
- return this.#target.deref();
285
+ return this._target.deref();
286
+ }
287
+
288
+ get _mc(): any {
289
+ return this.__mc;
285
290
  }
286
291
  }
287
292
 
288
293
  class MC extends McBase {
289
- _mc?: LooseObject = {};
290
-
291
294
  constructor(target?: any) {
292
295
  super(target);
293
296
  }
@@ -364,8 +367,6 @@ class MC extends McBase {
364
367
  }
365
368
 
366
369
  class DC extends McBase {
367
- _mc?: LooseObject = {};
368
-
369
370
  constructor(target: HTMLElement, debug: boolean = false) {
370
371
  super(target);
371
372
  }
@@ -410,45 +411,15 @@ class DC extends McBase {
410
411
  }
411
412
  }
412
413
 
413
- /*
414
- unresolvedCEs (code below this comment):
415
-
416
- a repository (a hashmap) of undefined custom elements:
417
- the name is the tagname of the micro component (like "my-custom-component")
418
- if they are loading, the value is a script element
419
- if they are loaded, the entry is deleted and the browser instanciates it automatically
420
- if they cannot be loaded, the browser will throw an error
414
+ const loadingMCs = new Set<string>();
421
415
 
422
- If the custom element ( defined by its tagname, like "my-custom-component") is not defined, it will be on-demand loaded:
423
- The file name is assumed to be "/my/custom/component.js"
424
- The file must define a custom element via the defineCE() function included in the "elements" module.
425
- This function is a wrapper for customElementRegistry.define(), which you can also use directly in the imported code.
416
+ function makeLoadScript( element: string ) {
426
417
 
427
- In general this behaves like a custom runtime import for custom elements in the browser.
428
- The only difference is that the micro component is loaded only when needed, and not on page load.
429
- */
418
+ if ( loadingMCs.has( element ) ) return; // already loading
430
419
 
431
- const CEs = new Map();
432
-
433
- /*
434
- loadedMCs (code below this comment):
435
- a repository (a hashmap) of micro components:
436
- the name is the name of the micro component (like "my-mc")
437
- if they are loading, the value is a script element
438
- if they are loaded, the value is the micro component class itself
439
-
440
- This is mostly used for old style progressive enhancement:
441
- If the micro component ( defined in the HTMLElements "_mc" attribute, like "my-mc") is not defined, it will be on-demand loaded:
442
- The file name is assumed to be "/my/mc.js"
443
- The file needs to have a default export, and it should be a class that extends the DC class ( since it is in a HTMLElements attribute )
444
-
445
- In general this behaves like a custom runtime import for classes in the browser.
446
- The only difference is that the micro component is loaded only when needed, and not on page load.
447
- */
448
- const MCs = new Map();
449
-
450
- function makeLoadScript( element: string ): HTMLScriptElement {
420
+ loadingMCs.add( element );
451
421
 
422
+ //console.log( 'makeLoadScript:', element);
452
423
  const fileName: string = './' + element.split('-').join('/')+'.js';
453
424
 
454
425
  const se: HTMLScriptElement = document.createElement('script');
@@ -457,123 +428,76 @@ function makeLoadScript( element: string ): HTMLScriptElement {
457
428
  se.setAttribute('blocking', 'render');
458
429
  se.async = true;
459
430
  se.setAttribute('type', 'module');
460
- se.setAttribute( 'name', element);
431
+ se.setAttribute( 'data-name', element);
461
432
  se.setAttribute( 'loading', '');
462
433
 
463
- addListener( se, 'load', (ev) => {
464
- // console.info('loaded MC', elementName);
465
- se.removeAttribute( 'loading' );
466
- se.setAttribute( 'loaded', '');
467
- });
434
+ const loadedPromise = customElements.whenDefined( element );
468
435
 
469
- addListener( se, 'error', (ev) => {
470
- console.error('could not load Custom Element code from', fileName);
471
- });
436
+ loadedPromise.then( () => {
437
+ const elements: HTMLElement[] = Array
438
+ .from(document.querySelectorAll(`[_mc*="${element}"]`))
439
+ .filter( element => element instanceof HTMLElement );
472
440
 
473
- return se;
474
- }
441
+ if ( elements.length === 0 ) return;
475
442
 
476
- function onLoadCallback( script: HTMLScriptElement ) {
477
- // create callback script tag
478
- // it is essential to do this in a timeout and via another script tag,
479
- // to force it to be a top level module allowing for the use of "import"
480
- setTimeout( function(){
481
- // create callback script tag
482
- const importFileName = script.getAttribute('src');
483
- const elementName = script.getAttribute('name');
484
-
485
- const se: HTMLScriptElement = document.createElement('script');
486
-
487
- se.async = true;
488
- se.setAttribute( 'type', 'module');
489
-
490
- // --- autoload script
491
- const code = /*javascript*/`
492
-
493
- import _ from "${importFileName}";
494
- import { DC } from "./microcomponents.js";
495
-
496
- const elements = Array.from(document.querySelectorAll('[_mc*="${elementName}"]')).filter( element => element instanceof HTMLElement );
497
-
498
- elements.forEach((element) => {
499
- // add class to MCs repository
500
- autoload.state.MCs.set( '${elementName}', _ );
501
- // add instance to HTMLElement
502
- DC.add(element, _.name, new _(element));
503
- // remove instance name from elements "_mc" attribute
504
- element.setAttribute('_mc', element.getAttribute('_mc').replace('${elementName}', '').replace( /\w\w/g, ' ').trim());
505
- });
443
+ //console.log( 'loadedPromise elements', elements );
506
444
 
507
- setTimeout( () => {
508
- document.body.querySelector('script[name="${elementName}]"')?.remove();
509
- },0);
445
+ const klass = customElements.get( element );
510
446
 
511
- `;
512
- // --- end autoload script
447
+ elements.forEach((node: HTMLElement) => {
448
+ //console.log( 'add', klass!.name, 'to', node );
449
+ DC.add(node, klass!.name, new klass!(node));
513
450
 
514
- se.innerHTML = code;
515
- document.body.append(se);
516
- }, 0);
451
+ //@ts-ignore
452
+ const new_mc = node
453
+ .getAttribute( '_mc' )
454
+ .split(' ')
455
+ .filter( (name) => name !== element && name !== '' )
456
+ .join(' ');
457
+
458
+ //@ts-ignore
459
+ node.setAttribute(
460
+ '_mc',
461
+ //@ts-ignore
462
+ new_mc
463
+ )
464
+ });
465
+
466
+ document.head.querySelector('script[data-name="${elementName}]"')?.remove();
467
+ });
468
+
469
+ addListener( se, 'load', (ev) => {
470
+ loadingMCs.delete( element );
471
+ });
472
+
473
+ addListener( se, 'error', (ev) => {
474
+ console.error('could not load MC code from', fileName);
475
+ });
476
+
477
+ document.head.append(se);
517
478
  }
518
479
 
519
- function loadUndefinedMicroComponents() {
480
+ function loadUndefinedMCs() {
520
481
 
521
- // load unresolved custom eleents
522
- [ ...document.querySelectorAll(':not(:defined)') ] // undefined custom elements
482
+ // load unresolved custom elements
483
+ [ ...document.querySelectorAll(':not(:defined)') ]
523
484
  .filter( (element) => !!element
524
485
  && !customElements.get(element.tagName.toLowerCase()) // not in CustomElementsRegistry
525
- && !CEs.has(element.tagName.toLowerCase()) // not in loading list
486
+ && !loadingMCs.has(element.tagName.toLowerCase()) // not in loading list
526
487
  )
527
488
  .forEach((el) => {
528
- const elementName = el.tagName.toLowerCase(),
529
- fileName: string = './'+elementName.split('-').join('/')+'.js';
530
-
531
- const se: HTMLScriptElement = makeLoadScript( elementName );
532
-
533
- addListener( se, 'load', () => {
534
- CEs.set( elementName, customElements.get(el.tagName.toLowerCase()) );
535
- });
536
-
537
- CEs.set( elementName, 'loading');
538
- document.head.append(se);
539
-
540
- // instanciation of the micro component will be handled by the browser automatically
541
- // module code must define the micro component class and add it to the customElementRegistry
489
+ //console.log( 'detected CE', el.tagName.toLowerCase() );
490
+ makeLoadScript( el.tagName.toLowerCase() );
542
491
  });
543
492
 
544
- [ ...document.querySelectorAll('[_mc]:not([_mc=""]') ] // undefined DOM components
493
+ // load unresolved MCs defined in _mc attribute
494
+ [ ...document.querySelectorAll('[_mc]:not([_mc=""]') ]
545
495
  .filter( (element) => !!element )
546
496
  .forEach((el) => {
547
- const elements = el.getAttribute('_mc')?.split(' ').filter( m => !!m ) || [];
548
- const elementsToBeLoaded = elements.filter( m => !MCs.has( m ) );
549
-
550
- // load MC components that do not exist yet
551
- elementsToBeLoaded?.forEach( elementName => {
552
- const se: HTMLScriptElement = makeLoadScript( elementName );
553
-
554
- addListener( se, 'load', () => onLoadCallback( document.head.querySelector(`script[name="${elementName}"]`) as HTMLScriptElement) );
555
-
556
- MCs.set( elementName, 'loading');
557
-
558
- document.head.append(se);
559
- });
560
-
561
- // loading MC components already have callbacks attached
562
- const elementsAlreadyLoaded = elements.filter( m => MCs.has( m ) && !MCs.get( m )!.length);
563
-
564
- // MCs that are already loaded will trigger the onLoadCallback manually
565
- elementsAlreadyLoaded?.forEach( elementName => {
566
- setTimeout( ()=>{
567
- //console.log('attaching', elementName, (autoload as any).state.MCs.get(elementName));
568
- DC.add(el, elementName, new ( (autoload as any).state.MCs.get(elementName) as any)(el)); // add instance to DOM
569
-
570
- const newAttribute = (el as any).getAttribute('_mc')
571
- .replace('${elementName}', '')
572
- .replace( /\w\w/g, ' ')
573
- .trim() || '_mc';
574
-
575
- (el as any).setAttribute('_mc', ); // set new "_mc" attribute
576
- }, 5);
497
+ const _mc = el.getAttribute('_mc')?.split(' ').filter( name => name !== '' );
498
+ _mc?.forEach( dc => {
499
+ //console.log( 'detected DC', dc );
500
+ makeLoadScript( dc );
577
501
  });
578
502
  });
579
503
  }
@@ -590,11 +514,11 @@ function autoload(enable: boolean = true): boolean {
590
514
  }
591
515
 
592
516
  autoloadEnabled = enable;
593
- observer = new MutationObserver(loadUndefinedMicroComponents);
517
+ observer = new MutationObserver(loadUndefinedMCs);
594
518
 
595
519
  setTimeout(() => {
596
520
  observer!.observe(document.body, { childList: true, subtree: true });
597
- loadUndefinedMicroComponents();
521
+ loadUndefinedMCs();
598
522
  }, 5);
599
523
 
600
524
  (window as any).autoload = (window as any).autoload || autoload;
@@ -602,7 +526,7 @@ function autoload(enable: boolean = true): boolean {
602
526
  return autoloadEnabled;
603
527
  }
604
528
 
605
- (autoload as LooseObject).state = { CEs, MCs };
529
+ (autoload as LooseObject).state = { loadingMCs };
606
530
 
607
531
  export { addListener, removeListener, McBase, MC, DC, McEvent, autoload };
608
532