@twobirds/microcomponents 0.0.66 → 0.0.68

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 (202) hide show
  1. package/.vscode/settings.json +1 -1
  2. package/README.md +11 -7
  3. package/assets/documentation/formvalues.md +26 -0
  4. package/assets/{test.html → test/test.html} +7 -7
  5. package/dist/microcomponents.d.ts +0 -1
  6. package/dist/microcomponents.d.ts.map +1 -1
  7. package/dist/microcomponents.min.js +1 -1
  8. package/dist/microcomponents.ts +1 -1
  9. package/package.json +5 -4
  10. package/public/MC.d.ts +36 -0
  11. package/public/MC.d.ts.map +1 -0
  12. package/public/MC.ts +605 -0
  13. package/public/McEvent.d.ts +15 -0
  14. package/public/McEvent.d.ts.map +1 -0
  15. package/public/McEvent.ts +96 -0
  16. package/public/MicroComponents.svg +15 -0
  17. package/public/documentation/MC.md +588 -0
  18. package/public/documentation/ajaxian-1.png +0 -0
  19. package/public/documentation/ajaxian-2.png +0 -0
  20. package/public/documentation/ajaxian-3.png +0 -0
  21. package/public/documentation/elements.md +278 -0
  22. package/public/documentation/formvalues.md +26 -0
  23. package/public/documentation/functional_requirements.md +8 -0
  24. package/public/documentation/history.md +436 -0
  25. package/public/documentation/magic.md +29 -0
  26. package/public/documentation/observables.md +107 -0
  27. package/public/documentation/rnd0023-1.jpg +0 -0
  28. package/public/documentation/rnd0023-2.jpg +0 -0
  29. package/public/documentation/rnd0023-3.jpg +0 -0
  30. package/public/documentation/tB_react.md +207 -0
  31. package/public/documentation/usage.md +142 -0
  32. package/public/documentation/why.md +25 -0
  33. package/public/elements.d.ts +5 -0
  34. package/public/elements.d.ts.map +1 -0
  35. package/public/elements.ts +76 -0
  36. package/public/fiddle/MicroComponents.svg +15 -0
  37. package/public/fiddle/fiddle.css +0 -0
  38. package/public/fiddle/fiddle.js +0 -0
  39. package/public/fiddle/index.html +0 -0
  40. package/public/formValues.d.ts +3 -0
  41. package/public/formValues.d.ts.map +1 -0
  42. package/public/formValues.ts +233 -0
  43. package/public/helpers.d.ts +14 -0
  44. package/public/helpers.d.ts.map +1 -0
  45. package/public/helpers.ts +149 -0
  46. package/public/microcomponents.d.ts +7 -0
  47. package/public/microcomponents.d.ts.map +1 -0
  48. package/public/microcomponents.es3.d.ts +2 -0
  49. package/public/microcomponents.es3.d.ts.map +1 -0
  50. package/public/microcomponents.js +0 -1
  51. package/public/microcomponents.js.map +1 -1
  52. package/public/microcomponents.min.js +1 -1
  53. package/public/microcomponents.ts +8 -0
  54. package/public/observables.d.ts +10 -0
  55. package/public/observables.d.ts.map +1 -0
  56. package/public/observables.ts +401 -0
  57. package/public/selectors.d.ts +108 -0
  58. package/public/selectors.d.ts.map +1 -0
  59. package/public/selectors.ts +1634 -0
  60. package/public/src/MC.ts +605 -0
  61. package/public/src/McEvent.ts +96 -0
  62. package/public/src/elements.ts +76 -0
  63. package/public/src/formValues.ts +233 -0
  64. package/public/src/helpers.ts +149 -0
  65. package/public/src/microcomponents.ts +8 -0
  66. package/public/src/observables.ts +401 -0
  67. package/public/src/selectors.ts +1634 -0
  68. package/public/src/test.ts +193 -0
  69. package/public/test/MC.d.ts +36 -0
  70. package/public/test/MC.d.ts.map +1 -0
  71. package/public/test/MC.js +378 -0
  72. package/public/test/MC.js.map +1 -0
  73. package/public/test/MC.ts +605 -0
  74. package/public/test/McEvent.d.ts +15 -0
  75. package/public/test/McEvent.d.ts.map +1 -0
  76. package/public/test/McEvent.js +71 -0
  77. package/public/test/McEvent.js.map +1 -0
  78. package/public/test/McEvent.ts +96 -0
  79. package/public/test/MicroComponents.svg +15 -0
  80. package/public/test/elements.d.ts +5 -0
  81. package/public/test/elements.d.ts.map +1 -0
  82. package/public/test/elements.js +48 -0
  83. package/public/test/elements.js.map +1 -0
  84. package/public/test/elements.ts +76 -0
  85. package/public/test/formValues.d.ts +3 -0
  86. package/public/test/formValues.d.ts.map +1 -0
  87. package/public/test/formValues.js +168 -0
  88. package/public/test/formValues.js.map +1 -0
  89. package/public/test/formValues.ts +233 -0
  90. package/public/test/grandparent.css +13 -0
  91. package/public/test/helpers.d.ts +14 -0
  92. package/public/test/helpers.d.ts.map +1 -0
  93. package/public/test/helpers.js +113 -0
  94. package/public/test/helpers.js.map +1 -0
  95. package/public/test/helpers.ts +149 -0
  96. package/public/test/microcomponents.d.ts +7 -0
  97. package/public/test/microcomponents.d.ts.map +1 -0
  98. package/public/test/microcomponents.es3.d.ts +2 -0
  99. package/public/test/microcomponents.es3.d.ts.map +1 -0
  100. package/public/test/microcomponents.es3.js +303 -0
  101. package/public/test/microcomponents.es3.js.map +1 -0
  102. package/public/test/microcomponents.js +8 -0
  103. package/public/test/microcomponents.js.map +1 -0
  104. package/public/test/microcomponents.min.js +1 -0
  105. package/public/test/microcomponents.ts +8 -0
  106. package/public/test/my-tag.css +19 -0
  107. package/public/test/observables.d.ts +10 -0
  108. package/public/test/observables.d.ts.map +1 -0
  109. package/public/test/observables.js +250 -0
  110. package/public/test/observables.js.map +1 -0
  111. package/public/test/observables.ts +401 -0
  112. package/public/test/selectors.d.ts +108 -0
  113. package/public/test/selectors.d.ts.map +1 -0
  114. package/public/test/selectors.js +971 -0
  115. package/public/test/selectors.js.map +1 -0
  116. package/public/test/selectors.ts +1634 -0
  117. package/public/test/test/child.d.ts +2 -0
  118. package/public/test/test/child.d.ts.map +1 -0
  119. package/public/test/test/child.js +15 -0
  120. package/public/test/test/child.js.map +1 -0
  121. package/public/test/test/grandchild.d.ts +2 -0
  122. package/public/test/test/grandchild.d.ts.map +1 -0
  123. package/public/test/test/grandchild.js +15 -0
  124. package/public/test/test/grandchild.js.map +1 -0
  125. package/public/test/test/grandparent.d.ts +2 -0
  126. package/public/test/test/grandparent.d.ts.map +1 -0
  127. package/public/test/test/grandparent.js +1 -0
  128. package/public/test/test/grandparent.js.map +1 -0
  129. package/public/test/test/greatgrandchild.d.ts +2 -0
  130. package/public/test/test/greatgrandchild.d.ts.map +1 -0
  131. package/public/test/test/greatgrandchild.js +29 -0
  132. package/public/test/test/greatgrandchild.js.map +1 -0
  133. package/public/test/test/parent.d.ts +2 -0
  134. package/public/test/test/parent.d.ts.map +1 -0
  135. package/public/test/test/parent.js +15 -0
  136. package/public/test/test/parent.js.map +1 -0
  137. package/public/test/test/testform.d.ts +2 -0
  138. package/public/test/test/testform.d.ts.map +1 -0
  139. package/public/test/test/testform.js +1 -0
  140. package/public/test/test/testform.js.map +1 -0
  141. package/public/test/test/testmc.d.ts +6 -0
  142. package/public/test/test/testmc.d.ts.map +1 -0
  143. package/public/test/test/testmc.js +10 -0
  144. package/public/test/test/testmc.js.map +1 -0
  145. package/public/test/test.d.ts +2 -0
  146. package/public/test/test.d.ts.map +1 -0
  147. package/public/test/test.html +27 -0
  148. package/public/test/test.ts +193 -0
  149. package/public/typedoc/.nojekyll +1 -0
  150. package/public/{classes → typedoc/classes}/MC.DC.html +2 -2
  151. package/public/{classes → typedoc/classes}/MC.MC.html +2 -2
  152. package/public/{classes → typedoc/classes}/MC.McBase.html +2 -2
  153. package/public/{classes → typedoc/classes}/MC.McEvent.html +2 -2
  154. package/public/{functions → typedoc/functions}/MC.addListener.html +1 -1
  155. package/public/{functions → typedoc/functions}/MC.autoload.html +1 -1
  156. package/public/{functions → typedoc/functions}/MC.removeListener.html +1 -1
  157. package/public/{functions → typedoc/functions}/elements.defineCE.html +1 -1
  158. package/public/{functions → typedoc/functions}/elements.getCE.html +1 -1
  159. package/public/{functions → typedoc/functions}/formValues.formValues.html +1 -1
  160. package/public/{functions → typedoc/functions}/observables.observe.html +1 -1
  161. package/public/{functions → typedoc/functions}/selectors._d.html +1 -1
  162. package/public/{functions → typedoc/functions}/selectors._t.html +1 -1
  163. package/public/{index.html → typedoc/index.html} +9 -7
  164. package/public/{interfaces → typedoc/interfaces}/MC.HTMLMcElement.html +2 -2
  165. package/public/{interfaces → typedoc/interfaces}/selectors.DSelector.html +2 -2
  166. package/public/{interfaces → typedoc/interfaces}/selectors.TSelector.html +2 -2
  167. package/public/typedoc/media/MicroComponents.svg +15 -0
  168. package/public/{modules → typedoc/modules}/MC.html +1 -1
  169. package/public/{modules → typedoc/modules}/elements.html +1 -1
  170. package/public/{modules → typedoc/modules}/formValues.html +1 -1
  171. package/public/{modules → typedoc/modules}/observables.html +1 -1
  172. package/public/{modules → typedoc/modules}/selectors.html +1 -1
  173. package/public/{types → typedoc/types}/observables.Observable.html +1 -1
  174. package/public/{types → typedoc/types}/selectors.selection.html +1 -1
  175. package/public/{types → typedoc/types}/selectors.singleSelector.html +1 -1
  176. package/src/microcomponents.ts +1 -1
  177. package/src/test/{child.ts → test/child.ts} +1 -1
  178. package/src/test/{grandchild.ts → test/grandchild.ts} +1 -1
  179. package/src/test/{grandparent.ts → test/grandparent.ts} +1 -1
  180. package/src/test/{greatgrandchild.ts → test/greatgrandchild.ts} +1 -1
  181. package/src/test/{parent.ts → test/parent.ts} +1 -1
  182. package/src/test/{testform.ts → test/testform.ts} +1 -1
  183. package/src/test/test/testmc.ts +12 -0
  184. package/tsconfig.json +2 -2
  185. package/typedoc.json +1 -1
  186. package/webpack.config.js +4 -4
  187. package/assets/3d.html +0 -42
  188. package/src/test/testmc.ts +0 -18
  189. /package/{public/media → assets/test}/MicroComponents.svg +0 -0
  190. /package/assets/{grandparent.css → test/grandparent.css} +0 -0
  191. /package/assets/{my-tag.css → test/my-tag.css} +0 -0
  192. /package/public/{test.js → test/test.js} +0 -0
  193. /package/public/{test.js.map → test/test.js.map} +0 -0
  194. /package/public/{assets → typedoc/assets}/highlight.css +0 -0
  195. /package/public/{assets → typedoc/assets}/icons.js +0 -0
  196. /package/public/{assets → typedoc/assets}/icons.svg +0 -0
  197. /package/public/{assets → typedoc/assets}/main.js +0 -0
  198. /package/public/{assets → typedoc/assets}/navigation.js +0 -0
  199. /package/public/{assets → typedoc/assets}/search.js +0 -0
  200. /package/public/{assets → typedoc/assets}/style.css +0 -0
  201. /package/public/{hierarchy.html → typedoc/hierarchy.html} +0 -0
  202. /package/public/{modules.html → typedoc/modules.html} +0 -0
@@ -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,15 @@
1
+ <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
2
+ <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
3
+ <title>test</title>
4
+ <rect fill="transparent" x="0" y="0" width="200" height="200" fill-opacity="1"/>
5
+ <g style="fill:transparent">
6
+ <title>first bird</title>
7
+ <path fill="#18829c" d="
8
+ m15,160
9
+ a30,75 45 1 0 160,-150
10
+ a20,50 225 1 1 -110,100
11
+ a12,25 45 1 1 60,-50
12
+ a20,50 225 1 0 -110,100
13
+ " />
14
+ </g>
15
+ </svg>
@@ -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=elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAkCA,wBAAgB,QAAQ,CACvB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,EAC9C,kBAAkB,GAAE,MAAM,EAAO,QAkCjC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAE3E"}
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+ import { DC } from './MC.js';
3
+ import { kebabToPascal } from './helpers.js';
4
+ class CeBaseClass extends HTMLElement {
5
+ constructor() {
6
+ super();
7
+ }
8
+ connectedCallback() {
9
+ DC.trigger(this, 'Connected');
10
+ }
11
+ disconnectedCallback() {
12
+ DC.trigger(this, 'Disconnected');
13
+ }
14
+ adoptedCallback() {
15
+ DC.trigger(this, 'Adopted');
16
+ }
17
+ attributeChangedCallback(name, oldValue, newValue) {
18
+ DC.trigger(this, 'AttributeChanged', { name, oldValue, newValue });
19
+ }
20
+ }
21
+ function createNamedClass(name, ClassBody) {
22
+ return Object.defineProperty(ClassBody, 'name', { value: name });
23
+ }
24
+ export function defineCE(tagName, DefinitionClass, observedAttributes = []) {
25
+ if (customElements.get(tagName)) {
26
+ console.warn(`IGNORED: Custom element "${tagName}" is already defined!`);
27
+ return;
28
+ }
29
+ if (!tagName.includes('-')) {
30
+ throw new Error('createCustomElement: tagName must contain at least one hyphen ("-").');
31
+ }
32
+ let name = kebabToPascal(tagName);
33
+ customElements.define(tagName, createNamedClass(name, class extends CeBaseClass {
34
+ instance;
35
+ constructor(data) {
36
+ super();
37
+ let instance = new DefinitionClass(this, data);
38
+ DC.add(this, name, instance);
39
+ }
40
+ static get observedAttributes() {
41
+ return observedAttributes;
42
+ }
43
+ }));
44
+ }
45
+ export function getCE(tagName) {
46
+ return customElements.get(tagName);
47
+ }
48
+ //# sourceMappingURL=elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAY,SAAQ,WAAW;IACpC;QACC,KAAK,EAAE,CAAC;IACT,CAAC;IAED,iBAAiB;QACf,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB;QAClB,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe;QACb,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,wBAAwB,CAAC,IAAY,EAAE,QAAa,EAAE,QAAa;QACjE,EAAU,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;CACD;AAED,SAAS,gBAAgB,CACxB,IAAY,EACZ,SAAwC;IAExC,OAAO,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,OAAe,EACf,eAA8C,EAC9C,qBAA+B,EAAE;IAEjC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,uBAAuB,CAAC,CAAC;QACzE,OAAO;IACR,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,sEAAsE,CACtE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAElC,cAAc,CAAC,MAAM,CACpB,OAAO,EACP,gBAAgB,CACf,IAAI,EACJ,KAAM,SAAQ,WAAW;QACxB,QAAQ,CAAM;QAEd,YAAY,IAAU;YACrB,KAAK,EAAE,CAAC;YACR,IAAI,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,kBAAkB;YAC5B,OAAO,kBAAkB,CAAC;QAC3B,CAAC;KACD,CACD,CACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACpC,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ import { DC } from './MC.js';
4
+ import { kebabToPascal } from './helpers.js';
5
+
6
+ class CeBaseClass extends HTMLElement {
7
+ constructor() {
8
+ super();
9
+ }
10
+
11
+ connectedCallback() {
12
+ (DC as any).trigger(this, 'Connected');
13
+ }
14
+
15
+ disconnectedCallback() {
16
+ (DC as any).trigger(this, 'Disconnected');
17
+ }
18
+
19
+ adoptedCallback() {
20
+ (DC as any).trigger(this, 'Adopted');
21
+ }
22
+
23
+ attributeChangedCallback(name: string, oldValue: any, newValue: any) {
24
+ (DC as any).trigger(this, 'AttributeChanged', { name, oldValue, newValue });
25
+ }
26
+ }
27
+
28
+ function createNamedClass(
29
+ name: string,
30
+ ClassBody: { new (...args: any[]): any }
31
+ ) {
32
+ return Object.defineProperty(ClassBody, 'name', { value: name });
33
+ }
34
+
35
+ export function defineCE(
36
+ tagName: string,
37
+ DefinitionClass: { new (...args: any[]): any },
38
+ observedAttributes: string[] = []
39
+ ) {
40
+ if (customElements.get(tagName)) {
41
+ console.warn(`IGNORED: Custom element "${tagName}" is already defined!`);
42
+ return;
43
+ }
44
+
45
+ if (!tagName.includes('-')) {
46
+ throw new Error(
47
+ 'createCustomElement: tagName must contain at least one hyphen ("-").'
48
+ );
49
+ }
50
+
51
+ let name = kebabToPascal(tagName);
52
+
53
+ customElements.define(
54
+ tagName,
55
+ createNamedClass(
56
+ name,
57
+ class extends CeBaseClass {
58
+ instance: any;
59
+
60
+ constructor(data?: any) {
61
+ super();
62
+ let instance = new DefinitionClass(this, data);
63
+ DC.add(this, name, instance);
64
+ }
65
+
66
+ static get observedAttributes() {
67
+ return observedAttributes;
68
+ }
69
+ }
70
+ )
71
+ );
72
+ }
73
+
74
+ export function getCE(tagName: string): CustomElementConstructor | undefined {
75
+ return customElements.get(tagName);
76
+ }
@@ -0,0 +1,3 @@
1
+ import { LooseObject } from './helpers.js';
2
+ export declare function formValues(targetObject: LooseObject, propertyName: string, dom: HTMLElement | ShadowRoot): void;
3
+ //# 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,EAAsB,MAAM,cAAc,CAAC;AA0M/D,wBAAgB,UAAU,CACzB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,GAAG,UAAU,QAwB7B"}
@@ -0,0 +1,168 @@
1
+ 'use strict';
2
+ import { copyGettersSetters } from './helpers.js';
3
+ import { DC, addListener } from './MC.js';
4
+ import { observe } from './observables.js';
5
+ const getInputName = (e) => {
6
+ return e.tagName.toLowerCase();
7
+ };
8
+ class InputBase {
9
+ constructor(e) { }
10
+ }
11
+ class RadioHandler extends InputBase {
12
+ #e;
13
+ constructor(e) {
14
+ super(e);
15
+ this.#e = e;
16
+ }
17
+ get val() {
18
+ let ret = new FormData(this.#e.form).get(this.#e.name);
19
+ return ret;
20
+ }
21
+ set val(value) {
22
+ let arr = [
23
+ ...this.#e.form.querySelectorAll(`input[type="radio"][name="${this.#e.name}"]`),
24
+ ];
25
+ arr
26
+ .filter((e) => e.getAttribute('value') === value)
27
+ .shift().checked = true;
28
+ }
29
+ }
30
+ class CheckboxHandler extends InputBase {
31
+ #e;
32
+ constructor(e) {
33
+ super(e);
34
+ this.#e = e;
35
+ }
36
+ get val() {
37
+ return this.#e.checked;
38
+ }
39
+ set val(value) {
40
+ this.#e.checked = value;
41
+ }
42
+ }
43
+ class InputHandler extends InputBase {
44
+ #e;
45
+ constructor(e) {
46
+ super(e);
47
+ this.#e = e;
48
+ }
49
+ get val() {
50
+ return this.#e.value;
51
+ }
52
+ set val(value) {
53
+ this.#e.value = value;
54
+ }
55
+ }
56
+ class SelectHandler extends InputBase {
57
+ #e;
58
+ #multi = false;
59
+ constructor(e) {
60
+ super(e);
61
+ this.#e = e;
62
+ this.#multi = e.multiple;
63
+ }
64
+ get val() {
65
+ const that = this, ret = [];
66
+ [...that.#e.querySelectorAll('option')]
67
+ .filter((o) => o.selected)
68
+ .forEach((o) => {
69
+ ret.push(o.value);
70
+ });
71
+ if (this.#multi)
72
+ return ret;
73
+ return ret.length ? ret[0] : '';
74
+ }
75
+ set val(value) {
76
+ const that = this;
77
+ value = typeof value === 'string' ? [value] : value;
78
+ [...that.#e.querySelectorAll('option')].forEach((o) => {
79
+ if (value.indexOf(o.value) > -1) {
80
+ o.selected = true;
81
+ }
82
+ else {
83
+ o.selected = false;
84
+ }
85
+ });
86
+ }
87
+ }
88
+ class TextAreaHandler extends InputBase {
89
+ #e;
90
+ constructor(e) {
91
+ super(e);
92
+ this.#e = e;
93
+ }
94
+ get val() {
95
+ return this.#e.value || '';
96
+ }
97
+ set val(value) {
98
+ this.#e.value = value;
99
+ }
100
+ }
101
+ const getInputHandlers = (e) => {
102
+ let inputList = [
103
+ ...(e || document).querySelectorAll('input,select,textarea'),
104
+ ], handlers = {};
105
+ inputList.forEach((i) => {
106
+ const name = i.getAttribute('name');
107
+ if (name) {
108
+ let handler = false;
109
+ switch (getInputName(i)) {
110
+ case 'input':
111
+ switch (i.type) {
112
+ case 'radio':
113
+ handler = new RadioHandler(i);
114
+ break;
115
+ case 'checkbox':
116
+ handler = new CheckboxHandler(i);
117
+ break;
118
+ default:
119
+ handler = new InputHandler(i);
120
+ }
121
+ break;
122
+ case 'select':
123
+ handler = new SelectHandler(i);
124
+ break;
125
+ case 'textarea':
126
+ handler = new TextAreaHandler(i);
127
+ break;
128
+ default:
129
+ console.warn('handler missing:', name, 'for', i.tagName.toLowerCase(), i);
130
+ break;
131
+ }
132
+ if (handler) {
133
+ DC.add(i, name, handler);
134
+ Object.defineProperty(handlers, name, {
135
+ enumerable: true,
136
+ configurable: true,
137
+ get: () => {
138
+ return handler.val;
139
+ },
140
+ set: (value) => {
141
+ if (handler.val !== value) {
142
+ handler.val = value;
143
+ }
144
+ },
145
+ });
146
+ }
147
+ }
148
+ });
149
+ return handlers;
150
+ };
151
+ export function formValues(targetObject, propertyName, dom) {
152
+ let handlers = getInputHandlers(dom);
153
+ targetObject[propertyName] = Object.assign({}, handlers);
154
+ observe(targetObject, propertyName);
155
+ copyGettersSetters(handlers, targetObject[propertyName]);
156
+ [...dom.querySelectorAll('input, textarea, select')].forEach((input) => {
157
+ addListener(input, 'keyup', (ev) => {
158
+ targetObject[propertyName].notify();
159
+ });
160
+ addListener(input, 'change', (ev) => {
161
+ targetObject[propertyName].notify();
162
+ });
163
+ addListener(input, 'select', (ev) => {
164
+ targetObject[propertyName].notify();
165
+ });
166
+ });
167
+ }
168
+ //# sourceMappingURL=formValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formValues.js","sourceRoot":"","sources":["../src/formValues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ 'use strict';
2
+
3
+ import { LooseObject, copyGettersSetters } from './helpers.js';
4
+ import { DC, addListener } from './MC.js';
5
+ import { observe } from './observables.js';
6
+
7
+ type inputTypes = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
8
+
9
+ const getInputName = (
10
+ e: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement
11
+ ): string => {
12
+ return e.tagName.toLowerCase();
13
+ };
14
+
15
+ abstract class InputBase {
16
+ constructor(e: inputTypes) {}
17
+
18
+ abstract get val(): any;
19
+
20
+ abstract set val(value: any);
21
+ }
22
+
23
+ class RadioHandler extends InputBase {
24
+ #e: HTMLInputElement;
25
+
26
+ constructor(e: HTMLInputElement) {
27
+ super(e);
28
+ this.#e = e;
29
+ }
30
+
31
+ get val(): string {
32
+ let ret = new FormData(this.#e.form as HTMLFormElement).get(this.#e.name);
33
+
34
+ //console.log('radio[', this.#e.name, '] = "' + ret + '"');
35
+ return ret as string;
36
+ }
37
+
38
+ set val(value: string) {
39
+ let arr = [
40
+ ...(this.#e.form as HTMLFormElement).querySelectorAll(
41
+ `input[type="radio"][name="${this.#e.name}"]`
42
+ ),
43
+ ] as HTMLInputElement[];
44
+
45
+ (
46
+ arr
47
+ .filter((e) => e.getAttribute('value') === value)
48
+ .shift() as HTMLInputElement
49
+ ).checked = true;
50
+ }
51
+ }
52
+
53
+ class CheckboxHandler extends InputBase {
54
+ #e: HTMLInputElement;
55
+
56
+ constructor(e: HTMLInputElement) {
57
+ super(e);
58
+ this.#e = e;
59
+ }
60
+
61
+ get val(): boolean {
62
+ return this.#e.checked;
63
+ }
64
+
65
+ set val(value: boolean) {
66
+ this.#e.checked = value;
67
+ }
68
+ }
69
+
70
+ class InputHandler extends InputBase {
71
+ #e: HTMLInputElement;
72
+
73
+ constructor(e: HTMLInputElement) {
74
+ super(e);
75
+ this.#e = e;
76
+ }
77
+
78
+ get val(): string {
79
+ return this.#e.value;
80
+ }
81
+
82
+ set val(value: string) {
83
+ this.#e.value = value;
84
+ }
85
+ }
86
+
87
+ class SelectHandler extends InputBase {
88
+ #e: HTMLSelectElement;
89
+ #multi: boolean = false;
90
+
91
+ constructor(e: HTMLSelectElement) {
92
+ super(e);
93
+ this.#e = e;
94
+ this.#multi = e.multiple;
95
+ }
96
+
97
+ get val(): string[] | string {
98
+ const that = this,
99
+ ret: string[] = [];
100
+
101
+ // get all options
102
+ [...that.#e.querySelectorAll('option')]
103
+ .filter((o) => o.selected)
104
+ .forEach((o) => {
105
+ ret.push(o.value);
106
+ });
107
+
108
+ if (this.#multi) return ret;
109
+ return ret.length ? ret[0] : '';
110
+ }
111
+
112
+ set val(value: string[] | string) {
113
+ const that = this;
114
+
115
+ value = typeof value === 'string' ? [value] : value;
116
+
117
+ // set all options
118
+ [...that.#e.querySelectorAll('option')].forEach((o) => {
119
+ if (value.indexOf(o.value) > -1) {
120
+ o.selected = true;
121
+ } else {
122
+ o.selected = false;
123
+ }
124
+ });
125
+ }
126
+ }
127
+
128
+ class TextAreaHandler extends InputBase {
129
+ #e: HTMLTextAreaElement;
130
+ constructor(e: HTMLTextAreaElement) {
131
+ super(e);
132
+ this.#e = e;
133
+ }
134
+
135
+ get val(): string {
136
+ return this.#e.value || '';
137
+ }
138
+
139
+ set val(value: string) {
140
+ this.#e.value = value;
141
+ }
142
+ }
143
+
144
+ const getInputHandlers = (e: HTMLElement | ShadowRoot): LooseObject => {
145
+ let inputList = [
146
+ ...(e || document).querySelectorAll('input,select,textarea'),
147
+ ],
148
+ handlers: LooseObject = {};
149
+
150
+ inputList.forEach((i) => {
151
+ const name: string | null = (i as inputTypes).getAttribute('name');
152
+ if (name) {
153
+ let handler: any = false;
154
+ switch (getInputName(i as inputTypes)) {
155
+ case 'input':
156
+ switch ((i as HTMLInputElement).type) {
157
+ case 'radio':
158
+ handler = new RadioHandler(i as HTMLInputElement);
159
+ break;
160
+ case 'checkbox':
161
+ handler = new CheckboxHandler(i as HTMLInputElement);
162
+ break;
163
+ default:
164
+ handler = new InputHandler(i as HTMLInputElement);
165
+ }
166
+ break;
167
+ case 'select':
168
+ handler = new SelectHandler(i as HTMLSelectElement);
169
+ break;
170
+ case 'textarea':
171
+ handler = new TextAreaHandler(i as HTMLTextAreaElement);
172
+ break;
173
+ default:
174
+ console.warn(
175
+ 'handler missing:',
176
+ name,
177
+ 'for',
178
+ i.tagName.toLowerCase(),
179
+ i
180
+ );
181
+ break;
182
+ }
183
+
184
+ if (handler) {
185
+ DC.add(i, name, handler);
186
+ Object.defineProperty(handlers, name, {
187
+ enumerable: true,
188
+ configurable: true,
189
+ get: (): any => {
190
+ return handler.val;
191
+ },
192
+ set: (value: any) => {
193
+ if (handler.val !== value) {
194
+ handler.val = value;
195
+ }
196
+ },
197
+ });
198
+ }
199
+ }
200
+ });
201
+
202
+ return handlers;
203
+ };
204
+
205
+ export function formValues(
206
+ targetObject: LooseObject,
207
+ propertyName: string,
208
+ dom: HTMLElement | ShadowRoot
209
+ ) {
210
+ let handlers = getInputHandlers(dom);
211
+
212
+ targetObject[propertyName] = Object.assign({}, handlers);
213
+
214
+ observe(targetObject, propertyName);
215
+
216
+ copyGettersSetters(handlers, targetObject[propertyName]);
217
+
218
+ [...dom.querySelectorAll('input, textarea, select')].forEach((input) => {
219
+ addListener(input as inputTypes, 'keyup', (ev: Event) => {
220
+ //console.log('keyup', ev);
221
+ targetObject[propertyName].notify();
222
+ });
223
+ addListener(input as HTMLElement, 'change', (ev: Event) => {
224
+ //console.log('change', ev);
225
+ targetObject[propertyName].notify();
226
+ });
227
+ addListener(input as inputTypes, 'select', (ev: Event) => {
228
+ //console.log('select', ev);
229
+ targetObject[propertyName].notify();
230
+ });
231
+ });
232
+ }
233
+
@@ -0,0 +1,13 @@
1
+ test-grandparent,
2
+ test-parent,
3
+ test-child,
4
+ test-grandchild,
5
+ test-greatgrandchild {
6
+ display: inline-block;
7
+ padding: 2px;
8
+ margin: 1px;
9
+ border: 1px solid darkslategray;
10
+ border-radius: 2px;
11
+ }
12
+
13
+ /*# sourceMappingURL=GrandParent.css.map */