* fix(client): reload once when a lazy chunk fails to load
* fix(client): show a fallback instead of a blank page when a route crashes
* fix(server): return 404 for missing client assets instead of the app shell
* fix(server): mark the missing-asset 404 as no-store
* fix(client): skip chunk reloads while offline and widen the cooldown
* perf(client): add lazyRoute and a background route prefetch
* perf(client): prefetch every route in the background after startup
- replaces the 3 s editor warm-up
- skipped on share, public docs and PDF render pages, and with Data Saver on
* fix(client): only auto-reload when a chunk fails to download
- an error thrown while a route module runs no longer reloads the tab, so a broken route can't reload every new tab once routes are prefetched
* fix(client): don't reload the tab when a background route prefetch fails
- the route recovers when it is actually opened, so a prefetch failure no longer reloads mid-edit or replaces a navigation in progress
* perf(client): skip route prefetch on OAuth consent and in dev
* perf(client): prefetch non-route lazy components in the background
* fix(client): stop the prefetch on failure and retry the stylesheets it failed to load
* perf(client): prefetch the page editor before other lazy components
* refactor: resolve client IP through trusted proxies
- replace fastify-ip with an onRequest hook that sets request.ip from trusted proxy hops
- read CF-Connecting-IP only when the hop is a Cloudflare edge
- strip ports and validate the address before it is stored or used for rate limits
- log the resolved IP in request log lines
- add @fastify/proxy-addr as a direct dependency
* refactor(collab): resolve client IP through trusted proxies
- set request.ip with the same onRequest hook as the main server
- carry the resolved client IP on collab WebSocket connections
* init multi-tab-node
* dragging logic
* tabs menu
* tabs menu
* markdown import
* markdown export
* improve markdown import and export
* fix exponential backtracking in regex
* fix exponential backtracking in regex
* WIP
* fix: add docx schema
* feat(editor): rework tabs block state, controls and editing
- Keep the active tab in per-viewer plugin state, not in the document
- Update hidden-tab decorations incrementally; diff whole-doc remote updates
- Replace the tabs bubble menu with an in-block toolbar and per-tab actions menu
- Add rename, duplicate, move left/right and delete tab actions
- Rename a tab by double-clicking it; add tabs from a strip button
- Hide inactive tabs with hidden="until-found" and open them on beforematch
- Open the containing tab for search, TOCs, comment links and hash scrolls
- Disallow tabs inside tabs: hide slash item, flatten pastes, refuse drops
- Stop content copied or dragged out of a tab from creating a new tabs block
- Keep the selection anchor and land at the panel end when arrowing into tabs
- Let Enter add a line at the end of a tab instead of leaving the block
- Fix drag handle moves of custom nodes inside tab panels
- Keep editor focus on toolbar clicks so copy and delete work
- Export tabs to Markdown as level 4 headings; drop the tabs Markdown syntax
- Share node copy-to-clipboard between the columns and tabs toolbars
- Raise inactive tab label contrast
* fix(editor): show a compact drag preview for the tabs block
- Add a hidden data-drag-preview chip with the tab labels to the tabs view
- The global drag handle uses it instead of snapshotting the block and its neighbours
- Style the chip outside the editor scope since the handle clones it into the body
* fix(editor): hide the drop cursor while reordering tabs in the tab strip
* fix: better tabs selection, rendering and ids
- Keep selections out of hidden tabs and map chained tab updates
- Drive the tab strip from decorations instead of per-keystroke lookups
- Repair empty and repeated tab ids
---------
Co-authored-by: Philipinho <16838612+Philipinho@users.noreply.github.com>
The export button only sent the page id, so filtered views still
downloaded every row. Send the view's current (including unsaved draft)
filter, and bump the ee submodule for server-side support.
* fix: drop malformed awareness before broadcast
* clear interval
* pass userId and avatar to awareness
* fix: skip page update notifications for editors and users viewing the page
* jump to search init
* support multiple text matching
* search navigation dialog
* remove search text
* typesense support
* typesense support
* add search guard
* use search key check
* minor fix
* minor fix
* fix: clean up jump search state on close
---------
Co-authored-by: Philipinho <16838612+Philipinho@users.noreply.github.com>