FlowDrop 1.8.0: i18n and Logout-Safe Drafts
FlowDrop 1.8.0 ships a typed, overridable messages system for i18n and localisation, a clearAllDrafts() API for logout hygiene, and a suite of targeted fixes.
FlowDrop 1.8.0 addresses two gaps that come up in production integrations: making every user-facing string overridable without forking the library, and giving hosts a clean way to clear workflow drafts on logout.
Typed messages system
Every user-facing string in FlowDrop — button labels, tooltips, placeholders, status notices — is now rendered from a single typed Messages tree. Pass messages to <FlowDrop> as a DeepPartial<Messages> value (or a callback returning one) to override any subset. Missing keys fall through to the English defaults, so you only supply what you actually want to change.
Reactive overrides work without any extra wiring. If you’re using paraglide-js, sveltekit-i18n, or any reactive store, pass a callback that reads from your active locale. FlowDrop re-evaluates it when locale changes and propagates the new strings through the component tree.
The public API additions from @flowdrop/flowdrop: defaultMessages, mergeMessages, setMessages, getMessages, m, and the Messages and MessagesOverride types. Components used outside the <FlowDrop> provider fall back silently to English.
The deprecated per-component label props (saveLabel, cancelLabel, onLabel, offLabel, addLabel, placeholder) still work but log a dev-mode warning. They’ll be removed in v2.0.
clearAllDrafts()
MountedFlowDropApp gains a clearAllDrafts() method. Calling it removes every localStorage key that begins with flowdrop:draft:, plus the configured draftStorageKey when called via an instance. The same function is available as a standalone export from @flowdrop/flowdrop/editor.
Call it from your logout handler. Without it, workflow drafts accumulate in localStorage across user sessions — on a shared browser profile, the next user inherits the previous user’s in-progress workflows.
AI Assistant rename
The bottom-panel tab previously labelled “AI Chat” is now “AI Assistant”. The settings entry, panel notice, and aria-label follow suit. Internal component names, CSS classes, and the underlying chat storage keys are unchanged — no migration required.
Fixes
Minimap contrast — the MiniMap was using --fd-card as its background, identical to --fd-background in light mode. Users were clicking and dragging on it, mistaking it for the canvas. The minimap now uses --fd-muted background with --fd-muted-foreground node fill, plus a border, rounded corners, and a shadow so it reads clearly as a floating overlay.
Markdown editor locale changes — FormMarkdownEditor’s placeholder and content aria-label live inside CodeMirror, outside Svelte’s reactivity graph. They now reconfigure via dedicated Compartments when locale changes, so translated copy reaches the editor without a full remount.
Performance
mergeMessages now lazy-allocates: when override leaves are === to the corresponding base values (common with paraglide-js due to JS string interning), the base reference is returned unchanged at every applicable level. This stops $derived(m().branch) reads from invalidating on every parent re-render when the consumer passes an inline messages={{...}} literal whose contents are stable.
Components that read the same m().branch.* repeatedly per render now pull the branch into a single $derived at the top of the script — one getter walk per render instead of N×M.
Upgrading
npm install @flowdrop/flowdrop@1.8.0 No breaking changes. Deprecated label props still work; migrate to the messages prop before v2.0.