* 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
* page presentation init
* fix minor issues
* minor fixes
* improve slides display
* fix: presentation min width
* fixes:fullscreen support, Only change slides with controls and keyboard
- Refresh controls ui
- Interactive slide content (tabs, toggles, links, code copy, checkboxes,
media, text selection) works without side effects
- Scrolling no longer stalls at fractional zoom or display scaling
- Keys pressed inside pop-ups opened from slide content no longer change slides
- Subpages blocks list their children and heading links copy the real anchor
- Renaming the page no longer closes the presentation
- Whitespace, non-breaking space, hard break and page break blocks no longer
produce blank slides
- Title slide wraps long words and keeps the direction of RTL titles
- The dialog has an accessible name, slide changes are announced and slide
content is labelled
- Other fixes
* fix(subpages): show a sidebar-style dot for subpages without children
* fix(base): share one realtime subscription per base across mounted views
- Embedded bases keep receiving realtime updates after a second view of the
same base (presentation, history) unmounts
- Row and schema events are no longer applied twice while two views of a
base are mounted
---------
Co-authored-by: Philipinho <16838612+Philipinho@users.noreply.github.com>
* 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