From 88a2bd0d7a4fb4d179212db9e0f39a4ca3d3456f Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Fri, 2 Oct 2026 18:26:12 -0700 Subject: [PATCH] Add Sticky Notes script synced to SurrealDB Classic sticky notes on any webpage, pinned to the exact URL and stored in the user's own SurrealDB (SURREAL_URL/USER/PASS secrets). Includes popup buttons, drag/resize/collapse, colours, undo delete, an all-notes panel with deep links, SPA support, a local outbox for failed saves and a cached URL index so pages without notes never query the database. Co-Authored-By: Claude Opus 5.5 --- README.md | 67 +++++ screenshot-notes.jpg | Bin 0 -> 43958 bytes screenshot-panel.jpg | Bin 0 -> 47055 bytes sticky-notes.os.js | 625 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 692 insertions(+) create mode 100644 README.md create mode 100644 screenshot-notes.jpg create mode 100644 screenshot-panel.jpg create mode 100644 sticky-notes.os.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..bc2527a --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# StickyNotes.openscript + +Classic sticky notes on any webpage, powered by [OpenScript](https://github.com/GetOpenScript/OpenScript). Every note is pinned to the exact page you left it on and synced to **your own SurrealDB**, so your notes follow you across browsers and devices without a third-party service. + +![Sticky notes in the margins of an article](screenshot-notes.jpg) + +## Scripts + +### 1. Sticky Notes (`sticky-notes.os.js`) + +Adds yellow (or pink, green, blue, purple, orange) notes to any page. Notes scroll with the page, staying beside the paragraph you attached them to. + +#### Features +- **Popup buttons:** **Add sticky note**, **Hide/Show notes on this page**, and **All sticky notes**, right in the OpenScript popup. +- **Pinned to the exact URL:** Query strings are kept, so `?page=2` gets its own notes. Tracking parameters (`utm_*`, `fbclid`, `gclid`, …) and `#section` anchors are ignored so links don't split your notes. Hash routes such as `#/inbox` are kept. +- **Sticks to the page:** Notes live in document coordinates and scroll with the content. The horizontal position is anchored to the page's centre line, so a note in the margin stays beside centred content at any window width or on another monitor. +- **Drag, resize, collapse:** Drag by the top strip (the page auto-scrolls near the viewport edges), resize from the folded corner, and double-click the strip to collapse a note to a one-line label. +- **Autosave:** Saves 0.7 s after you stop typing, and immediately on blur, move, resize or colour change. A failed save shows **Not saved · retry** and retries automatically. Failed saves are also kept locally and replayed on the next page load, so closing a tab while offline loses nothing. +- **Undo delete:** Deleting a note shows a toast with **Undo**. +- **All notes panel:** Search every note, grouped by page with this page first. Click a note on another page to open it; the page scrolls to the note and highlights it. +- **Sync between tabs and devices:** Notes refresh when you return to a tab, without overwriting a note you're editing. +- **SPA aware:** Follows client-side navigation (YouTube, GitHub, Reddit, …) via the Navigation API. +- **Plays nicely with sites:** + - The UI lives in a closed Shadow DOM, so page CSS can't restyle it. + - Keystrokes inside a note never trigger site shortcuts (YouTube `k`, GitHub `s`, Gmail `c`, …). + - Copy/paste blockers and focus traps can't interfere. + - Notes are hidden when printing. +- **Light on the network:** A cached index of which URLs have notes (refreshed at most once a minute) means pages without notes never query the database. + +![All sticky notes panel](screenshot-panel.jpg) + +#### Installation +1. Install [OpenScript](https://chromewebstore.google.com/detail/openscript/dkelmgdchndagjemmodhkphdikhpnfol) (requires version `1.0.6` or newer for popup buttons). +2. In the OpenScript popup, open **Secrets** and add: + + | Secret | Example | Required | + | :--- | :--- | :--- | + | `SURREAL_URL` | `https://surreal.example.com` (`wss://…/rpc` also works) | Yes | + | `SURREAL_USER` | a root, namespace or database user | Yes | + | `SURREAL_PASS` | that user's password | Yes | + | `SURREAL_NS` | defaults to `openscript` | No | + | `SURREAL_DB` | defaults to `sticky_notes` | No | + +3. Click **New Script**, paste the contents of [`sticky-notes.os.js`](sticky-notes.os.js), save, and make sure it is enabled. +4. Reload any page, open the OpenScript popup and click **Add sticky note**. + +#### Data +Notes are stored in the `sticky_note` table. On first write the script defines the table, `created`/`updated` timestamps and an index on `url`, so the user needs the Editor or Owner role on that database. If `SURREAL_NS`/`SURREAL_DB` don't exist yet, it needs root (or namespace) access to create them. + +| Field | Description | +| :--- | :--- | +| `url` | Normalised page URL the note belongs to | +| `title` | Page title, shown in the All notes panel | +| `text` | Note contents | +| `x` | Left edge, in px from the page's horizontal centre line | +| `y` | Top edge, in px from the top of the document | +| `w`, `h` | Size in px | +| `color` | `yellow`, `pink`, `green`, `blue`, `purple` or `orange` | +| `collapsed` | Whether the note is collapsed to its title strip | +| `created`, `updated` | Set by SurrealDB | + +Requests go straight from the browser to your `SURREAL_URL` through `OpenScript.fetch` (HTTP `/rpc` with Basic auth) and nowhere else. Values are sent as escaped SurrealQL literals rather than RPC variables. SurrealDB's JSON-RPC would otherwise turn text like `todo: buy milk` into the record link `todo:buy`. + +#### Limitations +- Pages that scroll an inner container instead of the window (some web apps) keep notes fixed to the viewport. +- Positions are page coordinates. If a page's layout changes a lot, a note can drift from the text it annotated. +- User scripts don't run on `chrome://` pages or the Chrome Web Store. diff --git a/screenshot-notes.jpg b/screenshot-notes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18737474481f0b6c512b38d5f8c12f3e1b72d262 GIT binary patch literal 43958 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 b{qnLb5%M-+`SG9UDpu>muzh^{Yv%s|R` JSON.stringify(v, (k, x) => typeof x === 'string' ? x.toWellFormed() : x); +const Q = { + schema: `DEFINE TABLE IF NOT EXISTS ${TB} SCHEMALESS; + DEFINE FIELD IF NOT EXISTS created ON ${TB} TYPE datetime DEFAULT time::now() READONLY; + DEFINE FIELD IF NOT EXISTS updated ON ${TB} TYPE datetime VALUE time::now(); + DEFINE INDEX IF NOT EXISTS ${TB}_url ON ${TB} FIELDS url;`, + page: url => `SELECT *, record::id(id) AS id FROM ${TB} WHERE url = ${lit(url)} ORDER BY created`, + pages: `array::distinct((SELECT VALUE url FROM ${TB}))`, + all: `SELECT *, record::id(id) AS id FROM ${TB} ORDER BY updated DESC LIMIT 2000`, + upsert: (id, data) => `UPSERT type::thing('${TB}', ${lit(id)}) MERGE ${lit(data)} RETURN NONE`, + delete: id => `DELETE type::thing('${TB}', ${lit(id)})`, +}; +const FONT = `ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`; +const CSS = ` + :host { all: initial; } + @media print { :host { display: none !important; } } + * { box-sizing: border-box; } + ${Object.entries(COLORS).map(([c, [bg, bar]]) => `[data-color=${c}] { --bg: ${bg}; --bar: ${bar}; }`).join('\n')} + .layer { position: absolute; left: 0; top: 0; z-index: 0; } + .layer[hidden] { display: none; } + .panel, .toasts { z-index: 1; } + .note { + position: absolute; left: 0; top: 0; display: flex; flex-direction: column; color: #2d2a1e; + font: 14px/1.5 ${FONT}; -webkit-font-smoothing: antialiased; border-radius: 2px 2px 3px 3px; + background: linear-gradient(175deg, var(--bg) 55%, color-mix(in srgb, var(--bg), #000 4%)); + box-shadow: 0 1px 1px rgb(0 0 0 / .08), 0 4px 10px -4px rgb(0 0 0 / .18), 0 18px 32px -16px rgb(0 0 0 / .32); + transition: box-shadow .2s, rotate .2s, scale .2s; + } + .note.dragging { rotate: -1.2deg; scale: 1.02; box-shadow: 0 2px 4px rgb(0 0 0 / .1), 0 26px 44px -14px rgb(0 0 0 / .42); } + .dragging, .dragging * { cursor: grabbing !important; } + .bar { + flex: none; display: flex; align-items: center; gap: 2px; height: 30px; padding: 0 4px 0 7px; + background: var(--bar); border-radius: 2px 2px 0 0; cursor: grab; user-select: none; touch-action: none; + } + .collapsed .bar { border-radius: 2px; } + .grip { + flex: none; width: 12px; height: 16px; margin-right: 4px; opacity: .4; + background: radial-gradient(circle, #000 1px, transparent 1.5px) 0 0 / 6px 5.33px; + } + .label { + flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + font-size: 12.5px; font-weight: 500; color: rgb(0 0 0 / .6); + } + .err .label { color: #b42318; cursor: pointer; } + .btn { + all: unset; flex: none; display: grid; place-items: center; width: 24px; height: 24px; border-radius: 6px; + color: rgb(0 0 0 / .55); cursor: pointer; opacity: 0; transition: opacity .15s, background-color .15s, color .15s; + } + .note:hover .btn, .note:focus-within .btn, .collapsed .btn { opacity: 1; } + .btn:hover { background: rgb(0 0 0 / .08); color: rgb(0 0 0 / .85); } + .btn:focus-visible { opacity: 1; outline: 2px solid rgb(0 0 0 / .45); outline-offset: -2px; } + .btn svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } + .dot { width: 13px; height: 13px; border-radius: 50%; background: var(--bg); box-shadow: inset 0 0 0 1.5px rgb(0 0 0 / .35); } + .palette { + position: absolute; top: 34px; right: 6px; z-index: 1; display: none; gap: 7px; padding: 8px; + background: #fff; border-radius: 10px; box-shadow: 0 0 0 1px rgb(0 0 0 / .06), 0 10px 24px -6px rgb(0 0 0 / .3); + } + .palette.open { display: flex; } + .swatch { + all: unset; width: 20px; height: 20px; border-radius: 50%; background: var(--bg); cursor: pointer; + box-shadow: inset 0 0 0 1px rgb(0 0 0 / .18); transition: transform .12s; + } + .swatch:hover { transform: scale(1.15); } + .swatch[aria-pressed=true] { box-shadow: inset 0 0 0 1px rgb(0 0 0 / .18), 0 0 0 2px #fff, 0 0 0 4px rgb(0 0 0 / .5); } + textarea { + all: unset; flex: 1; min-height: 0; display: block; padding: 10px 14px 18px; color: inherit; font: inherit; + white-space: pre-wrap; overflow-wrap: anywhere; overflow-y: auto; cursor: text; + scrollbar-width: thin; scrollbar-color: rgb(0 0 0 / .2) transparent; + } + textarea::placeholder { color: rgb(0 0 0 / .35); } + .collapsed textarea, .collapsed .resize { display: none; } + .resize { + position: absolute; right: 0; bottom: 0; width: 18px; height: 18px; cursor: nwse-resize; touch-action: none; + background: linear-gradient(135deg, transparent 50%, color-mix(in srgb, var(--bar), #000 10%) 50%); + border-radius: 0 0 3px 0; opacity: .55; transition: opacity .15s; + } + .note:hover .resize { opacity: 1; } + .pop { animation: pop .22s cubic-bezier(.2, .9, .3, 1.25); } + @keyframes pop { from { opacity: 0; scale: .9; } } + .flash { animation: flash .8s ease 2; } + @keyframes flash { 50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--bar), transparent 25%), 0 18px 32px -16px rgb(0 0 0 / .32); } } + .toasts { + position: fixed; left: 50%; bottom: 24px; translate: -50% 0; display: flex; flex-direction: column; + align-items: center; gap: 8px; pointer-events: none; font: 13.5px/1.4 ${FONT}; + } + .toast { + display: flex; align-items: center; gap: 14px; max-width: min(480px, calc(100vw - 32px)); padding: 10px 16px; + color: #f5f5f4; background: #262522; border-radius: 10px; box-shadow: 0 12px 30px -8px rgb(0 0 0 / .45); + pointer-events: auto; animation: rise .2s ease; + } + .toast:has(button) { padding-right: 8px; } + .toast button { all: unset; padding: 4px 8px; margin: -4px 0; border-radius: 6px; color: #fde68a; font-weight: 600; cursor: pointer; } + .toast button:hover { background: rgb(255 255 255 / .1); } + @keyframes rise { from { opacity: 0; translate: 0 8px; } } + .panel { + --p-bg: #fff; --p-fg: #1c1b18; --p-muted: #77736a; --p-line: rgb(0 0 0 / .08); --p-hover: rgb(0 0 0 / .045); --p-input: #f5f4f1; + position: fixed; top: 12px; right: 12px; bottom: 12px; width: min(380px, calc(100vw - 24px)); display: flex; + flex-direction: column; color: var(--p-fg); background: var(--p-bg); border-radius: 14px; overflow: hidden; + box-shadow: 0 0 0 1px var(--p-line), 0 30px 60px -12px rgb(0 0 0 / .35); font: 13.5px/1.45 ${FONT}; animation: slide .2s ease; + } + @media (prefers-color-scheme: dark) { + .panel { --p-bg: #1d1c1a; --p-fg: #ecebe8; --p-muted: #9a968d; --p-line: rgb(255 255 255 / .09); --p-hover: rgb(255 255 255 / .05); --p-input: #282724; } + } + @keyframes slide { from { opacity: 0; translate: 16px 0; } } + .panel header { display: flex; align-items: center; gap: 8px; padding: 14px 10px 10px 18px; } + .panel h2 { all: unset; flex: 1; font-size: 16px; font-weight: 650; } + .count { color: var(--p-muted); font-variant-numeric: tabular-nums; } + .panel .btn { opacity: 1; color: var(--p-muted); } + .panel .btn:hover { background: var(--p-hover); color: var(--p-fg); } + .search { all: unset; margin: 0 14px 8px; padding: 9px 12px; background: var(--p-input); border-radius: 9px; box-shadow: inset 0 0 0 1px var(--p-line); } + .search:focus { box-shadow: inset 0 0 0 2px #e6bf2a; } + .search::placeholder { color: var(--p-muted); } + .list { flex: 1; overflow-y: auto; padding: 4px 8px 12px; scrollbar-width: thin; } + .group + .group { margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--p-line); } + .page { display: flex; align-items: baseline; gap: 10px; padding: 8px 10px 4px; color: inherit; text-decoration: none; } + .page .title { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-weight: 600; } + .page:hover .title { text-decoration: underline; } + .host { flex: none; max-width: 45%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--p-muted); font-size: 12px; } + .item { display: flex; align-items: flex-start; gap: 10px; padding: 7px 6px 7px 10px; border-radius: 8px; cursor: pointer; outline: none; } + .item:hover, .item:focus-visible { background: var(--p-hover); } + .chip { + flex: none; width: 14px; height: 14px; margin-top: 3px; border-radius: 2px; box-shadow: 0 1px 2px rgb(0 0 0 / .2); + background: linear-gradient(var(--bar, #fbe97a) 0 4px, var(--bg, #fff7a8) 4px); + } + .snippet { + flex: 1; min-width: 0; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; + overflow: hidden; white-space: pre-line; overflow-wrap: anywhere; + } + .meta { flex: none; padding-top: 1px; color: var(--p-muted); font-size: 12px; font-variant-numeric: tabular-nums; } + .item .btn { width: 22px; height: 22px; margin: -1px 0; opacity: 0; } + .item:hover .btn, .item:focus-within .btn { opacity: 1; } + .empty { margin: 0; padding: 48px 24px; text-align: center; color: var(--p-muted); } + .empty.err { color: #c2410c; } + .panel footer { + padding: 10px 18px; border-top: 1px solid var(--p-line); color: var(--p-muted); font-size: 12px; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + } + @media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } } +`; + +// ---------- helpers ---------- +const $ = (tag, { data, ...props } = {}, ...kids) => { + const el = Object.assign(document.createElement(tag), props); + if (data) Object.assign(el.dataset, data); + el.append(...kids); + return el; +}; +const icon = d => { + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + const path = document.createElementNS(svg.namespaceURI, 'path'); + svg.setAttribute('viewBox', '0 0 24 24'); + path.setAttribute('d', d); + svg.append(path); + return svg; +}; +const button = (className, title, kid, onclick) => + $('button', { className: `btn ${className}`, type: 'button', title, ariaLabel: title, onclick }, kid); +const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v)); +const viewW = () => document.documentElement.clientWidth; +const ago = t => { + const s = (Date.now() - Date.parse(t)) / 1e3; + return isNaN(s) ? '' : s < 60 ? 'now' : s < 3600 ? `${s / 60 | 0}m` : s < 86400 ? `${s / 3600 | 0}h` + : s < 2592000 ? `${s / 86400 | 0}d` : new Date(t).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); +}; +// Exact page URL, minus tracking params and in-page anchors (hash routes like #/inbox are kept). +const pageKey = () => { + const u = new URL(location.href); + [...u.searchParams.keys()].filter(k => TRACKING.test(k)).forEach(k => u.searchParams.delete(k)); + if (!/^#!?\//.test(u.hash)) u.hash = ''; + return u.href; +}; +const domReady = new Promise(r => document.readyState === 'loading' + ? document.addEventListener('DOMContentLoaded', r, { once: true }) : r()); + +// ---------- SurrealDB ---------- +const query = async sql => { + const res = await OpenScript.fetch(ENDPOINT, { + method: 'POST', + headers: { + Accept: 'application/json', 'Content-Type': 'application/json', + Authorization: AUTH, 'Surreal-NS': NS, 'Surreal-DB': DB, + }, + body: JSON.stringify({ id: 1, method: 'query', params: [sql] }), + }); + const text = await res.text(); + let out; + try { out = JSON.parse(text); } catch {} + const err = res.status === 401 ? 'SurrealDB rejected SURREAL_USER / SURREAL_PASS' + : out?.error?.message || (!Array.isArray(out?.result) && (text.slice(0, 200) || `HTTP ${res.status}`)) + || out.result.find(r => r.status !== 'OK')?.result; + if (err) throw new Error(err); + return out.result.map(r => r.result); +}; +let writes = Promise.resolve(), schema; +const write = fn => writes = writes.catch(() => {}).then(fn); // serialised so saves and deletes never race +const ensureSchema = () => schema ||= (async () => { + if (await storage.get('schema') === SRC) return; + await query(Q.schema); + await storage.set('schema', SRC); +})().catch(e => { schema = null; throw e; }); +const pick = d => Object.fromEntries(FIELDS.map(k => [k, d[k]])); +const upsert = d => write(async () => { + await ensureSchema(); + await query(Q.upsert(d.id, pick(d))); +}); +// Notes that failed to save are kept locally and replayed on the next page load, so closing a tab offline loses nothing. +const outbox = async (d, keep) => { + const box = await storage.get('outbox') || {}; + if (keep) box[d.id] = { id: d.id, ...pick(d) }; + else delete box[d.id]; + await storage.set('outbox', box); +}; +const replayOutbox = async () => { + for (const d of Object.values(await storage.get('outbox') || {})) { + await upsert(d); + await outbox(d, false); + } +}; +// Cached list of URLs that have notes, so most page loads never touch the database. +const indexEdit = async (url, add) => { + const idx = await storage.get('index'); + if (idx?.src !== SRC) return; + const urls = idx.urls.filter(u => u !== url); + await storage.set('index', { ...idx, urls: add ? [...urls, url] : urls }); +}; + +// ---------- state ---------- +const notes = new Map(); +let key = pageKey(), host, root, layer, toasts, panel, renderPanel, panelAll = []; +let hidden = false, z = 1, loadSeq = 0, warned = false, offButtons = []; + +// ---------- UI shell ---------- +const ui = () => { + if (host) return; + host = document.createElement('openscript-sticky-notes'); + host.style.cssText = 'all:initial;position:absolute;top:0;left:0;width:0;height:0;z-index:2147483647'; + root = host.attachShadow({ mode: 'closed' }); + const sheet = new CSSStyleSheet(); + sheet.replaceSync(CSS); + root.adoptedStyleSheets = [sheet]; + root.append(layer = $('div', { className: 'layer', hidden }), toasts = $('div', { className: 'toasts' })); + // Keep our clicks, focus and selection from reaching page handlers (menus, focus traps, copy blockers). + ['pointerdown', 'pointerup', 'mousedown', 'mouseup', 'click', 'dblclick', 'contextmenu', 'wheel', 'touchstart', + 'touchmove', 'focusin', 'focusout', 'input', 'beforeinput', 'selectstart', 'dragstart'] + .forEach(t => root.addEventListener(t, e => e.stopPropagation(), { passive: true })); + root.addEventListener('pointerdown', e => notes.forEach(n => + n.palette.contains(e.target) || n.colorBtn.contains(e.target) || n.palette.classList.remove('open')), true); + document.documentElement.append(host); + new MutationObserver(() => host.isConnected || document.documentElement.append(host)) + .observe(document.documentElement, { childList: true }); +}; +const toast = (msg, action, fn, ms = 6000) => { + ui(); + const t = $('div', { className: 'toast', role: 'status' }, $('span', { textContent: msg })); + if (action) t.append($('button', { type: 'button', textContent: action, onclick: () => { t.remove(); fn(); } })); + toasts.append(t); + while (toasts.children.length > 3) toasts.firstChild.remove(); + setTimeout(() => t.remove(), ms); +}; +const setupHint = () => toast('Sticky Notes needs SURREAL_URL, SURREAL_USER and SURREAL_PASS in OpenScript › Secrets. Reload the page after adding them.', null, null, 9000); +const setHidden = v => { + hidden = v; + if (layer) layer.hidden = v; + syncButtons(); +}; +const syncButtons = () => { + offButtons.forEach(off => off()); + if (!OpenScript.button) return; + const c = notes.size, s = c > 1 ? 's' : ''; + offButtons = [ + OpenScript.button('Add sticky note', addNote), + c && OpenScript.button(hidden ? `Show ${c} hidden note${s}` : `Hide note${s} on this page`, () => setHidden(!hidden)), + OpenScript.button('All sticky notes', openPanel), + ].filter(Boolean); +}; + +// ---------- notes ---------- +// x is the offset from the page's centre line, so notes stay beside centred content at any window width. +const pos = n => ({ + x: clamp(Math.round(viewW() / 2 + n.data.x), 0, Math.max(0, viewW() - n.data.w)), + y: Math.max(0, n.data.y), +}); +const place = n => { + const { x, y } = pos(n); + Object.assign(n.el.style, { + transform: `translate(${x}px, ${y}px)`, width: `${n.data.w}px`, height: n.data.collapsed ? '' : `${n.data.h}px`, + }); +}; +const paint = n => { + const { data: d, el } = n, text = d.text || ''; + el.dataset.color = COLORS[d.color] ? d.color : 'yellow'; + el.classList.toggle('collapsed', !!d.collapsed); + el.classList.toggle('err', !!n.err); + n.label.textContent = n.err ? 'Not saved · retry' : d.collapsed ? text.trim().split('\n')[0] || 'Empty note' : ''; + n.label.title = n.err || ''; + n.minBtn.title = n.minBtn.ariaLabel = d.collapsed ? 'Expand' : 'Collapse'; + n.minBtn.replaceChildren(icon(d.collapsed ? ICON.expand : ICON.collapse)); + [...n.palette.children].forEach(s => s.ariaPressed = s.dataset.color === el.dataset.color); + if (root.activeElement !== n.ta && n.ta.value !== text) n.ta.value = text; +}; +const front = n => n.el.style.zIndex = ++z; +const status = (n, err) => { + n.err = err?.message; + paint(n); +}; +const persist = n => { + clearTimeout(n.timer); + n.timer = 0; + if (n.gone) return; + if (n.data.url === key) n.data.title = document.title; + upsert(n.data).then(() => { + n.data.updated = new Date().toISOString(); + if (n.boxed) n.boxed = false, outbox(n.data, false); + status(n); + }, e => { + n.boxed = true; + outbox(n.data, true); + status(n, e); + n.timer ||= setTimeout(() => persist(n), 15e3); + }); +}; +const save = (n, delay = 0) => { + n.touched = Date.now(); + clearTimeout(n.timer); + n.timer = setTimeout(() => persist(n), delay); +}; +const flush = () => notes.forEach(n => n.timer && persist(n)); +const collapse = n => { + n.data.collapsed = !n.data.collapsed; + paint(n); + place(n); + save(n); +}; + +const drag = (e, n, mode) => { + if (e.button || e.target.closest('button')) return; + e.preventDefault(); + front(n); + const { el, data: d } = n, o = { ...d, ...pos(n) }, sx = e.clientX + scrollX, sy = e.clientY + scrollY; + const ac = new AbortController(), opts = { capture: true, signal: ac.signal }; + let last = e, active = false, raf; + const apply = () => { + const dx = last.clientX + scrollX - sx, dy = last.clientY + scrollY - sy, vw = viewW(); + if (mode === 'move') { + d.x = Math.round(clamp(o.x + dx, 0, Math.max(0, vw - d.w)) - vw / 2); + d.y = Math.round(Math.max(0, o.y + dy)); + } else { + d.w = Math.round(clamp(o.w + dx, NOTE.minW, NOTE.maxW)); + d.h = Math.round(clamp(o.h + dy, NOTE.minH, NOTE.maxH)); + } + place(n); + }; + const tick = () => { // follows wheel scrolling and auto-scrolls near the viewport edges + const v = mode === 'move' && (last.clientY < 32 ? -14 : last.clientY > innerHeight - 32 ? 14 : 0); + if (v) scrollBy(0, v); + apply(); + raf = requestAnimationFrame(tick); + }; + const end = () => { + ac.abort(); + cancelAnimationFrame(raf); + el.classList.remove('dragging', 'resizing'); + if (active) apply(), save(n); + }; + addEventListener('pointermove', ev => { + last = ev; + if (active || Math.hypot(ev.clientX - e.clientX, ev.clientY - e.clientY) < 3) return; + active = true; + el.setPointerCapture(e.pointerId); + el.classList.add(mode === 'move' ? 'dragging' : 'resizing'); + n.palette.classList.remove('open'); + tick(); + }, opts); + addEventListener('pointerup', end, opts); + addEventListener('pointercancel', end, opts); +}; + +const mount = (data, fresh) => { + ui(); + const n = { id: data.id, touched: 0, timer: 0 }; + n.data = { text: '', color: 'yellow', collapsed: false, x: -NOTE.w / 2, y: 0, w: NOTE.w, h: NOTE.h, ...data }; + const ta = $('textarea', { + value: n.data.text, placeholder: 'Write a note…', ariaLabel: 'Sticky note', + oninput: () => { n.data.text = ta.value; save(n, 700); }, + onblur: () => n.timer && persist(n), + }); + const palette = $('div', { className: 'palette', role: 'group', ariaLabel: 'Note colour' }, + ...Object.keys(COLORS).map(c => $('button', { + className: 'swatch', type: 'button', title: c[0].toUpperCase() + c.slice(1), data: { color: c }, + onclick: () => { n.data.color = c; palette.classList.remove('open'); paint(n); save(n); }, + }))); + const label = $('span', { className: 'label', onclick: () => n.err && persist(n) }); + const colorBtn = button('color', 'Colour', $('span', { className: 'dot' }), () => palette.classList.toggle('open')); + const minBtn = button('min', 'Collapse', '', () => collapse(n)); + const bar = $('div', { + className: 'bar', title: 'Drag to move · double-click to collapse', + onpointerdown: e => drag(e, n, 'move'), ondblclick: e => e.target.closest('button') || collapse(n), + }, $('span', { className: 'grip' }), label, colorBtn, minBtn, + button('del', 'Delete note', icon(ICON.x), () => destroy(n.data))); + n.el = $('div', { className: `note${fresh ? ' pop' : ''}`, onpointerdown: () => front(n) }, bar, palette, ta, + $('div', { className: 'resize', title: 'Resize', onpointerdown: e => drag(e, n, 'size') })); + Object.assign(n, { ta, label, palette, colorBtn, minBtn }); + notes.set(n.id, n); + layer.append(n.el); + paint(n); + place(n); + front(n); + syncButtons(); + return n; +}; +const unmount = n => { + n.el.remove(); + notes.delete(n.id); + syncButtons(); +}; +const reveal = n => { + setHidden(false); + scrollTo({ top: Math.max(0, pos(n).y - innerHeight / 3), behavior: 'smooth' }); + front(n); + n.el.classList.remove('flash'); + void n.el.offsetWidth; + n.el.classList.add('flash'); +}; + +const addNote = async () => { + if (!READY) return setupHint(); + await domReady; + setHidden(false); + let x = -NOTE.w / 2, y = Math.round(scrollY + innerHeight * .2); + while ([...notes.values()].some(n => Math.abs(n.data.x - x) < 16 && Math.abs(n.data.y - y) < 16)) x += 28, y += 28; + const n = mount({ + id: crypto.randomUUID().replaceAll('-', ''), url: key, title: document.title, + x, y, w: NOTE.w, h: NOTE.h, text: '', color: 'yellow', collapsed: false, + }, true); + save(n); + indexEdit(key, true); + n.ta.focus({ preventScroll: true }); +}; +const destroy = d => { + const n = notes.get(d.id); + if (n) { + n.gone = true; + clearTimeout(n.timer); + unmount(n); + if (n.boxed) outbox(d, false); + } + panelAll = panelAll.filter(x => x.id !== d.id); + renderPanel?.(); + write(() => query(Q.delete(d.id))).catch(e => toast(`Couldn't delete the note: ${e.message}`)); + if (!(d.url === key ? notes.size : panelAll.some(x => x.url === d.url))) indexEdit(d.url, false); + toast('Note deleted', 'Undo', () => restore(d)); +}; +const restore = d => { + indexEdit(d.url, true); + if (renderPanel) panelAll.unshift(d), renderPanel(); + if (d.url !== key) return upsert(d).catch(e => toast(`Couldn't restore the note: ${e.message}`)); + setHidden(false); + save(mount(d, true)); +}; + +// ---------- loading & sync ---------- +const reconcile = (list, since) => { + const ids = new Set(list.map(d => d.id)); + for (const d of list) { + const n = notes.get(d.id); + if (!n) mount(d); + else if (n.touched < since && !n.timer && root.activeElement !== n.ta && !n.el.matches('.dragging, .resizing')) { + n.data = { ...n.data, ...d }; + paint(n); + place(n); + } + } + notes.forEach(n => ids.has(n.id) || n.touched >= since || n.timer || unmount(n)); + if (list.length) focusRequest(); +}; +const load = async () => { + if (!READY) return; + const seq = ++loadSeq, url = key, since = Date.now(); + await replayOutbox().catch(e => console.warn('[Sticky Notes] outbox replay failed', e)); + const idx = await storage.get('index').catch(() => null), known = idx?.src === SRC ? idx : null; + const fresh = known && since - known.at < INDEX_TTL; + if (fresh && !known.urls.includes(url)) return; + try { + const [list = [], urls] = await query(fresh ? Q.page(url) : `${Q.page(url)}; ${Q.pages}`); + if (urls) await storage.set('index', { src: SRC, at: since, urls }); + await domReady; + if (seq === loadSeq && url === key) reconcile(list, since); + } catch (e) { + console.warn('[Sticky Notes]', e); + if (!warned && known?.urls.includes(url)) warned = true, toast(`Couldn't load sticky notes: ${e.message}`); + } +}; +// Set by "All sticky notes" before opening another page, so that page scrolls to the chosen note. +const focusRequest = async () => { + const f = await storage.get('focus'); + if (f?.url !== key || Date.now() - f.at > 30e3) return; + await storage.delete('focus'); + const n = notes.get(f.id), go = () => reveal(n); + if (n) document.hidden ? document.addEventListener('visibilitychange', go, { once: true }) : go(); +}; + +// ---------- all notes panel ---------- +const closePanel = () => { + panel?.remove(); + panel = renderPanel = null; + panelAll = []; +}; +const go = d => { + if (d.url === key) { + closePanel(); + const n = notes.get(d.id); + return n ? reveal(n) : load(); + } + if (!/^https?:\/\//.test(d.url)) return; + window.open(d.url, '_blank', 'noopener'); + storage.set('focus', { url: d.url, id: d.id, at: Date.now() }); +}; +const group = (url, ds) => { + const here = url === key, u = URL.parse(url); + return $('section', { className: 'group' }, + $('a', { + className: 'page', href: /^https?:/.test(url) ? url : '', target: '_blank', rel: 'noopener', title: url, + onclick: e => here && (e.preventDefault(), closePanel()), + }, $('span', { className: 'title', textContent: ds.find(d => d.title)?.title || (u ? u.host + u.pathname : url) }), + $('span', { className: 'host', textContent: here ? 'This page' : u?.hostname.replace(/^www\./, '') || '' })), + ...ds.map(d => $('div', { className: 'item', tabIndex: 0, role: 'button', onclick: () => go(d) }, + $('span', { className: 'chip', data: { color: d.color } }), + $('span', { className: 'snippet', textContent: d.text?.trim() || 'Empty note' }), + $('span', { className: 'meta', textContent: ago(d.updated), title: d.updated ? new Date(d.updated).toLocaleString() : '' }), + button('del', 'Delete note', icon(ICON.x), e => { e.stopPropagation(); destroy(d); })))); +}; +const openPanel = async () => { + if (!READY) return setupHint(); + await domReady; + ui(); + closePanel(); + const search = $('input', { className: 'search', type: 'search', placeholder: 'Search notes and pages', ariaLabel: 'Search notes' }); + const count = $('span', { className: 'count' }); + const list = $('div', { className: 'list' }, $('p', { className: 'empty', textContent: 'Loading…' })); + const me = panel = $('aside', { className: 'panel', role: 'dialog', ariaLabel: 'All sticky notes' }, + $('header', {}, $('h2', { textContent: 'Sticky notes' }), count, button('close', 'Close', icon(ICON.x), closePanel)), + search, list, $('footer', { textContent: `${ENDPOINT.replace(/^\w+:\/\/|\/rpc$/g, '')} · ${NS}/${DB}` })); + root.append(panel); + search.focus(); + search.oninput = () => renderPanel?.(); + let all; + try { + [all] = await query(Q.all); + } catch (e) { + if (panel === me) list.replaceChildren($('p', { className: 'empty err', textContent: `Couldn't load notes: ${e.message}` })); + return; + } + if (all.length < 2000) storage.set('index', { src: SRC, at: Date.now(), urls: [...new Set(all.map(d => d.url))] }); + if (panel !== me) return; + panelAll = all; + (renderPanel = () => { + const q = search.value.trim().toLowerCase(); + const hits = panelAll.filter(d => !q || `${d.text}\n${d.title}\n${d.url}`.toLowerCase().includes(q)); + const groups = [...Map.groupBy(hits, d => d.url)].sort(([a], [b]) => (b === key) - (a === key)); + count.textContent = hits.length || ''; + list.replaceChildren(...groups.map(([url, ds]) => group(url, ds))); + if (!groups.length) list.append($('p', { + className: 'empty', textContent: q ? 'No matching notes.' : 'No sticky notes yet. Use “Add sticky note” in the OpenScript popup.', + })); + })(); +}; + +// ---------- wiring ---------- +// Registered at document_start so it runs before any page listener: typing in a note never +// triggers site shortcuts, and copy/paste blockers can't interfere. +['keydown', 'keyup', 'keypress', 'copy', 'cut', 'paste'].forEach(t => addEventListener(t, e => { + if (!host || !e.composedPath().includes(host)) return; + e.stopImmediatePropagation(); + if (t !== 'keydown' || e.isComposing) return; + const el = root.activeElement; + if (e.key === 'Escape') { + notes.forEach(n => n.palette.classList.remove('open')); + panel ? closePanel() : el?.blur(); + } else if (e.key === 'Enter' && el?.matches('.item')) el.click(); +}, true)); +addEventListener('pointerdown', e => { + if (!host || e.composedPath().includes(host)) return; + closePanel(); + notes.forEach(n => n.palette.classList.remove('open')); +}, true); +globalThis.navigation?.addEventListener('currententrychange', () => { + const k = pageKey(); + if (k === key) return; + flush(); + closePanel(); + notes.forEach(unmount); + key = k; + load(); +}); +document.addEventListener('visibilitychange', () => document.hidden ? flush() : load()); +addEventListener('pagehide', flush); +new ResizeObserver(() => notes.forEach(place)).observe(document.documentElement); // window resizes, scrollbars, side panels +syncButtons(); +load();