@twobirds/microcomponents 0.0.21 → 0.0.23

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 (118) 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/McEvent.d.ts +15 -0
  11. package/dist/McEvent.d.ts.map +1 -0
  12. package/dist/McEvent.ts +96 -0
  13. package/dist/autoloader.d.ts +2 -0
  14. package/dist/autoloader.d.ts.map +1 -0
  15. package/dist/autoloader.ts +98 -0
  16. package/dist/customElements.d.ts +5 -0
  17. package/dist/customElements.d.ts.map +1 -0
  18. package/dist/customElements.min.js +1 -0
  19. package/dist/customElements.ts +67 -0
  20. package/dist/customObservables.d.ts +3 -0
  21. package/dist/customObservables.d.ts.map +1 -0
  22. package/dist/customObservables.min.js +1 -0
  23. package/dist/customObservables.ts +340 -0
  24. package/dist/customSelectors.d.ts +108 -0
  25. package/dist/customSelectors.d.ts.map +1 -0
  26. package/dist/customSelectors.min.js +1 -0
  27. package/dist/customSelectors.ts +1634 -0
  28. package/dist/formValues.d.ts +4 -0
  29. package/dist/formValues.d.ts.map +1 -0
  30. package/dist/formValues.ts +275 -0
  31. package/dist/formvValues.min.js +1 -0
  32. package/dist/helpers.d.ts +11 -0
  33. package/dist/helpers.d.ts.map +1 -0
  34. package/dist/helpers.ts +173 -0
  35. package/dist/microcomponents.d.ts +7 -25
  36. package/dist/microcomponents.d.ts.map +1 -1
  37. package/dist/microcomponents.es3.d.ts +1 -20
  38. package/dist/microcomponents.es3.d.ts.map +1 -1
  39. package/dist/microcomponents.min.js +1 -38
  40. package/dist/microcomponents.ts +8 -216
  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/microcomponents.js +8 -176
  88. package/public/microcomponents.min.js +1 -0
  89. package/public/modules/MC.html +84 -0
  90. package/public/modules/MCbundle.html +133 -0
  91. package/public/modules.html +4 -4
  92. package/public/my-tag.css +4 -0
  93. package/public/test.html +5 -1
  94. package/public/test.js +100 -202
  95. package/public/types/MCbundle.selection.html +74 -0
  96. package/public/types/MCbundle.singleSelector.html +74 -0
  97. package/src/MC.ts +350 -0
  98. package/src/McEvent.ts +96 -0
  99. package/src/autoloader.ts +98 -0
  100. package/src/customElements.ts +67 -0
  101. package/src/customObservables.ts +340 -0
  102. package/src/customSelectors.ts +1634 -0
  103. package/src/formValues.ts +275 -0
  104. package/src/helpers.ts +173 -0
  105. package/src/microcomponents.es3.js +353 -82
  106. package/src/microcomponents.ts +8 -216
  107. package/src/test.js +137 -218
  108. package/tsconfig.json +2 -2
  109. package/typedoc.json +1 -1
  110. package/webpack.config.js +233 -0
  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/public/classes/microcomponents.MC.html +0 -313
  115. package/public/classes/microcomponents_es3.MC.html +0 -336
  116. package/public/functions/microcomponents_es3.__isEmpty.html +0 -60
  117. package/public/modules/microcomponents.html +0 -57
  118. package/public/modules/microcomponents_es3.html +0 -60
@@ -0,0 +1,4 @@
1
+ import { LooseObject } from './helpers.js';
2
+ import { MC } from './MC.js';
3
+ export declare const formValues: (target: HTMLElement | ShadowRoot, values?: Object, mc?: typeof MC, observable?: string) => LooseObject;
4
+ //# sourceMappingURL=formValues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formValues.d.ts","sourceRoot":"","sources":["../src/formValues.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAe,MAAM,SAAS,CAAA;AAqOzC,eAAO,MAAM,UAAU,WAAa,WAAW,GAAG,UAAU,WAAU,MAAM,OAAY,OAAO,EAAE,eAAe,MAAM,KAAI,WA0CzH,CAAA"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+
3
+ import { LooseObject } from './helpers.js'
4
+ import { MC, addListener } from './MC.js'
5
+
6
+ type inputTypes = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
7
+
8
+ const getInputName = ( e: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement ): string => {
9
+
10
+ let ret = e instanceof HTMLInputElement
11
+ ? 'input'
12
+ : e instanceof HTMLSelectElement
13
+ ? 'select'
14
+ : e instanceof HTMLTextAreaElement
15
+ ? 'textarea'
16
+ : ''
17
+ ;
18
+
19
+ return ret;
20
+ }
21
+
22
+ abstract class InputBase{
23
+ constructor( e: any ){
24
+ }
25
+
26
+ abstract get val(): any;
27
+
28
+ abstract set val( value: any );
29
+
30
+ }
31
+
32
+ const getInputHandlers = ( e: HTMLElement | ShadowRoot ): LooseObject => {
33
+
34
+ let
35
+ //inputList = ( Array.from( e.querySelectorAll('*') ) as HTMLElement[] ).filter( i => isInputElement(i) ),
36
+ inputList = [ ...( e || document).querySelectorAll('input,select,textarea') ],
37
+ handlers: LooseObject = {};
38
+
39
+ inputList.forEach( (i) => {
40
+ const
41
+ name: string = ( i as inputTypes ).getAttribute('name') || 'undefined';
42
+
43
+ if ( name ){
44
+ let h: InputBase;
45
+ switch ( getInputName( i as inputTypes ) ){
46
+ case 'input':
47
+ //console.log( i, 'is HTMLInputElement');
48
+ h = new InputHandler( i as HTMLInputElement, e ); // e = element to search radios in = radioBase
49
+ Object.defineProperty( handlers, name, {
50
+ enumerable: true,
51
+ configurable: true,
52
+ get: (): any => { return h.val },
53
+ set: ( value: any ) => { h.val = value }
54
+ });
55
+ break;
56
+ case 'select':
57
+ //console.log( i, 'is HTMLSelectElement');
58
+ h = new SelectHandler( i as HTMLSelectElement );
59
+ Object.defineProperty( handlers, name, {
60
+ enumerable: true,
61
+ configurable: true,
62
+ get: (): any => { return h.val },
63
+ set: ( value: any ) => { h.val = value }
64
+ });
65
+ break;
66
+ case 'textarea':
67
+ //console.log( i, 'is HTMLTextAreaElement');
68
+ h = new TextAreaHandler( i as HTMLTextAreaElement );
69
+ Object.defineProperty( handlers, name, {
70
+ enumerable: true,
71
+ configurable: true,
72
+ get: (): any => { return h.val },
73
+ set: ( value: any ) => { h.val = value }
74
+ });
75
+ break;
76
+ default:
77
+ console.warn('handler missing:', name, 'for', i);
78
+ break;
79
+ }
80
+ }
81
+ });
82
+
83
+ return handlers;
84
+ }
85
+
86
+ class InputHandler extends InputBase {
87
+
88
+ #e: HTMLInputElement;
89
+ #type: string;
90
+ #radioBase: any;
91
+
92
+ constructor( e: HTMLInputElement, radioBase?: HTMLElement | ShadowRoot ){
93
+ super( e );
94
+ this.#e = e;
95
+ this.#type = e.type;
96
+ this.#radioBase = radioBase;
97
+ }
98
+
99
+ get val(): any{
100
+ let that = this,
101
+ type = that.#type,
102
+ ret: any;
103
+
104
+ switch (type){
105
+ case 'radio':
106
+ const check = [ ...(this.#radioBase || document).querySelectorAll( `input[type="radio"][name="${ this.#e.getAttribute('name') }"]` ) ]
107
+ .filter( e => e.checked );
108
+ if ( !check.length ) return '';
109
+ ret = check?.[0];
110
+ return ret.value;
111
+ case 'checkbox':
112
+ return that.#e.checked;
113
+ default:
114
+ return that.#e.value;
115
+ break;
116
+ }
117
+
118
+ return '';
119
+ }
120
+
121
+ set val( value: any ){
122
+ let that = this,
123
+ type = that.#type,
124
+ ret: any;
125
+
126
+ switch (type){
127
+ case 'radio':
128
+ const
129
+ radios = [ ...(this.#radioBase || document).querySelectorAll( `input[type="radio"][name="${ this.#e.getAttribute('name') }"]` ) ];
130
+
131
+ // console.log('set radios', selection, this.#radioBase, radios.array );
132
+
133
+ if ( !radios.length ) return;
134
+
135
+ if ( value === '' ){ // uncheck all
136
+ radios.forEach( r => { if (r.checked) r.checked = false } );
137
+ //console.log('unset all radios', radios.array );
138
+ return;
139
+ }
140
+
141
+ const setRadioElement = radios.filter( r => r.getAttribute('value') === value );
142
+
143
+ if ( !setRadioElement.length ) return;
144
+
145
+ // console.log('set this radio', setRadioElement.array );
146
+
147
+ (setRadioElement?.[0] as HTMLInputElement).checked = true;
148
+
149
+ // console.log('done', setRadioElement.array );
150
+ return;
151
+ break;
152
+ case 'checkbox':
153
+ that.#e.checked = value;
154
+ break;
155
+ default:
156
+ that.#e.value = value;
157
+ break;
158
+ }
159
+
160
+ return;
161
+ }
162
+
163
+ }
164
+
165
+ class SelectHandler extends InputBase {
166
+
167
+ #e: HTMLSelectElement;
168
+ #multi: boolean = false;
169
+
170
+ constructor( e: HTMLSelectElement ){
171
+ super( e );
172
+ this.#e = e;
173
+ this.#multi = e.type === 'select-multiple';
174
+ }
175
+
176
+ get val(): string[] | string{
177
+ const
178
+ that = this,
179
+ ret: string[] = [];
180
+
181
+ // get all options
182
+ const options = [ ...that.#e.querySelectorAll('option') ]
183
+ .filter( o => o.selected )
184
+ .forEach( o => { if ( o.selected ) ret.push( o.value ) } );
185
+
186
+ if ( this.#multi ) return ret;
187
+ return ret.length ? ret[0] : '';
188
+ }
189
+
190
+ set val( value: string[] | string ){
191
+ const
192
+ that = this;
193
+
194
+ value = typeof value === 'string' ? [ value ] : value;
195
+
196
+ //console.log('set values', value );
197
+
198
+ // set all options
199
+ const options = [ ...that.#e.querySelectorAll('option') ]
200
+ .forEach( o => {
201
+ if ( value.indexOf( o.value ) > -1 ) {
202
+ o.setAttribute( 'selected', 'selected' )
203
+ o.selected = true;
204
+ } else {
205
+ o.removeAttribute( 'selected' )
206
+ o.selected = false;
207
+ }
208
+ });
209
+
210
+ return;
211
+ }
212
+
213
+ }
214
+
215
+ class TextAreaHandler extends InputBase {
216
+ #e: HTMLTextAreaElement
217
+ constructor( e: HTMLTextAreaElement ){
218
+ super(e);
219
+ this.#e = e;
220
+ }
221
+
222
+ get val(): string{
223
+ return this.#e.value;
224
+ }
225
+
226
+ set val( value: string ){
227
+ this.#e.value = value;
228
+ return;
229
+ }
230
+
231
+ }
232
+
233
+ export const formValues = ( target: HTMLElement | ShadowRoot, values: Object = {}, mc?: typeof MC, observable?: string ): LooseObject => {
234
+
235
+ //console.log( 'values(', target, ',', values, ',', observable, ')' );
236
+
237
+ //console.log( 'values()', values );
238
+ let handlers = getInputHandlers( target );
239
+
240
+ function updateForm( values: Object ){
241
+ Object
242
+ .keys( values )
243
+ .forEach( (key) => {
244
+ if ( handlers.hasOwnProperty(key) && values.hasOwnProperty(key) ) {
245
+ //console.log( 'set value', key, values[key] );
246
+ handlers[key] = (values as LooseObject)[key];
247
+ }
248
+ });
249
+ }
250
+
251
+ if ( Object.keys(values).length > 0 ){
252
+ updateForm( values );
253
+ }
254
+
255
+ //console.log( 'set observable on form change', observable );
256
+ if ( observable !== undefined ){
257
+ let obs = ( mc as LooseObject )[observable];
258
+ if ( !obs.constructor?.hasFormHandler ){
259
+ obs.constructor.hasFormHandler = true;
260
+ obs.observe( updateForm );
261
+ }
262
+
263
+ ( mc as any)[observable].observe( () => { } );
264
+
265
+ [ ...target.querySelectorAll('input, textarea, select') ].forEach( ( e ) => {
266
+ addListener( (e as HTMLElement), 'keyup', () => { ( mc as any)[observable] = structuredClone( Object.assign( handlers ) ) } );
267
+ addListener( (e as HTMLElement), 'change', () => { ( mc as any)[observable] = structuredClone( Object.assign( handlers ) ) } );
268
+ if ( (e as HTMLElement) instanceof HTMLSelectElement ){
269
+ addListener( (e as HTMLElement), 'select', () => { ( mc as any)[observable] = structuredClone( Object.assign( handlers ) ) } );
270
+ };
271
+ });
272
+ }
273
+
274
+ return observable ? ( mc as any)[observable] : Object.assign( {}, handlers );
275
+ }
@@ -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.formValues=t():e.formValues=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={};e.r(t),e.d(t,{formValues:()=>d});var r=new Function("try {return this===window;}catch(e){ return false;}");let n=new Set;r()&&Object.keys(HTMLElement.prototype).filter((e=>/^on/.test(e))).forEach((e=>n.add(e)));var o=new Function("try {return this===window;}catch(e){ return false;}");let s=new Set;function c(e,t,r,n=!1,o=!1){let s={once:!1};n&&(s.capture=n),o&&(s.once=o),e.addEventListener(t,r,s)}o()&&Object.keys(HTMLElement.prototype).filter((e=>/^on/.test(e))).forEach((e=>s.add(e)));class l{constructor(e){}}class a extends l{#e;#t;#r;constructor(e,t){super(e),this.#e=e,this.#t=e.type,this.#r=t}get val(){let e,t=this;switch(t.#t){case"radio":const r=[...(this.#r||document).querySelectorAll(`input[type="radio"][name="${this.#e.getAttribute("name")}"]`)].filter((e=>e.checked));return r.length?(e=r?.[0],e.value):"";case"checkbox":return t.#e.checked;default:return t.#e.value}return""}set val(e){let t=this;switch(t.#t){case"radio":const r=[...(this.#r||document).querySelectorAll(`input[type="radio"][name="${this.#e.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.#e.checked=e;break;default:t.#e.value=e}}}class i extends l{#e;#n=!1;constructor(e){super(e),this.#e=e,this.#n="select-multiple"===e.type}get val(){const e=[];return[...this.#e.querySelectorAll("option")].filter((e=>e.selected)).forEach((t=>{t.selected&&e.push(t.value)})),this.#n?e:e.length?e[0]:""}set val(e){e="string"==typeof e?[e]:e,[...this.#e.querySelectorAll("option")].forEach((t=>{e.indexOf(t.value)>-1?(t.setAttribute("selected","selected"),t.selected=!0):(t.removeAttribute("selected"),t.selected=!1)}))}}class u extends l{#e;constructor(e){super(e),this.#e=e}get val(){return this.#e.value}set val(e){this.#e.value=e}}const d=(e,t={},r,n)=>{let o=(e=>{let t=[...(e||document).querySelectorAll("input,select,textarea")],r={};return t.forEach((t=>{const n=t.getAttribute("name")||"undefined";if(n){let o;switch((e=>e instanceof HTMLInputElement?"input":e instanceof HTMLSelectElement?"select":e instanceof HTMLTextAreaElement?"textarea":"")(t)){case"input":o=new a(t,e),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>o.val,set:e=>{o.val=e}});break;case"select":o=new i(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>o.val,set:e=>{o.val=e}});break;case"textarea":o=new u(t),Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:()=>o.val,set:e=>{o.val=e}});break;default:console.warn("handler missing:",n,"for",t)}}})),r})(e);function s(e){Object.keys(e).forEach((t=>{o.hasOwnProperty(t)&&e.hasOwnProperty(t)&&(o[t]=e[t])}))}if(Object.keys(t).length>0&&s(t),void 0!==n){let t=r[n];t.constructor?.hasFormHandler||(t.constructor.hasFormHandler=!0,t.observe(s)),r[n].observe((()=>{})),[...e.querySelectorAll("input, textarea, select")].forEach((e=>{c(e,"keyup",(()=>{r[n]=structuredClone(Object.assign(o))})),c(e,"change",(()=>{r[n]=structuredClone(Object.assign(o))})),e instanceof HTMLSelectElement&&c(e,"select",(()=>{r[n]=structuredClone(Object.assign(o))}))}))}return n?r[n]:Object.assign({},o)};return t})()));
@@ -0,0 +1,11 @@
1
+ export declare function isObject(value: any): boolean;
2
+ export interface LooseObject {
3
+ [key: string | symbol]: any;
4
+ }
5
+ export declare function kebabToPascal(str: string): string;
6
+ export declare function debounce(func: Function, milliseconds: number): Function;
7
+ export declare function deepEqual(o1: any, o2: any): boolean;
8
+ export declare function nameSpace(ns: string, obj: LooseObject, val?: any, orig?: any): any;
9
+ export declare function parse(what: string | Object | any[], parseThis: Object): any;
10
+ export declare function htmlToElements(html: string): HTMLElement[];
11
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAE,KAAK,EAAE,GAAG,GAAI,OAAO,CAE9C;AAED,MAAM,WAAW,WAAW;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,UAKxC;AAED,wBAAgB,QAAQ,CAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAI,QAAQ,CAazE;AAED,wBAAgB,SAAS,CAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAC,GAAG,GAAG,OAAO,CAoBnD;AAED,wBAAgB,SAAS,CAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAE,GAAU,EAAE,IAAI,CAAC,EAAE,GAAG,GAAI,GAAG,CA2C1F;AAED,wBAAgB,KAAK,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,OA4DtE;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAE,MAAM,GAAI,WAAW,EAAE,CAW5D"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+
3
+ export function isObject( value: any ): boolean {
4
+ return value != null && typeof value === 'object';
5
+ }
6
+
7
+ export interface LooseObject {
8
+ [key: string | symbol]: any;
9
+ }
10
+
11
+ export function kebabToPascal(str: string) {
12
+ return str
13
+ .split('-') // Split by hyphens
14
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1)) // Capitalize each part
15
+ .join(''); // Join without spaces
16
+ }
17
+
18
+ export function debounce( func: Function, milliseconds: number ): Function {
19
+ let timeout: any;
20
+ return () => {
21
+
22
+ clearTimeout( timeout );
23
+
24
+ timeout = setTimeout(
25
+ function(){
26
+ func( ...arguments );
27
+ },
28
+ milliseconds
29
+ );
30
+ };
31
+ };
32
+
33
+ export function deepEqual( o1: any, o2:any): boolean {
34
+ const k1 = Object.keys(o1);
35
+ const k2 = Object.keys(o2);
36
+ if (k1.length !== k2.length) {
37
+ return false;
38
+ }
39
+ for (const key of k1) {
40
+ const
41
+ v1 = o1[key],
42
+ v2 = o2[key],
43
+ recurse = isObject(v1) && isObject(v2);
44
+ ;
45
+ if (
46
+ ( recurse && !deepEqual(v1, v2) )
47
+ || (!recurse && v1 !== v2)
48
+ ) {
49
+ return false;
50
+ }
51
+ }
52
+ return true;
53
+ }
54
+
55
+ export function nameSpace( ns: string, obj: LooseObject, val: any = null, orig?: any ): any {
56
+ let leftOver: Array<any> = ns.split('.');
57
+
58
+ if ( !orig ){
59
+ orig = obj;
60
+ }
61
+
62
+ // console.log( 'start', ns, obj, val, leftOver );
63
+
64
+ let
65
+ last: string = leftOver.shift(), // this property name
66
+ lns: string = leftOver.join('.') // the leftover namespace
67
+ ;
68
+
69
+ if ( val !== null && last.length && obj[last] === undefined ){ // extend if val given and ns leftover...
70
+ // console.log( 'add prop', last );
71
+ obj[last] = {};
72
+ }
73
+
74
+ let
75
+ lob: any = obj[last] // the leftover value or obj
76
+ ;
77
+
78
+ // console.log( 'lob', lob, 'last:', last, 'lns:', lns, 'obj:', obj );
79
+
80
+ if ( lns.length === 0 ){ // this should be the value to set or get
81
+ if ( val !== null ){
82
+ obj[last] = val;
83
+ return orig;
84
+ }
85
+ return obj[last];
86
+ }
87
+
88
+ if ( isObject( obj[last] ) ){
89
+ return nameSpace( lns, obj[last], val, orig );
90
+ } else {
91
+ if (val){
92
+ return orig;
93
+ }
94
+
95
+ return lob[last];
96
+ }
97
+
98
+ }
99
+
100
+ export function parse( what: string | Object | any[], parseThis: Object ){
101
+ var args = Array.from(arguments);
102
+
103
+ if (!args.length){
104
+ console.error('no arguments give to parse');
105
+ return;
106
+ }
107
+
108
+ if (args.length === 1){
109
+ return args[1];
110
+ } else if (args.length > 2) {
111
+ while (args.length > 1){
112
+ args[0] = parse( args[0], args[1]);
113
+ args.splice(1, 1);
114
+ }
115
+ return args[0];
116
+ }
117
+
118
+ // implicit else: exactly 2 arguments
119
+ if ( typeof what === 'string' ){
120
+ var vars = what.match( /\{[^\{\}]*\}/g );
121
+
122
+ if ( !!vars ) {
123
+ vars
124
+ .forEach(
125
+ function (pPropname) {
126
+ var propname = pPropname.substr(1, pPropname.length - 2),
127
+ value = nameSpace( propname, parseThis );
128
+
129
+ if ( typeof value !== 'undefined' ){
130
+ what = (what as string).replace( pPropname, value );
131
+ }
132
+ }
133
+ );
134
+ }
135
+ } else if ( isObject(what) ){
136
+ switch ( what.constructor ){
137
+ case Object:
138
+ Object
139
+ .keys( what )
140
+ .forEach(
141
+ function( pKey ){
142
+ if ( what.hasOwnProperty( pKey ) ){
143
+ ( what as LooseObject )[ pKey ] = parse( ( what as LooseObject )[ pKey ], parseThis );
144
+ }
145
+ }
146
+ );
147
+ break;
148
+ case Array:
149
+ ( what as Array<any> )
150
+ .forEach(
151
+ function( pValue, pKey, original ){
152
+ original[ pKey ] = parse( (what as any)[ pKey ], parseThis );
153
+ }
154
+ );
155
+ break;
156
+ }
157
+ }
158
+
159
+ return what;
160
+ };
161
+
162
+ export function htmlToElements( html: string ): HTMLElement[]{
163
+ let template = document.createElement('template');
164
+
165
+ html = html
166
+ .replace( /<([A-Za-z0-9\-]*)([^>\/]*)(\/>)/gi, "<$1$2></$1>"); // replace XHTML closing tags by full closing tags
167
+
168
+ template.innerHTML = html;
169
+
170
+ template.content.normalize();
171
+
172
+ return ( Array.from(template.content.childNodes) as HTMLElement[] );
173
+ }
@@ -1,26 +1,8 @@
1
- type HTMLElementMC = HTMLElement & {
2
- _mc: {
3
- [key: string]: any;
4
- };
5
- };
6
- export declare class MC {
7
- #private;
8
- static debug: boolean;
9
- constructor(target: {
10
- [key: string]: any;
11
- });
12
- get _mc(): undefined | any;
13
- get target(): any;
14
- static siblings(target: HTMLElementMC, search?: string): any[];
15
- static add(target: HTMLElement, key: string, element?: {}): any;
16
- static remove(target: HTMLElementMC, key: string): void;
17
- add(key: string, element: any, target?: HTMLElement): any;
18
- remove(key: string, target?: HTMLElement): void;
19
- siblings(search?: string): any[];
20
- parent(search?: string): any[];
21
- parents(search?: string): any[];
22
- children(search?: string): any[];
23
- descendants(search?: string): any[];
24
- }
25
- export {};
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';
26
8
  //# sourceMappingURL=microcomponents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"microcomponents.d.ts","sourceRoot":"","sources":["../src/microcomponents.ts"],"names":[],"mappings":"AAiDA,KAAK,aAAa,GAAG,WAAW,GAAG;IAAE,GAAG,EAAE;QAAE,CAAC,GAAG,EAAC,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;CAAE,CAAA;AAEjE,qBAAa,EAAE;;IAMd,MAAM,CAAC,KAAK,EAAE,OAAO,CAAS;gBAEjB,MAAM,EAAE;QAAE,CAAC,GAAG,EAAC,MAAM,GAAG,GAAG,CAAA;KAAE;IAK1C,IAAI,GAAG,IAAI,SAAS,GAAG,GAAG,CAGzB;IAED,IAAI,MAAM,IAAI,GAAG,CAEhB;IAGD,MAAM,CAAC,QAAQ,CAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;IAiBpE,MAAM,CAAC,GAAG,CAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,GAAI,GAAG;IAuBjE,MAAM,CAAC,MAAM,CAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM;IAkBjD,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,WAAW,GAAI,GAAG;IAgB3D,MAAM,CAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAI,IAAI;IAiBjD,QAAQ,CAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;IAetC,MAAM,CAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;IAOpC,OAAO,CAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;IAOrC,QAAQ,CAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;IActC,WAAW,CAAE,MAAM,GAAE,MAAW,GAAI,GAAG,EAAE;CAOzC"}
1
+ {"version":3,"file":"microcomponents.d.ts","sourceRoot":"","sources":["../src/microcomponents.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"}
@@ -1,21 +1,2 @@
1
- declare function __isEmpty(obj: any): boolean;
2
- declare function MC(target: any): void;
3
- declare class MC {
4
- static add(target: any, key: any, element?: {}): {};
5
- static remove(target: any, key: any): void;
6
- static debug: boolean;
7
- static siblings(target: any, search?: string): any;
8
- constructor(target: any);
9
- constructor(target: any);
10
- _target: any;
11
- siblings(search: any): any[];
12
- parent(search: any): any;
13
- parents(search: any): any[];
14
- children(search: any): any[];
15
- descendants(search: any): any[];
16
- }
17
- declare namespace MC {
18
- function add(domElement: any, key: any, element: any): typeof MC;
19
- function remove(domElement: any, key: any): typeof MC;
20
- }
1
+ declare function findNodesWithMcAttribute(rootNode: any, childrenOnly: any): any[];
21
2
  //# sourceMappingURL=microcomponents.es3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"microcomponents.es3.d.ts","sourceRoot":"","sources":["../src/microcomponents.es3.js"],"names":[],"mappings":"AAEA,8CAQC;AAED,uCAEC;;;;;;;IAFD,yBAEC;IADA,aAAqB;IAqBtB,6BAcC;IAED,yBAUC;IAED,4BAUC;IAED,6BAeC;IAED,gCAcC;;;IAxFD,iEAMC;IAED,sDAMC"}
1
+ {"version":3,"file":"microcomponents.es3.d.ts","sourceRoot":"","sources":["../src/microcomponents.es3.js"],"names":[],"mappings":"AAgWA,mFAwBC"}
@@ -1,38 +1 @@
1
- 'use strict';function getMicroComponents(elements,search){let mcValues=[];elements.forEach(e=>{if(e){if(e instanceof HTMLElement){const _mc=e?._mc;if(!search&&_mc){mcValues=mcValues.concat(Object.values(e._mc));}
2
- else if(search&&_mc&&_mc[search]){mcValues.push(_mc[search]);}}}});return mcValues;}
3
- function traverseNodes(node,search,firstonly=true){let mcValues=[];while(node){if(node._mc){if(!search){mcValues=mcValues.concat(Object.values(node._mc));}
4
- else if(search&&node._mc[search]){mcValues.push(node._mc[search]);}
5
- if(firstonly)
6
- return mcValues;}
7
- node=node.parentNode;}
8
- return mcValues;}
9
- function isDOM(element){return element&&element instanceof HTMLElement;}
10
- export class MC{#target={};#_mc={};static debug=false;constructor(target){this.#target=target;this.#_mc={};}
11
- get _mc(){if(!MC.debug)
12
- return undefined;return this.#_mc;}
13
- get target(){return this.#target;}
14
- static siblings(target,search=''){const mc=target;if(!mc._mc){return[];}
15
- const _mc=mc._mc;if(search.length){return _mc?.[search]||[];}
16
- return[...Object.values(_mc)];}
17
- static add(target,key,element={}){let node=target;if(!node._mc){node._mc=new MC(target);}
18
- const _mc=node._mc;if(key.length&&!_mc[key]){_mc[key]=element;if(target instanceof HTMLElement){target.setAttribute('_mc','');}}
19
- return element;}
20
- static remove(target,key){if(!key)
21
- return;const _mc=target?._mc||{};if(_mc&&_mc[key]){delete _mc[key];}
22
- if(!Object.keys(_mc).length&&target instanceof HTMLElement&&target.hasAttribute('_mc')){target.removeAttribute('_mc');}
23
- return;}
24
- add(key,element,target){if(this.#_mc[key])
25
- return;if(target){MC.add(target,key,element);}
26
- this.#_mc[key]=element;return element;}
27
- remove(key,target){const _mc=this.#_mc;const t=target;if(target){MC.remove(t,key);}
28
- delete _mc?.[key];}
29
- siblings(search=''){const _mc=this.#_mc;if(!_mc)
30
- return[];const result=_mc[search||''];return search&&result?[result]:[...Object.values(_mc)];}
31
- parent(search=''){if(!isDOM(this.#target))
32
- return[];return traverseNodes(this.#target.parentNode,search,true);}
33
- parents(search=''){if(!isDOM(this.#target))
34
- return[];return traverseNodes(this.#target.parentNode,search,false);}
35
- children(search=''){if(!isDOM(this.#target))
36
- return[];const id=Math.random().toString().replace('.','');const selector='[_mc]:not([temp_id="'+id+'"] [_mc] [_mc])';this.#target.setAttribute('temp_id',id);const myDomElements=this.#target.querySelectorAll(selector);const mcValues=getMicroComponents([...myDomElements],search);this.#target.removeAttribute('temp_id');return mcValues;}
37
- descendants(search=''){if(!isDOM(this.#target))
38
- return[];const myDomElements=this.#target.querySelectorAll('*[_mc]');return getMicroComponents([...myDomElements],search);}}
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.microcomponents=t():e.microcomponents=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:()=>b,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 m(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 y(e){return e&&e instanceof HTMLElement}function b(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 y(t)?m(t.parentNode,e,!0):[]}ancestors(e=""){let t=this?.target;return y(t)?m(this.target.parentNode,e,!1):[]}children(e=""){let t=this?.target;if(!y(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 y(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)&&b(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){b(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){b(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){b(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){b(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=>{b(e,"keyup",(()=>{r[n]=structuredClone(Object.assign(s))})),b(e,"change",(()=>{r[n]=structuredClone(Object.assign(s))})),e instanceof HTMLSelectElement&&b(e,"select",(()=>{r[n]=structuredClone(Object.assign(s))}))}))}return n?r[n]:Object.assign({},s)};return t})()));