# Klottle changelog All notable changes to Klottle. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), versioned per [SemVer](https://semver.org/). ## [Unreleased] ### Added - Google indexing prep: sitemap.xml served dynamically (lists public Klotts), JSON-LD structured data (WebSite + Organization + per-doc Article), canonical URLs, noindex for gated docs, GSC verification config slot. See docs/google-indexing-setup.md for the post-deploy steps. - First-visit onboarding tour. Walks new users through the left panel (browse/TOC), the Settings/Share/Versions tabs, and the slash menu. Skip available on every step. ### Fixed - Tooltips and popovers now stay within the viewport. Replaced hand-rolled positioning in the onboarding tour and other floating UI with @floating-ui/dom's shift + flip middleware. - Critical: switching to another Klott while edits were pending could silently drop them. Saves now flush before slug change with a slug captured at the call site, the flush triggers on a `dirtyRef` flag (not just on an armed debounce timer) so saves that fired moments before the swap can't lose follow-up keystrokes, and `useDoc.save` warns + refuses to mutate state when the active slug has drifted from the explicit POST target. Added a `beforeunload` "Leave site?" prompt as a defense-in-depth backstop for unsaved changes, and an explicit Cmd+S "Saved" toast. - "HTTP 502" error toast that surfaced on transient PHP-FPM hiccups. `useDoc.ts` now retries 502/503/504/408 once with a 600ms backoff before bubbling the error up, and on autosave the post-retry failure is silenced entirely (the next debounce will write through) instead of popping a sticky toast. On the initial load path the error is also swallowed when we already painted from cache. - Toast border width is now uniform on all four sides. Replaced the inset 3px left accent with a plain 1px border on every edge; severity is conveyed via the existing WarningCircle bullet on the left. - Data table now responds to the 6-dot global drag handle. Added `data-type="dataTable"` to the wrapper and registered it under `tiptap-extension-global-drag-handle`'s `customNodes` array so the handle activates when hovering a table row. - Code block content now has 16px padding on the box edges. Both the plain `.ProseMirror pre` and the Shiki-flavored `.klottle-code-block` overlay / editable layers were reduced from 28px / 32px to a uniform 16px. ### Changed - Block math equations now render full-width with a 12px-radius 1px outline and 24px inner padding. The equation stays horizontally centred inside the box. - Doodle moved under the Media slash submenu (was Advanced). The Advanced submenu still hosts the gated executable-code block but auto-collapses when that flag is off. - Symbol and Emoji slash commands merged into a single tabbed picker. The slash menu entry is now "Symbol & emoji"; the body has two tabs (Emoji + Symbol) and reuses the existing EmojiPicker / SymbolPalette components verbatim. - Custom-mood emoji picker moved directly under the Mood grid (was buried below Typography). The picked emoji also styles `