@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.
- package/.gitlab-ci.yml +1 -0
- package/README.md +31 -12
- package/assets/documentation/MicroComponents.md +228 -0
- package/assets/my-tag.css +4 -0
- package/assets/test.html +5 -1
- package/dist/MC.d.ts +32 -0
- package/dist/MC.d.ts.map +1 -0
- package/dist/MC.min.js +414 -0
- package/dist/MC.ts +350 -0
- package/dist/McEvent.d.ts +15 -0
- package/dist/McEvent.d.ts.map +1 -0
- package/dist/McEvent.ts +96 -0
- package/dist/autoloader.d.ts +2 -0
- package/dist/autoloader.d.ts.map +1 -0
- package/dist/autoloader.ts +98 -0
- package/dist/customElements.d.ts +5 -0
- package/dist/customElements.d.ts.map +1 -0
- package/dist/customElements.min.js +1 -0
- package/dist/customElements.ts +67 -0
- package/dist/customObservables.d.ts +3 -0
- package/dist/customObservables.d.ts.map +1 -0
- package/dist/customObservables.min.js +1 -0
- package/dist/customObservables.ts +340 -0
- package/dist/customSelectors.d.ts +108 -0
- package/dist/customSelectors.d.ts.map +1 -0
- package/dist/customSelectors.min.js +1 -0
- package/dist/customSelectors.ts +1634 -0
- package/dist/formValues.d.ts +4 -0
- package/dist/formValues.d.ts.map +1 -0
- package/dist/formValues.ts +275 -0
- package/dist/formvValues.min.js +1 -0
- package/dist/helpers.d.ts +11 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.ts +173 -0
- package/dist/microcomponents.d.ts +7 -25
- package/dist/microcomponents.d.ts.map +1 -1
- package/dist/microcomponents.es3.d.ts +1 -20
- package/dist/microcomponents.es3.d.ts.map +1 -1
- package/dist/microcomponents.min.js +1 -38
- package/dist/microcomponents.ts +8 -216
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/package.json +11 -7
- package/public/MC.js +273 -0
- package/public/MC.min.js +414 -0
- package/public/MCbundle.js +8 -0
- package/public/MCbundle.min.js +1 -0
- package/public/McEvent.js +74 -0
- package/public/MicroComponents.svg +15 -0
- package/public/assets/search.js +1 -1
- package/public/autoloader.js +57 -0
- package/public/classes/MC.DC.html +247 -0
- package/public/classes/MC.MC.html +150 -0
- package/public/classes/MC.McBase.html +123 -0
- package/public/classes/MCbundle.McEvent.html +184 -0
- package/public/customElements.js +48 -0
- package/public/customElements.min.js +1 -0
- package/public/customObservables.js +255 -0
- package/public/customObservables.min.js +1 -0
- package/public/customSelectors.js +1088 -0
- package/public/customSelectors.min.js +1 -0
- package/public/documentation/MicroComponents.md +228 -0
- package/public/formValues.js +211 -0
- package/public/formvValues.min.js +1 -0
- package/public/functions/MC.addListener.html +73 -0
- package/public/functions/MC.removeListener.html +69 -0
- package/public/functions/MCbundle._d.html +85 -0
- package/public/functions/MCbundle._t.html +85 -0
- package/public/functions/MCbundle.debounce.html +85 -0
- package/public/functions/MCbundle.deepEqual.html +85 -0
- package/public/functions/MCbundle.defineCE.html +98 -0
- package/public/functions/MCbundle.formValues.html +89 -0
- package/public/functions/MCbundle.getCE.html +83 -0
- package/public/functions/MCbundle.htmlToElements.html +83 -0
- package/public/functions/MCbundle.isObject.html +83 -0
- package/public/functions/MCbundle.kebabToPascal.html +83 -0
- package/public/functions/MCbundle.makeCO.html +85 -0
- package/public/functions/MCbundle.nameSpace.html +89 -0
- package/public/functions/MCbundle.parse.html +85 -0
- package/public/helpers.js +128 -0
- package/public/index.html +22 -13
- package/public/interfaces/MC.HTMLMcElement.html +3605 -0
- package/public/interfaces/MCbundle.DSelector.html +1010 -0
- package/public/interfaces/MCbundle.LooseObject.html +80 -0
- package/public/interfaces/MCbundle.TSelector.html +709 -0
- package/public/microcomponents.es3.js +348 -0
- package/public/microcomponents.js +8 -176
- package/public/microcomponents.min.js +1 -0
- package/public/modules/MC.html +84 -0
- package/public/modules/MCbundle.html +133 -0
- package/public/modules.html +4 -4
- package/public/my-tag.css +4 -0
- package/public/test.html +5 -1
- package/public/test.js +100 -202
- package/public/types/MCbundle.selection.html +74 -0
- package/public/types/MCbundle.singleSelector.html +74 -0
- package/src/MC.ts +350 -0
- package/src/McEvent.ts +96 -0
- package/src/autoloader.ts +98 -0
- package/src/customElements.ts +67 -0
- package/src/customObservables.ts +340 -0
- package/src/customSelectors.ts +1634 -0
- package/src/formValues.ts +275 -0
- package/src/helpers.ts +173 -0
- package/src/microcomponents.es3.js +353 -82
- package/src/microcomponents.ts +8 -216
- package/src/test.js +137 -218
- package/tsconfig.json +2 -2
- package/typedoc.json +1 -1
- package/webpack.config.js +233 -0
- package/dist/microcomponents.es3.js +0 -96
- package/dist/microcomponents.es3.min.js +0 -15
- package/dist/microcomponents.js +0 -176
- package/public/classes/microcomponents.MC.html +0 -313
- package/public/classes/microcomponents_es3.MC.html +0 -336
- package/public/functions/microcomponents_es3.__isEmpty.html +0 -60
- package/public/modules/microcomponents.html +0 -57
- package/public/modules/microcomponents_es3.html +0 -60
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
(function () {
|
|
3
|
+
// Polyfill for String.prototype.trim (ES3-compliant)
|
|
4
|
+
if (!String.prototype.trim) {
|
|
5
|
+
String.prototype.trim = function () {
|
|
6
|
+
return this.replace(/^\s+|\s+$/g, "");
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
// Helper function to remove duplicates from an array
|
|
10
|
+
function unique(elements) {
|
|
11
|
+
var uniqueElements = [];
|
|
12
|
+
for (var i = 0; i < elements.length; i++) {
|
|
13
|
+
if (uniqueElements.indexOf(elements[i]) === -1) {
|
|
14
|
+
uniqueElements.push(elements[i]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return uniqueElements;
|
|
18
|
+
}
|
|
19
|
+
// Helper function to check if an element matches an attribute selector
|
|
20
|
+
function matchesAttribute(element, attrSelector) {
|
|
21
|
+
var match = attrSelector.match(/^\[([^\]=~^$*]+)([~^$*|]?=)?(['"]?)(.*?)\3\]$/);
|
|
22
|
+
if (!match)
|
|
23
|
+
return false;
|
|
24
|
+
var attrName = match[1];
|
|
25
|
+
var operator = match[2] || null;
|
|
26
|
+
var attrValue = match[4] || null;
|
|
27
|
+
var actualValue = element.getAttribute(attrName);
|
|
28
|
+
if (actualValue === null)
|
|
29
|
+
return false; // Attribute does not exist
|
|
30
|
+
switch (operator) {
|
|
31
|
+
case null: // [attr]
|
|
32
|
+
return true;
|
|
33
|
+
case "=": // [attr=value]
|
|
34
|
+
return actualValue === attrValue;
|
|
35
|
+
case "~=": // [attr~=value]
|
|
36
|
+
return (" " + actualValue + " ").indexOf(" " + attrValue + " ") !== -1;
|
|
37
|
+
case "^=": // [attr^=value]
|
|
38
|
+
return actualValue.indexOf(attrValue) === 0;
|
|
39
|
+
case "$=": // [attr$=value]
|
|
40
|
+
return actualValue.slice(-attrValue.length) === attrValue;
|
|
41
|
+
case "*=": // [attr*=value]
|
|
42
|
+
return actualValue.indexOf(attrValue) !== -1;
|
|
43
|
+
default:
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Helper function to check if an element matches a selector
|
|
48
|
+
function matchesSelector(element, selector) {
|
|
49
|
+
var regex = /(\w+)?(?:\.([\w\-]+))?(?:\[.*?\])?/g;
|
|
50
|
+
var match, tagMatch, classMatch, attrMatch;
|
|
51
|
+
while ((match = regex.exec(selector))) {
|
|
52
|
+
tagMatch = match[1];
|
|
53
|
+
classMatch = match[2] ? match[2].split(".") : null;
|
|
54
|
+
attrMatch = selector.match(/\[.*?\]/g);
|
|
55
|
+
if (tagMatch &&
|
|
56
|
+
element.tagName.toLowerCase() !== tagMatch.toLowerCase()) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (classMatch) {
|
|
60
|
+
for (var i = 0; i < classMatch.length; i++) {
|
|
61
|
+
if ((" " + element.className + " ").indexOf(" " + classMatch[i] + " ") === -1) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (attrMatch) {
|
|
67
|
+
for (var j = 0; j < attrMatch.length; j++) {
|
|
68
|
+
if (!matchesAttribute(element, attrMatch[j])) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Polyfill for document.querySelectorAll
|
|
77
|
+
if (!document.querySelectorAll) {
|
|
78
|
+
document.querySelectorAll = function (selectors) {
|
|
79
|
+
var simpleSelectors = selectors.split(",");
|
|
80
|
+
var results = [];
|
|
81
|
+
for (var i = 0; i < simpleSelectors.length; i++) {
|
|
82
|
+
var selector = simpleSelectors[i].trim();
|
|
83
|
+
if (!selector)
|
|
84
|
+
continue;
|
|
85
|
+
var allElements = document.getElementsByTagName("*");
|
|
86
|
+
for (var j = 0; j < allElements.length; j++) {
|
|
87
|
+
if (matchesSelector(allElements[j], selector)) {
|
|
88
|
+
results.push(allElements[j]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return unique(results); // Return unique results
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Polyfill for document.querySelector
|
|
96
|
+
if (!document.querySelector) {
|
|
97
|
+
document.querySelector = function (selectors) {
|
|
98
|
+
var elements = document.querySelectorAll(selectors);
|
|
99
|
+
return elements.length ? elements[0] : null;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Polyfill for HTMLElement.prototype.querySelectorAll
|
|
103
|
+
if (typeof HTMLElement !== "undefined" &&
|
|
104
|
+
!HTMLElement.prototype.querySelectorAll) {
|
|
105
|
+
HTMLElement.prototype.querySelectorAll = function (selectors) {
|
|
106
|
+
var simpleSelectors = selectors.split(",");
|
|
107
|
+
var results = [];
|
|
108
|
+
for (var i = 0; i < simpleSelectors.length; i++) {
|
|
109
|
+
var selector = simpleSelectors[i].trim();
|
|
110
|
+
if (!selector)
|
|
111
|
+
continue;
|
|
112
|
+
var allElements = this.getElementsByTagName("*");
|
|
113
|
+
for (var j = 0; j < allElements.length; j++) {
|
|
114
|
+
if (matchesSelector(allElements[j], selector)) {
|
|
115
|
+
results.push(allElements[j]);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return unique(results); // Return unique results
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Polyfill for HTMLElement.prototype.querySelector
|
|
123
|
+
if (typeof HTMLElement !== "undefined" &&
|
|
124
|
+
!HTMLElement.prototype.querySelector) {
|
|
125
|
+
HTMLElement.prototype.querySelector = function (selectors) {
|
|
126
|
+
var elements = this.querySelectorAll(selectors);
|
|
127
|
+
return elements.length ? elements[0] : null;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Polyfill for Object.values()
|
|
131
|
+
if (!Object.values) {
|
|
132
|
+
Object.values = function (obj) {
|
|
133
|
+
if (obj === null ||
|
|
134
|
+
(typeof obj !== "object" && typeof obj !== "function")) {
|
|
135
|
+
throw new TypeError("Object.values called on a non-object");
|
|
136
|
+
}
|
|
137
|
+
var values = [];
|
|
138
|
+
for (var key in obj) {
|
|
139
|
+
if (obj.hasOwnProperty(key)) {
|
|
140
|
+
values.push(obj[key]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return values;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
})();
|
|
147
|
+
window.MC = (function () {
|
|
148
|
+
/*
|
|
149
|
+
helper methods
|
|
150
|
+
*/
|
|
151
|
+
// get all microcomponents from a list of HTMLElements
|
|
152
|
+
function getMicroComponents(elements, search) {
|
|
153
|
+
let mcValues = [];
|
|
154
|
+
elements.forEach((e) => {
|
|
155
|
+
if (e) {
|
|
156
|
+
if (e instanceof HTMLElement) {
|
|
157
|
+
const _mc = e?._mc;
|
|
158
|
+
if (!search && _mc) {
|
|
159
|
+
mcValues = mcValues.concat(Object.values(e._mc));
|
|
160
|
+
}
|
|
161
|
+
else if (search && _mc && _mc[search]) {
|
|
162
|
+
mcValues.push(_mc[search]);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return mcValues;
|
|
168
|
+
}
|
|
169
|
+
// get all ancestor DOM nodes up to the document
|
|
170
|
+
function traverseNodes(node, search, firstonly = true) {
|
|
171
|
+
let mcValues = [];
|
|
172
|
+
while (node) {
|
|
173
|
+
if (node._mc) {
|
|
174
|
+
if (!search) {
|
|
175
|
+
mcValues = mcValues.concat(Object.values(node._mc));
|
|
176
|
+
}
|
|
177
|
+
else if (search && node._mc[search]) {
|
|
178
|
+
mcValues.push(node._mc[search]);
|
|
179
|
+
}
|
|
180
|
+
if (firstonly)
|
|
181
|
+
return mcValues;
|
|
182
|
+
}
|
|
183
|
+
node = node.parentNode;
|
|
184
|
+
}
|
|
185
|
+
return mcValues;
|
|
186
|
+
}
|
|
187
|
+
function isDOM(element) {
|
|
188
|
+
return element && element instanceof HTMLElement;
|
|
189
|
+
}
|
|
190
|
+
// continue here....
|
|
191
|
+
var MC = function () { };
|
|
192
|
+
class MC {
|
|
193
|
+
#target = {};
|
|
194
|
+
#_mc = {};
|
|
195
|
+
static debug = false;
|
|
196
|
+
constructor(target) {
|
|
197
|
+
this.#target = target;
|
|
198
|
+
this.#_mc = {};
|
|
199
|
+
}
|
|
200
|
+
get _mc() {
|
|
201
|
+
if (!MC.debug)
|
|
202
|
+
return undefined;
|
|
203
|
+
return this.#_mc;
|
|
204
|
+
}
|
|
205
|
+
get target() {
|
|
206
|
+
return this.#target;
|
|
207
|
+
}
|
|
208
|
+
// return all top-level micro components from an HTMLElement, or the searched one
|
|
209
|
+
static siblings(target, search = "") {
|
|
210
|
+
const mc = target;
|
|
211
|
+
if (!mc._mc) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const _mc = mc._mc;
|
|
215
|
+
if (search.length) {
|
|
216
|
+
return _mc?.[search] || [];
|
|
217
|
+
}
|
|
218
|
+
return [...Object.values(_mc)];
|
|
219
|
+
}
|
|
220
|
+
// add a microcomponent to a target DOM node
|
|
221
|
+
static add(target, key, element = {}) {
|
|
222
|
+
let node = target;
|
|
223
|
+
// create the _mc property if necessary
|
|
224
|
+
if (!node._mc) {
|
|
225
|
+
node._mc = new MC(target);
|
|
226
|
+
}
|
|
227
|
+
const _mc = node._mc;
|
|
228
|
+
// add the element with the given property key to the _mc property
|
|
229
|
+
if (key.length && !_mc[key]) {
|
|
230
|
+
_mc[key] = element;
|
|
231
|
+
// add attribute if HTMLElement
|
|
232
|
+
if (target instanceof HTMLElement) {
|
|
233
|
+
target.setAttribute("_mc", "");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return element;
|
|
237
|
+
}
|
|
238
|
+
// remove a micro component from the DOM
|
|
239
|
+
static remove(target, key) {
|
|
240
|
+
if (!key)
|
|
241
|
+
return; // silent fail
|
|
242
|
+
const _mc = target?._mc || {};
|
|
243
|
+
// delete the property from the HTMLElement _mc collection
|
|
244
|
+
if (_mc && _mc[key]) {
|
|
245
|
+
delete _mc[key];
|
|
246
|
+
}
|
|
247
|
+
// remove the _mc attribute if the DOM collection is empty
|
|
248
|
+
if (!Object.keys(_mc).length &&
|
|
249
|
+
target instanceof HTMLElement &&
|
|
250
|
+
target.hasAttribute("_mc")) {
|
|
251
|
+
target.removeAttribute("_mc");
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
// add a microcomponent to the collection
|
|
256
|
+
add(key, element, target) {
|
|
257
|
+
if (this.#_mc[key])
|
|
258
|
+
return;
|
|
259
|
+
// if target parameter exists ( a DOM node )
|
|
260
|
+
// you want a top level (public) MC
|
|
261
|
+
if (target) {
|
|
262
|
+
// ... add the new micro component to the DOM node _mc
|
|
263
|
+
MC.add(target, key, element);
|
|
264
|
+
}
|
|
265
|
+
// add the new micro component to the private collection anyway
|
|
266
|
+
this.#_mc[key] = element;
|
|
267
|
+
return element;
|
|
268
|
+
}
|
|
269
|
+
// remove a micro component from the collection
|
|
270
|
+
remove(key, target) {
|
|
271
|
+
const _mc = this.#_mc;
|
|
272
|
+
const t = target;
|
|
273
|
+
// if target parameter exists ( a DOM node )
|
|
274
|
+
// you want to remove a top level (public) MC
|
|
275
|
+
if (target) {
|
|
276
|
+
// ... remove the new micro component from the DOM node _mc
|
|
277
|
+
MC.remove(t, key);
|
|
278
|
+
}
|
|
279
|
+
// remove the new micro component from the private collection anyway
|
|
280
|
+
delete _mc?.[key];
|
|
281
|
+
}
|
|
282
|
+
// return all micro components from the collection, or the searched one
|
|
283
|
+
// in a top level DOM MC, this refers to the inner collection always
|
|
284
|
+
// use MC.siblings() to get the public MCs
|
|
285
|
+
siblings(search = "") {
|
|
286
|
+
const _mc = this.#_mc;
|
|
287
|
+
if (!_mc)
|
|
288
|
+
return [];
|
|
289
|
+
const result = _mc[search || ""];
|
|
290
|
+
return search && result ? [result] : [...Object.values(_mc)];
|
|
291
|
+
}
|
|
292
|
+
/*
|
|
293
|
+
the following selectors will only work for the DOM top level MCs and return [] otherwise
|
|
294
|
+
*/
|
|
295
|
+
// first anchestor DOM node, all public MCs
|
|
296
|
+
parent(search = "") {
|
|
297
|
+
if (!isDOM(this.#target))
|
|
298
|
+
return [];
|
|
299
|
+
return traverseNodes(this.#target.parentNode, search, true);
|
|
300
|
+
}
|
|
301
|
+
// all anchestor DOM nodes, beginning with the closest, all public MCs
|
|
302
|
+
parents(search = "") {
|
|
303
|
+
if (!isDOM(this.#target))
|
|
304
|
+
return [];
|
|
305
|
+
return traverseNodes(this.#target.parentNode, search, false);
|
|
306
|
+
}
|
|
307
|
+
// nearest child DOM nodes, all puclic MCs
|
|
308
|
+
children(search = "") {
|
|
309
|
+
if (!isDOM(this.#target))
|
|
310
|
+
return [];
|
|
311
|
+
const id = Math.random().toString().replace(".", "");
|
|
312
|
+
const selector = '[_mc]:not([temp_id="' + id + '"] [_mc] [_mc])'; // HOTFIX: minifier or tsc compiler error, dont use backtick string, cuts out blanks
|
|
313
|
+
this.#target.setAttribute("temp_id", id);
|
|
314
|
+
const myDomElements = this.#target.querySelectorAll(selector);
|
|
315
|
+
const mcValues = getMicroComponents([...myDomElements], search);
|
|
316
|
+
this.#target.removeAttribute("temp_id");
|
|
317
|
+
return mcValues;
|
|
318
|
+
}
|
|
319
|
+
// all descendant DOM nodes, all puclic MCs
|
|
320
|
+
descendants(search = "") {
|
|
321
|
+
if (!isDOM(this.#target))
|
|
322
|
+
return [];
|
|
323
|
+
const myDomElements = this.#target.querySelectorAll("*[_mc]");
|
|
324
|
+
return getMicroComponents([...myDomElements], search);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return MC;
|
|
328
|
+
})();
|
|
329
|
+
function findNodesWithMcAttribute(rootNode, childrenOnly) {
|
|
330
|
+
var result = []; // Array to store nodes with "_mc" attribute
|
|
331
|
+
var getChildren = childrenOnly === undefined ? true : childrenOnly;
|
|
332
|
+
function walk(node) {
|
|
333
|
+
// Check if the node has an "_mc" attribute
|
|
334
|
+
if (node.nodeType === 1 && node.getAttribute("_mc") !== null) {
|
|
335
|
+
result.push(node); // Add the node to the result array
|
|
336
|
+
return; // Stop searching this branch
|
|
337
|
+
}
|
|
338
|
+
// Recursively search child nodes
|
|
339
|
+
var child = node.firstChild;
|
|
340
|
+
while (child) {
|
|
341
|
+
walk(child);
|
|
342
|
+
child = child.nextSibling;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Start the tree walk
|
|
346
|
+
walk(rootNode);
|
|
347
|
+
return result; // Return the array of found nodes
|
|
348
|
+
}
|
|
@@ -1,176 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (e) {
|
|
10
|
-
if (e instanceof HTMLElement) {
|
|
11
|
-
const _mc = e?._mc;
|
|
12
|
-
if (!search && _mc) {
|
|
13
|
-
mcValues = mcValues.concat(Object.values(e._mc));
|
|
14
|
-
}
|
|
15
|
-
else if (search && _mc && _mc[search]) {
|
|
16
|
-
mcValues.push(_mc[search]);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
return mcValues;
|
|
22
|
-
}
|
|
23
|
-
// get all ancestor DOM nodes up to the document
|
|
24
|
-
function traverseNodes(node, search, firstonly = true) {
|
|
25
|
-
let mcValues = [];
|
|
26
|
-
while (node) {
|
|
27
|
-
if (node._mc) {
|
|
28
|
-
if (!search) {
|
|
29
|
-
mcValues = mcValues.concat(Object.values(node._mc));
|
|
30
|
-
}
|
|
31
|
-
else if (search && node._mc[search]) {
|
|
32
|
-
mcValues.push(node._mc[search]);
|
|
33
|
-
}
|
|
34
|
-
if (firstonly)
|
|
35
|
-
return mcValues;
|
|
36
|
-
}
|
|
37
|
-
node = node.parentNode;
|
|
38
|
-
}
|
|
39
|
-
return mcValues;
|
|
40
|
-
}
|
|
41
|
-
function isDOM(element) {
|
|
42
|
-
return element && element instanceof HTMLElement;
|
|
43
|
-
}
|
|
44
|
-
export class MC {
|
|
45
|
-
#target = {};
|
|
46
|
-
#_mc = {};
|
|
47
|
-
static debug = false;
|
|
48
|
-
constructor(target) {
|
|
49
|
-
this.#target = target;
|
|
50
|
-
this.#_mc = {};
|
|
51
|
-
}
|
|
52
|
-
get _mc() {
|
|
53
|
-
if (!MC.debug)
|
|
54
|
-
return undefined;
|
|
55
|
-
return this.#_mc;
|
|
56
|
-
}
|
|
57
|
-
get target() {
|
|
58
|
-
return this.#target;
|
|
59
|
-
}
|
|
60
|
-
// return all top-level micro components from an HTMLElement, or the searched one
|
|
61
|
-
static siblings(target, search = '') {
|
|
62
|
-
const mc = target;
|
|
63
|
-
if (!mc._mc) {
|
|
64
|
-
return [];
|
|
65
|
-
}
|
|
66
|
-
const _mc = mc._mc;
|
|
67
|
-
if (search.length) {
|
|
68
|
-
return _mc?.[search] || [];
|
|
69
|
-
}
|
|
70
|
-
return [...Object.values(_mc)];
|
|
71
|
-
}
|
|
72
|
-
// add a microcomponent to a target DOM node
|
|
73
|
-
static add(target, key, element = {}) {
|
|
74
|
-
let node = target;
|
|
75
|
-
// create the _mc property if necessary
|
|
76
|
-
if (!node._mc) {
|
|
77
|
-
node._mc = new MC(target);
|
|
78
|
-
}
|
|
79
|
-
const _mc = node._mc;
|
|
80
|
-
// add the element with the given property key to the _mc property
|
|
81
|
-
if (key.length && !_mc[key]) {
|
|
82
|
-
_mc[key] = element;
|
|
83
|
-
// add attribute if HTMLElement
|
|
84
|
-
if (target instanceof HTMLElement) {
|
|
85
|
-
target.setAttribute('_mc', '');
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return element;
|
|
89
|
-
}
|
|
90
|
-
// remove a micro component from the DOM
|
|
91
|
-
static remove(target, key) {
|
|
92
|
-
if (!key)
|
|
93
|
-
return; // silent fail
|
|
94
|
-
const _mc = target?._mc || {};
|
|
95
|
-
// delete the property from the HTMLElement _mc collection
|
|
96
|
-
if (_mc && _mc[key]) {
|
|
97
|
-
delete _mc[key];
|
|
98
|
-
}
|
|
99
|
-
// remove the _mc attribute if the DOM collection is empty
|
|
100
|
-
if (!Object.keys(_mc).length && target instanceof HTMLElement && target.hasAttribute('_mc')) {
|
|
101
|
-
target.removeAttribute('_mc');
|
|
102
|
-
}
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
// add a microcomponent to the collection
|
|
106
|
-
add(key, element, target) {
|
|
107
|
-
if (this.#_mc[key])
|
|
108
|
-
return;
|
|
109
|
-
// if target parameter exists ( a DOM node )
|
|
110
|
-
// you want a top level (public) MC
|
|
111
|
-
if (target) {
|
|
112
|
-
// ... add the new micro component to the DOM node _mc
|
|
113
|
-
MC.add(target, key, element);
|
|
114
|
-
}
|
|
115
|
-
// add the new micro component to the private collection anyway
|
|
116
|
-
this.#_mc[key] = element;
|
|
117
|
-
return element;
|
|
118
|
-
}
|
|
119
|
-
// remove a micro component from the collection
|
|
120
|
-
remove(key, target) {
|
|
121
|
-
const _mc = this.#_mc;
|
|
122
|
-
const t = target;
|
|
123
|
-
// if target parameter exists ( a DOM node )
|
|
124
|
-
// you want to remove a top level (public) MC
|
|
125
|
-
if (target) {
|
|
126
|
-
// ... remove the new micro component from the DOM node _mc
|
|
127
|
-
MC.remove(t, key);
|
|
128
|
-
}
|
|
129
|
-
// remove the new micro component from the private collection anyway
|
|
130
|
-
delete _mc?.[key];
|
|
131
|
-
}
|
|
132
|
-
// return all micro components from the collection, or the searched one
|
|
133
|
-
// in a top level DOM MC, this refers to the inner collection always
|
|
134
|
-
// use MC.siblings() to get the public MCs
|
|
135
|
-
siblings(search = '') {
|
|
136
|
-
const _mc = this.#_mc;
|
|
137
|
-
if (!_mc)
|
|
138
|
-
return [];
|
|
139
|
-
const result = _mc[search || ''];
|
|
140
|
-
return search && result ? [result] : [...Object.values(_mc)];
|
|
141
|
-
}
|
|
142
|
-
/*
|
|
143
|
-
the following selectors will only work for the DOM top level MCs and return [] otherwise
|
|
144
|
-
*/
|
|
145
|
-
// first anchestor DOM node, all public MCs
|
|
146
|
-
parent(search = '') {
|
|
147
|
-
if (!isDOM(this.#target))
|
|
148
|
-
return [];
|
|
149
|
-
return traverseNodes(this.#target.parentNode, search, true);
|
|
150
|
-
}
|
|
151
|
-
// all anchestor DOM nodes, beginning with the closest, all public MCs
|
|
152
|
-
parents(search = '') {
|
|
153
|
-
if (!isDOM(this.#target))
|
|
154
|
-
return [];
|
|
155
|
-
return traverseNodes(this.#target.parentNode, search, false);
|
|
156
|
-
}
|
|
157
|
-
// nearest child DOM nodes, all puclic MCs
|
|
158
|
-
children(search = '') {
|
|
159
|
-
if (!isDOM(this.#target))
|
|
160
|
-
return [];
|
|
161
|
-
const id = Math.random().toString().replace('.', '');
|
|
162
|
-
const selector = '[_mc]:not([temp_id="' + id + '"] [_mc] [_mc])'; // HOTFIX: minifier or tsc compiler error, dont use backtick string, cuts out blanks
|
|
163
|
-
this.#target.setAttribute('temp_id', id);
|
|
164
|
-
const myDomElements = this.#target.querySelectorAll(selector);
|
|
165
|
-
const mcValues = getMicroComponents([...myDomElements], search);
|
|
166
|
-
this.#target.removeAttribute('temp_id');
|
|
167
|
-
return mcValues;
|
|
168
|
-
}
|
|
169
|
-
// all descendant DOM nodes, all puclic MCs
|
|
170
|
-
descendants(search = '') {
|
|
171
|
-
if (!isDOM(this.#target))
|
|
172
|
-
return [];
|
|
173
|
-
const myDomElements = this.#target.querySelectorAll('*[_mc]');
|
|
174
|
-
return getMicroComponents([...myDomElements], search);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
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 @@
|
|
|
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})()));
|