/* Declarations for lib/hangul.js — the module itself ships unchanged. */ export const CHO: string; export const JUNG: string; export const JONG: string; /** [initialIndex, medialIndex, finalIndex], or null if not a syllable block. */ export function decompose(ch: string): [number, number, number] | null; export function compose(i: number, m: number, f?: number): string; export const isJamo: { initial(c: string): boolean; medial(c: string): boolean; final(c: string): boolean; }; /** * A 두벌식 IME. Hold one per input: feed jamo with key(), literal text with * text(), Backspace with back(). Each call returns the full new value. */ export class Composer { cho: string | null; jung: string | null; jong: string | null; reset(): void; readonly empty: boolean; /** The syllable currently being assembled, as text. */ render(): string; key(value: string, jamo: string): string; back(value: string): string; /** Commit the buffer and append literal text (space, punctuation). */ text(value: string, t: string): string; } export const KEYBOARD: { rows: string[][]; shift: Record; }; /* ── letter-level marking ───────────────────────────────────────────── */ /** Two-consonant batchim clusters, unpacked: "ㄼ" → "ㄹ+ㅂ". */ export const CLUSTER: Record; /** ["first consonant", "vowel", "batchim"] — the three slots of a syllable. */ export const SLOT: string[]; /** "짧다" → "짧=ㅉ+ㅏ+ㄼ(ㄹ+ㅂ) · 다=ㄷ+ㅏ" */ export function spellOut(word: string): string; /** The exact jamo difference, naming what was correct as well as what was wrong. "" when either side is empty; "identical" when they match. */ export function letterDiff(expected: string, written: string): string; export interface LetterRow { /** The item as the student saw it — for a recall task, the English. */ prompt: string; expected: string; written: string; } /** The LETTER-LEVEL CHECK block for a marking message; "" when nothing differs. */ export function letterCheck(rows: LetterRow[]): string;