Commit graph

47 commits

Author SHA1 Message Date
igor
a36949aab5 Add recovery backups and fix theme/title edge cases 2026-05-18 19:34:06 +12:00
igor
3ec9b6fc6d Add BASIC language syntax highlighting support
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
Register BASIC with highlight.js (preview mode) and add it to the
code modal language picker. CodeMirror falls back to plain text in
the modal editor as no CM6 BASIC parser is available.
2026-05-18 12:17:14 +12:00
igor
a70efdd296 Fix rendered-mode image uploads and save state
Some checks failed
Build and push Joplock image / build-and-push (push) Has been cancelled
2026-05-15 15:27:02 +12:00
igor
09d7b8f464 Publish multi-arch Docker images
Some checks failed
Build and push Joplock image / build-and-push (push) Has been cancelled
2026-05-07 14:30:50 +12:00
igor
0698bbd78e Unify note title sanitization
Use the shared title sanitizer for both SSR and client-side title editing
so note titles are cleaned by one function. Also sanitize note titles on
create in the fragments route and add a regression test for formatted
titles.
2026-05-01 19:38:25 +12:00
igor
6652f8ddeb fix: re-init desktop UI when switching from mobile→desktop shell mode
Some checks failed
Build and push Joplock image / build-and-push (push) Has been cancelled
syncResponsiveMode already called redrawMobileUI() when crossing
desktop→mobile, but the reverse path only hid the mobile app. A session
that started narrow (mobile mode) never called initNavPanel/initEditorPanel
for the desktop form, leaving the preview and CM host with undefined
display states and stale scroll position.

Mirror the pattern: save wasMobile before clobbering _lastSyncWasMobile,
then call initNavPanel()+initEditorPanel() when wasMobile===true.
Both functions are idempotent (guarded by dataset flags) so a repeat
call on an already-initialised form is a no-op.
2026-05-01 13:47:30 +12:00
igor
1c236c9721 Replace hand-rolled markdown renderer with markdown-it; fix blank-line round-trip and editor UX
- Install markdown-it@14.1.1 as server-side renderer (renderMarkdown only)
- Preserve all Joplin extensions: underline (++..++), checkboxes,
  blank-line markers, softbreak→<br>, resource URIs, spellcheck attrs,
  hx-* strip, fence/code/image/link render overrides
- Fix blank-line round-trip: emptyDiv/emptyP Turndown rules now return
  the BL sentinel instead of '<br>' (which line 611 inflated to 4 newlines)
  or '' (which made blank-line edits never save)
- Disable CSS scroll anchoring in preview editor so images flow down
  naturally when text is typed above them
- Narrow the Notebook + button label and padding in the nav header
- Bump static asset version to 20260501a
2026-05-01 13:20:22 +12:00
igor
67afe502a0 Render fenced code blocks nested in list items
Custom regex renderer's fence extraction required column-0 anchoring,
so any fence inside a list item (or with leading whitespace) was missed
and the loose backticks were mangled by the inline-code regex. Add a
list-item-nested fence pass that outdents the body and preserves the
surrounding list structure as a placeholder, plus relax the column-0
fence regex to allow up to 3 spaces of indentation per CommonMark and
trailing whitespace on the closing fence.
2026-05-01 10:30:03 +12:00
igor
003dc817de Refactor mobile shell to state machine; enforce single-screen invariant
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
Eliminates fragile ad-hoc DOM toggling that allowed two mobile screens to
render simultaneously. All transitions now go through setMobileState()
reducer; renderMobile() is the only function that writes
.mobile-screen-active. assertSingleActiveScreen() self-heals violations
and traces them. Test asserts the architectural invariant in source.

Also: DB session lookup fails closed on transient errors instead of
crashing; mobile back-save uses formHash (not UI badge); single-screen
CSS via display:none/flex (no transforms); resize debounced without
reload; aria-hidden warning fix.
2026-05-01 00:10:43 +12:00
igor
682e95dff3 fix mobile back save timing
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
2026-04-30 13:12:07 +12:00
igor
af9a8fd2c0 fix rescale issues 2026-04-30 12:11:47 +12:00
igor
e3656f0185 fix mobile redraw restore: editor first, lists after settle 2026-04-30 10:22:20 +12:00
igor
00e1172121 fix mobile shell layout and add display mode setting 2026-04-30 09:13:46 +12:00
igor
3aff615878 Add vault/notebook encryption: client-side AES-256-GCM E2EE with SVG lock icons, mobile vault support, startup resume gate, and re-entry guard
Some checks failed
Build and push Joplock image / build-and-push (push) Has been cancelled
2026-04-28 22:25:46 +12:00
igor
2211238269 sync editor folder select on folder create/delete/rename
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
2026-04-27 23:23:10 +12:00
igor
b57f79c59e fix session expiry: delete from both sessions tables 2026-04-27 23:03:52 +12:00
igor
65b0c9c463 improve auto logoff 2026-04-27 22:51:54 +12:00
igor
3e30ad1b68 offline detection 2026-04-27 22:05:42 +12:00
igor
22a40f5393 fix trash
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
2026-04-27 20:35:02 +12:00
igor
082eea707b fix trash 2026-04-27 17:50:48 +12:00
igor
b735224377 Refactor route rendering and harden editor session handling
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
2026-04-27 00:24:23 +12:00
igor
bd291548b9 Update AGENT_GUIDE with recent work, conventions, and CI info 2026-04-26 17:44:51 +12:00
igor
7f62ed2a34 Add plans/ to .gitignore 2026-04-26 17:44:05 +12:00
igor
e8d0d6bdd5 Keep checked text at normal color, only accent the icon
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
2026-04-26 17:40:32 +12:00
igor
840612fb3b Remove strikethrough from checked checkboxes 2026-04-26 17:39:26 +12:00
igor
d7d1815ac7 Match checkbox spacing to bullet lists, tighten icon line-height 2026-04-26 17:36:32 +12:00
igor
8db457a903 Reduce checkbox list item spacing 2026-04-26 17:33:28 +12:00
igor
1be60d47d5 Fix checkbox alignment: use flexbox instead of hanging indent 2026-04-26 17:32:01 +12:00
igor
b51048db8d Make checkbox icon bigger/bold with accent color, independent from text styling 2026-04-26 17:30:07 +12:00
igor
46bfc5f4f3 Make checked checkbox items bigger and bold 2026-04-26 17:27:54 +12:00
igor
63758db294 Style checked checkboxes with accent color 2026-04-26 17:26:25 +12:00
igor
9d6531cbf8 Revert checkbox icon span — broke click-to-toggle; no CSS-only solution without JS changes 2026-04-26 17:24:28 +12:00
igor
7a96e1a997 Style checked checkboxes with accent color icon in preview mode 2026-04-26 17:22:26 +12:00
igor
d3045a3165 Fix search input character loss: capture value at beforeSwap not beforeRequest 2026-04-26 17:11:31 +12:00
igor
909484b1ae Fix All Notes showing empty: normalize __all_notes__ to __all__ in folder-notes endpoint 2026-04-26 17:04:10 +12:00
igor
540ec1fd32 Bump service worker cache version to force PWA refresh 2026-04-26 16:55:56 +12:00
igor
8e83712353 Revert resource caching to no-store for maximum security 2026-04-26 16:47:40 +12:00
igor
8adc4f2ab9 Cache resources with immutable header to eliminate repeated image fetches from DB 2026-04-26 16:43:02 +12:00
igor
c4e1eac6fb Add gzip compression for HTML responses and sanitize hx-* attrs from rendered markdown 2026-04-26 16:39:40 +12:00
igor
412d4b7ef0 Fix UX issues: note flash, search input drop, spinner on search/mobile, tablet on phone 2026-04-26 16:23:09 +12:00
igor
245ceae603 Fix tablet view note list scrolling by adding min-height:0 and overflow:hidden to grid items; update plan to reflect Phase 6 completion 2026-04-26 15:01:37 +12:00
igor
01eccb973a implement phase 6: search pagination + pg_trgm trigram index
- ensureIndexes: CREATE EXTENSION pg_trgm + GIN index on extracted title+body
- searchNotes: add limit/offset params (default 50/0)
- /fragments/search: read offset param, detect hasMore, paginate
- /fragments/mobile/search: same, target #mobile-search-results
- searchResultsFragment: Load more button when hasMore (hx-swap=beforeend)
- mobileSearchFragment: Load more button when hasMore
- Tests: 137/137 passing (8 new search pagination tests)
2026-04-26 12:38:09 +12:00
igor
3af113e0da update plan: mark phases 1-5 done, add phase 6 search pagination + pg_trgm 2026-04-26 12:35:00 +12:00
igor
fd468fe3e3 implement lazy folder expansion and paginated note loading for large databases
- Add DB index on (owner_id, jop_type, jop_parent_id, jop_updated_time DESC)
- New folderNoteCountsByUserId query: GROUP BY folder, no row data fetched
- New noteHeadersByFolder query: paginated per folder (LIMIT 100)
- navData() now fetches only folders + counts (no note rows on page load)
- navigationFragment: lazy mode renders empty note lists, lazy-loaded on expand
- toggleNavFolder / initNavPanel: htmx fetch on first expand, data-loaded guard
- Add /fragments/folder-notes endpoint for lazy per-folder note pages
- Add folderNotesPageFragment with Load more button for pagination
- Mobile: folders use counts Map, notes use paginated noteHeadersByFolder
- Tests: 129/129 passing
2026-04-26 12:22:05 +12:00
igor
9a003e3bd4 add lazy pagination plan 2026-04-26 12:11:02 +12:00
igor
91fb055c75 improve mobile search and editor state
Some checks are pending
Build and push Joplock image / build-and-push (push) Waiting to run
Keep search context when opening notes and make in-note search behave consistently across desktop, mobile, markdown, and render modes.
2026-04-26 00:55:23 +12:00
igor
d606ecf60f fix mobile resume startup and editor targeting 2026-04-25 20:51:37 +12:00