@twobirds/microcomponents 0.0.21 → 0.0.22

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 (122) hide show
  1. package/.gitlab-ci.yml +1 -0
  2. package/README.md +31 -12
  3. package/assets/documentation/MicroComponents.md +228 -0
  4. package/assets/my-tag.css +4 -0
  5. package/assets/test.html +5 -1
  6. package/dist/MC.d.ts +32 -0
  7. package/dist/MC.d.ts.map +1 -0
  8. package/dist/MC.min.js +414 -0
  9. package/dist/MC.ts +350 -0
  10. package/dist/MCbundle.d.ts +8 -0
  11. package/dist/MCbundle.d.ts.map +1 -0
  12. package/dist/MCbundle.min.js +1 -0
  13. package/dist/MCbundle.ts +8 -0
  14. package/dist/McEvent.d.ts +15 -0
  15. package/dist/McEvent.d.ts.map +1 -0
  16. package/dist/McEvent.ts +96 -0
  17. package/dist/autoloader.d.ts +2 -0
  18. package/dist/autoloader.d.ts.map +1 -0
  19. package/dist/autoloader.ts +98 -0
  20. package/dist/customElements.d.ts +5 -0
  21. package/dist/customElements.d.ts.map +1 -0
  22. package/dist/customElements.min.js +1 -0
  23. package/dist/customElements.ts +67 -0
  24. package/dist/customObservables.d.ts +3 -0
  25. package/dist/customObservables.d.ts.map +1 -0
  26. package/dist/customObservables.min.js +1 -0
  27. package/dist/customObservables.ts +340 -0
  28. package/dist/customSelectors.d.ts +108 -0
  29. package/dist/customSelectors.d.ts.map +1 -0
  30. package/dist/customSelectors.min.js +1 -0
  31. package/dist/customSelectors.ts +1634 -0
  32. package/dist/formValues.d.ts +4 -0
  33. package/dist/formValues.d.ts.map +1 -0
  34. package/dist/formValues.ts +275 -0
  35. package/dist/formvValues.min.js +1 -0
  36. package/dist/helpers.d.ts +11 -0
  37. package/dist/helpers.d.ts.map +1 -0
  38. package/dist/helpers.ts +173 -0
  39. package/dist/microcomponents.es3.d.ts +1 -20
  40. package/dist/microcomponents.es3.d.ts.map +1 -1
  41. package/dist/test.d.ts +2 -0
  42. package/dist/test.d.ts.map +1 -0
  43. package/package.json +11 -7
  44. package/public/MC.js +273 -0
  45. package/public/MC.min.js +414 -0
  46. package/public/MCbundle.js +8 -0
  47. package/public/MCbundle.min.js +1 -0
  48. package/public/McEvent.js +74 -0
  49. package/public/MicroComponents.svg +15 -0
  50. package/public/assets/search.js +1 -1
  51. package/public/autoloader.js +57 -0
  52. package/public/classes/MC.DC.html +247 -0
  53. package/public/classes/MC.MC.html +150 -0
  54. package/public/classes/MC.McBase.html +123 -0
  55. package/public/classes/MCbundle.McEvent.html +184 -0
  56. package/public/customElements.js +48 -0
  57. package/public/customElements.min.js +1 -0
  58. package/public/customObservables.js +255 -0
  59. package/public/customObservables.min.js +1 -0
  60. package/public/customSelectors.js +1088 -0
  61. package/public/customSelectors.min.js +1 -0
  62. package/public/documentation/MicroComponents.md +228 -0
  63. package/public/formValues.js +211 -0
  64. package/public/formvValues.min.js +1 -0
  65. package/public/functions/MC.addListener.html +73 -0
  66. package/public/functions/MC.removeListener.html +69 -0
  67. package/public/functions/MCbundle._d.html +85 -0
  68. package/public/functions/MCbundle._t.html +85 -0
  69. package/public/functions/MCbundle.debounce.html +85 -0
  70. package/public/functions/MCbundle.deepEqual.html +85 -0
  71. package/public/functions/MCbundle.defineCE.html +98 -0
  72. package/public/functions/MCbundle.formValues.html +89 -0
  73. package/public/functions/MCbundle.getCE.html +83 -0
  74. package/public/functions/MCbundle.htmlToElements.html +83 -0
  75. package/public/functions/MCbundle.isObject.html +83 -0
  76. package/public/functions/MCbundle.kebabToPascal.html +83 -0
  77. package/public/functions/MCbundle.makeCO.html +85 -0
  78. package/public/functions/MCbundle.nameSpace.html +89 -0
  79. package/public/functions/MCbundle.parse.html +85 -0
  80. package/public/helpers.js +128 -0
  81. package/public/index.html +22 -13
  82. package/public/interfaces/MC.HTMLMcElement.html +3605 -0
  83. package/public/interfaces/MCbundle.DSelector.html +1010 -0
  84. package/public/interfaces/MCbundle.LooseObject.html +80 -0
  85. package/public/interfaces/MCbundle.TSelector.html +709 -0
  86. package/public/microcomponents.es3.js +348 -0
  87. package/public/modules/MC.html +84 -0
  88. package/public/modules/MCbundle.html +133 -0
  89. package/public/modules.html +4 -4
  90. package/public/my-tag.css +4 -0
  91. package/public/test.html +5 -1
  92. package/public/test.js +100 -202
  93. package/public/types/MCbundle.selection.html +74 -0
  94. package/public/types/MCbundle.singleSelector.html +74 -0
  95. package/src/MC.ts +350 -0
  96. package/src/MCbundle.ts +8 -0
  97. package/src/McEvent.ts +96 -0
  98. package/src/autoloader.ts +98 -0
  99. package/src/customElements.ts +67 -0
  100. package/src/customObservables.ts +340 -0
  101. package/src/customSelectors.ts +1634 -0
  102. package/src/formValues.ts +275 -0
  103. package/src/helpers.ts +173 -0
  104. package/src/microcomponents.es3.js +353 -82
  105. package/src/test.js +137 -218
  106. package/tsconfig.json +2 -2
  107. package/typedoc.json +1 -1
  108. package/webpack.config.js +233 -0
  109. package/dist/microcomponents.d.ts +0 -26
  110. package/dist/microcomponents.d.ts.map +0 -1
  111. package/dist/microcomponents.es3.js +0 -96
  112. package/dist/microcomponents.es3.min.js +0 -15
  113. package/dist/microcomponents.js +0 -176
  114. package/dist/microcomponents.min.js +0 -38
  115. package/dist/microcomponents.ts +0 -216
  116. package/public/classes/microcomponents.MC.html +0 -313
  117. package/public/classes/microcomponents_es3.MC.html +0 -336
  118. package/public/functions/microcomponents_es3.__isEmpty.html +0 -60
  119. package/public/microcomponents.js +0 -176
  120. package/public/modules/microcomponents.html +0 -57
  121. package/public/modules/microcomponents_es3.html +0 -60
  122. package/src/microcomponents.ts +0 -216
package/dist/MC.ts ADDED
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+
3
+ import { LooseObject } from './helpers.js';
4
+ import { McEvent } from './McEvent.js';
5
+
6
+ var isBrowser=new Function("try {return this===window;}catch(e){ return false;}");
7
+
8
+ let nativeEventNames: Set<string> = new Set();
9
+
10
+ // HTMLElement native event names
11
+ if ( isBrowser() ){
12
+ Object.keys( HTMLElement.prototype ).filter( key => /^on/.test(key) ).forEach( eventName => nativeEventNames.add( eventName ) );
13
+ }
14
+
15
+ export interface HTMLMcElement extends HTMLElement{
16
+ _mc: LooseObject;
17
+ }
18
+
19
+ // get all microcomponents from a list of HTMLElements
20
+ function getMicroComponents( elements: any[], search: string): any[] {
21
+ let mcValues: any[] = [];
22
+
23
+ elements.forEach( e => {
24
+ if (e) {
25
+ if (e instanceof HTMLElement) {
26
+ const _mc = ( e as any )?._mc;
27
+ if ( !search && _mc ) {
28
+ mcValues = mcValues.concat(Object.values(( e as any )._mc));
29
+ }
30
+ else if ( search && _mc && _mc[search] ) {
31
+ mcValues.push( _mc[search] );
32
+ }
33
+ }
34
+ }
35
+ });
36
+ return mcValues;
37
+ }
38
+
39
+ // get all ancestor DOM nodes up to the document root
40
+ function traverseNodes(node: { [key:string]: any }, search: string, firstonly = true): any[] {
41
+ let mcValues: any[] = [];
42
+ while (node) {
43
+ if (node._mc) {
44
+ if (!search) {
45
+ mcValues = mcValues.concat(Object.values(node._mc));
46
+ }
47
+ else if (search && node._mc[search]) {
48
+ mcValues.push(node._mc[search]);
49
+ }
50
+ if (firstonly)
51
+ return mcValues;
52
+ }
53
+ node = node.parentNode;
54
+ }
55
+ return mcValues;
56
+ }
57
+
58
+ function isDOM(element: { [key:string]: any } ) {
59
+ return element && element instanceof HTMLElement;
60
+ }
61
+
62
+ function addListener( domNode: Node, eventName: string, handler: EventListenerOrEventListenerObject | null, capture: boolean = false, once: boolean = false ){
63
+ let
64
+ options: EventListenerOptions & { once: boolean } = { once: false }
65
+ ;
66
+
67
+ if ( capture ){
68
+ options.capture = capture;
69
+ }
70
+
71
+ if ( once ){
72
+ options.once = once;
73
+ }
74
+
75
+ //console.log( 'addEventListener', eventName, ( handler as Function ).name, options );
76
+ domNode.addEventListener( eventName, handler, options );
77
+ }
78
+
79
+ function removeListener( domNode: Node, eventName: string, handler: EventListenerOrEventListenerObject | null ){
80
+ domNode.removeEventListener( eventName, handler );
81
+ }
82
+
83
+ // add a microcomponent to a target DOM node
84
+ function add( target: HTMLElement, key: string, element = {} ): any {
85
+
86
+ let node = target as HTMLMcElement;
87
+
88
+ // create the _mc property if necessary
89
+ if (!node._mc) {
90
+ let _MC: unknown = MC,
91
+ debug = (MC as any)?.debug;
92
+ ( MC as any ).debug = false;
93
+ node._mc = new ( MC as any )( target );
94
+ ( MC as any ).debug = debug;
95
+ }
96
+
97
+ const _mc = node._mc;
98
+
99
+ // add the element with the given property key to the _mc property
100
+ if ( key.length && !_mc[key]) {
101
+ _mc[key] = element;
102
+ // add attribute if HTMLElement
103
+ if ( target instanceof HTMLElement ) {
104
+ target.setAttribute('_mc', '');
105
+ }
106
+ }
107
+ return element;
108
+ }
109
+
110
+ // remove a micro component from the DOM
111
+ function remove( target: HTMLMcElement, key: string) {
112
+ if ( !key ) return; // silent fail
113
+
114
+ const _mc = target?._mc || {};
115
+
116
+ // delete the property from the HTMLElement _mc collection
117
+ if ( _mc && _mc[key] ) {
118
+ delete _mc[key];
119
+ }
120
+
121
+ // remove the _mc attribute if the DOM collection is empty
122
+ if ( !Object.keys(_mc).length && target instanceof HTMLElement && target.hasAttribute('_mc') ) {
123
+ target.removeAttribute('_mc');
124
+ }
125
+ return;
126
+ }
127
+
128
+ // trigger an event
129
+ function trigger( target: unknown, ev: McEvent | string, data: any = {}) {
130
+ let _mc = (target as any)?._mc;
131
+ if ( !_mc ) return;
132
+ [ ...Object.values( _mc ) ].forEach( (mc) => {
133
+ if ( (mc as any)?.trigger && typeof (mc as any)?.trigger === 'function' ){
134
+ (mc as any)?.trigger( ev, data );
135
+ }
136
+ });
137
+ return;
138
+ }
139
+
140
+ class McBase {
141
+
142
+ #target: WeakRef<any>; // avoid circular reference
143
+
144
+ #_mc: { [key:string]: any } = {};
145
+
146
+ constructor( target: { [key:string]: any } ) {
147
+ let that = this;
148
+
149
+ this.#target = new WeakRef( target );
150
+
151
+ if ( this.constructor !== MC && this.constructor !== DC ){
152
+ Object.defineProperty( this, "_mc", {
153
+ get(){
154
+ return this.#_mc;
155
+ }
156
+ })
157
+ }
158
+ }
159
+
160
+ get target(): any {
161
+ return this.#target.deref();
162
+ }
163
+
164
+ }
165
+
166
+ class MC extends McBase {
167
+ constructor(target: any) {
168
+ super(target);
169
+ let that = this;
170
+ if ( that.constructor === MC || that.constructor === DC ) return;
171
+ setTimeout(
172
+ () => {
173
+ that.trigger('init');
174
+ }
175
+ ,0
176
+ );
177
+ }
178
+
179
+ trigger( ev: McEvent | string, data: any = {}, bubble?: string ) {
180
+ let that = this;
181
+
182
+ bubble = bubble || 'l';
183
+
184
+ // run all triggers
185
+ if ( that.constructor === MC || that.constructor === DC){
186
+ [ ...Object.getOwnPropertyNames( that ) ].forEach( (mc) => {
187
+ if ( (that as any)[mc]?.trigger && typeof (that as any)[mc]?.trigger === 'function' ){
188
+ (that as any)[mc]?.trigger( ev, data, bubble );
189
+ }
190
+ });
191
+ return; // must return here!
192
+ }
193
+
194
+ // only this instance
195
+ if ( (that as any) instanceof MC || (that as any) instanceof DC ){
196
+
197
+ const
198
+ that = this,
199
+ mcEvent: McEvent = typeof ev !== 'string' ? ( ev as McEvent) : new McEvent( ev, data, bubble ),
200
+ handlerName = 'on' + mcEvent.type[0].toUpperCase() + mcEvent.type.slice(1);
201
+ ;
202
+
203
+ // console.log('trigger', handlerName, mcEvent, data, bubble );
204
+
205
+ if ( mcEvent.bubble.indexOf('l') > -1 ){
206
+ if ( !mcEvent.immediateStopped
207
+ && typeof ( that as any )[ handlerName ] === 'function'
208
+ ){
209
+ // console.log( 'execute handler:', handlerName );
210
+ ( that as any )[handlerName]( mcEvent );
211
+ if ( ( that as any ).hasOwnProperty( handlerName ) ){ // it is a once handler
212
+ delete ( that as any )[ handlerName ]; // remove after first execution
213
+ }
214
+ }
215
+ }
216
+
217
+ // if event stopped or local only, handling is cancelled
218
+ if ( mcEvent.stopped || mcEvent.bubble === 'l') {
219
+ return that;
220
+ }
221
+
222
+ // at this point, either 'u' or 'd' bubbling should be indicated
223
+ // mcEvent bubbling is asynchronous, and the order of target MC execution in case of multiple matches is not guaranteed!
224
+ if ( isBrowser() && /[ud]/.test( mcEvent.bubble ) && (that as any) instanceof MC ){
225
+ setTimeout(
226
+ () => {
227
+ // bubbling must include 'l' for local, or else no handlers are executed'
228
+ if ( mcEvent.bubble.indexOf('l') === -1 ){
229
+ mcEvent.bubble += 'l';
230
+ }
231
+
232
+ // bubble up towards root
233
+ if ( mcEvent.bubble.indexOf('u') > -1 ){
234
+ (that as any)
235
+ .parent()
236
+ .forEach( (mc: any) => {
237
+ mc instanceof MC ? ( mc as any ).trigger(mcEvent) : null;
238
+ });
239
+ }
240
+
241
+ // bubble down
242
+ if ( mcEvent.bubble.indexOf('d') > -1 ){
243
+ (that as any)
244
+ .children()
245
+ .forEach( (mc: any) => {
246
+ mc instanceof MC ? ( mc as any ).trigger(mcEvent) : null;
247
+ });
248
+ }
249
+
250
+ },
251
+ 0
252
+ );
253
+ }
254
+
255
+ }
256
+
257
+ }
258
+
259
+ };
260
+
261
+ class DC extends MC {
262
+ constructor(target: HTMLElement) {
263
+ super(target);
264
+ }
265
+
266
+ static debug: boolean = false;
267
+
268
+ static add: Function = add;
269
+ static remove: Function = remove;
270
+ static trigger: Function = trigger;
271
+
272
+ parent(search: string = ''): any[] {
273
+ let target: HTMLElement = (this as any).target;
274
+ if (!isDOM(target)) return [];
275
+ return traverseNodes((target as any).parentNode, search, true);
276
+ }
277
+
278
+ ancestors(search: string = ''): any[] {
279
+ let target: any = (this as any)?.target;
280
+ if (!isDOM(target)) return [];
281
+ return traverseNodes((this as any).target.parentNode, search, false);
282
+ }
283
+
284
+ children(search: string = ''): any[] {
285
+ let target: any = (this as any)?.target;
286
+ if (!isDOM(target)) return [];
287
+ const id = Math.random().toString().replace('.', '');
288
+ const selector = '[_mc]:not([temp_id="' + id + '"] [_mc] [_mc])';
289
+ target.setAttribute('temp_id', id);
290
+ const myDomElements = target.querySelectorAll(selector);
291
+ const mcValues = getMicroComponents([...myDomElements], search);
292
+ target.removeAttribute('temp_id');
293
+ return mcValues;
294
+ }
295
+
296
+ descendants(search: string = ''): any[] {
297
+ let target: any = (this as any)?.target;
298
+ if (!isDOM(target)) return [];
299
+ const myDomElements = target.querySelectorAll('*[_mc]');
300
+ return getMicroComponents([...myDomElements], search);
301
+ }
302
+
303
+ autoAttachListeners(){
304
+ if ( !isBrowser() ) return;
305
+
306
+ const target = this.target;
307
+
308
+ if ( target instanceof HTMLElement ){
309
+ let that: LooseObject = this;
310
+ Object
311
+ .getOwnPropertyNames( that.constructor.prototype )
312
+ .filter( key => /^on[A-Z]|one[A-Z]/.test(key) && typeof that.constructor.prototype[key] === 'function' )
313
+ .forEach( key => {
314
+ let
315
+ once = /^one/.test(key),
316
+ withoutOnOne = key.replace( /^on[e]{0,1}/, '' ), // preserves upper/lowercase for non-native events
317
+ nativeEventName = withoutOnOne.toLowerCase(),
318
+ listener = ( ev: McEvent | Event | CustomEvent ) => { that.trigger( withoutOnOne, ev ); };
319
+ ;
320
+
321
+ // console.log('autoAttach', nativeEventName, withoutOnOne, once, listener);
322
+
323
+ if ( once ){
324
+ // console.log( '...is only called once', that.constructor.prototype[key] );
325
+ Object.defineProperty(
326
+ this,
327
+ 'on' + withoutOnOne,
328
+ {
329
+ configurable: true,
330
+ enumerable: false,
331
+ writable: true,
332
+ value: (ev: any) => {
333
+ // console.log( 'onceHandler execute:', that.constructor.prototype[key] );
334
+ ( that.constructor.prototype[key] ).bind(that)(ev);
335
+ }
336
+ }
337
+ );
338
+ }
339
+
340
+ if ( nativeEventNames.has( 'on' + nativeEventName ) ){ // native event defined in HTMLElement
341
+ // console.log('added as native listener', target, nativeEventName );
342
+ addListener( target, nativeEventName, listener, false, once );
343
+ }
344
+ });
345
+ }
346
+ }
347
+
348
+ };
349
+
350
+ export { addListener, removeListener, McBase, MC, DC, McEvent };
@@ -0,0 +1,8 @@
1
+ export * from './helpers.js';
2
+ export * from './MC.js';
3
+ export * from './McEvent.js';
4
+ export * from './customElements.js';
5
+ export * from './customObservables.js';
6
+ export * from './customSelectors.js';
7
+ export * from './formValues.js';
8
+ //# sourceMappingURL=MCbundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCbundle.d.ts","sourceRoot":"","sources":["../src/MCbundle.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.MCbundle=t():e.MCbundle=t()}(this,(()=>(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function r(e){return null!=e&&"object"==typeof e}function n(e){return e.split("-").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join("")}function s(e,t){let r;return()=>{clearTimeout(r),r=setTimeout((function(){e(...arguments)}),t)}}function a(e,t){const n=Object.keys(e),s=Object.keys(t);if(n.length!==s.length)return!1;for(const s of n){const n=e[s],o=t[s],c=r(n)&&r(o);if(c&&!a(n,o)||!c&&n!==o)return!1}return!0}function o(e,t,n=null,s){let a=e.split(".");s||(s=t);let c=a.shift(),i=a.join(".");null!==n&&c.length&&void 0===t[c]&&(t[c]={});let l=t[c];return 0===i.length?null!==n?(t[c]=n,s):t[c]:r(t[c])?o(i,t[c],n,s):n?s:l[c]}function c(e,t){var n=Array.from(arguments);if(n.length){if(1===n.length)return n[1];if(n.length>2){for(;n.length>1;)n[0]=c(n[0],n[1]),n.splice(1,1);return n[0]}if("string"==typeof e){var s=e.match(/\{[^\{\}]*\}/g);s&&s.forEach((function(r){var n=o(r.substr(1,r.length-2),t);void 0!==n&&(e=e.replace(r,n))}))}else if(r(e))switch(e.constructor){case Object:Object.keys(e).forEach((function(r){e.hasOwnProperty(r)&&(e[r]=c(e[r],t))}));break;case Array:e.forEach((function(r,n,s){s[n]=c(e[n],t)}))}return e}console.error("no arguments give to parse")}function i(e){let t=document.createElement("template");return e=e.replace(/<([A-Za-z0-9\-]*)([^>\/]*)(\/>)/gi,"<$1$2></$1>"),t.innerHTML=e,t.content.normalize(),Array.from(t.content.childNodes)}e.r(t),e.d(t,{$d:()=>B,$t:()=>q,DC:()=>S,MC:()=>A,McBase:()=>w,McEvent:()=>h,addListener:()=>m,debounce:()=>s,deepEqual:()=>a,defineCE:()=>k,formValues:()=>F,getCE:()=>x,htmlToElements:()=>i,isObject:()=>r,kebabToPascal:()=>n,makeCO:()=>T,nameSpace:()=>o,parse:()=>c,removeListener:()=>g});var l=new Function("try {return this===window;}catch(e){ return false;}");let u=new Set;l()&&Object.keys(HTMLElement.prototype).filter((e=>/^on/.test(e))).forEach((e=>u.add(e)));class h{#e;#t=!1;#r=!1;constructor(e,t={},r="l"){this.#e=e,this.data=t,this.bubble=r}get type(){return this.#e}get stopped(){return this.#t}get immediateStopped(){return this.#r}stopPropagation(){this.#t=!0}stopImmediatePropagation(){this.stopPropagation(),this.#r=!0}}var f=new Function("try {return this===window;}catch(e){ return false;}");let d=new Set;function p(e,t){let r=[];return e.forEach((e=>{if(e&&e instanceof HTMLElement){const n=e?._mc;!t&&n?r=r.concat(Object.values(e._mc)):t&&n&&n[t]&&r.push(n[t])}})),r}function y(e,t,r=!0){let n=[];for(;e;){if(e._mc&&(t?t&&e._mc[t]&&n.push(e._mc[t]):n=n.concat(Object.values(e._mc)),r))return n;e=e.parentNode}return n}function b(e){return e&&e instanceof HTMLElement}function m(e,t,r,n=!1,s=!1){let a={once:!1};n&&(a.capture=n),s&&(a.once=s),e.addEventListener(t,r,a)}function g(e,t,r){e.removeEventListener(t,r)}function E(e,t,r={}){let n=e;if(!n._mc){let t=A?.debug;A.debug=!1,n._mc=new A(e),A.debug=t}const s=n._mc;return t.length&&!s[t]&&(s[t]=r,e instanceof HTMLElement&&e.setAttribute("_mc","")),r}function v(e,t){if(!t)return;const r=e?._mc||{};r&&r[t]&&delete r[t],!Object.keys(r).length&&e instanceof HTMLElement&&e.hasAttribute("_mc")&&e.removeAttribute("_mc")}function O(e,t,r={}){let n=e?._mc;n&&[...Object.values(n)].forEach((e=>{e?.trigger&&"function"==typeof e?.trigger&&e?.trigger(t,r)}))}f()&&Object.keys(HTMLElement.prototype).filter((e=>/^on/.test(e))).forEach((e=>d.add(e)));class w{#n;#s={};constructor(e){this.#n=new WeakRef(e),this.constructor!==A&&this.constructor!==S&&Object.defineProperty(this,"_mc",{get(){return this.#s}})}get target(){return this.#n.deref()}}class A extends w{constructor(e){super(e);let t=this;t.constructor!==A&&t.constructor!==S&&setTimeout((()=>{t.trigger("init")}),0)}trigger(e,t={},r){let n=this;if(r=r||"l",n.constructor!==A&&n.constructor!==S){if(n instanceof A||n instanceof S){const n=this,s="string"!=typeof e?e:new h(e,t,r),a="on"+s.type[0].toUpperCase()+s.type.slice(1);if(s.bubble.indexOf("l")>-1&&(s.immediateStopped||"function"!=typeof n[a]||(n[a](s),n.hasOwnProperty(a)&&delete n[a])),s.stopped||"l"===s.bubble)return n;f()&&/[ud]/.test(s.bubble)&&n instanceof A&&setTimeout((()=>{-1===s.bubble.indexOf("l")&&(s.bubble+="l"),s.bubble.indexOf("u")>-1&&n.parent().forEach((e=>{e instanceof A&&e.trigger(s)})),s.bubble.indexOf("d")>-1&&n.children().forEach((e=>{e instanceof A&&e.trigger(s)}))}),0)}}else[...Object.getOwnPropertyNames(n)].forEach((s=>{n[s]?.trigger&&"function"==typeof n[s]?.trigger&&n[s]?.trigger(e,t,r)}))}}class S extends A{constructor(e){super(e)}static debug=!1;static add=E;static remove=v;static trigger=O;parent(e=""){let t=this.target;return b(t)?y(t.parentNode,e,!0):[]}ancestors(e=""){let t=this?.target;return b(t)?y(this.target.parentNode,e,!1):[]}children(e=""){let t=this?.target;if(!b(t))return[];const r=Math.random().toString().replace(".",""),n='[_mc]:not([temp_id="'+r+'"] [_mc] [_mc])';t.setAttribute("temp_id",r);const s=p([...t.querySelectorAll(n)],e);return t.removeAttribute("temp_id"),s}descendants(e=""){let t=this?.target;return b(t)?p([...t.querySelectorAll("*[_mc]")],e):[]}autoAttachListeners(){if(!f())return;const e=this.target;if(e instanceof HTMLElement){let t=this;Object.getOwnPropertyNames(t.constructor.prototype).filter((e=>/^on[A-Z]|one[A-Z]/.test(e)&&"function"==typeof t.constructor.prototype[e])).forEach((r=>{let n=/^one/.test(r),s=r.replace(/^on[e]{0,1}/,""),a=s.toLowerCase();n&&Object.defineProperty(this,"on"+s,{configurable:!0,enumerable:!1,writable:!0,value:e=>{t.constructor.prototype[r].bind(t)(e)}}),d.has("on"+a)&&m(e,a,(e=>{t.trigger(s,e)}),!1,n)}))}}}class j extends HTMLElement{constructor(){super()}connectedCallback(){S.trigger(this,"Connected")}disconnectedCallback(){S.trigger(this,"Disconnected")}adoptedCallback(){S.trigger(this,"Adopted")}attributeChangedCallback(e,t,r){S.trigger(this,"AttributeChanged",{name:e,oldValue:t,newValue:r})}}function k(e,t,r=[]){if(customElements.get(e))return void console.warn(`IGNORED: Custom element "${e}" is already defined!`);if(!e.includes("-"))throw new Error('createCustomElement: tagName must contain at least one hyphen ("-").');let s=n(e);customElements.define(e,function(e,t){return Object.defineProperty(t,"name",{value:e})}(s,class extends j{instance;constructor(e){super();let r=new t(this,e);S.add(this,s,r)}static get observedAttributes(){return r}}))}function x(e){return customElements.get(e)}const T=(e,t)=>{(t?[t]:[...Object.getOwnPropertyNames(e)]).forEach((t=>{if("_"===t[0]||void 0===e?.[t])return;let n,o=e[t];if(!o.prototype)switch(typeof o){case"string":n=String;break;case"number":n=Number;break;case"boolean":n=Boolean;break;case"object":n=o instanceof Array?Array:Object;break;default:return}let i=class extends n{constructor(e){super(e),this.constructor.callbacks=[],r(e)&&(this.constructor.bound=[],Object.getOwnPropertyNames(e).forEach((t=>{this[t]=e[t]})))}observe(e){return this.constructor.callbacks.push(e),this}bind(e){const t=this,n=r(t.valueOf()),s=t.constructor.bound;if(n){function a(e){if(e.nodeType&&3===e.nodeType){var r=Array.from(e.nodeValue&&e.nodeValue.match(/\{[^\{\}]*\}/g)||[]);if(r.length>0){var o=(i=e.nodeValue||"",function(t){var s,a=!1;return r&&(n?r.forEach((function(e){o.values[e]!==t[e]&&(o.values[e]=t[e],a=!0)})):(o.values=t,a=!0)),a&&(s=i,e.nodeValue=n?c(s,o.values):s.replace(/\{.*\}/g,o.values)),t});o.values=n?{}:void 0,r=Array.from(r).map((e=>e.replace(/[\{\}]/g,"").trim()));let t=n?{}:void 0;r.forEach((function(e){n&&(t[e]="")})),s.push(o)}Array.from(e.childNodes).forEach((function(e){a(e)})),t.notify()}var i;e.nodeType&&1===e.nodeType&&(Array.from(e.attributes).forEach((function(t){var r=Array.from(t.value&&t.value.match(/\{[^\{\}]*\}/g)||[]);if(r.length>0){var n=function(t){return function(s){var a,o=!1;return r&&r.forEach((function(e){n.values[e]!==s[e]&&(n.values[e]=s[e],o=!0)})),o&&(a=t,e.nodeValue=c(a,n.values)),s}}(t.value||"");n.values={},r=Array.from(r).map((e=>e.replace(/[\{\}]/g,"").trim()));let a={};r.forEach((function(e){a[e]=""})),s.push(n)}})),Array.from(e.childNodes).forEach((function(e){a(e)})),t.notify()),e.nodeType&&11===e.nodeType&&Array.from(e.childNodes).forEach((function(e){a(e)}))}a(e),s.length>0&&t.notify()}else console.warn("IGNORED - cannot bind a non-Object to the dom, IS:",typeof t.valueOf());return this}notify(){let e=this,t=r(e.valueOf())&&e.valueOf()instanceof Array==0?structuredClone(Object.assign({},e)):e.valueOf();return e.constructor.callbacks.forEach((e=>{e(t)})),r(e.valueOf())&&e.constructor.bound.forEach((e=>{e(t)})),this}},l=new i(o);Object.defineProperty(e,t,{enumerable:!0,get(){if(r(l.valueOf())){let e=structuredClone(Object.assign({},l));setTimeout(s((function(){a(structuredClone(Object.assign({},l)),e)||l.notify()}),0),0)}return l},set(e){if(typeof e==typeof l.valueOf())if(r(l.valueOf())&&l.valueOf()instanceof Array==0){let t=structuredClone(Object.assign({},l));e=structuredClone(Object.assign({},e));let r=l.constructor?.hasFormHandler??!1,n=l.constructor.callbacks,o=l.constructor.bound;l=new i(structuredClone(Object.assign({},e))),l.constructor.callbacks=r,l.constructor.callbacks=n,l.constructor.bound=o,setTimeout(s((function(){a(structuredClone(Object.assign({},l)),t)||l.notify()}),0),0)}else{let t=l.valueOf(),r=l.constructor.callbacks;l=new i(e),l.constructor.callbacks=r,e!==t&&l.notify()}else console.warn("IGNORED - cannot change observable types, IS:",typeof l.valueOf(),"- CANNOT BECOME:",typeof e)}}),e[t]=o}))},C=e=>{let t=new Set;return e.forEach((e=>{(e=e.trim()).split(" ").forEach((e=>{""!==e&&t.add(e)}))})),Array.from(t)},_=e=>{let t=B("input,select,textarea",e).array,r={};return t.forEach((t=>{const n=t.getAttribute("name")||"undefined";if(n){let s;switch((e=>e instanceof HTMLInputElement?"input":e instanceof HTMLSelectElement?"select":e instanceof HTMLTextAreaElement?"textarea":"")(t)){case"input":s=new L(t,e),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;case"select":s=new M(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;case"textarea":s=new P(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;default:console.warn("handler missing:",n,"for",t)}}})),r};class N{constructor(e){}}class L extends N{#a;#e;#o;constructor(e,t){super(e),this.#a=e,this.#e=e.type,this.#o=t}get val(){let e,t=this;switch(t.#e){case"radio":const r=B(`input[type="radio"][name="${this.#a.getAttribute("name")}"]`,this.#o).filter((e=>e.checked));return r.length?(e=r.array[0],e.value):"";case"checkbox":return t.#a.checked;default:return t.#a.value}return""}set val(e){let t=this;switch(t.#e){case"radio":const r=`input[type="radio"][name="${this.#a.getAttribute("name")}"]`,n=B(r,this.#o);if(!n.length)return;if(""===e)return void n.forEach((e=>{e.checked&&(e.checked=!1)}));const s=n.filter((t=>t.getAttribute("value")===e));if(!s.length)return;return void(s.array[0].checked=!0);case"checkbox":t.#a.checked=e;break;default:t.#a.value=e}}}class M extends N{#a;#c=!1;constructor(e){super(e),this.#a=e,this.#c="select-multiple"===e.type}get val(){const e=[];return B(this.#a.querySelectorAll("option")).filter((e=>e.selected)).forEach((t=>{t.selected&&e.push(t.value)})),this.#c?e:e.length?e[0]:""}set val(e){e="string"==typeof e?[e]:e,B(this.#a.querySelectorAll("option")).forEach((t=>{e.indexOf(t.value)>-1?(t.setAttribute("selected",!0),t.selected=!0):(t.removeAttribute("selected"),t.selected=!1)}))}}class P extends N{#a;constructor(e){super(e),this.#a=e}get val(){return this.#a.value}set val(e){this.#a.value=e}}class H{#i=new Set;get set(){return this.#i}get array(){return Array.from(this.#i)}set set(e){this.#i=e}get length(){return this.#i.size}constructor(e,t=document.body){if(new Set,!e)return this}$t(e){let t=new $;return this.#i.forEach((e=>{e._mc&&Object.values(e._mc).forEach((e=>{t.set.add(e)}))})),e&&t.filter((t=>t.nameSpace===e)),t}add(e,t){let r=this;return B(e,t).forEach((e=>{r.#i.add(e)})),r}addClass(...e){return e=C(e),this.forEach((t=>{t.classList.add(...e)})),this}after(e,t){let r=this,n=B(e,t);return n.length?(n.first().forEach((e=>{r.array.reverse().forEach((t=>{t.after(e)}))})),r):r}append(e,t){let r=this.array[0],n=B(e,t);return r&&n.forEach((e=>{r.append(e)})),this}appendTo(e,t){let r=B(e,t).array[0];return r&&this.forEach((e=>{r.append(e)})),this}attr(e,t){let r=this,n={};return r.length?arguments.length?"string"==typeof e?void 0===t?[...r.set][0].getAttribute(e):null===t?([...r.set].forEach((t=>{t.removeAttribute(e)})),r):("object"==typeof t&&(t=JSON.stringify(t)),[...r.set].forEach((r=>{r.setAttribute(e,t)})),r):"object"==typeof e?([...r.set].forEach((t=>{Object.keys(e).forEach((r=>{B(t).attr(r,e.key)}))})),r):r:(Array.from([...r.set][0].attributes).forEach((e=>{n[e.name]=e.value})),n):r}before(e,t){let r=this,n=B(e,t);return n.length?(n.first().forEach((e=>{r.forEach((t=>{t.before(e)}))})),r):r}children(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{Array.from(e.children).forEach((e=>{n.add(e)}))})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}descendants(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{e.querySelectorAll("*").forEach((e=>{n.add(e)}))})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}empty(){return this.filter((e=>!1))}first(e,t){let r=this,n=new Set,s=!1;return e&&(s=B(e,t)),r.#i.forEach((e=>{e.parentNode&&n.add(e.parentNode.children[0])})),r=B([...n]),e&&r.filter((e=>s.has(e))),r}has(e){return this.#i.has(e)}hasClass(...e){return e=C(e),this.every((e=>Array.from(e.classList).every((t=>e.contains(t)))))}html(e){let t=this;return e?(t.forEach((t=>{t.parentNode?t.innerHTML=e:(()=>{console.warn("Cannot access the .innerHTML of a HTMLElement that hasnt been inserted yet",t),console.trace(t,this),console.info("If you called this from inside a Web Component constructor, consider using the %c[connected] event callback!","color: blue;")})()})),t):t.array[0].innerHTML}last(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{let t=e.parentNode?.children;t&&n.add(Array.from(t).at(-1))})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}next(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{let t=e.parentNode?.children;if(t){let r=Array.from(t),s=r.indexOf(e)+1;s<r.length&&n.add(r.at(s))}})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}normalize(){return this.#i.forEach((e=>{e.normalize()})),this}off(e,t){let r=e.indexOf(" ")>-1?e.split(" "):[e];return this.array.forEach((e=>{r.forEach((function(r){g(e,r,t)}))})),this}on(e,t,r=!1,n=!1){let s=this,a=e.indexOf(" ")>-1?e.split(" ").filter((e=>""!==e)):[e];function o(){o.cb.apply(s,Array.from(arguments))}return o.cb=t,s.forEach((e=>{a.forEach((function(t){m(e,t,o,r,n)}))})),o}one(e,t,r=!1){let n=this,s=e.indexOf(" ")>-1?e.split(" ").filter((e=>""!==e)):[e];function a(){a.cb.apply(n,Array.from(arguments))}return a.cb=t,n.forEach((e=>{s.forEach((function(t){m(e,t,a,r,!0)}))})),a}parent(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{e.parentNode&&"HTML"!==e.parentNode.tagName&&n.add(e.parentNode)})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}parents(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{let t=e;for(;t.parentNode&&"HTML"!==t.parentNode.tagName;)t=t.parentNode,n.add(t)})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}prepend(e,t){let r=this.array[0],n=B(e,t);return r&&n.forEach((e=>{r.prepend(e)})),this}prev(e,t){let r=this,n=new Set;if(r.#i.forEach((e=>{let t=e.parentNode?.children;if(t){let r=Array.from(t),s=r.indexOf(e)-1;s>-1&&n.add(r.at(s))}})),r=B([...n]),e){let n=B(e,t);r.filter((e=>n.has(e)))}return r}removeClass(...e){return e=C(e),this.forEach((t=>{t.classList.remove(...e)})),this}text(e){let t=this;return e?(t.forEach((t=>{t.parentNode?t.innerText=e:(()=>{console.warn("Cannot access the .textContent of a HTMLElement that hasnt been inserted yet",t),console.trace(t,this),console.info("If you called this from inside a Web Component constructor, consider using the %c[connected] event callback!","color: blue;")})()})),t):t.array[0].innerText??""}toggleClass(...e){return e=C(e),this.forEach((t=>{t.classList.toggle(...e)})),this}trigger(e,t={},r=!1,n=!1,s=!1){let a,o={bubbles:r,cancelable:n,composed:s},c=e.indexOf(" ")>-1?e.split(" "):[e];return this.#i.forEach((e=>{c.forEach((function(r){a=new Event(r,o),a.data=t,e.dispatchEvent(a)}))})),this}val(e,t){if(!this.length)return this;const r=this;let n,s=_(r.array[0]);var a;return e?null!=(a=e)&&"object"==typeof a?(Object.assign(s,e),n=r):"string"==typeof e&&(void 0===t?n=s[e]:(s[e]=t,n=r)):n=Object.assign({},s),n}values(e){const t=this;let r={};if(!t.length)return console.warn("no dom selection to search inputs in"),{};let n=_(t.array[0]);return Object.keys(n).forEach((e=>{r[e]=n[e]})),0===Object.keys(r).length&&console.warn("no inputs in this dom selection",t.array[0],r),e&&Object.keys(e).forEach((t=>{n.hasOwnProperty(t)&&(console.log("key found",t),n[t]=e[t])})),structuredClone(Object.assign(n))}at(e){return B(this.array.at(e))}concat(e){let t=this;return(e instanceof H?e.array:e).forEach((e=>{t.#i.add(e)})),t}entries(){return this.array.entries()}every(e,t){return this.array.every(e,t)}filter(e,t){return this.#i=new Set(this.array.filter(e,t)),this}forEach(e,t){return this.array.forEach(e,t),this}includes(e){return-1!==this.array.indexOf(e,0)}indexOf(e,t){return this.array.indexOf(e,t)}map(e,t){return this.array.map(e,t)}pop(){return this.array.pop()}push(...e){return e.forEach((e=>{this.#i.add(e)})),this}shift(){let e=this,t=e.#i.size?e.array[0]:void 0;return t&&e.#i.delete(t),t}slice(e,t){return B(this.array.slice(e,t))}some(e,t){return this.array.some(e,t)}splice(e,t,...r){let n=this.array;return n.splice(e,t,...r),B(n)}}class ${#i=new Set;get set(){return this.#i}get array(){return Array.from(this.#i)}set set(e){this.#i=e}get length(){return this.#i.size}set length(e){}constructor(e,t=document.body){if(!e)return this;B(e,t).forEach((e=>{q(e).forEach((e=>{this.#i.add(e)}))}))}$d(e,t=document.body){let r=new H,n=new Set,s=!!e||!1,a=new Set;return s&&(a=B(e,t).set),this.#i.forEach((e=>{s&&!a.has(e._tg)||n.add(e._tg)})),r.set=n,r}children(e){let t=this,r=new Set;return t.#i.forEach((t=>{t.children(e).forEach((e=>{r.add(e)}))})),t.#i=r,t}descendants(e){let t=this,r=new Set;return t.#i.forEach((t=>{t.descendants(e).forEach((e=>{r.add(e)}))})),t.#i=r,t}first(e){let t=this,r=new Set;return t.#i.forEach((e=>{e.parent().children().$d().first().$t().forEach((e=>{r.add(e)}))})),t.#i=r,e&&t.filter((t=>t.nameSpace=e)),t}has(e){return this.#i.has(e)}last(e){let t=this,r=new Set;return t.#i.forEach((e=>{e.parent().children().$d().last().$t().forEach((e=>{r.add(e)}))})),t.#i=r,e&&t.filter((t=>t.nameSpace=e)),t}next(e){let t=this,r=new Set;return t.#i.forEach((e=>{let t,n=new Set;for(t=e._tg;null!==t.nextElementSibling;)t=t.nextElementSibling,n.add(t);q([...n]).$d().first().$t().forEach((e=>{r.add(e)}))})),t.#i=r,e&&t.filter((t=>t.nameSpace=e)),t}ns(e){return this.filter((t=>t.nameSpace===e))}off(e,t){let r=e.indexOf(" ")>-1?e.split(" ").filter((e=>""!==e)):[e];return this.$d().array.forEach((e=>{r.forEach((function(r){g(e,`[TB]${r}`,t)}))})),this}on(e,t,r=!1){let n=this,s=e.indexOf(" ")>-1?e.split(" ").filter((e=>""!==e)):[e];function a(){a.cb.apply(n,Array.from(arguments))}return a.cb=t,n.forEach((e=>{s.forEach((function(t){m(e._tg,`[TB]${t}`,a,!1,r)}))})),a}one(e,t){let r=this,n=e.indexOf(" ")>-1?e.split(" ").filter((e=>""!==e)):[e];function s(){s.cb.apply(r,Array.from(arguments))}return s.cb=t,r.forEach((e=>{n.forEach((function(t){m(e._tg,`[TB]${t}`,s,!1,!0)}))})),s}parent(e){let t=this,r=new Set;return t.#i.forEach((t=>{t.parent(e).forEach((e=>{r.add(e)}))})),t.#i=r,t}parents(e){let t=this,r=new Set;return t.#i.forEach((t=>{t.parents(e).forEach((e=>{r.add(e)}))})),t.#i=r,t}prev(e){let t=this,r=new Set;return t.#i.forEach((e=>{let t,n=new Set;for(t=e._tg;null!==t.previousElementSibling;)t=t.previousElementSibling,n.add(t);q([...n]).$d().last().$t().forEach((e=>{r.add(e)}))})),t.#i=r,e&&t.filter((t=>t.nameSpace=e)),t}trigger(e,t={},r="l"){return this.forEach((n=>{n.trigger(e,t,r)})),this}at(e){return q(this.array.at(e))}concat(e){let t=this;return e.forEach((e=>{t.#i.add(e)})),t}entries(){return this.array.entries()}every(e,t){return this.array.every(e,t)}filter(e,t){return q(this.array.filter(e,t))}forEach(e,t){return this.array.forEach(e,t),this}includes(e){return-1!==this.array.indexOf(e)}indexOf(e,t){return this.array.indexOf(e,t)}map(e,t){return this.array.map(e,t)}pop(){let e=this.array,t=e.pop();return this.#i=new Set(e),t}push(e){return this.#i.add(e),this}shift(){let e=this.array.shift();return this.#i.delete(e),e}slice(e,t){return q(this.array.slice(e,t))}some(e,t){return this.array.some(e,t)}splice(e,t,...r){let n=this.array.splice(e,t,...r);return q(n)}}const B=(e,t=document)=>{let r=new Set;return e instanceof Array?(e.forEach((e=>{B(e,t).forEach((e=>{r.add(e)}))})),new H([...r])):new H(e,t)},q=(e,t=document)=>B(e,t).$t();class I{constructor(e){}}class V extends I{#a;#e;#o;constructor(e,t){super(e),this.#a=e,this.#e=e.type,this.#o=t}get val(){let e,t=this;switch(t.#e){case"radio":const r=[...(this.#o||document).querySelectorAll(`input[type="radio"][name="${this.#a.getAttribute("name")}"]`)].filter((e=>e.checked));return r.length?(e=r?.[0],e.value):"";case"checkbox":return t.#a.checked;default:return t.#a.value}return""}set val(e){let t=this;switch(t.#e){case"radio":const r=[...(this.#o||document).querySelectorAll(`input[type="radio"][name="${this.#a.getAttribute("name")}"]`)];if(!r.length)return;if(""===e)return void r.forEach((e=>{e.checked&&(e.checked=!1)}));const n=r.filter((t=>t.getAttribute("value")===e));if(!n.length)return;return void((n?.[0]).checked=!0);case"checkbox":t.#a.checked=e;break;default:t.#a.value=e}}}class z extends I{#a;#c=!1;constructor(e){super(e),this.#a=e,this.#c="select-multiple"===e.type}get val(){const e=[];return[...this.#a.querySelectorAll("option")].filter((e=>e.selected)).forEach((t=>{t.selected&&e.push(t.value)})),this.#c?e:e.length?e[0]:""}set val(e){e="string"==typeof e?[e]:e,[...this.#a.querySelectorAll("option")].forEach((t=>{e.indexOf(t.value)>-1?(t.setAttribute("selected","selected"),t.selected=!0):(t.removeAttribute("selected"),t.selected=!1)}))}}class D extends I{#a;constructor(e){super(e),this.#a=e}get val(){return this.#a.value}set val(e){this.#a.value=e}}const F=(e,t={},r,n)=>{let s=(e=>{let t=[...(e||document).querySelectorAll("input,select,textarea")],r={};return t.forEach((t=>{const n=t.getAttribute("name")||"undefined";if(n){let s;switch((e=>e instanceof HTMLInputElement?"input":e instanceof HTMLSelectElement?"select":e instanceof HTMLTextAreaElement?"textarea":"")(t)){case"input":s=new V(t,e),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;case"select":s=new z(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;case"textarea":s=new D(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>s.val,set:e=>{s.val=e}});break;default:console.warn("handler missing:",n,"for",t)}}})),r})(e);function a(e){Object.keys(e).forEach((t=>{s.hasOwnProperty(t)&&e.hasOwnProperty(t)&&(s[t]=e[t])}))}if(Object.keys(t).length>0&&a(t),void 0!==n){let t=r[n];t.constructor?.hasFormHandler||(t.constructor.hasFormHandler=!0,t.observe(a)),r[n].observe((()=>{})),[...e.querySelectorAll("input, textarea, select")].forEach((e=>{m(e,"keyup",(()=>{r[n]=structuredClone(Object.assign(s))})),m(e,"change",(()=>{r[n]=structuredClone(Object.assign(s))})),e instanceof HTMLSelectElement&&m(e,"select",(()=>{r[n]=structuredClone(Object.assign(s))}))}))}return n?r[n]:Object.assign({},s)};return t})()));
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ export * from './helpers.js';
3
+ export * from './MC.js';
4
+ export * from './McEvent.js';
5
+ export * from './customElements.js';
6
+ export * from './customObservables.js';
7
+ export * from './customSelectors.js';
8
+ export * from './formValues.js';
@@ -0,0 +1,15 @@
1
+ interface McEvent {
2
+ data: any;
3
+ bubble: string;
4
+ }
5
+ declare class McEvent {
6
+ #private;
7
+ constructor(type: string, data?: any, bubble?: string);
8
+ get type(): string;
9
+ get stopped(): boolean;
10
+ get immediateStopped(): boolean;
11
+ stopPropagation(): void;
12
+ stopImmediatePropagation(): void;
13
+ }
14
+ export { McEvent };
15
+ //# sourceMappingURL=McEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McEvent.d.ts","sourceRoot":"","sources":["../src/McEvent.ts"],"names":[],"mappings":"AAeA,UAAU,OAAO;IAChB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CACf;AAED,cAAM,OAAO;;gBAMC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,EAAE,MAAM,GAAE,MAAY;IAO/D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,eAAe;IAIf,wBAAwB;CAKxB;AAyCD,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ var isBrowser=new Function("try {return this===window;}catch(e){ return false;}");
4
+
5
+ let nativeEventNames: Set<string> = new Set();
6
+
7
+ // HTMLElement native event names
8
+ if ( isBrowser() ){
9
+ Object.keys( HTMLElement.prototype ).filter( key => /^on/.test(key) ).forEach( eventName => nativeEventNames.add( eventName ) );
10
+ }
11
+
12
+ function isDOM(element: { [key:string]: any } ) {
13
+ return element && element instanceof HTMLElement;
14
+ }
15
+
16
+ interface McEvent {
17
+ data: any;
18
+ bubble: string;
19
+ }
20
+
21
+ class McEvent{
22
+
23
+ #type: string;
24
+ #stopped: boolean = false;
25
+ #immediateStopped: boolean = false;
26
+
27
+ constructor( type: string, data: any = {}, bubble: string = 'l' ){
28
+ // bubble standard = local only, options = any combination of'uld' characters: up to root, local, down
29
+ this.#type = type;
30
+ this.data = data;
31
+ this.bubble = bubble;
32
+ }
33
+
34
+ get type(): string {
35
+ return this.#type;
36
+ }
37
+
38
+ get stopped(): boolean {
39
+ return this.#stopped;
40
+ }
41
+
42
+ get immediateStopped(): boolean {
43
+ return this.#immediateStopped;
44
+ }
45
+
46
+ stopPropagation(){
47
+ this.#stopped = true;
48
+ }
49
+
50
+ stopImmediatePropagation(){
51
+ this.stopPropagation();
52
+ this.#immediateStopped = true;
53
+ }
54
+
55
+ }
56
+
57
+ // get all microcomponents from a list of HTMLElements
58
+ function getMicroComponents( elements: any[], search: string): any[] {
59
+ let mcValues: any[] = [];
60
+
61
+ elements.forEach( e => {
62
+ if (e) {
63
+ if (e instanceof HTMLElement) {
64
+ const _mc = ( e as any )?._mc;
65
+ if ( !search && _mc ) {
66
+ mcValues = mcValues.concat(Object.values(( e as any )._mc));
67
+ }
68
+ else if ( search && _mc && _mc[search] ) {
69
+ mcValues.push( _mc[search] );
70
+ }
71
+ }
72
+ }
73
+ });
74
+ return mcValues;
75
+ }
76
+
77
+ // get all ancestor DOM nodes up to the document root
78
+ function traverseNodes(node: { [key:string]: any }, search: string, firstonly = true): any[] {
79
+ let mcValues: any[] = [];
80
+ while (node) {
81
+ if (node._mc) {
82
+ if (!search) {
83
+ mcValues = mcValues.concat(Object.values(node._mc));
84
+ }
85
+ else if (search && node._mc[search]) {
86
+ mcValues.push(node._mc[search]);
87
+ }
88
+ if (firstonly)
89
+ return mcValues;
90
+ }
91
+ node = node.parentNode;
92
+ }
93
+ return mcValues;
94
+ }
95
+
96
+ export { McEvent };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autoloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoloader.d.ts","sourceRoot":"","sources":["../src/autoloader.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ import { getCE } from './customElements.js'
4
+
5
+ // set of currently loading scripts
6
+ const loadingScripts: Set<string> = new Set();
7
+
8
+ const _makeLoadData = ( e: HTMLElement ): Array<any> | false => {
9
+
10
+ let
11
+ tagName = e?.localName ?? '',
12
+ isAttribute = e.getAttribute?.('is') || '',
13
+ isUBE = isAttribute ? true : false,
14
+ isCE = tagName.indexOf('-') !== -1 ? true : false,
15
+ ubeSelector = isUBE ? `${tagName}[is=\"${isAttribute}\"]:defined` : '',
16
+ ceSelector = isCE ? tagName + ':defined' : '',
17
+ fileBaseName = isUBE
18
+ ? isAttribute
19
+ : isCE
20
+ ? tagName
21
+ : '',
22
+ fileName = fileBaseName.length ? '/' + fileBaseName.split('-').join('/') + '.js' : '',
23
+ selector = isUBE
24
+ ? ubeSelector
25
+ : isCE
26
+ ? ceSelector
27
+ : ''
28
+ ;
29
+
30
+ //console.log( 'makeLoadData()', tagName, isUBE, isCE, ubeSelector, ceSelector, fileBaseName, ' => ', (isUBE || isCE) ? [ e, selector, fileName ] : false );
31
+ return (isUBE || isCE) ? [ e, selector, fileName, fileBaseName ] : false;
32
+ }
33
+
34
+ const _loadRequirements = ( node: HTMLTemplateElement | HTMLElement ): Promise<any> => {
35
+
36
+ let
37
+ undefinedSet: Set<any> = new Set(),
38
+ element: any = node instanceof HTMLTemplateElement ? (node as HTMLTemplateElement).content : node,
39
+ head = document.head,
40
+ allPromises: Array<any> = [],
41
+ e: HTMLElement;
42
+ ;
43
+
44
+ if ( element instanceof HTMLTemplateElement === false ){
45
+ // if node itself is undefined
46
+ let data: any = _makeLoadData(element);
47
+
48
+ if ( data && !data[0].matches( data[1] ) ){
49
+ undefinedSet.add( data );
50
+ }
51
+ }
52
+
53
+ // if some of the childNodes are undefined
54
+ Array.from( element.childNodes ).forEach(( node )=>{
55
+ let data: any = _makeLoadData(node as HTMLElement);
56
+
57
+ if ( data && !data[0].matches( data[1] ) ){
58
+ undefinedSet.add( data );
59
+ }
60
+ });
61
+
62
+ if ( !!undefinedSet.size ){ // there are requirements
63
+
64
+ undefinedSet.forEach( (data) => {
65
+ if ( !getCE( data[3] ) && !loadingScripts.has( data[2]) ){
66
+
67
+ loadingScripts.add( data[2] );
68
+
69
+ const se: HTMLScriptElement = document.createElement('script');
70
+
71
+ se.setAttribute( 'src', data[2] );
72
+ se.setAttribute( 'blocking', 'render' );
73
+ se.setAttribute( 'type', 'module' );
74
+ let s = (data as any)[2];
75
+ se.onload = () => {
76
+ // console.info('loaded', s);
77
+ loadingScripts.delete( s );
78
+ };
79
+
80
+ head.append( se );
81
+
82
+ let e = (data as Array<any>)[0];
83
+ } else {
84
+ return ;
85
+ }
86
+ });
87
+
88
+ }
89
+
90
+ return Promise.all( allPromises );
91
+ }
92
+
93
+ /*
94
+ TBD
95
+ if ( template.content.childNodes.length ){
96
+ _loadRequirements(template);
97
+ }
98
+ */
@@ -0,0 +1,5 @@
1
+ export declare function defineCE(tagName: string, DefinitionClass: {
2
+ new (...args: any[]): any;
3
+ }, observedAttributes?: string[]): void;
4
+ export declare function getCE(tagName: string): CustomElementConstructor | undefined;
5
+ //# sourceMappingURL=customElements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customElements.d.ts","sourceRoot":"","sources":["../src/customElements.ts"],"names":[],"mappings":"AA+BA,wBAAgB,QAAQ,CAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,EAAE,kBAAkB,GAAE,MAAM,EAAO,QA+B3H;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAE3E"}
@@ -0,0 +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.customElements=e():t.customElements=e()}(this,(()=>(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},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:()=>h,getCE:()=>y});var r=new Function("try {return this===window;}catch(e){ return false;}");let n=new Set;r()&&Object.keys(HTMLElement.prototype).filter((t=>/^on/.test(t))).forEach((t=>n.add(t)));class o{#t;#e=!1;#r=!1;constructor(t,e={},r="l"){this.#t=t,this.data=e,this.bubble=r}get type(){return this.#t}get stopped(){return this.#e}get immediateStopped(){return this.#r}stopPropagation(){this.#e=!0}stopImmediatePropagation(){this.stopPropagation(),this.#r=!0}}var i=new Function("try {return this===window;}catch(e){ return false;}");let c=new Set;function s(t,e){let r=[];return t.forEach((t=>{if(t&&t instanceof HTMLElement){const n=t?._mc;!e&&n?r=r.concat(Object.values(t._mc)):e&&n&&n[e]&&r.push(n[e])}})),r}function a(t,e,r=!0){let n=[];for(;t;){if(t._mc&&(e?e&&t._mc[e]&&n.push(t._mc[e]):n=n.concat(Object.values(t._mc)),r))return n;t=t.parentNode}return n}function u(t){return t&&t instanceof HTMLElement}function l(t,e,r={}){let n=t;if(!n._mc){let e=m?.debug;m.debug=!1,n._mc=new m(t),m.debug=e}const o=n._mc;return e.length&&!o[e]&&(o[e]=r,t instanceof HTMLElement&&t.setAttribute("_mc","")),r}function d(t,e){if(!e)return;const r=t?._mc||{};r&&r[e]&&delete r[e],!Object.keys(r).length&&t instanceof HTMLElement&&t.hasAttribute("_mc")&&t.removeAttribute("_mc")}function p(t,e,r={}){let n=t?._mc;n&&[...Object.values(n)].forEach((t=>{t?.trigger&&"function"==typeof t?.trigger&&t?.trigger(e,r)}))}i()&&Object.keys(HTMLElement.prototype).filter((t=>/^on/.test(t))).forEach((t=>c.add(t)));class f{#n;#o={};constructor(t){this.#n=new WeakRef(t),this.constructor!==m&&this.constructor!==g&&Object.defineProperty(this,"_mc",{get(){return this.#o}})}get target(){return this.#n.deref()}}class m extends f{constructor(t){super(t);let e=this;e.constructor!==m&&e.constructor!==g&&setTimeout((()=>{e.trigger("init")}),0)}trigger(t,e={},r){let n=this;if(r=r||"l",n.constructor!==m&&n.constructor!==g){if(n instanceof m||n instanceof g){const n=this,c="string"!=typeof t?t:new o(t,e,r),s="on"+c.type[0].toUpperCase()+c.type.slice(1);if(c.bubble.indexOf("l")>-1&&(c.immediateStopped||"function"!=typeof n[s]||(n[s](c),n.hasOwnProperty(s)&&delete n[s])),c.stopped||"l"===c.bubble)return n;i()&&/[ud]/.test(c.bubble)&&n instanceof m&&setTimeout((()=>{-1===c.bubble.indexOf("l")&&(c.bubble+="l"),c.bubble.indexOf("u")>-1&&n.parent().forEach((t=>{t instanceof m&&t.trigger(c)})),c.bubble.indexOf("d")>-1&&n.children().forEach((t=>{t instanceof m&&t.trigger(c)}))}),0)}}else[...Object.getOwnPropertyNames(n)].forEach((o=>{n[o]?.trigger&&"function"==typeof n[o]?.trigger&&n[o]?.trigger(t,e,r)}))}}class g extends m{constructor(t){super(t)}static debug=!1;static add=l;static remove=d;static trigger=p;parent(t=""){let e=this.target;return u(e)?a(e.parentNode,t,!0):[]}ancestors(t=""){let e=this?.target;return u(e)?a(this.target.parentNode,t,!1):[]}children(t=""){let e=this?.target;if(!u(e))return[];const r=Math.random().toString().replace(".",""),n='[_mc]:not([temp_id="'+r+'"] [_mc] [_mc])';e.setAttribute("temp_id",r);const o=s([...e.querySelectorAll(n)],t);return e.removeAttribute("temp_id"),o}descendants(t=""){let e=this?.target;return u(e)?s([...e.querySelectorAll("*[_mc]")],t):[]}autoAttachListeners(){if(!i())return;const t=this.target;if(t instanceof HTMLElement){let e=this;Object.getOwnPropertyNames(e.constructor.prototype).filter((t=>/^on[A-Z]|one[A-Z]/.test(t)&&"function"==typeof e.constructor.prototype[t])).forEach((r=>{let n=/^one/.test(r),o=r.replace(/^on[e]{0,1}/,""),i=o.toLowerCase();n&&Object.defineProperty(this,"on"+o,{configurable:!0,enumerable:!1,writable:!0,value:t=>{e.constructor.prototype[r].bind(e)(t)}}),c.has("on"+i)&&function(t,e,r,n=!1,o=!1){let i={once:!1};n&&(i.capture=n),o&&(i.once=o),t.addEventListener(e,r,i)}(t,i,(t=>{e.trigger(o,t)}),!1,n)}))}}}class b extends HTMLElement{constructor(){super()}connectedCallback(){g.trigger(this,"Connected")}disconnectedCallback(){g.trigger(this,"Disconnected")}adoptedCallback(){g.trigger(this,"Adopted")}attributeChangedCallback(t,e,r){g.trigger(this,"AttributeChanged",{name:t,oldValue:e,newValue:r})}}function h(t,e,r=[]){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 n=t.split("-").map((t=>t.charAt(0).toUpperCase()+t.slice(1))).join("");customElements.define(t,function(t,e){return Object.defineProperty(e,"name",{value:t})}(n,class extends b{instance;constructor(t){super();let r=new e(this,t);g.add(this,n,r)}static get observedAttributes(){return r}}))}function y(t){return customElements.get(t)}return e})()));