
13 July 2026
Built for everyone: RTL, accessibility, and voice typing
Three features shipped recently that don't make for an exciting screenshot, but change who can actually use noteloom comfortably: right-to-left text, screen-reader support, and hands-free dictation.
Right-to-left, with zero configuration
Every block defaults to dir="auto" — the browser's own Unicode bidi algorithm detects direction per block from its first strong character. A document mixing an English heading with an Arabic paragraph underneath it, or vice versa, just works without a language picker or a document-level setting to remember.
For the cases auto can't infer — mainly an empty block, with no text yet to read a direction from — a per-block or document-wide override is one operation away, and the block gutter menu exposes a "Switch to right-to-left" item directly, no code required.
Code blocks stay dir="ltr" always — brackets and operators are structurally left-to-right no matter what language a comment happens to be written in.
Menus a screen reader can actually use
A popover that only responds to a mouse click isn't really a menu. Every action menu in noteloom — the block gutter, the range-select action menu, a table column's options — behaves like a real one:
- Opening it moves real focus onto the first item
- Arrow keys move between items (wrapping), Home/End jump to the ends
- Escape closes it and returns focus to whatever opened it
Structural actions that don't move focus anywhere describable — duplicate, move, hide, delete — announce themselves through a shared, visually-hidden live region, so a screen-reader user hears "Block deleted" instead of silence.
Dictate instead of type
useVoiceTyping() wraps the browser's own Web Speech API for continuous dictation, mixed with spoken structural commands. Say "heading one", "bulleted list", "new paragraph", or "undo" mid-dictation and the current block converts, or a new one is inserted, instead of those words landing as text.
const voice = useVoiceTyping();
if (!voice.isSupported) return null; // e.g. Firefox
<button onClick={() => (voice.isListening ? voice.stop() : voice.start())}>
{voice.isListening ? 'Stop dictation' : 'Start dictation'}
</button>No speech-to-text SDK is bundled — real speech recognition needs either a network round-trip to a vendor's servers or a heavy on-device model, and noteloom stays zero-runtime-dependency either way. isSupported is simply false wherever the API doesn't exist, and a host app decides how to surface that.
A command only fires on a fully finalized spoken utterance — mentioning "undo" mid-sentence while dictating prose is never misread as the command.
Try the RTL heading in the demo above, or read the full accessibility guide for the keyboard/screen-reader details and every known gap.
Read the Accessibility & RTL guideA real, live noteloom instance embedded inside the article. Want the full thing? Open the Playground.