Commit Graph

176 Commits

Author SHA1 Message Date
JonKazama-Hellion d041c66dfb feat(layout): Board-Position per Lock-Button fixieren
Neuer Pin-Button (custom SVG, kein Emoji) im Board-Header sperrt die Position eines
Boards. Bei gesperrtem Board (.board.locked):
- der Drag-Handle wird per CSS ausgeblendet (Flos Wunsch: Handle weg statt nur inaktiv),
- ein zweiter Guard in drag.js onDown verweigert zusaetzlich jeden Drag.
Schuetzt vor versehentlichem Verschieben (ergaenzt den 3px-Bewegungs-Schwellwert). locked
wird wie blurred persistiert, im Export/Import durchgereicht und mit ins Trash-Board geklont.
i18n DE/EN ergaenzt.
2026-06-14 20:18:00 +02:00
JonKazama-Hellion 520a062049 fix(quick-save): mid-drag gedrainter Quick-Save wird nach Drag-Ende gerendert
Der Drain laesst renderBoards() aus, solange ein Board- oder Bookmark-Drag laeuft
(replaceChildren wuerde den Drag abreissen) — holte den Render danach aber nie nach,
sodass der gespeicherte Eintrag bis zu einem unabhaengigen Fremd-Render unsichtbar blieb.
Der ausgelassene Render wird jetzt gemerkt (_renderDeferredByDrag) und drag.js ruft am
Ende jedes Drags (onUp/onCancel/Bookmark-dragend) flushQuickSaveRenderIfDeferred nach.
Idempotent: ohne ausstehenden Render kein Extra-Render bei normalen Drags.
2026-06-14 19:55:18 +02:00
JonKazama-Hellion 327bcd3385 fix(quick-save): Drain idempotent (srcId-Dedup) + isSafeUrl-Gate
Zwei Befunde aus der Integrations-Review:
- Race: der Page-Drain und der Worker machen je ein read-modify-write auf
  'quicksave_pending' ohne kontextuebergreifende Atomizitaet. Ein Worker-Append im
  await-Fenster des Drains konnte einen bereits gedrainten Eintrag in der Queue belassen,
  den ein Folge-Drain erneut in die Inbox schrieb (Duplikat). Jede eingespielte Bookmark
  traegt jetzt die Pending-id als srcId; ein erneut auftauchender Eintrag wird uebersprungen
  statt doppelt eingefuegt. boards-Write bleibt vor der Queue-Bereinigung -> kein Verlust.
- Validierung: der Drain hat e.url ohne isSafeUrl gepusht, anders als jeder andere
  Bookmark-Schreibpfad. isSafeUrl (jetzt im DOM-freien quicksave-core, http/https/ftp)
  filtert unsichere/leere Protokolle vor dem Schreiben ins Board.
2026-06-14 19:53:38 +02:00
JonKazama-Hellion 530196ddf7 fix(trash): Import-Cap verdraengt keine lokalen Sole-Copies mehr
Beim Trash-Import sortierte combined.sort+slice(-N) rein nach deletedAt: brachte ein
Backup neuere Eintraege mit, fielen aeltere LOKALE Eintraege aus dem Cap — und die sind
die einzige Kopie der geloeschten Daten (Datenverlust). Jetzt haben lokale Eintraege
Vorrang (alle behalten, sind bereits auf TRASH_MAX_ENTRIES gekappt), Importe fuellen nur
den Rest mit den neuesten auf.
2026-06-14 19:52:16 +02:00
JonKazama-Hellion 17eac64683 fix(layout): geblurrtes Board wieder verschiebbar (Drag-Handle ueber Blur-Overlay)
Das .board-blur-overlay (position:absolute; inset:0; z-index:5) lag im geblurrten
Zustand ueber dem Drag-Handle und schluckte den pointerdown, sodass ein geblurrtes
Board nicht mehr per Handle verschoben werden konnte (stattdessen enthuellte der Klick
es). Der Handle bekommt jetzt position:relative + z-index:6 und liegt damit ueber dem
Overlay; Drag funktioniert, Klick auf den Rest des Boards enthuellt weiterhin.
2026-06-14 19:51:32 +02:00
JonKazama-Hellion 1d17f4d11f fix(layout): Board-Handle-Klick ohne Bewegung ueberschreibt board.pos nicht mehr
Ein reiner Klick/Tap auf den Drag-Handle (ohne echtes Verschieben) hat in onUp den
gegen die Viewport geclampten --board-x/y-Wert zurueckgelesen und als board.pos
persistiert. Bei einem off-screen geclampten Board (nach Fenster-Verkleinerung oder
Import von breiterem Screen) zerstoerte das die wahre Position. Jetzt zaehlt erst eine
Bewegung > 3px als Drag; ohne Bewegung bleibt board.pos unangetastet.
2026-06-14 19:51:15 +02:00
JonKazama-Hellion b3288b47eb docs: add 2.3.0 changelog entry 2026-06-14 15:22:37 +02:00
JonKazama-Hellion 84976f5a10 ci: assert background/action + activeTab/commands in Chrome and Firefox manifests 2026-06-14 15:21:46 +02:00
JonKazama-Hellion 5b18bed9b5 chore: bump version to 2.3.0 across all bump targets 2026-06-14 15:20:07 +02:00
JonKazama-Hellion 70f3f705b4 fix(layout): Phase-5-Review — off-screen-Clamp, Drag-Cleanup, Blur-Position, Import-pos
- Render + neuer debounced Resize-Handler clampen --board-x/y gegen den
  aktuellen Viewport: ein auf breiterem Fenster platziertes Board rendert
  nie mehr off-screen (und damit per Drag unerreichbar). board.pos bleibt
  unveraendert, bei spaeterer Verbreiterung wird die Originalposition erreicht.
- drag.js: cleanup() + pointercancel-Listener. Die Klasse .board.dragging
  klebte bei Touch-Interrupt/Browser-Geste sonst dauerhaft und legte den
  app.js-Sync-Guard (Quick-Save-Render) still.
- main.css: '.board.blurred { position: relative }' entfernt — lag im
  utilities-Layer und schlug das absolute Free-Layout (geblurrtes Board fiel
  aus seiner Position + war nicht mehr drag-bar).
- data.js: board.pos wird beim JSON-Import durchgereicht (safePos-Validierung
  via Number.isFinite), sonst Verlust des frei gesetzten Layouts beim Restore.
2026-06-14 15:16:51 +02:00
JonKazama-Hellion 1d9e9dab81 Freies Layout: Mobil-Reset (<=768/480px) auf gestapeltes Layout, ungeschichtet 2026-06-14 14:59:10 +02:00
JonKazama-Hellion 8401535900 Freies Layout: Board-Drag als Free-Move neu (widgets.js-Vorbild), .board.dragging auf z-index umgewidmet, Reorder-CSS (placeholder/ghost) raus 2026-06-14 14:58:08 +02:00
JonKazama-Hellion 390a9b2f94 Freies Layout: board.pos-Migration aus Auto-Raster, Position als --board-x/y beim Render 2026-06-14 14:55:05 +02:00
JonKazama-Hellion dcc015abd2 Freies Layout: .board absolut via --board-x/--board-y (components-Layer, kein Inline-Style) 2026-06-14 14:53:09 +02:00
JonKazama-Hellion 456be8ba26 Freies Layout: .boards-wrapper auf absolute Kinder vorbereiten (layout-Layer) 2026-06-14 14:52:44 +02:00
JonKazama-Hellion 767c7c80aa fix(quick-save): Drain-Trailing-Re-Run gegen verworfene onChanged waehrend laufendem Drain (Latenz, kein Verlust) 2026-06-14 14:29:47 +02:00
JonKazama-Hellion 43403bc755 fix(quick-save): Pending-Queue-Redesign (Blocker 2b) — Worker schreibt eigenen 'quicksave_pending'-Key statt boards, Seite drained in die Inbox; getrennte Schreib-Domaenen, kein boards-Clobber 2026-06-14 14:27:31 +02:00
JonKazama-Hellion 4897781848 fix(quick-save): Opera-Worker — interne-URL-Filter, kurzer Fehler-Badge, Re-Entry-Schutz gegen Lost-Update 2026-06-14 14:17:46 +02:00
JonKazama-Hellion 5feadcc90c fix(quick-save): Firefox-importScripts-Guard (Event-Page), Sync-Guard auf reale Overlay/Drag-Klassen, Worker-Serialisierung + interne-URL-Filter + kurzer Fehler-Badge 2026-06-14 14:14:31 +02:00
JonKazama-Hellion a37f34eeac fix(manifest): Quick-Save auf Alt+Shift+S (Strg+Shift+S Brave-Konflikt, Strg+Alt verboten); Firefox laedt quicksave-core via scripts-Array 2026-06-14 10:47:17 +02:00
JonKazama-Hellion f473697fb2 fix(backup): Papierkorb (trash) auch im Backup-Reminder-Export, konsistent zum Settings-Export 2026-06-14 10:30:08 +02:00
JonKazama-Hellion 9383726198 feat(quick-save): Live-Sync via chrome.storage.onChanged in app.js (boards neu laden + renderBoards) 2026-06-14 10:28:29 +02:00
JonKazama-Hellion 7d390792ea feat(quick-save): Opera-Worker additiv um onCommand + importScripts ergaenzt, Redirect unberuehrt (CRLF) 2026-06-14 10:26:29 +02:00
JonKazama-Hellion 17506011c1 feat(quick-save): background.js fuer Chrome-Worker + Firefox-Event-Page, read-modify-write in Inbox, Badge-Bestaetigung 2026-06-14 10:24:06 +02:00
JonKazama-Hellion c8ff4dd9d2 manifest(opera): quick-save command additiv, tabs/action/Redirect-Worker unveraendert 2026-06-14 10:22:26 +02:00
JonKazama-Hellion 79459beb98 manifest(firefox): quick-save command, activeTab, Event-Page background.scripts, action-Badge 2026-06-14 10:22:15 +02:00
JonKazama-Hellion 9a682d49a9 manifest(chrome): quick-save command (Strg+Shift+S), activeTab, service_worker, action-Badge 2026-06-14 10:22:00 +02:00
JonKazama-Hellion a9928706ad i18n: Quick-Save command-description + Badge/Confirm-Keys in _locales DE/EN 2026-06-14 10:20:19 +02:00
JonKazama-Hellion 83df926979 fix(trash): Daten-Review-Befunde — Import-Cap nach deletedAt sortiert (Verlust-Schutz), Restore-Doppelklick-Guard, Delete-Rollback bei Save-Fehler, NaN/Null-Haertung 2026-06-14 10:18:10 +02:00
JonKazama-Hellion 9800e6c949 fix(trash): Papierkorb-Eintrag als vertikale Karte, kompaktere Aktions-Buttons (UX im 380px-Panel) 2026-06-14 10:11:43 +02:00
JonKazama-Hellion ba5f5c4978 v2.3 Papierkorb: Export/Import um trash erweitern (defensiv validiert) 2026-06-14 10:02:31 +02:00
JonKazama-Hellion 22203d25a7 v2.3 Papierkorb: renderTrash, Wiederherstellen, endgueltig loeschen, leeren 2026-06-14 09:59:44 +02:00
JonKazama-Hellion da5d8faafa v2.3 Papierkorb: CSS fuer die Papierkorb-Liste (components-Layer) 2026-06-14 09:55:01 +02:00
JonKazama-Hellion 127aba12eb v2.3 Papierkorb: Settings-Section zwischen Daten und Danger Zone 2026-06-14 09:55:01 +02:00
JonKazama-Hellion 4031b429ad v2.3 Papierkorb: i18n-Keys DE und EN 2026-06-14 09:51:57 +02:00
JonKazama-Hellion 62c1ecab8d v2.3 Papierkorb: Inbox-Board ist nicht loeschbar (kein Delete-Button) 2026-06-14 09:48:41 +02:00
JonKazama-Hellion 061c3708bc v2.3 Papierkorb: Board-Loeschen in den Papierkorb umleiten (Confirm bleibt) 2026-06-14 09:48:06 +02:00
JonKazama-Hellion 9abfefc0e0 v2.3 Papierkorb: Bookmark-Loeschen in den Papierkorb umleiten 2026-06-14 09:47:40 +02:00
JonKazama-Hellion 36d917b420 v2.3 Papierkorb: pushToTrash() mit Klon und harter Obergrenze 2026-06-14 09:44:43 +02:00
JonKazama-Hellion fcaea64604 fix(palette): Review-Befunde — Close-Crash-Guard, Self-Block-Race, ARIA-Combobox, URL-Protokoll-Guard 2026-06-14 09:42:00 +02:00
JonKazama-Hellion 6eaa3457d0 v2.3 Papierkorb: Trash-Konstanten und Auto-Cleanup beim Laden 2026-06-14 09:33:47 +02:00
JonKazama-Hellion 091195cdef v2.3: persistenter Header-Trigger fuer die Strg+K-Palette (Entdeckbarkeit, BS-08) 2026-06-14 09:26:22 +02:00
JonKazama-Hellion b5b0ac3471 v2.3: Onboarding-Slide fuer die Strg+K-Palette (Entdeckbarkeit, BS-08) 2026-06-14 09:25:05 +02:00
JonKazama-Hellion 7b16db96b9 style: Command-Palette-Overlay in @layer components 2026-06-14 09:20:51 +02:00
JonKazama-Hellion 3872f4cf12 feat: initPalette() im App-Init nach initSearch() verdrahten 2026-06-14 09:20:04 +02:00
JonKazama-Hellion e7a064783f build: palette.js zwischen search.js und widgets.js laden 2026-06-14 09:19:43 +02:00
JonKazama-Hellion 42860bb95d feat: Command-Palette-Modul (Strg+K, read-only Bookmark-Suche) 2026-06-14 09:15:21 +02:00
JonKazama-Hellion 6a27d9b307 i18n: Keys fuer Command-Palette (DE+EN) 2026-06-14 09:12:49 +02:00
JonKazama-Hellion c96922d1bb v2.3: page-seitiger ensureInboxBoard-Wrapper auf quicksave-core 2026-06-14 09:03:31 +02:00
JonKazama-Hellion 2daccf4ecc v2.3: trash als eigener Store-Key + saveTrash, in init geladen 2026-06-14 08:35:27 +02:00