From 3ec124a1b38002521608794ed27b6b43cdd3ece6 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Thu, 13 Nov 2025 22:53:44 -0500 Subject: [PATCH] Move sticky note element to context --- dist/birb.js | 25 ++++++++++++++++++------- dist/extension.zip | Bin 149222 -> 149338 bytes dist/extension/birb.js | 25 ++++++++++++++++++------- dist/extension/manifest.json | 2 +- dist/obsidian/main.js | 27 +++++++++++++++++++-------- dist/obsidian/manifest.json | 2 +- dist/userscript/birb.user.js | 27 +++++++++++++++++++-------- src/context.js | 8 ++++++++ src/stickyNotes.js | 15 +++++++++------ 9 files changed, 93 insertions(+), 38 deletions(-) diff --git a/dist/birb.js b/dist/birb.js index 3192d72..db44b3a 100644 --- a/dist/birb.js +++ b/dist/birb.js @@ -900,6 +900,14 @@ return window.location.href; } + /** + * @returns {HTMLElement} The current active page element where sticky notes can be applied + */ + getActivePage() { + // Default to root element + return document.documentElement; + } + /** * Checks if a path is applicable given the context * @param {string} path Can be a site URL or another context-specific path @@ -1173,11 +1181,12 @@ /** * @param {StickyNote} stickyNote + * @param {HTMLElement} page * @param {() => void} onSave * @param {() => void} onDelete * @returns {HTMLElement} */ - function renderStickyNote(stickyNote, onSave, onDelete) { + function renderStickyNote(stickyNote, page, onSave, onDelete) { const noteElement = makeElement("birb-window"); noteElement.classList.add("birb-sticky-note"); @@ -1202,7 +1211,7 @@ noteElement.style.top = `${stickyNote.top}px`; noteElement.style.left = `${stickyNote.left}px`; - document.body.appendChild(noteElement); + page.appendChild(noteElement); makeDraggable(header, true, (top, left) => { stickyNote.top = top; @@ -1253,10 +1262,11 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const pageElement = getContext().getActivePage(); const context = getContext(); for (let stickyNote of stickyNotes) { if (context.isPathApplicable(stickyNote.site)) { - renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); + renderStickyNote(stickyNote, pageElement, onSave, () => onDelete(stickyNote)); } } } @@ -1270,9 +1280,10 @@ const id = Date.now().toString(); const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); - const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); - element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; - element.style.top = `${window.scrollY + window.innerHeight / 2 - element.offsetHeight / 2}px`; + const page = getContext().getActivePage(); + const element = renderStickyNote(stickyNote, page, onSave, () => onDelete(stickyNote)); + element.style.left = `${page.clientWidth / 2 - element.offsetWidth / 2}px`; + element.style.top = `${page.scrollTop + page.clientHeight / 2 - element.offsetHeight / 2}px`; stickyNote.top = parseInt(element.style.top, 10); stickyNote.left = parseInt(element.style.left, 10); stickyNotes.push(stickyNote); @@ -1946,7 +1957,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.64", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.64"); }, false), + new MenuItem("2025.11.13.80", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.80"); }, false), ]; const styleElement = document.createElement("style"); diff --git a/dist/extension.zip b/dist/extension.zip index 29853804057df7eff2a451fec389069492fc8346..84c58c8ca619bad06ea33ce0c35d88ca25ddf83a 100644 GIT binary patch delta 26806 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 HNBI8$wXXWa delta 26660 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 void} onSave * @param {() => void} onDelete * @returns {HTMLElement} */ - function renderStickyNote(stickyNote, onSave, onDelete) { + function renderStickyNote(stickyNote, page, onSave, onDelete) { const noteElement = makeElement("birb-window"); noteElement.classList.add("birb-sticky-note"); @@ -1202,7 +1211,7 @@ noteElement.style.top = `${stickyNote.top}px`; noteElement.style.left = `${stickyNote.left}px`; - document.body.appendChild(noteElement); + page.appendChild(noteElement); makeDraggable(header, true, (top, left) => { stickyNote.top = top; @@ -1253,10 +1262,11 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const pageElement = getContext().getActivePage(); const context = getContext(); for (let stickyNote of stickyNotes) { if (context.isPathApplicable(stickyNote.site)) { - renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); + renderStickyNote(stickyNote, pageElement, onSave, () => onDelete(stickyNote)); } } } @@ -1270,9 +1280,10 @@ const id = Date.now().toString(); const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); - const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); - element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; - element.style.top = `${window.scrollY + window.innerHeight / 2 - element.offsetHeight / 2}px`; + const page = getContext().getActivePage(); + const element = renderStickyNote(stickyNote, page, onSave, () => onDelete(stickyNote)); + element.style.left = `${page.clientWidth / 2 - element.offsetWidth / 2}px`; + element.style.top = `${page.scrollTop + page.clientHeight / 2 - element.offsetHeight / 2}px`; stickyNote.top = parseInt(element.style.top, 10); stickyNote.left = parseInt(element.style.left, 10); stickyNotes.push(stickyNote); @@ -1946,7 +1957,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.64", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.64"); }, false), + new MenuItem("2025.11.13.80", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.80"); }, false), ]; const styleElement = document.createElement("style"); diff --git a/dist/extension/manifest.json b/dist/extension/manifest.json index 1043051..bf67d73 100644 --- a/dist/extension/manifest.json +++ b/dist/extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Pocket Bird", "description": "It's a pet bird in your browser, what more could you want?", - "version": "2025.11.13.64", + "version": "2025.11.13.80", "homepage_url": "https://idreesinc.com", "icons": { "48": "images/icons/transparent/48x48x1.png", diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index 398dcba..e192150 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -2,7 +2,7 @@ const { Plugin, Notice } = require('obsidian'); module.exports = class PocketBird extends Plugin { onload() { - console.log("Loading Pocket Bird version 2025.11.13.64..."); + console.log("Loading Pocket Bird version 2025.11.13.80..."); const OBSIDIAN_PLUGIN = this; (function () { 'use strict'; @@ -906,6 +906,14 @@ module.exports = class PocketBird extends Plugin { return window.location.href; } + /** + * @returns {HTMLElement} The current active page element where sticky notes can be applied + */ + getActivePage() { + // Default to root element + return document.documentElement; + } + /** * Checks if a path is applicable given the context * @param {string} path Can be a site URL or another context-specific path @@ -1179,11 +1187,12 @@ module.exports = class PocketBird extends Plugin { /** * @param {StickyNote} stickyNote + * @param {HTMLElement} page * @param {() => void} onSave * @param {() => void} onDelete * @returns {HTMLElement} */ - function renderStickyNote(stickyNote, onSave, onDelete) { + function renderStickyNote(stickyNote, page, onSave, onDelete) { const noteElement = makeElement("birb-window"); noteElement.classList.add("birb-sticky-note"); @@ -1208,7 +1217,7 @@ module.exports = class PocketBird extends Plugin { noteElement.style.top = `${stickyNote.top}px`; noteElement.style.left = `${stickyNote.left}px`; - document.body.appendChild(noteElement); + page.appendChild(noteElement); makeDraggable(header, true, (top, left) => { stickyNote.top = top; @@ -1259,10 +1268,11 @@ module.exports = class PocketBird extends Plugin { const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const pageElement = getContext().getActivePage(); const context = getContext(); for (let stickyNote of stickyNotes) { if (context.isPathApplicable(stickyNote.site)) { - renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); + renderStickyNote(stickyNote, pageElement, onSave, () => onDelete(stickyNote)); } } } @@ -1276,9 +1286,10 @@ module.exports = class PocketBird extends Plugin { const id = Date.now().toString(); const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); - const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); - element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; - element.style.top = `${window.scrollY + window.innerHeight / 2 - element.offsetHeight / 2}px`; + const page = getContext().getActivePage(); + const element = renderStickyNote(stickyNote, page, onSave, () => onDelete(stickyNote)); + element.style.left = `${page.clientWidth / 2 - element.offsetWidth / 2}px`; + element.style.top = `${page.scrollTop + page.clientHeight / 2 - element.offsetHeight / 2}px`; stickyNote.top = parseInt(element.style.top, 10); stickyNote.left = parseInt(element.style.left, 10); stickyNotes.push(stickyNote); @@ -1952,7 +1963,7 @@ module.exports = class PocketBird extends Plugin { insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.64", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.64"); }, false), + new MenuItem("2025.11.13.80", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.80"); }, false), ]; const styleElement = document.createElement("style"); diff --git a/dist/obsidian/manifest.json b/dist/obsidian/manifest.json index 6b45b09..1b8b3da 100644 --- a/dist/obsidian/manifest.json +++ b/dist/obsidian/manifest.json @@ -1,7 +1,7 @@ { "id": "pocket-bird", "name": "Pocket Bird", - "version": "2025.11.13.64", + "version": "2025.11.13.80", "minAppVersion": "0.15.0", "description": "It's a pet bird in your Obsidian, what more could you want?", "author": "Idrees Hassan", diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index e2b828e..0d465ed 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Pocket Bird // @namespace https://idreesinc.com -// @version 2025.11.13.64 +// @version 2025.11.13.80 // @description It's a bird that hops around your web browser, the future is here // @author Idrees // @downloadURL https://github.com/IdreesInc/Pocket-Bird/raw/refs/heads/main/dist/userscript/birb.user.js @@ -914,6 +914,14 @@ return window.location.href; } + /** + * @returns {HTMLElement} The current active page element where sticky notes can be applied + */ + getActivePage() { + // Default to root element + return document.documentElement; + } + /** * Checks if a path is applicable given the context * @param {string} path Can be a site URL or another context-specific path @@ -1187,11 +1195,12 @@ /** * @param {StickyNote} stickyNote + * @param {HTMLElement} page * @param {() => void} onSave * @param {() => void} onDelete * @returns {HTMLElement} */ - function renderStickyNote(stickyNote, onSave, onDelete) { + function renderStickyNote(stickyNote, page, onSave, onDelete) { const noteElement = makeElement("birb-window"); noteElement.classList.add("birb-sticky-note"); @@ -1216,7 +1225,7 @@ noteElement.style.top = `${stickyNote.top}px`; noteElement.style.left = `${stickyNote.left}px`; - document.body.appendChild(noteElement); + page.appendChild(noteElement); makeDraggable(header, true, (top, left) => { stickyNote.top = top; @@ -1267,10 +1276,11 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const pageElement = getContext().getActivePage(); const context = getContext(); for (let stickyNote of stickyNotes) { if (context.isPathApplicable(stickyNote.site)) { - renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); + renderStickyNote(stickyNote, pageElement, onSave, () => onDelete(stickyNote)); } } } @@ -1284,9 +1294,10 @@ const id = Date.now().toString(); const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); - const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); - element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; - element.style.top = `${window.scrollY + window.innerHeight / 2 - element.offsetHeight / 2}px`; + const page = getContext().getActivePage(); + const element = renderStickyNote(stickyNote, page, onSave, () => onDelete(stickyNote)); + element.style.left = `${page.clientWidth / 2 - element.offsetWidth / 2}px`; + element.style.top = `${page.scrollTop + page.clientHeight / 2 - element.offsetHeight / 2}px`; stickyNote.top = parseInt(element.style.top, 10); stickyNote.left = parseInt(element.style.left, 10); stickyNotes.push(stickyNote); @@ -1960,7 +1971,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.64", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.64"); }, false), + new MenuItem("2025.11.13.80", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.80"); }, false), ]; const styleElement = document.createElement("style"); diff --git a/src/context.js b/src/context.js index f693f05..9f1f50b 100644 --- a/src/context.js +++ b/src/context.js @@ -61,6 +61,14 @@ export class Context { return window.location.href; } + /** + * @returns {HTMLElement} The current active page element where sticky notes can be applied + */ + getActivePage() { + // Default to root element + return document.documentElement; + } + /** * Checks if a path is applicable given the context * @param {string} path Can be a site URL or another context-specific path diff --git a/src/stickyNotes.js b/src/stickyNotes.js index 8e9c523..f070e69 100644 --- a/src/stickyNotes.js +++ b/src/stickyNotes.js @@ -33,11 +33,12 @@ export class StickyNote { /** * @param {StickyNote} stickyNote + * @param {HTMLElement} page * @param {() => void} onSave * @param {() => void} onDelete * @returns {HTMLElement} */ -export function renderStickyNote(stickyNote, onSave, onDelete) { +export function renderStickyNote(stickyNote, page, onSave, onDelete) { const noteElement = makeElement("birb-window"); noteElement.classList.add("birb-sticky-note"); @@ -62,7 +63,7 @@ export function renderStickyNote(stickyNote, onSave, onDelete) { noteElement.style.top = `${stickyNote.top}px`; noteElement.style.left = `${stickyNote.left}px`; - document.body.appendChild(noteElement); + page.appendChild(noteElement); makeDraggable(header, true, (top, left) => { stickyNote.top = top; @@ -113,10 +114,11 @@ export function drawStickyNotes(stickyNotes, onSave, onDelete) { const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const pageElement = getContext().getActivePage(); const context = getContext(); for (let stickyNote of stickyNotes) { if (context.isPathApplicable(stickyNote.site)) { - renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); + renderStickyNote(stickyNote, pageElement, onSave, () => onDelete(stickyNote)); } } } @@ -130,9 +132,10 @@ export function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); - const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); - element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; - element.style.top = `${window.scrollY + window.innerHeight / 2 - element.offsetHeight / 2}px`; + const page = getContext().getActivePage(); + const element = renderStickyNote(stickyNote, page, onSave, () => onDelete(stickyNote)); + element.style.left = `${page.clientWidth / 2 - element.offsetWidth / 2}px`; + element.style.top = `${page.scrollTop + page.clientHeight / 2 - element.offsetHeight / 2}px`; stickyNote.top = parseInt(element.style.top, 10); stickyNote.left = parseInt(element.style.left, 10); stickyNotes.push(stickyNote);