1d0bafaabb
- #6 align the UI variant id to the backend canonical 'russian_scrabble' (type, variants, Lobby, mock, tests) — fixes the New->Russian 400 - #11/#12 inside Telegram force the colour scheme from WebApp.colorScheme (over OS prefers-color-scheme, fixing the Telegram Desktop breakage) and hide the theme switcher - #14/#15 nav bar takes Telegram's bg; announcement banner gets a dedicated subtle --ad-bg accent token - #16 suppress the reconnect banner while backgrounded and silently reconnect the live stream on return to the foreground - #17 hint zoom scrolls to the placement's bounding box, not the top-left - #19/#20 players plaque: active seat raised with side shadows, others sunk; tap toggles history - #21/#23 history: scrollbar-gutter:stable (no word jitter); fixed-height drawer pins the bottom shadow to the board - #3 (UI) disable nudge on the player's own turn - #18a directional screen slide transitions (forward in from the right, back reveals the lobby) - #13 per-game in-memory cache: instant render on re-entry + background refresh - e2e: openGame waits for the slide transition to settle
42 lines
1.7 KiB
TypeScript
42 lines
1.7 KiB
TypeScript
// Mock alphabet fixtures (Stage 13). In production the per-variant (index, letter, value)
|
||
// table comes from the server; the mock seeds the same client cache from a local copy so
|
||
// the rack, the blank chooser and the mock's scoring work with no backend. The data is the
|
||
// solver's value tables (scrabble-solver/rules/rules.go), in alphabet-index order, so a
|
||
// token's position is its index — the same shape the wire delivers.
|
||
|
||
import { setAlphabet, type AlphabetEntryWire } from '../alphabet';
|
||
import type { Variant } from '../model';
|
||
|
||
// "letter+value" tokens in alphabet-index order. English Latin a..z; Russian а..я incl. ё;
|
||
// Эрудит а..я incl. ё=0.
|
||
const SPECS: Record<Variant, string> = {
|
||
english:
|
||
'a1 b3 c3 d2 e1 f4 g2 h4 i1 j8 k5 l1 m3 n1 o1 p3 q10 r1 s1 t1 u1 v4 w4 x8 y4 z10',
|
||
russian_scrabble:
|
||
'а1 б3 в1 г3 д2 е1 ё3 ж5 з5 и1 й4 к2 л2 м2 н1 о1 п2 р1 с1 т1 у2 ф10 х5 ц5 ч5 ш8 щ10 ъ10 ы4 ь3 э8 ю8 я3',
|
||
erudit:
|
||
'а1 б3 в2 г3 д2 е1 ё0 ж5 з5 и1 й2 к2 л2 м2 н1 о1 п2 р2 с2 т2 у3 ф10 х5 ц10 ч5 ш10 щ10 ъ10 ы5 ь5 э10 ю10 я3',
|
||
};
|
||
|
||
function parse(spec: string): AlphabetEntryWire[] {
|
||
return spec
|
||
.trim()
|
||
.split(/\s+/)
|
||
.map((tok, index) => {
|
||
const m = tok.match(/^(.+?)(\d+)$/);
|
||
return { index, letter: m ? m[1] : tok, value: m ? Number(m[2]) : 0 };
|
||
});
|
||
}
|
||
|
||
let seeded = false;
|
||
|
||
/** seedMockAlphabets populates the alphabet cache for every variant once, mirroring the
|
||
* server-sent tables so the mock-driven UI is alphabet-agnostic too. */
|
||
export function seedMockAlphabets(): void {
|
||
if (seeded) return;
|
||
for (const variant of Object.keys(SPECS) as Variant[]) {
|
||
setAlphabet(variant, parse(SPECS[variant]));
|
||
}
|
||
seeded = true;
|
||
}
|