Command Palette

Search for a command to run...

Accessibility

Braille Keyboard Access

Braille keyboard access

A practical design and implementation guide for people who type, read, edit, and navigate through braille keyboards, refreshable braille displays, and braille screen input.

Detailed guidance for tactile input, screen reader output, focus order, form behavior, and accessible component design.

Hands using a braille keyboard and refreshable braille display connected to a laptop.
Example: a braille display converts screen-reader output into raised tactile pins while the user enters text with chorded braille keys.

What a braille keyboard is

A braille keyboard is an input method built around the six-dot braille cell. Instead of pressing a separate key for every alphabet character, the person presses a combination of dot keys at the same time. This combination is called a chord. The device may be a dedicated Perkins-style keyboard, a refreshable braille display with input keys, or a phone feature such as braille screen input.

The important design-system lesson is simple: a braille user does not experience a page as a screenshot. They experience it as focused objects, accessible names, roles, values, state, editable text, headings, landmarks, and announcements. The visual layer still matters, but the semantic layer is what becomes tactile, directly enforcing WCAG 4.1.2 (Name, Role, Value).

Chorded input

Multiple dot keys are pressed together to produce one letter, number, punctuation mark, or command.

Screen reader bridge

The screen reader sends focused UI text to speech and to the refreshable braille display.

Cursor routing

Small keys above braille cells can move the text cursor directly to a tactile character position.

The six-dot mental model

The standard braille cell has two columns and three rows. Dots 1, 2, and 3 are on the left. Dots 4, 5, and 6 are on the right. A keyboard maps each dot position to a physical key. The user presses the needed dot keys together, then releases them to commit a character.

தமிழ் பிரெய்லி விசைப்பலகை (Tamil Braille Chord Simulator)

Tactile Perkins Cell

Click dots to simulate physical chording.

நிலவரம் (Active Translation)

விசைப்பலகையின் புள்ளிகளை சொடுக்கி முடிவுகளைக் காண்க.
Click the dots on the left. Tamil Braille utilizes the same base-6 cell mapping but aligns them to traditional vowel/consonant vocal sets.

பிரெய்லி குறிப்புகள் (Quick Shortcuts)

How a person actually uses it

1. Connect the display or enable braille input

The person pairs a refreshable braille display over USB or Bluetooth, or turns on braille screen input on a phone. The screen reader becomes the bridge between visual UI and tactile output.

2. Read the current focus in braille

As focus lands on a button, heading, field, or list item, the braille display raises pins that spell the accessible name, role, state, and sometimes extra context.

3. Enter characters through chorded keys

Instead of pressing one key per letter, the person presses a combination of dot keys at the same time. This is called chording. Space, backspace, enter, and command keys sit around the dot keys.

4. Review what changed

The display refreshes after each character, command, validation error, or focus movement. The user checks the tactile line, uses cursor routing keys, and edits without needing to look at the screen.

5. Navigate by structure, not pixels

Headings, landmarks, form labels, table headers, list boundaries, and live-region announcements are what make the experience understandable. Layout-only visuals do not help unless they are exposed semantically.

Typing examples

The examples below are uncontracted English braille examples. Real users may use grade 1, grade 2 contracted braille, eight-dot computer braille, Tamil braille, or a local braille table configured in their screen reader. The product should not assume only one braille table.

142536

a

dots 1

one raised dot in the top-left position

142536

b

dots 1-2

top-left and middle-left dots pressed together

142536

c

dots 1-4

two top dots pressed together

142536

d

dots 1-4-5

top-left, top-right, and middle-right

142536

e

dots 1-5

top-left and middle-right

142536

h

dots 1-2-5

left top, left middle, and right middle

142536

i

dots 2-4

middle-left and top-right

142536

k

dots 1-3

top-left and bottom-left

Refreshable braille display behavior

A refreshable braille display is not just a keyboard. It is also an output device. A row of small pins raises and lowers to form tactile braille cells. The person reads the current line through touch, pans left or right for more text, and uses routing keys to place the cursor. This output relies heavily on WAI-ARIA Live Regions to meet WCAG 4.1.3 (Status Messages), ensuring dynamic updates push tactile output without stealing keyboard focus.

Focus moves to a button

Display shows the button label, role, and sometimes state.

Focus moves to a required field

Display should include the label, required state, current value, and error relationship.

User types into a text field

Display updates the inserted character, caret position, and any inline validation message.

A dialog opens

Display should land on a useful heading or first action, not on a hidden overlay wrapper.

A toast appears

Display receives a concise live-region announcement if the message is important.

Tactile text selection & routing implementation

Tactile displays use small routing buttons to position the editing caret. By explicitly handling selection changes in custom text editors, you ensure physical pins align exactly with the focused cursor character block:

// Tactile routing text field in React
import React, { useState, useId } from "react";

export function TactileRoutingTextField({ label, labelTa }) {
  const id = useId();
  const [value, setValue] = useState("");
  const [cursorPos, setCursorPos] = useState({ start: 0, end: 0 });

  const handleSelection = (e) => {
    // Expose cursor positions explicitly so refreshable braille displays
    // raise dot indicators around the focused caret selection block
    setCursorPos({
      start: e.currentTarget.selectionStart || 0,
      end: e.currentTarget.selectionEnd || 0,
    });
  };

  return (
    <div className="flex flex-col gap-2">
      <label htmlFor={id} className="text-sm font-bold">{label}</label>
      <input
        id={id}
        type="text"
        value={value}
        onChange={(e) => setValue(e.target.value)}
        onSelect={handleSelection}
        className="rounded-md border border-border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary"
      />
      <div className="text-[10px] text-muted-foreground">
        Caret routing cursor indexes: {cursorPos.start} - {cursorPos.end}
      </div>
    </div>
  );
}

Design-system requirements

Every field needs a programmatic label. Placeholder-only labels are weak because braille users review fields by accessible name.

Validation errors must be tied to the field with aria-describedby or equivalent component wiring.

Focus order must match reading order. A braille user should never jump from a submit button back to an unrelated help card.

Buttons need action-first names such as Save changes, Download invoice, or Open filters.

Do not rely on icon-only controls unless the icon button has a clear aria-label.

Live updates must announce only useful changes. Repeating a whole table after each keystroke creates tactile noise.

Tables need header associations because braille displays read one linear line at a time.

Avoid disabled controls without explanation. A tactile user needs to know why an option cannot be used.

Common mistakes and fixes

Issue

Visual-only grouping

Use fieldsets, legends, headings, lists, and landmarks so the same grouping exists in the accessibility tree.

Issue

Custom inputs that hide the real caret

Keep native input behavior or recreate caret position, selection state, and editing feedback correctly.

Issue

Toast-only confirmation

Pair the toast with a live region and leave persistent state in the page when the result matters.

Issue

Dense cards with weak names

Expose card titles, control labels, and row actions in a stable reading order.

Testing checklist

If you do not have a physical braille display, you can still catch many problems with NVDA, VoiceOver, TalkBack, browser accessibility trees, and keyboard-only testing. For release confidence, test the flow with a real display and a real braille user whenever possible.

Tab through the full flow and confirm focus order matches the visual and reading order.

Use a screen reader to confirm field labels, descriptions, errors, roles, and states.

Check every custom component with keyboard input only.

Confirm dynamic updates are announced once and only when useful.

Verify tables, lists, and headings remain meaningful when read linearly.

Ask whether the task can be completed without sight, mouse, or touch gestures.

What good support feels like

Good braille support feels quiet, predictable, and precise. The user knows where focus is, what each control does, whether a value changed, where the cursor is inside text, and what to do next. The page does not need special treatment or a separate braille mode. It needs strong semantics, stable focus, useful announcements, and components that respect native behavior.

Design rule: if a visual feature cannot be understood through focus, name, role, value, state, or description, it is not fully available to a braille keyboard user.