feat(01-03): implement level definitions 1-6 with finger mappings
- 6 levels per spec section 4.1 progression table - Finger-to-CSS-variable mapping per spec section 8.3 - getLevelByNumber and getKeysUpToLevel helper functions - All 14 tests passing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
import type { Level } from "../types";
|
||||||
|
|
||||||
|
// Finger color CSS variable mapping per spec section 8.3
|
||||||
|
// Left hand: pinky=Q/A/Y/1, ring=W/S/X/2, mid=E/D/C/3, index=R/F/V/T/G/B/4/5
|
||||||
|
// Right hand: index=U/J/M/Z/H/N/6/7, mid=I/K/,/8, ring=O/L/./9, pinky=P/Ö/Ä/Ü/0/ß
|
||||||
|
// Thumb: Space
|
||||||
|
|
||||||
|
const fingerMap: Record<string, string> = {
|
||||||
|
// Left pinky
|
||||||
|
q: "--finger-l-pinky",
|
||||||
|
a: "--finger-l-pinky",
|
||||||
|
y: "--finger-l-pinky",
|
||||||
|
// Left ring
|
||||||
|
w: "--finger-l-ring",
|
||||||
|
s: "--finger-l-ring",
|
||||||
|
x: "--finger-l-ring",
|
||||||
|
// Left middle
|
||||||
|
e: "--finger-l-mid",
|
||||||
|
d: "--finger-l-mid",
|
||||||
|
c: "--finger-l-mid",
|
||||||
|
// Left index
|
||||||
|
r: "--finger-l-index",
|
||||||
|
f: "--finger-l-index",
|
||||||
|
v: "--finger-l-index",
|
||||||
|
t: "--finger-l-index",
|
||||||
|
g: "--finger-l-index",
|
||||||
|
b: "--finger-l-index",
|
||||||
|
// Right index
|
||||||
|
u: "--finger-r-index",
|
||||||
|
j: "--finger-r-index",
|
||||||
|
m: "--finger-r-index",
|
||||||
|
z: "--finger-r-index",
|
||||||
|
h: "--finger-r-index",
|
||||||
|
n: "--finger-r-index",
|
||||||
|
// Right middle
|
||||||
|
i: "--finger-r-mid",
|
||||||
|
k: "--finger-r-mid",
|
||||||
|
// Right ring
|
||||||
|
o: "--finger-r-ring",
|
||||||
|
l: "--finger-r-ring",
|
||||||
|
// Right pinky
|
||||||
|
p: "--finger-r-pinky",
|
||||||
|
ö: "--finger-r-pinky",
|
||||||
|
ä: "--finger-r-pinky",
|
||||||
|
ü: "--finger-r-pinky",
|
||||||
|
// Thumb
|
||||||
|
" ": "--finger-thumb",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const levels: Level[] = [
|
||||||
|
{
|
||||||
|
level: 1,
|
||||||
|
newKeys: ["f", "j", " "],
|
||||||
|
allKeys: ["f", "j", " "],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
level: 2,
|
||||||
|
newKeys: ["d", "k"],
|
||||||
|
allKeys: ["f", "j", " ", "d", "k"],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
level: 3,
|
||||||
|
newKeys: ["s", "l"],
|
||||||
|
allKeys: ["f", "j", " ", "d", "k", "s", "l"],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
level: 4,
|
||||||
|
newKeys: ["a", "ö"],
|
||||||
|
allKeys: ["f", "j", " ", "d", "k", "s", "l", "a", "ö"],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
level: 5,
|
||||||
|
newKeys: ["g", "h"],
|
||||||
|
allKeys: ["f", "j", " ", "d", "k", "s", "l", "a", "ö", "g", "h"],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
level: 6,
|
||||||
|
newKeys: ["e", "i"],
|
||||||
|
allKeys: [
|
||||||
|
"f",
|
||||||
|
"j",
|
||||||
|
" ",
|
||||||
|
"d",
|
||||||
|
"k",
|
||||||
|
"s",
|
||||||
|
"l",
|
||||||
|
"a",
|
||||||
|
"ö",
|
||||||
|
"g",
|
||||||
|
"h",
|
||||||
|
"e",
|
||||||
|
"i",
|
||||||
|
],
|
||||||
|
fingerMap,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export function getLevelByNumber(n: number): Level | undefined {
|
||||||
|
return levels.find((l) => l.level === n);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getKeysUpToLevel(n: number): string[] {
|
||||||
|
const level = getLevelByNumber(n);
|
||||||
|
return level ? level.allKeys : [];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user