From 35893ea7a01647de0e48ad6dc4ea0a0a8bed5c3e Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 15 Sep 2023 11:57:56 +0200 Subject: [PATCH 01/65] signalingMessage posting --- inkwell/inkwell.html | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/inkwell/inkwell.html b/inkwell/inkwell.html index 285aae7..ea36636 100644 --- a/inkwell/inkwell.html +++ b/inkwell/inkwell.html @@ -25,7 +25,7 @@
You may copy the id="storyweave-script" section from this page to your own pages to create an inkwell.
` } - + let maybeExtant = document.getElementById("storyweave-main-container"); let storageHost = window.storageHost ? window.storageHost : window.location.host; if (checkForParticipatingDiv() && document.getElementById("inkwell-configurator") == null) { @@ -35,7 +35,7 @@ // need to think of a better way to secure requests. const { action, key, value } = event.data; - //console.log(event.data); + console.log("Message Event Data", event.data); if (action === 'set') { localStorage.setItem(key, JSON.stringify(value)); } else if (action === 'get') { @@ -61,12 +61,14 @@ //use some backend for signalling as fallback/bootstrap //let the page embedding this script handle the logic //we just listen for their responses with an eventlistener + console.log("FallbackSignal"); const signalingEvent = new CustomEvent('signalingMessage', { detail: value }); - window.parent.dispatchEvent(signalingEvent); + document.getElementById("inkwell").dispatchEvent(signalingEvent); } }); window.addEventListener('signalingMessage', (event) => { + console.log("signalingMessage"); const message = event.detail; //console.log('Received signaling message:', message); window.parent.postMessage({ action: "backend_signal", value: message }, window.parent.origin); @@ -244,9 +246,13 @@ e.target.classList.add("sheen-effect"); switch (clickType) { case 'autoSignaling-button': + setTimeout(function() { console.log("autoSignaling object :", autoSignaling); + const signalingEvent = new CustomEvent('signalingMessage', { detail: autoSignaling }); + document.getElementById("inkwell").dispatchEvent(signalingEvent); }, 0); + break case 'top-story': case 'back-story': @@ -322,7 +328,7 @@ case 'manual-router': let signalInput = document.getElementById("manual-router"); try { - autoSignaling.sdpManual = outeSignalingMessage(JSON.parse(signalInput.value)); + autoSignaling.sdpManual = routeSignalingMessage(JSON.parse(signalInput.value)); routeSignalingMessage(JSON.parse(signalInput.value)); } catch (e) { console.info(e); From 2ab2c43b9fd8de44b8b352b787b6612d8820dba2 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 15 Sep 2023 11:59:20 +0200 Subject: [PATCH 02/65] signalingMessage basic logic --- script.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index 7457b66..9b8c364 100644 --- a/script.js +++ b/script.js @@ -58,6 +58,7 @@ async function appendPost(postID) { const post = postConstructor(postObject); const postsStartMarker = document.getElementById('posts-start-marker'); postContainer.insertBefore(post, postsStartMarker.nextSibling); + // Check if the number of posts in the post container has exceeded the maxPosts limit const maxPosts = userPrefs.maxPosts || 10; if (postContainer.children.length > maxPosts + 2) { @@ -317,4 +318,34 @@ async function signPost() { const signButton = document.getElementById('sign-button'); signButton.addEventListener('click', signPost); const clearButton = document.getElementById('clear-button'); -clearButton.addEventListener('click', clearPost); \ No newline at end of file +clearButton.addEventListener('click', clearPost); + +document.getElementById("inkwell").addEventListener('signalingMessage', async (event) => { + + // Define the post object with the desired properties + const stubPost = { + title: "Signaling details", + author: event.detail.id, + content: event.detail.sdpSender + " \n " + event.detail.manualSignal, + signature: postEditor.temp ? postEditor.temp.signature ? postEditor.temp.signature : "" : "" + }; + + const response = await fetch('/post', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(stubPost) + }); + + const data = await response.json(); + const postID = data.postID; + appendPost(postID); + + window.dispatchEvent(new Event('signalingMessage')); + + setTimeout(function() { + console.log('Received signaling event:', event.detail); + }, 0); + // Add logic here +}); From 25076f816e8b54c0965aeacc49ddff546ad64d46 Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Sun, 17 Sep 2023 16:49:50 +0200 Subject: [PATCH 03/65] console log cleanup --- inkwell/inkwell.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/inkwell/inkwell.html b/inkwell/inkwell.html index ea36636..2680386 100644 --- a/inkwell/inkwell.html +++ b/inkwell/inkwell.html @@ -61,14 +61,13 @@ //use some backend for signalling as fallback/bootstrap //let the page embedding this script handle the logic //we just listen for their responses with an eventlistener - console.log("FallbackSignal"); + const signalingEvent = new CustomEvent('signalingMessage', { detail: value }); document.getElementById("inkwell").dispatchEvent(signalingEvent); } }); window.addEventListener('signalingMessage', (event) => { - console.log("signalingMessage"); const message = event.detail; //console.log('Received signaling message:', message); window.parent.postMessage({ action: "backend_signal", value: message }, window.parent.origin); From 2093bac3ba3c94f0a6f2c94a5c5ea003dedcb923 Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Sun, 17 Sep 2023 16:50:19 +0200 Subject: [PATCH 04/65] Psuedo tag on signalling mesasge --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index 9b8c364..5590bf2 100644 --- a/script.js +++ b/script.js @@ -324,7 +324,7 @@ document.getElementById("inkwell").addEventListener('signalingMessage', async (e // Define the post object with the desired properties const stubPost = { - title: "Signaling details", + title: "[Signal] Signaling details", author: event.detail.id, content: event.detail.sdpSender + " \n " + event.detail.manualSignal, signature: postEditor.temp ? postEditor.temp.signature ? postEditor.temp.signature : "" : "" From 89ee48abe72af1ab27f3b5549f666726af9efd83 Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 11:49:58 +0200 Subject: [PATCH 05/65] New debug iframe added wip --- index.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 3b53db0..b7afef3 100644 --- a/index.html +++ b/index.html @@ -43,9 +43,14 @@
src bin + + +
+ +
+ - + \ No newline at end of file From 199dc704ecf35c8106a79f95f3f9fa0b18094afa Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 11:50:51 +0200 Subject: [PATCH 06/65] debug toggle added. --- script.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/script.js b/script.js index 5590bf2..4fdb662 100644 --- a/script.js +++ b/script.js @@ -349,3 +349,15 @@ document.getElementById("inkwell").addEventListener('signalingMessage', async (e }, 0); // Add logic here }); + +document.getElementById('debugButton').addEventListener('click', function() { + var debug = document.getElementById('debug'); + debug.style.display = (debug.style.display === 'none' || debug.style.display === '') ? 'block' : 'none'; +}); +document.getElementById('eventTest').addEventListener('click', function() { + logDebug("Hello world"); +}); + +function logDebug(message) { + document.getElementById('consoleOutput').innerHTML += `

${message}

`; +}; From 454211b5b0e077669a428164608b7938874aa75e Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 11:51:08 +0200 Subject: [PATCH 07/65] debug styilings --- style.css | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/style.css b/style.css index b3a8ade..cf51971 100644 --- a/style.css +++ b/style.css @@ -36,13 +36,16 @@ body { } .app-container { + display: flex; overflow-x: hidden; overflow-y: hidden; } footer { - height: 1rem; + height: fit-content; width: 100%; + display: flex; + justify-content: center; position: absolute; bottom: 0; } @@ -235,4 +238,18 @@ footer { /* Define a style for the secondary button when hovered */ button:hover { background-color: #c6afe9; +} + +#debug{ + width: fit-content; + height: fit-content; + display: none; +} +#debugButton{ + width: fit-content; + height: min-content; +} +#eventTest{ + width: fit-content; + height: min-content; } \ No newline at end of file From 91e510521a4d152199b2f9004db46bc3e9ba0901 Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 11:51:36 +0200 Subject: [PATCH 08/65] debug page --- inkwell/debugger.html | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 inkwell/debugger.html diff --git a/inkwell/debugger.html b/inkwell/debugger.html new file mode 100644 index 0000000..23fd77a --- /dev/null +++ b/inkwell/debugger.html @@ -0,0 +1,55 @@ + + + + + + Debugging Tools + + + + +
+

Console

+
+ +
+
+ + + + + From 49a72d18a50249a53f8e808a1c728185c30a2178 Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 13:29:36 +0200 Subject: [PATCH 09/65] Basic index <==> debugger message passing --- inkwell/debugger.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/inkwell/debugger.html b/inkwell/debugger.html index 23fd77a..f0a1920 100644 --- a/inkwell/debugger.html +++ b/inkwell/debugger.html @@ -51,5 +51,29 @@

Console

+ From e1a8697c0184b0ff6884eb6000827adb4a01ea3f Mon Sep 17 00:00:00 2001 From: Jerome Dupret Date: Fri, 22 Sep 2023 13:30:00 +0200 Subject: [PATCH 10/65] Logic for index <==> debugger messaging --- script.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/script.js b/script.js index 4fdb662..0852cf3 100644 --- a/script.js +++ b/script.js @@ -354,10 +354,17 @@ document.getElementById('debugButton').addEventListener('click', function() { var debug = document.getElementById('debug'); debug.style.display = (debug.style.display === 'none' || debug.style.display === '') ? 'block' : 'none'; }); + +function logDebug(message){ + document.getElementById("debugIframe").contentWindow.postMessage(message, 'http://localhost:8080/debugger.html'); +} + document.getElementById('eventTest').addEventListener('click', function() { logDebug("Hello world"); }); -function logDebug(message) { - document.getElementById('consoleOutput').innerHTML += `

${message}

`; -}; +window.addEventListener("message", function(event) { + if (event.origin === 'http://localhost:8080') { + console.log(event.data); + } + }); From 654215e7707a367078fd227a79bfbbf356e20774 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Thu, 28 Sep 2023 12:54:29 +0200 Subject: [PATCH 11/65] Mae the window translucent --- inkwell/debugger.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inkwell/debugger.html b/inkwell/debugger.html index f0a1920..ac621f7 100644 --- a/inkwell/debugger.html +++ b/inkwell/debugger.html @@ -7,6 +7,7 @@ Catalyst @@ -51,7 +61,6 @@ - \ No newline at end of file diff --git a/script.js b/script.js index aac5360..57103eb 100644 --- a/script.js +++ b/script.js @@ -65,6 +65,7 @@ async function appendPost(postID) { const postObject = await response.json(); postObject.postID = postID; const post = postConstructor(postObject); + console.log(post); const postsStartMarker = document.getElementById('posts-start-marker'); postContainer.insertBefore(post, postsStartMarker.nextSibling); @@ -122,7 +123,6 @@ async function loadPosts() { // Set the query parameters based on the user preferences const queryParams = `?max_posts=${userPrefs.maxPosts}&recency_days=${userPrefs.recencyDays}`; // Fetch the list of posts from the backend API - logDebug(queryParams); const response = await postResponse(queryParams); const posts = response.data; // Get an array of post IDs @@ -230,7 +230,7 @@ saveButton.addEventListener('click', async () => { // Get the post ID from the response and log it to the console const postObj = await postMethod(newPost); - logDebug(`New post created with ID: ${postObj.postID}`); + //logDebug(`New post created with ID: ${postObj.postID}`); if (postEditor.temp) if (postEditor.temp.pendingAnchors) postEditor.temp.pendingAnchors.forEach(pendingAnchor => { let postRendered = document.createElement("div"); @@ -272,7 +272,6 @@ async function signPost() { const postAuthor = document.querySelector('.post-editor #editor-author'); // Check if there is an existing keypair in localStorage const localStorageKeypair = localStorage.getItem("keySeed"); - logDebug(localStorageKeypair); let keypair = localStorageKeypair ? (() => { let keySeed = new Uint8Array(atob(localStorageKeypair).split("").map(c => c.charCodeAt(0))); @@ -299,12 +298,10 @@ async function signPost() { ...keypair.public_key_bytes() ) ); - logDebug(keypair.public_key_bytes()); // Sign the post content using the keypair const signature = keypair.sign( postEditor.value ); - logDebug(signature); // Store the signature in a variable waiting for post submission if (!postEditor.temp) { postEditor.temp = {} } postEditor.temp.signature = btoa( @@ -360,7 +357,6 @@ document.getElementById('eventTest').addEventListener('click', function() { logDebug("Hello world"); }); - async function postMethod(post){ const R = await fetch('/post', { method: 'POST', @@ -405,3 +401,6 @@ async function anchorMethod(anchor) { return responsePromise; }; + +//iframe constructor, works as stub function, put setHTML as inner html to contruct a post. +//check for local storage restrictions, permission security features. \ No newline at end of file From b3332a3480ba62320ba1f200d400f9b077a0f955 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 10 Nov 2023 15:18:51 +0100 Subject: [PATCH 33/65] iframes baby! replaced postConstructor logic to send to iframes including the stylings. Might be interesting to explore that. --- script.js | 65 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/script.js b/script.js index 57103eb..0197ba9 100644 --- a/script.js +++ b/script.js @@ -22,40 +22,55 @@ function getPostID(element) { return element ? element.id : null; } -//Jerome's attempt at a sanitizer -function basicParser(unparsed) { - const parser = new DOMParser(); - const parsed = parser.parseFromString(unparsed, 'text/html'); - console.log(parsed.getElementsByTagName("a")); -} - function postRenderer(postContentElement, postContent) { - basicParser(postContent); - postContentElement.setHTML + postContentElement.insertAdjacentHTML("afterbegin", postContent) + /*postContentElement.setHTML ? postContentElement.setHTML(postContent) : /<\/?[a-z][\s\S]*>/i.test(postContent) ? ((postContentElement.innerHTML = "unsupported browser, rendering in text mode:
"), postContentElement.appendChild(document.createTextNode(postContent))) - : (postContentElement.innerHTML = postContent); + : (postContentElement.innerHTML = postContent);*/ } function postConstructor(postObject) { - const post = document.createElement('div'); - const title = document.createElement('div'); - const author = document.createElement('div'); - const content = document.createElement('div'); - post.classList.add('post'); - title.classList.add('post-title'); - author.classList.add('post-author'); - content.classList.add('post-content'); - postRenderer(title, postObject.title); - postRenderer(author, postObject.author); - postRenderer(content, postObject.content); - post.appendChild(title); - post.appendChild(author); - post.appendChild(content); + const post = document.createElement('iframe'); + post.src = "about:blank"; + + post.onload = function() { + const cntWindow = post.contentWindow; + const cntDocument = cntWindow.document; + + // Create a link element for the stylesheet + const stylesheetLink = cntDocument.createElement('link'); + stylesheetLink.rel = 'stylesheet'; + stylesheetLink.type = 'text/css'; + stylesheetLink.href = 'style.css'; // Replace with the actual path to your stylesheet + + // Append the link element to the head of the iframe's document + cntDocument.head.appendChild(stylesheetLink); + + const title = cntWindow.document.createElement('div'); + const author = cntWindow.document.createElement('div'); + const content = cntWindow.document.createElement('div'); + + post.classList.add('post'); + title.classList.add('post-title'); + author.classList.add('post-author'); + content.classList.add('post-content'); + + postRenderer(title, postObject.title); + postRenderer(author, postObject.author); + postRenderer(content, postObject.content); + + cntWindow.document.body.appendChild(title); + cntWindow.document.body.appendChild(author); + cntWindow.document.body.appendChild(content); + }; + post.id = postObject.postID; - post.signature = postObject.signature + post.signature = postObject.signature; + return post; } + async function appendPost(postID) { const response = await postResponse(postID); if (!response.ok) { From 86b635bdc027a0c098e497d5da431a90cda0c744 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 10 Nov 2023 15:19:59 +0100 Subject: [PATCH 34/65] Basically since I was sending the entire stylesheet as reference for the iframes they would also have the giant catalyst logo. could be useful? needs changes in sizing and js logic to resize iframes maybe. --- style.css | 6 ------ 1 file changed, 6 deletions(-) diff --git a/style.css b/style.css index d2336dd..12ec046 100644 --- a/style.css +++ b/style.css @@ -1,12 +1,6 @@ @charset "UTF-8"; body { - background-image: url('/icon.svg'), url('/icon_text.svg'), linear-gradient(to bottom right, white, rgba(23, 11, 40, 0.3)); - background-position: top left, max(12%, 20em) 2%, top left; - background-size: max(9%, 10em), 40em, 130vw 130vh; - background-repeat: no-repeat, no-repeat, no-repeat; - overflow-x: hidden; - overflow-y: hidden; font-family: "URW Gothic", sans-serif; } From 17129e27b97beacc1d4bc4e7a4be36da9887c452 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Sat, 11 Nov 2023 11:13:47 +0100 Subject: [PATCH 35/65] iframe logic to send height info to parent. needs refining --- script.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index 0197ba9..6cb8c58 100644 --- a/script.js +++ b/script.js @@ -44,7 +44,6 @@ function postConstructor(postObject) { stylesheetLink.type = 'text/css'; stylesheetLink.href = 'style.css'; // Replace with the actual path to your stylesheet - // Append the link element to the head of the iframe's document cntDocument.head.appendChild(stylesheetLink); const title = cntWindow.document.createElement('div'); @@ -63,11 +62,39 @@ function postConstructor(postObject) { cntWindow.document.body.appendChild(title); cntWindow.document.body.appendChild(author); cntWindow.document.body.appendChild(content); + + // Create a script element for the sendHeightToParent function + const scriptElement = cntDocument.createElement('script'); + scriptElement.textContent = ` + function sendHeightToParent() { + // Get the height of the content + const height = document.body.scrollHeight; + + // Send a message to the parent with the height + parent.postMessage({ height }, '*'); + } + + // Call the function when the iframe is loaded + sendHeightToParent(); + `; + + // Append the script element to the body of the iframe's document + cntDocument.body.appendChild(scriptElement); }; post.id = postObject.postID; post.signature = postObject.signature; + window.addEventListener('message', function(event) { + // Ensure that the message is from a trusted source (optional) + // if (event.origin !== 'http://your-iframe-domain.com') return; + + // Adjust the height of the iframe + const iframe = document.getElementById(post.id); + console.log(iframe); + iframe.style.height = event.data.height + 'px'; + }); + return post; } From 80cf3884d332f3881c834664c8d63dbe895374cb Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Sat, 11 Nov 2023 11:14:08 +0100 Subject: [PATCH 36/65] iframe stylings --- style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/style.css b/style.css index 12ec046..fc9f1a2 100644 --- a/style.css +++ b/style.css @@ -24,6 +24,9 @@ body { font-family: inherit; z-index: 8; } +.post-container > iframe{ + max-height: calc(83vh - 1rem); +} .post-container.small { left: 0; @@ -59,6 +62,7 @@ footer { width: calc(100% - 10px); font-family: inherit; z-index: 4; + flex: none; } /* Define a style for the post title */ From 9292d6ed4f2007731302b9a0724f97f71e4972a4 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Sat, 11 Nov 2023 12:38:01 +0100 Subject: [PATCH 37/65] Okay so a container containing the iframe now so that author and title are outside of iframe --- script.js | 123 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 68 insertions(+), 55 deletions(-) diff --git a/script.js b/script.js index 6cb8c58..d472e26 100644 --- a/script.js +++ b/script.js @@ -31,73 +31,86 @@ function postRenderer(postContentElement, postContent) { : (postContentElement.innerHTML = postContent);*/ } function postConstructor(postObject) { - const post = document.createElement('iframe'); - post.src = "about:blank"; - - post.onload = function() { - const cntWindow = post.contentWindow; - const cntDocument = cntWindow.document; - - // Create a link element for the stylesheet - const stylesheetLink = cntDocument.createElement('link'); - stylesheetLink.rel = 'stylesheet'; - stylesheetLink.type = 'text/css'; - stylesheetLink.href = 'style.css'; // Replace with the actual path to your stylesheet - - cntDocument.head.appendChild(stylesheetLink); + // Create container element for title and author (in main DOM) + const container = document.createElement('div'); + const title = document.createElement('div'); + const author = document.createElement('div'); - const title = cntWindow.document.createElement('div'); - const author = cntWindow.document.createElement('div'); - const content = cntWindow.document.createElement('div'); + container.classList.add('post'); + title.classList.add('post-title'); + author.classList.add('post-author'); - post.classList.add('post'); - title.classList.add('post-title'); - author.classList.add('post-author'); - content.classList.add('post-content'); + postRenderer(title, postObject.title); + postRenderer(author, postObject.author); - postRenderer(title, postObject.title); - postRenderer(author, postObject.author); - postRenderer(content, postObject.content); + container.appendChild(title); + container.appendChild(author); - cntWindow.document.body.appendChild(title); - cntWindow.document.body.appendChild(author); - cntWindow.document.body.appendChild(content); - - // Create a script element for the sendHeightToParent function - const scriptElement = cntDocument.createElement('script'); - scriptElement.textContent = ` - function sendHeightToParent() { - // Get the height of the content - const height = document.body.scrollHeight; - - // Send a message to the parent with the height - parent.postMessage({ height }, '*'); - } - - // Call the function when the iframe is loaded - sendHeightToParent(); - `; + // Create iframe + const post = document.createElement('iframe'); + post.classList.add('post'); + post.src = "about:blank"; - // Append the script element to the body of the iframe's document - cntDocument.body.appendChild(scriptElement); - }; + post.onload = function() { + const cntWindow = post.contentWindow; + const cntDocument = cntWindow.document; + + // Create a link element for the stylesheet + const stylesheetLink = cntDocument.createElement('link'); + stylesheetLink.rel = 'stylesheet'; + stylesheetLink.type = 'text/css'; + stylesheetLink.href = 'style.css'; // Replace with the actual path to your stylesheet + + stylesheetLink.onload = function() { + // Create content element within the iframe + const content = cntDocument.createElement('div'); + content.classList.add('post-content'); + postRenderer(content, postObject.content); + + // Append content to the iframe's body + cntDocument.body.appendChild(content); + + // Create a script element for the sendHeightToParent function + const scriptElement = cntDocument.createElement('script'); + scriptElement.textContent = ` + function sendHeightToParent() { + // Get the height of the content + const height = document.body.scrollHeight; + + // Send a message to the parent with the height + parent.postMessage({ height }, '*'); + } + + // Call the function when the iframe is loaded + sendHeightToParent(); + `; + + // Append the script element to the body of the iframe's document + cntDocument.body.appendChild(scriptElement); + }; + + // Append the link element to the head of the iframe's document + cntDocument.head.appendChild(stylesheetLink); + }; post.id = postObject.postID; post.signature = postObject.signature; - window.addEventListener('message', function(event) { - // Ensure that the message is from a trusted source (optional) - // if (event.origin !== 'http://your-iframe-domain.com') return; - - // Adjust the height of the iframe - const iframe = document.getElementById(post.id); - console.log(iframe); - iframe.style.height = event.data.height + 'px'; - }); + window.addEventListener('message', function(event) { + // Ensure that the message is from a trusted source (optional) + // if (event.origin !== 'http://your-iframe-domain.com') return; + + // Adjust the height of the iframe + const iframe = document.getElementById(post.id); + iframe.style.height = event.data.height + 'px'; + }); - return post; + container.appendChild(post); // Append the iframe to the container + + return container; } + async function appendPost(postID) { const response = await postResponse(postID); if (!response.ok) { From d831839ce6dfc3d7a39c6e23395332f6bf2c3d31 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Sat, 11 Nov 2023 13:22:33 +0100 Subject: [PATCH 38/65] seperate iframe stylings --- script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script.js b/script.js index d472e26..c51e1e2 100644 --- a/script.js +++ b/script.js @@ -48,7 +48,7 @@ function postConstructor(postObject) { // Create iframe const post = document.createElement('iframe'); - post.classList.add('post'); + post.classList.add('postframe'); post.src = "about:blank"; post.onload = function() { From f9d23709d600787d5ba9de86e2088ff28f4e6443 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Sat, 11 Nov 2023 13:22:37 +0100 Subject: [PATCH 39/65] seperate iframe stylings --- style.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/style.css b/style.css index fc9f1a2..17f2695 100644 --- a/style.css +++ b/style.css @@ -64,6 +64,21 @@ footer { z-index: 4; flex: none; } +/* Define a style for iframes in posts*/ +.postframe{ + font-size: 1.5em; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 5px; + box-shadow: 0px 2px 4px rgba(23, 11, 40, 0.3); + padding: 10px; + width: 98%; + font-family: inherit; + z-index: 4; + display: flex; + flex: none; + margin: auto; +} /* Define a style for the post title */ .post-title { From a98ae9f76352cdb1dfae8cf046fe7e76e3d01b0c Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Tue, 14 Nov 2023 21:15:42 +0100 Subject: [PATCH 40/65] TODO: Fix height property thingy for iframes --- script.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/script.js b/script.js index c51e1e2..1bf77e0 100644 --- a/script.js +++ b/script.js @@ -59,7 +59,7 @@ function postConstructor(postObject) { const stylesheetLink = cntDocument.createElement('link'); stylesheetLink.rel = 'stylesheet'; stylesheetLink.type = 'text/css'; - stylesheetLink.href = 'style.css'; // Replace with the actual path to your stylesheet + stylesheetLink.href = 'style.css'; stylesheetLink.onload = function() { // Create content element within the iframe @@ -70,7 +70,9 @@ function postConstructor(postObject) { // Append content to the iframe's body cntDocument.body.appendChild(content); - // Create a script element for the sendHeightToParent function + cntDocument.body.setAttribute('onload', 'sendHeightToParent()'); + + // Create a script element to send height ideal size to parent to modify. const scriptElement = cntDocument.createElement('script'); scriptElement.textContent = ` function sendHeightToParent() { @@ -80,13 +82,11 @@ function postConstructor(postObject) { // Send a message to the parent with the height parent.postMessage({ height }, '*'); } - - // Call the function when the iframe is loaded - sendHeightToParent(); `; // Append the script element to the body of the iframe's document cntDocument.body.appendChild(scriptElement); + }; // Append the link element to the head of the iframe's document @@ -97,9 +97,9 @@ function postConstructor(postObject) { post.signature = postObject.signature; window.addEventListener('message', function(event) { - // Ensure that the message is from a trusted source (optional) + // Ensure that the message is from a trusted source // if (event.origin !== 'http://your-iframe-domain.com') return; - + console.log("Beanz" + event.data.height); // Adjust the height of the iframe const iframe = document.getElementById(post.id); iframe.style.height = event.data.height + 'px'; @@ -110,7 +110,6 @@ function postConstructor(postObject) { return container; } - async function appendPost(postID) { const response = await postResponse(postID); if (!response.ok) { @@ -196,6 +195,7 @@ async function loadPosts() { // Call the function to load the posts into the post container loadPosts(); // Add a button element to start creating a transformation + postContainer.addEventListener('mouseup', event => { const postID = getPostID(event.target); const selection = window.getSelection(); @@ -232,6 +232,7 @@ postContainer.addEventListener('mouseup', event => { }); } }); + document.getElementById('toggle-inkwell').addEventListener('click', function() { document.getElementById('inkwell').classList.toggle('collapsed'); }); @@ -457,5 +458,6 @@ async function anchorMethod(anchor) { return responsePromise; }; -//iframe constructor, works as stub function, put setHTML as inner html to contruct a post. -//check for local storage restrictions, permission security features. \ No newline at end of file +//check for local storage restrictions, permission security features. +//live post updater in post section +//Small screen size issue \ No newline at end of file From 89ed21d76caace763ccb41d0247878c59a0d2a68 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Thu, 16 Nov 2023 11:51:26 +0100 Subject: [PATCH 41/65] Wanted to add a scrollbar gutter, won't waste more time on it. --- style.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/style.css b/style.css index 17f2695..ead423a 100644 --- a/style.css +++ b/style.css @@ -6,6 +6,7 @@ body { /* Define a style for the post container */ .post-container { + /*Math for Post Editor*/ position: absolute; left: 51vw; top: 13vh; @@ -16,13 +17,20 @@ body { gap: 10px; padding: 10px; transition: width 0.3s ease-in-out; + /*Flex items*/ + display: flex; align-items: center; flex-direction: column; justify-content: flex-start; + /*More Stylings*/ overflow-x: hidden; overflow-y: auto; font-family: inherit; z-index: 8; + /*Should make jumping to hyperlinks smooth*/ + scroll-behavior: smooth; + + scrollbar-color: #8d5fd3 #ffffff00; } .post-container > iframe{ max-height: calc(83vh - 1rem); From 0a88f72103069909e7ae875b04dbab018556743b Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 17 Nov 2023 18:23:29 +0100 Subject: [PATCH 42/65] Stylings moved to css --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index fb96e9a..c7237d3 100644 --- a/index.html +++ b/index.html @@ -22,7 +22,7 @@
- +
From 0d28f076a2f37ff0522bb29b08d7dc7d71dfe184 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Fri, 17 Nov 2023 18:24:12 +0100 Subject: [PATCH 43/65] Fixed phone view. Need opinion about ratios. --- style.css | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/style.css b/style.css index ead423a..58d4ae7 100644 --- a/style.css +++ b/style.css @@ -13,7 +13,6 @@ body { transform: translateX(calc(-50% + 6vw)); width: 80vw; height: calc(83vh - 1rem); - display: flex; gap: 10px; padding: 10px; transition: width 0.3s ease-in-out; @@ -146,6 +145,11 @@ footer { display: flex; justify-content: center; } + #inkwell > iframe { + width: 90%; + height: 30vh; + border: none; + } #inkwell.collapsed { max-height: 0; @@ -182,6 +186,7 @@ footer { @media (max-width: 1079px) { .post-container { transform: translateX(-50%); + height: calc(72vh - 1rem); } .right-side { @@ -200,17 +205,25 @@ footer { .left-side { position: absolute; - background-color: Canvas; + background-color: #5f6bd3c9; bottom: 0; + margin-left: auto; + margin-right: auto; + left: 0; right: 0; - width: 100%; + width: 81vw; + height: 10vh; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 1; + border-radius: 4%/2%; + } + #inkwell{ + height: 75%; + width: 75%; } - #inkwell.collapsed { position: fixed; bottom: 0; @@ -218,11 +231,14 @@ footer { max-height: 50px; /* Adjust to the height of your icon */ width: 50px; /* Adjust to the width of your icon */ } + #inkwell > iframe { + width: 90%; + height: 30vh; + border: none; + } #toggle-inkwell { - position: fixed; - bottom: 0; - right: 0; + font-size: 1em; } .hidden { @@ -249,6 +265,10 @@ footer { z-index: 7; transition: background-color 0.2s ease-in-out; } + + footer{ + visibility: hidden; + } } /* Define a style for the post editor textarea */ From cfb130905929b70302f062b61731fbfcd052660d Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Mon, 20 Nov 2023 20:28:58 +0100 Subject: [PATCH 44/65] Live post Preview area, shows only on editor toggle. --- index.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/index.html b/index.html index c7237d3..afc95e0 100644 --- a/index.html +++ b/index.html @@ -28,6 +28,17 @@
+
+
Title
+ +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc purus tellus, tristique vel leo eget, sagittis facilisis arcu. Fusce condimentum non magna eu condimentum. Donec sodales lorem massa, dictum convallis nibh sagittis sit amet. Duis tincidunt, enim sed feugiat venenatis, lorem erat dictum eros, vitae consectetur est felis et ex. Nullam bibendum quis quam eu tempus. Nam tincidunt finibus mi sed venenatis. Donec faucibus ante sed dui iaculis finibus non nec dolor. Maecenas condimentum justo vel sapien semper, a elementum quam varius. Nulla nec libero quis mi eleifend porttitor. Maecenas convallis, turpis at aliquam tristique, neque leo pharetra dolor, non auctor odio nunc at dui. + + Nunc a ultricies sapien, molestie fringilla massa. Ut eleifend dictum ex ut mattis. Nullam ac tortor pulvinar, tincidunt nulla in, posuere felis. Sed bibendum tristique felis, vitae maximus odio tempus id. Maecenas interdum odio eget sem lobortis finibus. Nam ut lacus vel neque fringilla condimentum. Sed quis tempus ipsum. Cras vel nisi id leo laoreet efficitur sed eu mauris. Cras ac felis consectetur, tempor sapien eu, efficitur sapien. Sed mattis porta ullamcorper. Integer sed iaculis nibh. Integer leo ex, tempor et porttitor eu, dictum sed arcu. Suspendisse id aliquam lorem, ac dictum sem. Praesent rhoncus mattis odio, a consectetur mi dictum a. Integer ut eleifend leo. Proin ac purus purus. + + In pulvinar dapibus arcu, vitae vehicula enim volutpat in. Proin porttitor mi varius porttitor cursus. Fusce aliquam consectetur lorem, vel convallis tortor varius ut. Maecenas augue elit, commodo eget lectus at, volutpat facilisis lacus. Vestibulum dapibus, tellus quis tincidunt ullamcorper, neque sem eleifend odio, a condimentum sem mi vel magna. Vestibulum bibendum placerat consequat. Vivamus et erat eros. Vivamus eu luctus diam, id laoreet eros. Nunc ut molestie nibh. Aenean euismod quis odio vel laoreet. Vestibulum ornare turpis sit amet mi dictum, nec pulvinar diam vulputate. Phasellus mi enim, pellentesque id scelerisque ut, accumsan a nunc. +
+
From a332c3c9637fac074817674096e8dd73dcb9b616 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Thu, 23 Nov 2023 19:40:32 +0100 Subject: [PATCH 51/65] iframe sandboxing --- script.js | 109 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 52 deletions(-) diff --git a/script.js b/script.js index 87b3b11..4d27485 100644 --- a/script.js +++ b/script.js @@ -56,59 +56,60 @@ function postConstructor(postObject) { post.classList.add('postframe'); post.src = "about:blank"; - post.onload = function() { - const cntWindow = post.contentWindow; - const cntDocument = cntWindow.document; - - // Create a link element for the stylesheet - const stylesheetLink = cntDocument.createElement('link'); - stylesheetLink.rel = 'stylesheet'; - stylesheetLink.type = 'text/css'; - stylesheetLink.href = 'style.css'; - - stylesheetLink.onload = function() { - // Create content element within the iframe - const content = cntDocument.createElement('div'); - content.classList.add('post-content'); - postRenderer(content, postObject.content, "1"); - - // Append content to the iframe's body - cntDocument.body.appendChild(content); - - cntDocument.body.setAttribute('onload', 'sendHeightToParent()'); - - // Create a script element to send height ideal size to parent to modify. - const scriptElement = cntDocument.createElement('script'); - scriptElement.textContent = ` - function sendHeightToParent() { - // Get the height of the content - const height = document.body.scrollHeight; - - // Send a message to the parent with the height - parent.postMessage({ height }, '*'); - } - `; - - // Append the script element to the body of the iframe's document - cntDocument.body.appendChild(scriptElement); - - }; - - // Append the link element to the head of the iframe's document - cntDocument.head.appendChild(stylesheetLink); - }; + post.onload = function() { + const cntWindow = post.contentWindow; + const cntDocument = cntWindow.document; + + // Create a link element for the stylesheet + const stylesheetLink = cntDocument.createElement('link'); + stylesheetLink.rel = 'stylesheet'; + stylesheetLink.type = 'text/css'; + stylesheetLink.href = 'style.css'; + + stylesheetLink.onload = function() { + // Create content element within the iframe + const content = cntDocument.createElement('div'); + content.classList.add('post-content'); + postRenderer(content, postObject.content, "1"); + + // Append content to the iframe's body + cntDocument.body.appendChild(content); + + cntDocument.body.setAttribute('onload', 'sendHeightToParent()'); + + // Create a script element to send height ideal size to parent to modify. + const scriptElement = cntDocument.createElement('script'); + scriptElement.textContent = ` + function sendHeightToParent() { + // Get the height of the content + const height = document.body.scrollHeight; + + // Send a message to the parent with the height + parent.postMessage({ height }, '*'); + } + `; + + // Append the script element to the body of the iframe's document + cntDocument.body.appendChild(scriptElement); + + }; + + // Append the link element to the head of the iframe's document + cntDocument.head.appendChild(stylesheetLink); + post.sandbox = "allow-scripts"; + }; post.id = postObject.postID; post.signature = postObject.signature; - window.addEventListener('message', function(event) { - // Ensure that the message is from a trusted source - // if (event.origin !== 'http://your-iframe-domain.com') return; - console.log("Beanz" + event.data.height); - // Adjust the height of the iframe - const iframe = document.getElementById(post.id); - iframe.style.height = event.data.height + 'px'; - }); + window.addEventListener('message', function(event) { + // Ensure that the message is from a trusted source + // if (event.origin !== 'http://your-iframe-domain.com') return; + console.log("Beanz" + event.data.height); + // Adjust the height of the iframe + const iframe = document.getElementById(post.id); + iframe.style.height = event.data.height + 'px'; + }); container.appendChild(post); // Append the iframe to the container @@ -135,6 +136,7 @@ async function appendPost(postID) { postContainer.removeChild(postContainer.lastChild); } } + async function getUnfilteredAnchors(postId) { const response = await postResponse(postId, "/unfiltered_anchors"); if (!response.ok) { @@ -162,6 +164,7 @@ async function getFilteredAnchors(postId) { referencingPostId: anchor.referencing_post_id, })); } + function insertTextAtCursor(textarea, text) { // Get the current cursor position const startPos = textarea.selectionStart; @@ -177,6 +180,7 @@ function insertTextAtCursor(textarea, text) { // Set the focus back to the textarea textarea.focus(); } + // Define a function to load posts from the backend API async function loadPosts() { // Set the query parameters based on the user preferences @@ -197,6 +201,7 @@ async function loadPosts() { postContainer.appendChild(postDiv); }); }; + // Call the function to load the posts into the post container loadPosts(); // Add a button element to start creating a transformation @@ -347,6 +352,7 @@ saveButton.addEventListener('click', async () => { document.getElementById("stub-author").innerText = "Author"; document.getElementById("stub-iframe").innerText = "This is what your post will look like"; }); + function clearPost() { const postTitle = document.querySelector('.post-editor #editor-title'); const postAuthor = document.querySelector('.post-editor #editor-author'); @@ -501,7 +507,6 @@ async function anchorMethod(anchor) { //check for local storage restrictions, permission security features. //allow UI to support hiding messages. +//signalling messages hidden //-> Only show messages inted for you. -//Identity/fact attestation and local user beliefs. Basically an updoot for authors for -//-> Could we not just replace the post editor to be a post in itself and you just edit it? -//-> If! We can have a manually added post which will live update in the post area (hidden when post editor is hidden) \ No newline at end of file +//Identity/fact attestation and local user beliefs. Basically an updoot for authors for \ No newline at end of file From c7a0d444bc544a09b6ecdd6f46fc65c062de07ef Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Mon, 27 Nov 2023 18:44:59 +0100 Subject: [PATCH 52/65] Had to turn post-container into an id rather than a class for event listener functionality with buttons --- style.css | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/style.css b/style.css index c687f8a..2141e36 100644 --- a/style.css +++ b/style.css @@ -5,7 +5,7 @@ body { } /* Define a style for the post container */ -.post-container { +#post-container { /*Math for Post Editor*/ position: absolute; left: 51vw; @@ -31,11 +31,11 @@ body { scrollbar-color: #8d5fd3 #ffffff00; } -.post-container > iframe{ +#post-container > iframe{ max-height: calc(83vh - 1rem); } -.post-container.small { +#post-container.small { left: 0; width: 50vw; transform: none; @@ -183,10 +183,19 @@ footer { z-index: 7; transition: background-color 0.2s ease-in-out; } + + .hide-post { + background-image: url('/show_BW.png'); + background-size: 100% 100%; + background-repeat: no-repeat; + width: 2vw; + height: 3.5vh; + margin-bottom: 0.5%; + } } @media (max-width: 1079px) { - .post-container { + #post-container { transform: translateX(-50%); height: calc(72vh - 1rem); } @@ -268,6 +277,15 @@ footer { transition: background-color 0.2s ease-in-out; } + .hide-post { + background-image: url('/show_BW.png'); + background-size: 100% 100%; + background-repeat: no-repeat; + width: 3vw; + height: 1.5vh; + margin-bottom: 0.5%; + } + footer{ visibility: hidden; } From 3bdfe15404df95aee8597e96c1a2cc771a8ceca0 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Mon, 27 Nov 2023 18:45:19 +0100 Subject: [PATCH 53/65] hide/show first icon --- show_BW.png | Bin 0 -> 24167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 show_BW.png diff --git a/show_BW.png b/show_BW.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9a2834316f54de9ee2396d0fbc07aaf1ad2630 GIT binary patch literal 24167 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 z zdZNOp%rhOnd;lS1P5}yvmK`b1!rflyA6I2*BQVs!d#+kynRZR znf;ur`>(TTq`aQrj4uiD)kr)&pnYGJf8{4EEENOCIuk#x9< z-p4YcCL9;r7&aL>judnxRjCjG;fU4gIlrAk9{?r2z?;7XUw064E86+m+qco;ya6!4 zG>`#aA<9EUH!q72o-JacVlLU?%9&VZ@d`n>IG)k=HkI z_;)qxq~hqa+xgueVqm5Ntm;$?dvE-rj1A@k#BB~lx3Ef?>MNPIzK|OZD_CI3>8dmR zl8Lv820%d88Fn_B0m%+y9O0*3PwQ1NBvHNse6M!ZyMPt-We^nKk^VNcfS==j(69bs zhIOuMt!MK~cF#PthYO$oO!?C!xmfNo6k3qJx@U#yWcL71$+Q~Y$8m!a6tH{DkT=I1 zX+iIOf)$N)ANg!7m3 z^ax4?U0j~Jh7^*#8k4-uMKU{4x(=>dLI^9=^DtfNMt>UO(fm9UH+0DgmYor#czcAn zJii(J8ucFWQ|rGhWCja+NoGf#DNXY_(-VgPkUPhhHQ;_i{_{V4=Pfbh#0OPT-GFhb zMFJnh*rZVP;FF`*0ASiadV1rwi}Pzby>b9!GbcY2EiI#2ByEG`rsKXKlt1zq!<6)( z*s)p<)cW9Fga)n+uin%MY6cXF;ojANZ17aaUiJxqvxOCLXDX2|fFg zIy^^#1;gMJMZ$2kutwW!v2NFamd%|<-Kgo>NA&go?U(@x^X)@^6+p;ehHjb^b1Jn-J4Z2L=XWjFvn>1BU(q zMxhC=S`lt!Vs1Yfa0H!_1Xk?O@!fR&{bzHSWFhun;PF!5M&HqmY{iuD(iKBHyemtJ$m#<$|`ySm+dFk|P8m$dkJF#;gC2O+J`DchQiSTh`0^Rrk%?v-#PXfzsIU#6DmnGWe8F%naip(B3SY!YTy-t z?6X|6SmSC=Bl8g{nq`csCb*uL%;p(8xfW1`s-!}CKZ)g0FL^^CJpzPh4tQG8w=v*m zx0sXC3S?2};oAlw7nt1vP80=R1z7EJFd3N*IcI8i8r?!7W!)j>HzJK5Gycj<3YEoj z{Lt@$GKZZQnEoYd<7~y-!(=lPFT7_H6Xv?hor98j!#S!EZp7Qk*#6CFXdn59M{sGJ zly(9k0Xza_v>$xlpF=Js^>oe%MLnDeq3F7mbKd2ChZ28z-D_)Xm`^Tg^)uyi(gTd< zzvi;O(1YXaQcO<5HrVG-{RN_ZYJ#{!IgX%F0pK5zyQet#1j zK8&n1k{vWO$0#?BO66m%z!=O7XI~xn1Rm-Vo!?zU(TPJO^diE;ZP^OxFR*@}VLUTp z6{db=I=_ob_UE1R3fbDElNZ!Kef`q^M#Rq#?7pI4Jd*Hwu5QS+*C*KGLM}3&rP?-K zW;MA0yDQ4�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 Date: Mon, 27 Nov 2023 18:45:35 +0100 Subject: [PATCH 54/65] post-container is now an id --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 67a7a7b..6478720 100644 --- a/index.html +++ b/index.html @@ -26,7 +26,7 @@ -
+
Title
From 36d220b17111d26c7b7719f2f3e33b86e59fdf75 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Mon, 27 Nov 2023 18:45:52 +0100 Subject: [PATCH 55/65] Hide button and Hide button logic --- script.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index 4d27485..1b8cf53 100644 --- a/script.js +++ b/script.js @@ -5,7 +5,7 @@ const editorContainer = document.querySelector('.post-editor'); const postEditor = document.querySelector('.post-editor #editor-content'); const previewContainer = document.querySelector('.post-previewer'); const previewPost = document.querySelector('.preview-post'); -const postContainer = document.querySelector('.post-container'); +const postContainer = document.querySelector('#post-container'); const isWideWindow = window.matchMedia('(min-width: 1080px)'); // Get the user preferences from localStorage or set defaults const storedPreferences = localStorage.getItem('userPreferences'); @@ -51,6 +51,11 @@ function postConstructor(postObject) { container.appendChild(title); container.appendChild(author); + //Hide button + const hide = document.createElement('button'); + hide.classList.add('hide-post'); + container.appendChild(hide); + // Create iframe const post = document.createElement('iframe'); post.classList.add('postframe'); @@ -439,6 +444,17 @@ document.getElementById("inkwell").addEventListener('signalingMessage', async (e // Add logic here }); +//Hide post Event +document.getElementById('post-container').addEventListener('click', function(event) { + // Check if the clicked element is a button with the specified class + if (event.target.classList.contains('hide-post')) { + // Get the element below the clicked button + var elementBelowButton = event.target.nextElementSibling; + + elementBelowButton.style.display = (elementBelowButton.style.display === 'block' || elementBelowButton.style.display === '') ? 'none' : 'block'; + } +}); + document.getElementById('debugButton').addEventListener('click', function() { var debug = document.getElementById('debug'); debug.style.display = (debug.style.display === 'none' || debug.style.display === '') ? 'block' : 'none'; From 5d2082608f5684c2fc1c3cfa46fa99cdcbbe50aa Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Tue, 28 Nov 2023 12:33:33 +0100 Subject: [PATCH 56/65] Seperate class for show and hide icons --- style.css | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/style.css b/style.css index 2141e36..871928b 100644 --- a/style.css +++ b/style.css @@ -185,7 +185,15 @@ footer { } .hide-post { - background-image: url('/show_BW.png'); + background-image: url("/hide_BW.png"); + background-size: 100% 100%; + background-repeat: no-repeat; + width: 2vw; + height: 3.5vh; + margin-bottom: 0.5%; + } + .show-post { + background-image: url("/show_BW.png"); background-size: 100% 100%; background-repeat: no-repeat; width: 2vw; @@ -278,6 +286,14 @@ footer { } .hide-post { + background-image: url('/hide_BW.png'); + background-size: 100% 100%; + background-repeat: no-repeat; + width: 3vw; + height: 1.5vh; + margin-bottom: 0.5%; + } + .show-post { background-image: url('/show_BW.png'); background-size: 100% 100%; background-repeat: no-repeat; From 2e37dd1322e2b07851797ed512a541657f3440cf Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Tue, 28 Nov 2023 12:33:40 +0100 Subject: [PATCH 57/65] hide icon --- hide_BW.png | Bin 0 -> 26729 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hide_BW.png diff --git a/hide_BW.png b/hide_BW.png new file mode 100644 index 0000000000000000000000000000000000000000..7a88d5e85cb4bf9fd89e175ceb50bb38bc0c7dc1 GIT binary patch literal 26729 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 AWra}Tl*s*`*o=$$z+ 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 b0WAO1U)W|Iyb_VTR_Sar2iX~3Fwy@%e|gVY literal 0 HcmV?d00001 From 0c7fa7507045a59c6d1d680d726fb2bca0c0738f Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Tue, 28 Nov 2023 12:33:54 +0100 Subject: [PATCH 58/65] icon change logic --- script.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/script.js b/script.js index 1b8cf53..22eb030 100644 --- a/script.js +++ b/script.js @@ -447,11 +447,13 @@ document.getElementById("inkwell").addEventListener('signalingMessage', async (e //Hide post Event document.getElementById('post-container').addEventListener('click', function(event) { // Check if the clicked element is a button with the specified class - if (event.target.classList.contains('hide-post')) { + if (event.target.classList.contains('hide-post') || event.target.classList.contains('show-post')) { // Get the element below the clicked button var elementBelowButton = event.target.nextElementSibling; elementBelowButton.style.display = (elementBelowButton.style.display === 'block' || elementBelowButton.style.display === '') ? 'none' : 'block'; + console.log(event.target.classList.contains('hide-post') ); + event.target.classList.toggle(event.target.classList.contains('hide-post') ? 'show-post' : 'hide-post'); } }); From 76e3e69567aec2c579512dfc87ddb3197c4a14c9 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Wed, 29 Nov 2023 13:56:06 +0100 Subject: [PATCH 59/65] Signalling message class --- style.css | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/style.css b/style.css index 871928b..d7c2a5d 100644 --- a/style.css +++ b/style.css @@ -71,6 +71,21 @@ footer { z-index: 4; flex: none; } +/*Define style for signaling messages*/ +.signal { + font-size: 1.5em; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 5px; + box-shadow: 0px 2px 4px rgba(23, 11, 40, 0.3); + padding: 10px; + width: calc(100% - 10px); + font-family: inherit; + z-index: 4; + flex: none; + + display: none; +} /* Define a style for iframes in posts*/ .postframe{ font-size: 1em; From f15559435a0f6892973c0b9b46821ff4634b8484 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Wed, 29 Nov 2023 13:56:18 +0100 Subject: [PATCH 60/65] Basic Signalling message hiding logic --- script.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/script.js b/script.js index 22eb030..2d7871f 100644 --- a/script.js +++ b/script.js @@ -36,12 +36,14 @@ function postRenderer(postContentElement, postContent, flag="0") { : (postContentElement.innerHTML = postContent);*/ } function postConstructor(postObject) { + // Create container element for title and author (in main DOM) const container = document.createElement('div'); const title = document.createElement('div'); const author = document.createElement('div'); - container.classList.add('post'); + //Signaling message check + container.classList.add(postObject.title === "[Signal] Signaling details" ? 'signal' : 'post'); title.classList.add('post-title'); author.classList.add('post-author'); @@ -81,16 +83,15 @@ function postConstructor(postObject) { cntDocument.body.appendChild(content); cntDocument.body.setAttribute('onload', 'sendHeightToParent()'); - // Create a script element to send height ideal size to parent to modify. const scriptElement = cntDocument.createElement('script'); - scriptElement.textContent = ` + scriptElement.innerHTML = ` function sendHeightToParent() { // Get the height of the content const height = document.body.scrollHeight; // Send a message to the parent with the height - parent.postMessage({ height }, '*'); + parent.postMessage({ height }, '${window.location.origin}'); } `; @@ -130,7 +131,6 @@ async function appendPost(postID) { const postObject = await response.json(); postObject.postID = postID; const post = postConstructor(postObject); - console.log(post); const postsStartMarker = document.getElementById('posts-start-marker'); postContainer.insertBefore(post, postsStartMarker.nextSibling); @@ -452,7 +452,7 @@ document.getElementById('post-container').addEventListener('click', function(eve var elementBelowButton = event.target.nextElementSibling; elementBelowButton.style.display = (elementBelowButton.style.display === 'block' || elementBelowButton.style.display === '') ? 'none' : 'block'; - console.log(event.target.classList.contains('hide-post') ); + event.target.classList.toggle(event.target.classList.contains('hide-post') ? 'show-post' : 'hide-post'); } }); @@ -522,9 +522,13 @@ async function anchorMethod(anchor) { return responsePromise; }; - -//check for local storage restrictions, permission security features. -//allow UI to support hiding messages. //signalling messages hidden +//New button Verify, turns Author to aka and Verify instead of unverify +//signing NO LONGER OPTIONAL +//New button Reference button for referencing posts +//Buttons looking nicer and having disabled support +//links in frames... [1] [2]...[N] //-> Only show messages inted for you. -//Identity/fact attestation and local user beliefs. Basically an updoot for authors for \ No newline at end of file +//Identity/fact attestation and local user beliefs. Basically an updoot for authors +//auto height for iframes +//check for local storage restrictions, permission security features. \ No newline at end of file From e7f057dd396853d2b3a03bc2f70b3710fb6c5260 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Wed, 29 Nov 2023 19:36:17 +0100 Subject: [PATCH 61/65] icons folder and new verify/revoke icons --- hide_BW.png | Bin 26729 -> 0 bytes icons/hide.svg | 9 +++++++++ icon.svg => icons/icon.svg | 0 icon_text.svg => icons/icon_text.svg | 0 icons/revoke.svg | 8 ++++++++ icons/show.svg | 11 +++++++++++ icons/verify.svg | 9 +++++++++ show_BW.png | Bin 24167 -> 0 bytes 8 files changed, 37 insertions(+) delete mode 100644 hide_BW.png create mode 100644 icons/hide.svg rename icon.svg => icons/icon.svg (100%) rename icon_text.svg => icons/icon_text.svg (100%) create mode 100644 icons/revoke.svg create mode 100644 icons/show.svg create mode 100644 icons/verify.svg delete mode 100644 show_BW.png diff --git a/hide_BW.png b/hide_BW.png deleted file mode 100644 index 7a88d5e85cb4bf9fd89e175ceb50bb38bc0c7dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26729 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 AWra}Tl*s*`*o=$$z+ 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 b0WAO1U)W|Iyb_VTR_Sar2iX~3Fwy@%e|gVY diff --git a/icons/hide.svg b/icons/hide.svg new file mode 100644 index 0000000..25862ad --- /dev/null +++ b/icons/hide.svg @@ -0,0 +1,9 @@ + + show_BW + + + + + + \ No newline at end of file diff --git a/icon.svg b/icons/icon.svg similarity index 100% rename from icon.svg rename to icons/icon.svg diff --git a/icon_text.svg b/icons/icon_text.svg similarity index 100% rename from icon_text.svg rename to icons/icon_text.svg diff --git a/icons/revoke.svg b/icons/revoke.svg new file mode 100644 index 0000000..7a9ed1f --- /dev/null +++ b/icons/revoke.svg @@ -0,0 +1,8 @@ + + Verify/Revoke + + + + \ No newline at end of file diff --git a/icons/show.svg b/icons/show.svg new file mode 100644 index 0000000..3437c77 --- /dev/null +++ b/icons/show.svg @@ -0,0 +1,11 @@ + + show_BW + + + + + + + \ No newline at end of file diff --git a/icons/verify.svg b/icons/verify.svg new file mode 100644 index 0000000..0c2dc1a --- /dev/null +++ b/icons/verify.svg @@ -0,0 +1,9 @@ + + show_BW + + + + + + \ No newline at end of file diff --git a/show_BW.png b/show_BW.png deleted file mode 100644 index 3b9a2834316f54de9ee2396d0fbc07aaf1ad2630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24167 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 z zdZNOp%rhOnd;lS1P5}yvmK`b1!rflyA6I2*BQVs!d#+kynRZR znf;ur`>(TTq`aQrj4uiD)kr)&pnYGJf8{4EEENOCIuk#x9< z-p4YcCL9;r7&aL>judnxRjCjG;fU4gIlrAk9{?r2z?;7XUw064E86+m+qco;ya6!4 zG>`#aA<9EUH!q72o-JacVlLU?%9&VZ@d`n>IG)k=HkI z_;)qxq~hqa+xgueVqm5Ntm;$?dvE-rj1A@k#BB~lx3Ef?>MNPIzK|OZD_CI3>8dmR zl8Lv820%d88Fn_B0m%+y9O0*3PwQ1NBvHNse6M!ZyMPt-We^nKk^VNcfS==j(69bs zhIOuMt!MK~cF#PthYO$oO!?C!xmfNo6k3qJx@U#yWcL71$+Q~Y$8m!a6tH{DkT=I1 zX+iIOf)$N)ANg!7m3 z^ax4?U0j~Jh7^*#8k4-uMKU{4x(=>dLI^9=^DtfNMt>UO(fm9UH+0DgmYor#czcAn zJii(J8ucFWQ|rGhWCja+NoGf#DNXY_(-VgPkUPhhHQ;_i{_{V4=Pfbh#0OPT-GFhb zMFJnh*rZVP;FF`*0ASiadV1rwi}Pzby>b9!GbcY2EiI#2ByEG`rsKXKlt1zq!<6)( z*s)p<)cW9Fga)n+uin%MY6cXF;ojANZ17aaUiJxqvxOCLXDX2|fFg zIy^^#1;gMJMZ$2kutwW!v2NFamd%|<-Kgo>NA&go?U(@x^X)@^6+p;ehHjb^b1Jn-J4Z2L=XWjFvn>1BU(q zMxhC=S`lt!Vs1Yfa0H!_1Xk?O@!fR&{bzHSWFhun;PF!5M&HqmY{iuD(iKBHyemtJ$m#<$|`ySm+dFk|P8m$dkJF#;gC2O+J`DchQiSTh`0^Rrk%?v-#PXfzsIU#6DmnGWe8F%naip(B3SY!YTy-t z?6X|6SmSC=Bl8g{nq`csCb*uL%;p(8xfW1`s-!}CKZ)g0FL^^CJpzPh4tQG8w=v*m zx0sXC3S?2};oAlw7nt1vP80=R1z7EJFd3N*IcI8i8r?!7W!)j>HzJK5Gycj<3YEoj z{Lt@$GKZZQnEoYd<7~y-!(=lPFT7_H6Xv?hor98j!#S!EZp7Qk*#6CFXdn59M{sGJ zly(9k0Xza_v>$xlpF=Js^>oe%MLnDeq3F7mbKd2ChZ28z-D_)Xm`^Tg^)uyi(gTd< zzvi;O(1YXaQcO<5HrVG-{RN_ZYJ#{!IgX%F0pK5zyQet#1j zK8&n1k{vWO$0#?BO66m%z!=O7XI~xn1Rm-Vo!?zU(TPJO^diE;ZP^OxFR*@}VLUTp z6{db=I=_ob_UE1R3fbDElNZ!Kef`q^M#Rq#?7pI4Jd*Hwu5QS+*C*KGLM}3&rP?-K zW;MA0yDQ4�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 Date: Wed, 29 Nov 2023 19:37:05 +0100 Subject: [PATCH 62/65] buttonZone + small refactor for post buttons --- style.css | 61 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/style.css b/style.css index d7c2a5d..f882a64 100644 --- a/style.css +++ b/style.css @@ -41,6 +41,13 @@ body { transform: none; } +.buttonZone{ + width: 100%; + display: flex; + flex-direction: row; + align-items: center; +} + .app-container { display: flex; overflow-x: hidden; @@ -199,21 +206,26 @@ footer { transition: background-color 0.2s ease-in-out; } - .hide-post { - background-image: url("/hide_BW.png"); + .buttonZone > button{ + width: 2vw; + height: 3vh; background-size: 100% 100%; background-repeat: no-repeat; - width: 2vw; - height: 3.5vh; - margin-bottom: 0.5%; + margin-top: 0.4%; + margin-bottom: 0.4%; + margin-right: 1%; + } + .hide-post { + background-image: url("icons/hide.svg"); } .show-post { - background-image: url("/show_BW.png"); - background-size: 100% 100%; - background-repeat: no-repeat; - width: 2vw; - height: 3.5vh; - margin-bottom: 0.5%; + background-image: url("icons/show.svg"); + } + .verify { + background-image: url("icons/verify.svg"); + } + .revoke { + background-image: url("icons/revoke.svg"); } } @@ -300,21 +312,26 @@ footer { transition: background-color 0.2s ease-in-out; } - .hide-post { - background-image: url('/hide_BW.png'); - background-size: 100% 100%; - background-repeat: no-repeat; + .buttonZone > button{ width: 3vw; height: 1.5vh; - margin-bottom: 0.5%; - } - .show-post { - background-image: url('/show_BW.png'); background-size: 100% 100%; background-repeat: no-repeat; - width: 3vw; - height: 1.5vh; - margin-bottom: 0.5%; + margin-top: 0.4%; + margin-bottom: 0.4%; + margin-right: 1%; + } + .hide-post { + background-image: url('icons/hide.svg'); + } + .show-post { + background-image: url('icons/show.svg'); + } + .verify { + background-image: url("icons/verify.svg"); + } + .revoke { + background-image: url("icons/revoke.svg"); } footer{ From b4637a7576dd09f76b8b30a26629fd0ebd0e1dc8 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Wed, 29 Nov 2023 19:37:23 +0100 Subject: [PATCH 63/65] icons moved --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 6478720..78f183d 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ Catalyst - + From 9baca799d667a03d9b1eee4a1c4ceb9a7b092ff4 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Wed, 29 Nov 2023 19:37:44 +0100 Subject: [PATCH 64/65] ButtonZone added --- script.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/script.js b/script.js index 2d7871f..4672a3d 100644 --- a/script.js +++ b/script.js @@ -53,10 +53,18 @@ function postConstructor(postObject) { container.appendChild(title); container.appendChild(author); - //Hide button + //Button zone, zoning laws mandate all post buttons to be delimited in this zone + const buttonZone = document.createElement('div'); + buttonZone.classList.add("buttonZone"); + container.appendChild(buttonZone); + //HideShow/ button const hide = document.createElement('button'); hide.classList.add('hide-post'); - container.appendChild(hide); + buttonZone.appendChild(hide); + //Verify/Revoke Button + const verify = document.createElement('button'); + verify.classList.add('verify'); + buttonZone.appendChild(verify); // Create iframe const post = document.createElement('iframe'); @@ -449,7 +457,7 @@ document.getElementById('post-container').addEventListener('click', function(eve // Check if the clicked element is a button with the specified class if (event.target.classList.contains('hide-post') || event.target.classList.contains('show-post')) { // Get the element below the clicked button - var elementBelowButton = event.target.nextElementSibling; + var elementBelowButton = event.target.parentElement.nextElementSibling; elementBelowButton.style.display = (elementBelowButton.style.display === 'block' || elementBelowButton.style.display === '') ? 'none' : 'block'; @@ -522,13 +530,15 @@ async function anchorMethod(anchor) { return responsePromise; }; -//signalling messages hidden -//New button Verify, turns Author to aka and Verify instead of unverify + +//New button Verify//Done +//->turns Author to aka and Verify instead of unverify //signing NO LONGER OPTIONAL //New button Reference button for referencing posts //Buttons looking nicer and having disabled support //links in frames... [1] [2]...[N] //-> Only show messages inted for you. //Identity/fact attestation and local user beliefs. Basically an updoot for authors +//redo icons without raster //auto height for iframes //check for local storage restrictions, permission security features. \ No newline at end of file From 5159e14918cc2849f444cc31fc716cbe6e1b6fb9 Mon Sep 17 00:00:00 2001 From: TwistedPorkchop Date: Tue, 5 Dec 2023 16:05:55 +0100 Subject: [PATCH 65/65] Iframe post Message works now. seperation required --- script.js | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/script.js b/script.js index 4672a3d..43dc695 100644 --- a/script.js +++ b/script.js @@ -69,7 +69,7 @@ function postConstructor(postObject) { // Create iframe const post = document.createElement('iframe'); post.classList.add('postframe'); - post.src = "about:blank"; + post.src = `about:${postObject.postID}`; post.onload = function() { const cntWindow = post.contentWindow; @@ -90,17 +90,20 @@ function postConstructor(postObject) { // Append content to the iframe's body cntDocument.body.appendChild(content); - cntDocument.body.setAttribute('onload', 'sendHeightToParent()'); // Create a script element to send height ideal size to parent to modify. const scriptElement = cntDocument.createElement('script'); scriptElement.innerHTML = ` - function sendHeightToParent() { - // Get the height of the content + // Function to send iframe height to the parent window + function sendHeightToParent() { const height = document.body.scrollHeight; + window.parent.postMessage({ iframeHeight: height }, '*'); + } - // Send a message to the parent with the height - parent.postMessage({ height }, '${window.location.origin}'); - } + // Attach an event listener to the resize event + window.addEventListener('resize', sendHeightToParent); + + // Initially send the height to the parent + sendHeightToParent(); `; // Append the script element to the body of the iframe's document @@ -117,12 +120,10 @@ function postConstructor(postObject) { post.signature = postObject.signature; window.addEventListener('message', function(event) { - // Ensure that the message is from a trusted source - // if (event.origin !== 'http://your-iframe-domain.com') return; - console.log("Beanz" + event.data.height); - // Adjust the height of the iframe - const iframe = document.getElementById(post.id); - iframe.style.height = event.data.height + 'px'; + if (event.data.iframeHeight) { + const iframe = document.getElementById(post.id); + iframe.style.height = event.data.iframeHeight + 'px'; + } }); container.appendChild(post); // Append the iframe to the container @@ -454,15 +455,21 @@ document.getElementById("inkwell").addEventListener('signalingMessage', async (e //Hide post Event document.getElementById('post-container').addEventListener('click', function(event) { - // Check if the clicked element is a button with the specified class + // Check wich button has been pressed if (event.target.classList.contains('hide-post') || event.target.classList.contains('show-post')) { // Get the element below the clicked button - var elementBelowButton = event.target.parentElement.nextElementSibling; + let elementBelowButton = event.target.parentElement.nextElementSibling; elementBelowButton.style.display = (elementBelowButton.style.display === 'block' || elementBelowButton.style.display === '') ? 'none' : 'block'; event.target.classList.toggle(event.target.classList.contains('hide-post') ? 'show-post' : 'hide-post'); } + if (event.target.classList.contains('verify') || event.target.classList.contains('revoke')){ + let elementAboveButton = event.target.parentElement.previousElementSibling; + + //elementAboveButton. + + } }); document.getElementById('debugButton').addEventListener('click', function() {