diff --git a/THIRDPARTY.md b/THIRDPARTY.md
index ae7e3ff..fb40c40 100644
--- a/THIRDPARTY.md
+++ b/THIRDPARTY.md
@@ -80,8 +80,8 @@ Repo: https://github.com/emcconville/wand
## Bitty
-Affected files: [`data/static/js/vnd/bitty-6.0.0-rc3.min.js`](./data/static/js/vnd/bitty-6.0.0-rc3.min.js)
-URL: https://bitty.alanwsmith.com/
+Affected files: [`data/static/js/vnd/bitty-7.0.0.js`](./data/static/js/vnd/bitty-7.0.0.js)
+URL: https://bitty-js.com/
License: CC0 1.0
Author: alan w smith https://www.alanwsmith.com/
Repo: https://github.com/alanwsmith/bitty
diff --git a/data/static/js/bitties/pyrom-bitty.js b/data/static/js/bitties/pyrom-bitty.js
index e79cc8f..9d86c36 100644
--- a/data/static/js/bitties/pyrom-bitty.js
+++ b/data/static/js/bitties/pyrom-bitty.js
@@ -7,12 +7,12 @@ const delay = ms => {return new Promise(resolve => setTimeout(resolve, ms))}
export default class {
async showBookmarkMenu(ev, el) {
- if ((el.sender.dataset.bookmarkId === el.ds('bookmarkId')) && el.childElementCount === 0) {
+ if ((ev.sender.dataset.bookmarkId === el.prop('bookmarkId')) && el.childElementCount === 0) {
const searchParams = new URLSearchParams({
- 'id': el.sender.dataset.conceptId,
+ 'id': ev.sender.dataset.conceptId,
'require_reload': el.dataset.requireReload,
});
- const bookmarkMenuHref = `${bookmarkMenuHrefTemplate}/${el.sender.dataset.bookmarkType}?${searchParams}`;
+ const bookmarkMenuHref = `${bookmarkMenuHrefTemplate}/${ev.sender.dataset.bookmarkType}?${searchParams}`;
const res = await this.api.getHTML(bookmarkMenuHref);
if (res.error) {
return;
@@ -50,9 +50,9 @@ export default class {
}
selectBookmarkCollection(ev, el) {
- const clicked = el.sender;
+ const clicked = ev.sender;
- if (el.sender === el) {
+ if (ev.sender === el) {
if (clicked.classList.contains('selected')) {
clicked.classList.remove('selected');
} else {
@@ -64,7 +64,7 @@ export default class {
}
async saveBookmarks(ev, el) {
- const bookmarkHref = el.ds('bookmarkEndpoint');
+ const bookmarkHref = el.prop('bookmarkEndpoint');
const collection = el.querySelector('.bookmark-dropdown-item.selected');
let data = {};
if (collection) {
@@ -73,7 +73,7 @@ export default class {
data['memo'] = el.querySelector('.bookmark-memo-input').value;
} else {
data['operation'] = 'remove';
- data['collection_id'] = el.ds('originallyContainedIn');
+ data['collection_id'] = el.prop('originallyContainedIn');
}
const options = {
@@ -83,7 +83,7 @@ export default class {
'Content-Type': 'application/json',
},
}
- const requireReload = el.dsInt('requireReload') !== 0;
+ const requireReload = el.propToInt('requireReload') !== 0;
el.remove();
await fetch(bookmarkHref, options);
if (requireReload) {
@@ -104,10 +104,10 @@ export default class {
toggleAccordion(ev, el) {
const accordion = el;
const header = accordion.querySelector('.accordion-header');
- if (!header.contains(el.sender)){
+ if (!header.contains(ev.sender)){
return;
}
- const btn = el.sender;
+ const btn = ev.sender;
const content = el.querySelector('.accordion-content');
// these are all meant to be in sync
accordion.classList.toggle('hidden');
@@ -117,15 +117,15 @@ export default class {
toggleTab(ev, el) {
const tabButtonsContainer = el.querySelector('.tab-buttons');
- if (!el.contains(el.sender)) {
+ if (!el.contains(ev.sender)) {
return;
}
- if (el.sender.classList.contains('active')) {
+ if (ev.sender.classList.contains('active')) {
return;
}
- const targetId = el.senderDs('targetId');
+ const targetId = ev.sender.prop('targetId');
const contents = el.querySelectorAll('.tab-content');
for (let content of contents) {
if (content.id === targetId) {
@@ -145,7 +145,7 @@ export default class {
#previousMarkup = null;
async babycodePreview(ev, el) {
- if (el.sender.classList.contains('active')) {
+ if (ev.sender.classList.contains('active')) {
return;
}
@@ -200,9 +200,9 @@ export default class {
}
insertBabycodeTag(ev, el) {
- const tagStart = el.senderDs('tag');
- const breakLine = 'breakLine' in el.sender.dataset;
- const prefill = 'prefill' in el.sender.dataset ? el.sender.dataset.prefill : '';
+ const tagStart = ev.sender.prop('tag');
+ const breakLine = 'breakLine' in ev.sender.dataset;
+ const prefill = 'prefill' in ev.sender.dataset ? ev.sender.dataset.prefill : '';
const hasAttr = tagStart[tagStart.length - 1] === '=';
let tagEnd = tagStart;
@@ -250,13 +250,13 @@ export default class {
}
addQuote(ev, el) {
- el.value += el.sender.value;
+ el.value += ev.sender.value;
el.scrollIntoView();
el.focus();
}
convertTimestamps(ev, el) {
- const timestamp = el.dsInt('utc');
+ const timestamp = el.propToInt('utc');
if (!isNaN(timestamp)) {
const date = new Date(timestamp * 1000);
el.textContent = date.toLocaleString();
@@ -273,7 +273,7 @@ export default class {
this.#currentUsername = userInfo.value.user.username;
}
- if (el.ds('username') === this.#currentUsername) {
+ if (el.prop('username') === this.#currentUsername) {
el.classList.add('me');
}
}
@@ -316,18 +316,18 @@ export class BadgeEditorForm {
}
deleteBadge(ev, el) {
- if (!el.contains(el.sender)) {
+ if (!el.contains(ev.sender)) {
return;
}
el.remove();
this.api.localTrigger('updateBadgeCount');
}
- updateBadgeCount(_ev, el) {
+ updateBadgeCount(ev, el) {
const badgeCount = el.parentNode.parentNode.querySelectorAll('.settings-badge-container').length;
- if (el.dsInt('disableIfMax') === 1) {
+ if (el.propToInt('disableIfMax') === 1) {
el.disabled = badgeCount === 10;
- } else if (el.dsInt('count') === 1) {
+ } else if (el.propToInt('count') === 1) {
el.textContent = `${badgeCount}/10`;
}
}
@@ -364,13 +364,13 @@ export class BadgeEditorBadge {
if (ev.type !== 'change') {
return;
}
- // TODO: el.sender doesn't have a bittyParentBittyId
- const selectBittyParent = el.sender.closest('bitty-7-0');
- if (el.bittyParentBittyId !== selectBittyParent.dataset.bittyid) {
+ // TODO: ev.sender doesn't have a bittyParent
+ const selectBittyParent = ev.sender.closest('bitty-7-0');
+ if (el.bittyParent !== selectBittyParent) {
return;
}
- if (ev.val === 'custom') {
+ if (ev.value === 'custom') {
if (this.#badgeCustomImageData) {
el.src = this.#badgeCustomImageData;
} else {
@@ -378,7 +378,7 @@ export class BadgeEditorBadge {
}
return;
}
- const option = el.sender.selectedOptions[0];
+ const option = ev.sender.selectedOptions[0];
el.src = option.dataset.filePath;
}
@@ -386,13 +386,13 @@ export class BadgeEditorBadge {
if (ev.type !== 'change') {
return;
}
- if (el.bittyParentBittyId !== el.sender.bittyParentBittyId) {
+ if (el.bittyParent !== ev.sender.bittyParent) {
return;
}
const file = ev.target.files[0];
if (file.size >= 1000 * 500) {
- this.api.trigger('badgeErrorSize');
+ this.api.localTrigger('badgeErrorSize');
this.#badgeCustomImageData = null;
el.removeAttribute('src');
return;
@@ -403,14 +403,14 @@ export class BadgeEditorBadge {
reader.onload = async e => {
const dimsValid = await validateBase64Img(e.target.result);
if (!dimsValid) {
- this.api.trigger('badgeErrorDim');
+ this.api.localTrigger('badgeErrorDim');
this.#badgeCustomImageData = null;
el.removeAttribute('src');
return;
}
this.#badgeCustomImageData = e.target.result;
el.src = this.#badgeCustomImageData;
- this.api.trigger('badgeHideErrors');
+ this.api.localTrigger('badgeHideErrors');
}
reader.readAsDataURL(file);
@@ -420,13 +420,13 @@ export class BadgeEditorBadge {
if (ev.type !== 'change') {
return;
}
- // TODO: el.sender doesn't have a bittyParentBittyId
- const selectBittyParent = el.sender.closest('bitty-7-0');
- if (el.bittyParentBittyId !== selectBittyParent.dataset.bittyid) {
+ // TODO: ev.sender doesn't have a bittyParent
+ const selectBittyParent = ev.sender.closest('bitty-7-0');
+ if (el.bittyParent !== selectBittyParent) {
return;
}
const filePicker = el.querySelector('input[type=file]');
- if (ev.val === 'custom') {
+ if (ev.value === 'custom') {
el.classList.remove('hidden');
if (filePicker.dataset.validity) {
filePicker.setCustomValidity(filePicker.dataset.validity);
@@ -440,37 +440,28 @@ export class BadgeEditorBadge {
}
openBadgeFilePicker(ev, el) {
- // TODO: el.sender doesn't have a bittyParentBittyId
- if (el.sender.parentNode !== el.parentNode) {
+ // TODO: ev.sender doesn't have a bittyParent
+ if (ev.sender.parentNode !== el.parentNode) {
return;
}
el.click();
}
- badgeErrorSize(_ev, el) {
- if (el.sender !== el.bittyParent) {
- return;
- }
+ badgeErrorSize(ev, el) {
const validity = "Image can't be over 500KB."
el.dataset.validity = validity;
el.setCustomValidity(validity);
el.reportValidity();
}
- badgeErrorDim(_ev, el) {
- if (el.sender !== el.bittyParent) {
- return;
- }
+ badgeErrorDim(ev, el) {
const validity = "Image must be exactly 88x31 pixels."
el.dataset.validity = validity;
el.setCustomValidity(validity);
el.reportValidity();
}
- badgeHideErrors(_ev, el) {
- if (el.sender !== el.bittyParent) {
- return;
- }
+ badgeHideErrors(ev, el) {
delete el.dataset.validity;
el.setCustomValidity('');
}
diff --git a/data/static/js/vnd/bitty-7.0.0-rc1.min.js b/data/static/js/vnd/bitty-7.0.0-rc1.min.js
deleted file mode 100644
index 2fc4b9b..0000000
--- a/data/static/js/vnd/bitty-7.0.0-rc1.min.js
+++ /dev/null
@@ -1 +0,0 @@
-const t=[7,0,0],e=`bitty-${t[0]}-${t[1]}`;function n(t,e){null!==t&&(e.isTarget=t.target.dataset.bittyid===e.dataset.bittyid,e.isSender=e.sender.dataset.bittyid===e.dataset.bittyid),e.bittyParent=s(e),e.bittyParentBittyId=e.bittyParent.dataset.bittyid,e.bittyId=e.dataset.bittyid,e.ds=t=>c.call(null,e,t),e.dsInt=t=>parseInt(c.call(null,e,t)),e.dsFloat=t=>parseFloat(c.call(null,e,t)),null!==t&&(e.targetBittyId=t.target.dataset.bittyid),e.targetDs=e=>c.call(null,t.target,e),e.targetDsInt=e=>parseInt(c.call(null,t.target,e)),e.targetDsFloat=e=>parseFloat(c.call(null,t.target,e)),null!==t&&(e.senderBittyId=e.sender.dataset.bittyid),e.senderDs=t=>c.call(null,e.sender,t),e.senderDsInt=t=>parseInt(c.call(null,e.sender,t)),e.senderDsFloat=t=>parseFloat(c.call(null,e.sender,t)),e.value&&(e.val=e.value,e.valInt=parseInt(e.value,10),e.valFloat=parseFloat(e.value)),null!==t&&t.target.value&&(e.targetVal=t.target.value,e.targetValInt=parseInt(t.target.value,10),e.targetValFloat=parseFloat(t.target.value)),null!==t&&e.sender.value&&(e.senderVal=e.sender.value,e.senderValInt=parseInt(e.sender.value,10),e.senderValFloat=parseFloat(e.sender.value)),e.matchTargetDs=n=>{const a=c.call(null,t.target,n),s=c.call(null,e,n);return void 0!==a&&void 0!==s&&a===s},e.matchSenderDs=t=>{const n=c.call(null,e.sender,t),a=c.call(null,e,t);return void 0!==n&&void 0!==a&&n===a}}function a(t){return t.dataset&&t.dataset.send||t.dataset&&t.dataset.use?t:t.parentNode?a(t.parentNode):void 0}function s(t){return t.localName.toLowerCase()===e?t:t.parentNode?s(t.parentNode):null}class i extends Error{constructor(t){super(),Error.captureStackTrace&&Error.captureStackTrace(this,i),this.name="BittyError";for(let[e,n]of Object.entries(t))this[e]=n}}class r extends Event{constructor(t,e){super("bittyforward",{bubbles:!0}),this.forwardedEvent=t,this.forwardedSignal=e}}class o extends Event{constructor(t){super("bittylocaltrigger",{bubbles:!0}),this.signal=t}}class l extends Event{constructor(t){super("bittytrigger",{bubbles:!0}),this.signal=t}}function c(t,e){if(void 0!==t.dataset)return void 0!==t.dataset[e]?t.dataset[e]:t.parentNode?c(t.parentNode,e):void 0}class d extends HTMLElement{constructor(){super(),this.config={listeners:["click","input"],license:"CC0",version:t}}async connectedCallback(){this.dataset.bittyid=self.crypto.randomUUID(),await this.makeConnection(),this.conn&&(this.conn.api=this,this.handleEventBridge=this.handleEvent.bind(this),this.setIds(this),this.addEventListeners(),await this.runBittyInit(),await this.runDataInits(),await this.runBittyReady())}addEventListeners(){const t=["bittyforward","bittylocaltrigger","bittytrigger"];this.dataset.listeners?this.trimInput(this.dataset.listeners).forEach(e=>{t.push(e)}):(t.push("click"),t.push("input")),t.forEach(t=>{window.addEventListener(t,t=>{this.handleEventBridge.call(this,t)})})}connectedMoveCallback(){}doSubs(t,e){return e.forEach(e=>{const n=typeof e[1],a=Object.prototype.toString.call(e[1]);if("object"===n&&"[object Array]"===a){const n=e[1].map(t=>{const e=typeof t,n=Object.prototype.toString.call(t);return"object"===e&&"[object DocumentFragment]"===n?[...t.childNodes].map(t=>"[object Text]"===Object.prototype.toString.call(t)?t.wholeText:t.outerHTML).join(""):"object"===e?t.outerHTML:t}).join("");t=t.replaceAll(e[0],n)}else if("object"===n&&"[object DocumentFragment]"===a){const n=[];[...e[1].childNodes].forEach(t=>{"[object Text]"===Object.prototype.toString.call(t)?n.push(t.wholeText):n.push(t.outerHTML)}),t=t.replaceAll(e[0],n.join(""))}else t="object"==typeof e[1]?t.replaceAll(e[0],e[1].outerHTML):t.replaceAll(e[0],e[1])}),t}forward(t,e){const n=new r(t,e);this.dispatchEvent(n)}getBittyParent(t){return t.localName.toLowerCase()===e?t:t.parentNode?this.getBittyParent(t.parentNode):null}async getElement(t,e=[],n={}){const a=await this.getHTML(t,e,n,"getElement");if(a.value){return{value:a.value.firstChild}}return a}async getHTML(t,e=[],n={}){const a=await this.getTXT(t,e,n,"getHTML");return a.error?a:{value:this.makeHTML(a.value,e)}}async getJSON(t,e=[],n={}){const a=await this.getTXT(t,e,n,"getJSON");if(a.error)return a;try{const t=JSON.parse(a.value);return{value:t}}catch(t){return{error:new i({type:"parsing"})}}}async getSVG(t,e=[],n={}){const a=await this.getTXT(t,e,n,"getSVG");if(a.error)return a;{const t=document.createElement("template");t.innerHTML=a.value;return{value:t.content.cloneNode(!0).querySelector("svg")}}}async getTXT(t,e=[],n={},a="getTXT"){let s=await fetch(t,n);try{if(s.ok){return{value:this.doSubs(await s.text(),e)}}throw new i({type:"fetching",message:`${a}() returned ${s.status} [${s.statusText}] in:\n${a}(${s.url}, ${JSON.stringify(e)}, ${JSON.stringify(n)})`,statusText:s.statusText,status:s.status,url:s.url,incomingMethod:a,subs:e,options:n})}catch(t){return console.error(`BittyError: ${t.message}`),{error:t}}}async handleEvent(t){if(function(t){void 0!==t.target.value&&(t.val=t.target.value,t.valInt=parseInt(t.target.value,10),t.valFloat=parseFloat(event.target.value)),t.ds=e=>c.call(null,t.target,e),t.dsInt=e=>parseInt(c.call(null,t.target,e)),t.dsFloat=e=>parseFloat(c.call(null,t.target,e))}(t),"bittylocaltrigger"===t.type){const e=this.trimInput(t.signal),a=this.querySelectorAll("[data-receive]");for(let i of e){let e=!1;const r=i.split(":");if(2===r.length&&"await"===r[0]&&(e=!0,i=r[1]),this.conn[i]){const r=s(t.target);let o=!1;for(let l of a){l.sender=t.target;const a=s(l);if(r.dataset.bittyid===a.dataset.bittyid){const a=this.trimInput(l.dataset.receive);for(let s of a){const a=s.split(":");2===a.length&&"await"===a[0]&&(e=!0,s=a[1]),s===i&&(o=!0,n(t,l),e?await this.conn[i](t,l):this.conn[i](t,l))}}}!1===o&&r.dataset.bittyid===this.dataset.bittyid&&(e?await this.conn[i](t,null):this.conn[i](t,null))}}}else if("bittytrigger"===t.type){const e=this.trimInput(t.signal),a=this.querySelectorAll("[data-receive]");for(let s of e){let e=!1;const i=s.split(":");if(2===i.length&&"await"===i[0]&&(e=!0,s=i[1]),this.conn[s]){let i=!1;for(let r of a){r.sender=t.target;const a=this.trimInput(r.dataset.receive);for(let o of a){const a=o.split(":");2===a.length&&"await"===a[0]&&(e=!0,o=a[1]),o===s&&(i=!0,n(t,r),e?await this.conn[s](t,r):this.conn[s](t,r))}}!1===i&&(e?await this.conn[s](t,null):this.conn[s](t,null))}}}else if("bittyforward"===t.type){const e=this.trimInput(t.forwardedSignal);t=t.forwardedEvent;const a=this.querySelectorAll("[data-receive]");for(let s of a){s.sender=t.target,n(t,s);const a=this.trimInput(s.dataset.receive);for(let n of a)e.includes(n)&&this.conn[n]&&this.conn[n](t,s)}}else{const e=a(t.target);if(e){const a=this.querySelectorAll("[data-use]");if(e.dataset.use){const s=this.trimInput(e.dataset.use);if(a.length>0)for(let i of s){let s=!1;const r=i.split(":");if(2===r.length&&"await"===r[0]&&(s=!0,i=r[1]),this.conn[i])for(let r of a)r.sender=e,n(t,r),r.bittyId===r.senderBittyId&&(s?await this.conn[i](t,r):this.conn[i](t,r))}}if(e.dataset.send){const a=this.trimInput(e.dataset.send),s=this.querySelectorAll("[data-receive]");for(let i of a){let a=!1;const r=i.split(":");if(2===r.length&&"await"===r[0]&&(a=!0,i=r[1]),this.conn[i]){let r=!1;for(let o of s){o.sender=e;const s=this.trimInput(o.dataset.receive);for(const e of s){const s=e.split(":");2===s.length&&"await"===s[0]&&(e=s[1]),e===i&&(r=!0,n(t,o),a?await this.conn[i](t,o):this.conn[i](t,o))}}!1===r&&(a?await this.conn[i](t,null):this.conn[i](t,null))}}}}}}localTrigger(t){const e=new o(t);this.dispatchEvent(e)}async loadCSS(t,e,n){const a=await this.getTXT(t,e,n,"loadCSS");if(a.error)return a;{const t=new CSSStyleSheet;return t.replaceSync(a.value),document.adoptedStyleSheets.push(t),{value:a.value}}}async makeConnection(){try{if(this.dataset.connect){let t=this.trimInput(this.dataset.connect);if(void 0!==window[t[0]])this.conn=new window[t[0]];else{if("/"===t[0].substring(0,1)){const e=new URL(window.location.href);t[0]=new URL(t[0],e.origin).toString()}if("http"===t[0].substring(0,4)){const e=await import(t[0]);void 0===t[1]?this.conn=new e.default:this.conn=new e[t[1]]}else console.error(`Tried to use 'data-connect="${this.dataset.connect}" which did not match a class on the page which means an attempt to use it as a URL was made. It failed becasue the URL version of 'data-connect' must start with 'http' or '/'. Other URLs are not currently supported`)}}else window.BittyClass?this.conn=new window.BittyClass:console.error(`${e} error: No class to connect to.`)}catch(t){console.error(`${e} error: ${t} - ${this.dataset.connect}`)}}makeElement(t,e=[]){return this.makeHTML(t,e).firstChild}makeHTML(t,e=[]){const n=document.createElement("template");n.innerHTML=this.makeTXT(t,e).trim();const a=n.content.cloneNode(!0);return this.setIds(a),a}makeSVG(t,e=[]){const n=document.createElement("template");n.innerHTML=this.makeTXT(t,e).trim();return n.content.cloneNode(!0).querySelector("svg")}makeTXT(t,e=[]){return this.doSubs(t,e)}async runBittyInit(){"function"==typeof this.conn.bittyInit&&("AsyncFunction"===this.conn.bittyInit[Symbol.toStringTag]?await this.conn.bittyInit():this.conn.bittyInit())}async runBittyReady(){"function"==typeof this.conn.bittyReady&&("AsyncFunction"===this.conn.bittyReady[Symbol.toStringTag]?await this.conn.bittyReady():this.conn.bittyReady())}async runDataInits(){if(this.dataset.init){const t=this.trimInput(this.dataset.init);for(let e of t)"function"==typeof this.conn[e]&&("AsyncFunction"===this.conn[e][Symbol.toStringTag]?await this.conn[e](null,this):this.conn[e](null,this))}for(let t of this.querySelectorAll("[data-init]"))if(t.dataset.init){n(null,t);const e=this.trimInput(t.dataset.init);for(let n of e)"function"==typeof this.conn[n]&&("AsyncFunction"===this.conn[n][Symbol.toStringTag]?await this.conn[n](null,t):this.conn[n](null,t))}}setProp(t,e){document.documentElement.style.setProperty(t,e)}setIds(t){t.querySelectorAll("*").forEach(t=>{t.dataset.bittyid||(t.dataset.bittyid=self.crypto.randomUUID())})}trigger(t){const e=new l(t);this.dispatchEvent(e)}trimInput(t){return t.trim().split(/\s+/m).map(t=>t.trim())}}customElements.define(e,d);
\ No newline at end of file
diff --git a/data/static/js/vnd/bitty-7.0.0.js b/data/static/js/vnd/bitty-7.0.0.js
new file mode 100644
index 0000000..adfe260
--- /dev/null
+++ b/data/static/js/vnd/bitty-7.0.0.js
@@ -0,0 +1 @@
+const t=[7,0,0],e=`bitty-${t[0]}-${t[1]}`;class n extends Error{constructor(t){super(),Error.captureStackTrace&&Error.captureStackTrace(this,n),this.name="BittyError";for(let[e,n]of Object.entries(t))this[e]=n}}class s extends Event{constructor(t,e){super("bittyforward",{bubbles:!0}),this.forwardedEvent=t,this.forwardedSignal=e}}class a extends Event{constructor(t,e){super("bittylocaltrigger",{bubbles:!0}),this.signal=t,this.localId=e}}class r extends Event{constructor(t){super("bittytrigger",{bubbles:!0}),this.signal=t}}function i(t,e){if(void 0!==t.dataset)return void 0!==t.dataset[e]?t.dataset[e]:t.parentNode?i(t.parentNode,e):void 0}class o extends HTMLElement{constructor(){super(),this.config={listeners:["click","input"],license:"CC0",version:t}}async connectedCallback(){this.dataset.bittyid=self.crypto.randomUUID(),this.bittyId=this.dataset.bittyid,await this.makeConnection(),this.conn&&(this.conn.api=this,this.setIds(this),this.handleEventBridge=this.handleEvent.bind(this),this.addEventListeners(),await this.runBittyInit(),await this.runDataInits(),await this.runBittyReady())}addEventListeners(){const t=["bittyforward","bittylocaltrigger","bittytrigger"];this.dataset.listeners?this.trimInput(this.dataset.listeners).forEach(e=>{t.push(e)}):(t.push("click"),t.push("input")),t.forEach(t=>{window.addEventListener(t,t=>{this.handleEventBridge.call(this,t)})})}connectedMoveCallback(){}doSubs(t,e){return e.forEach(e=>{const n=typeof e[1],s=Object.prototype.toString.call(e[1]);if("object"===n&&"[object Array]"===s){const n=e[1].map(t=>{const e=typeof t,n=Object.prototype.toString.call(t);return"object"===e&&"[object DocumentFragment]"===n?[...t.childNodes].map(t=>"[object Text]"===Object.prototype.toString.call(t)?t.wholeText:t.outerHTML).join(""):"object"===e?t.outerHTML:t}).join("");t=t.replaceAll(e[0],n)}else if("object"===n&&"[object DocumentFragment]"===s){const n=[];[...e[1].childNodes].forEach(t=>{"[object Text]"===Object.prototype.toString.call(t)?n.push(t.wholeText):n.push(t.outerHTML)}),t=t.replaceAll(e[0],n.join(""))}else t="object"==typeof e[1]?t.replaceAll(e[0],e[1].outerHTML):t.replaceAll(e[0],e[1])}),t}expandElement(t,e){null!==t&&(e.isTarget=t.target.dataset.bittyid===e.dataset.bittyid,e.isSender=t.sender.dataset.bittyid===e.dataset.bittyid),e.bittyParent=this.getBittyParent(e),e.prop=t=>i.call(null,e,t),e.propToInt=t=>parseInt(i.call(null,e,t)),e.propToFloat=t=>parseFloat(i.call(null,e,t)),e.value&&(e.valueToInt=parseInt(e.value,10),e.valueToFloat=parseFloat(e.value)),e.propMatchesTarget=n=>{const s=i.call(null,t.target,n),a=i.call(null,e,n);return void 0!==s&&void 0!==a&&s===a},e.propMatchesSender=n=>{const s=i.call(null,t.sender,n),a=i.call(null,e,n);return void 0!==s&&void 0!==a&&s===a}}expandEvent(t){t.sender=this.findSender(t.target),t.sender&&t.sender.dataset&&t.sender.dataset.bittyid&&(t.sender.bittyId=t.sender.dataset.bittyid),t.sender.dataset&&t.sender.dataset.send&&(t.sendPayload=t.sender.dataset.send),t.sender&&t.sender.value&&(t.sender.valueToInt=parseInt(t.sender.value,10),t.sender.valueToFloat=parseFloat(t.sender.value)),t.sender&&(t.sender.prop=e=>i.call(null,t.sender,e),t.sender.propToInt=e=>parseInt(i.call(null,t.sender,e),10),t.sender.propToFloat=e=>parseFloat(i.call(null,t.sender,e))),void 0!==t.target.value&&(t.value=t.target.value,t.valueToInt=parseInt(t.target.value,10),t.valueToFloat=parseFloat(event.target.value)),t.bittyId=t.target.dataset.bittyid,t.prop=e=>i.call(null,t.target,e),t.propToInt=e=>parseInt(i.call(null,t.target,e)),t.propToFloat=e=>parseFloat(i.call(null,t.target,e))}findSender(t){return t.dataset&&t.dataset.send||t.dataset&&t.dataset.use?t:t.parentNode?this.findSender(t.parentNode):this}forward(t,e){const n=new s(t,e);this.dispatchEvent(n)}getBittyParent(t){return t.localName.toLowerCase()===e?t:t.parentNode?this.getBittyParent(t.parentNode):this}async getElement(t,e=[],n={}){const s=await this.getHTML(t,e,n,"getElement");if(s.value){return{value:s.value.firstChild}}return s}async getHTML(t,e=[],n={}){const s=await this.getTXT(t,e,n,"getHTML");return s.error?s:{value:this.makeHTML(s.value,e)}}async getJSON(t,e=[],s={}){const a=await this.getTXT(t,e,s,"getJSON");if(a.error)return a;try{const t=JSON.parse(a.value);return{value:t}}catch(t){return{error:new n({type:"parsing"})}}}async getSVG(t,e=[],n={}){const s=await this.getTXT(t,e,n,"getSVG");if(s.error)return s;{const t=document.createElement("template");t.innerHTML=s.value;return{value:t.content.cloneNode(!0).querySelector("svg")}}}async getTXT(t,e=[],s={},a="getTXT"){let r=await fetch(t,s);try{if(r.ok){return{value:this.doSubs(await r.text(),e)}}throw new n({type:"fetching",message:`${a}() returned ${r.status} [${r.statusText}] in:\n${a}(${r.url}, ${JSON.stringify(e)}, ${JSON.stringify(s)})`,statusText:r.statusText,status:r.status,url:r.url,incomingMethod:a,subs:e,options:s})}catch(t){return console.error(`BittyError: ${t.message}`),{error:t}}}async handleEvent(t){if("bittyforward"===t.type){const e=t.forwardedEvent;e.sendPayload=t.forwardedSignal,await this.processEvent(e)}else if(this.expandEvent(t),"bittylocaltrigger"===t.type)t.sendPayload=t.signal,await this.processEvent(t);else if("bittytrigger"===t.type)t.sendPayload=t.signal,await this.processEvent(t);else{if(t.sender.dataset.use){const e=this.trimInput(t.sender.dataset.use);for(let n of e){let e=!1;const s=n.split(":");2===s.length&&"await"===s[0]&&(e=!0,n=s[1]),this.conn[n]&&(this.expandElement(t,t.sender),e?await this.conn[n](t,t.sender):this.conn[n](t,t.sender))}}t.sender.dataset.send&&(t.sendPayload=t.sender.dataset.send,await this.processEvent(t))}}async loadCSS(t,e=[],n={}){const s=await this.getTXT(t,e,n,"loadCSS");if(s.error)return s;{const t=new CSSStyleSheet;return t.replaceSync(s.value),document.adoptedStyleSheets.push(t),{value:s.value}}}localTrigger(t){const e=new a(t,this.bittyId);this.dispatchEvent(e)}async makeConnection(){try{if(this.dataset.connect){let t=this.trimInput(this.dataset.connect);if(void 0!==window[t[0]])this.conn=new window[t[0]];else{if("/"===t[0].substring(0,1)){const e=new URL(window.location.href);t[0]=new URL(t[0],e.origin).toString()}if("http"===t[0].substring(0,4)){const n=await import(t[0]);if(void 0===t[1])try{this.conn=new n.default}catch(t){console.error(`${e} error [${t}] - data-connect="${this.dataset.connect}" failed - Check the file "${this.dataset.connect}" to make sure it has an "export default class {}"`)}else try{this.conn=new n[t[1]]}catch(n){console.error(`${e} error [${n}] - data-connect="${this.dataset.connect}" failed - Check the file "${t[0]}" to make sure it has an "export class ${t[1]} {}"`)}}else console.error(`${e} error: Tried to use 'data-connect="${this.dataset.connect}" which did not match a class on the page which means an attempt to use it as a URL was made. It failed becasue the URL version of 'data-connect' must start with 'http' or '/'. Other URLs are not currently supported`)}}else window.BittyClass?this.conn=new window.BittyClass:console.error(`${e} error: Could not find "window.BittyClass" on the page to connect to (which is needed because there is no "data-connect" attribute).`)}catch(t){console.error(`${e} error: [${t}] - ${this.dataset.connect}`)}}makeElement(t,e=[]){return this.makeHTML(t,e).firstChild}makeHTML(t,e=[]){const n=document.createElement("template");n.innerHTML=this.makeTXT(t,e).trim();const s=n.content.cloneNode(!0);return this.setIds(s),s}makeSVG(t,e=[]){const n=document.createElement("template");n.innerHTML=this.makeTXT(t,e).trim();return n.content.cloneNode(!0).querySelector("svg")}makeTXT(t,e=[]){return this.doSubs(t,e)}async processEvent(t){if(t.localId&&t.localId!==this.bittyId)return null;if(t.sendPayload){const e=this.trimInput(t.sendPayload);for(let n of e){let e=!1;const s=n.split(":");if(2===s.length&&"await"===s[0]&&(e=!0,n=s[1]),this.conn[n]){let s=!1;const a=this.querySelectorAll("[data-receive]");for(let r of a){const a=this.trimInput(r.dataset.receive);for(let i of a){const a=i.split(":");2===a.length&&"await"===a[0]&&(i=a[1]),i===n&&(s=!0,this.expandElement(t,r),e?await this.conn[n](t,r):this.conn[n](t,r))}}!1===s&&(e?await this.conn[n](t,null):this.conn[n](t,null))}}}}async runBittyInit(){"function"==typeof this.conn.bittyInit&&("AsyncFunction"===this.conn.bittyInit[Symbol.toStringTag]?await this.conn.bittyInit():this.conn.bittyInit())}async runBittyReady(){"function"==typeof this.conn.bittyReady&&("AsyncFunction"===this.conn.bittyReady[Symbol.toStringTag]?await this.conn.bittyReady():this.conn.bittyReady())}async runDataInits(){if(this.dataset.init){const t=this.trimInput(this.dataset.init);for(let e of t)"function"==typeof this.conn[e]&&("AsyncFunction"===this.conn[e][Symbol.toStringTag]?await this.conn[e](null,this):this.conn[e](null,this))}for(let t of this.querySelectorAll("[data-init]"))if(t.dataset.init){this.expandElement(null,t);const e=this.trimInput(t.dataset.init);for(let n of e)"function"==typeof this.conn[n]&&("AsyncFunction"===this.conn[n][Symbol.toStringTag]?await this.conn[n](null,t):this.conn[n](null,t))}}setProp(t,e){document.documentElement.style.setProperty(t,e)}setIds(t){t.querySelectorAll("*").forEach(t=>{t.dataset.bittyid||(t.dataset.bittyid=self.crypto.randomUUID()),t.bittyId||(t.bittyId=t.dataset.bittyid)})}trigger(t){const e=new r(t);this.dispatchEvent(e)}trimInput(t){return t.trim().split(/\s+/m).map(t=>t.trim())}async getQuickElement(t,e=[],n={}){const s=await this.getElement(t,e,n);return s.value?s.value:this.makeElement('Error (check console)')}async getQuickHTML(t,e=[],n={}){const s=await this.getElement(t,e,n);return s.value?s.value:this.makeHTML('Error (check console)')}async getQuickJSON(t,e=[],n={}){const s=await this.getJSON(t,e,n);return s.value?s.value:s.error}async getQuickSVG(t,e=[],n={}){const s=await this.getSVG(t,e,n);if(s.value)return s.value;{const t=document.createElement("template");t.innerHTML='';return t.content.cloneNode(!0).querySelector("svg")}}async getQuickTXT(t,e=[],n={}){const s=await this.getTXT(t,e,n);return s.value?s.value:s.error}}customElements.define(e,o);
\ No newline at end of file