- JSON layouts (en-US, sv-SE inheriting number/symbol layers via base) - LayoutModel + KeyGeometry: proportional rows, nearest-key hit testing - KeyboardSurface: multi-pointer touch/mouse routing to the controller - KeyboardController + ShiftState: iOS shift/caps-lock, layers, globe, dismiss - QML view with light/dark iPad palette and drag handle - DevHooks: SLOPOSK_AUTOTYPE, SLOPOSK_SCREENSHOT for headless checks - Unit tests for shift, loader, geometry and controller Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
2.9 KiB
JSON
63 lines
2.9 KiB
JSON
{
|
||
"id": "sv-SE",
|
||
"name": "Svenska",
|
||
"locale": "sv_SE",
|
||
"base": "en-US",
|
||
"layers": [
|
||
{
|
||
"name": "letters",
|
||
"rows": [
|
||
[
|
||
{"label": "q", "flick": "1"},
|
||
{"label": "w", "flick": "2"},
|
||
{"label": "e", "flick": "3", "alternates": ["é", "è", "ê", "ë"]},
|
||
{"label": "r", "flick": "4"},
|
||
{"label": "t", "flick": "5"},
|
||
{"label": "y", "flick": "6", "alternates": ["ý", "ü"]},
|
||
{"label": "u", "flick": "7", "alternates": ["ü", "ú", "ù", "û"]},
|
||
{"label": "i", "flick": "8", "alternates": ["í", "ì", "î", "ï"]},
|
||
{"label": "o", "flick": "9", "alternates": ["ó", "ò", "ô", "õ", "ø", "œ"]},
|
||
{"label": "p", "flick": "0"},
|
||
{"label": "å", "flick": "^"},
|
||
{"type": "backspace", "width": 1.5}
|
||
],
|
||
[
|
||
{"label": "a", "flick": "@", "alternates": ["á", "à", "â", "ã", "æ"]},
|
||
{"label": "s", "flick": "#", "alternates": ["ß", "š"]},
|
||
{"label": "d", "flick": "$", "alternates": ["ð"]},
|
||
{"label": "f", "flick": "&"},
|
||
{"label": "g", "flick": "*"},
|
||
{"label": "h", "flick": "("},
|
||
{"label": "j", "flick": ")"},
|
||
{"label": "k", "flick": "'"},
|
||
{"label": "l", "flick": "\""},
|
||
{"label": "ö", "flick": ";", "alternates": ["ø", "œ"]},
|
||
{"label": "ä", "flick": ":", "alternates": ["æ"]},
|
||
{"type": "enter", "width": 1.5}
|
||
],
|
||
[
|
||
{"type": "shift", "width": 1.5},
|
||
{"label": "z", "flick": "%", "alternates": ["ž"]},
|
||
{"label": "x", "flick": "-"},
|
||
{"label": "c", "flick": "+", "alternates": ["ç", "č"]},
|
||
{"label": "v", "flick": "="},
|
||
{"label": "b", "flick": "/"},
|
||
{"label": "n", "flick": "_", "alternates": ["ñ"]},
|
||
{"label": "m", "flick": "~"},
|
||
{"label": ",", "flick": "!", "shifted": ","},
|
||
{"label": ".", "flick": "?", "shifted": ".", "alternates": ["…"]},
|
||
{"label": "-", "flick": "–", "shifted": "-", "alternates": ["—", "•"]},
|
||
{"type": "shift"}
|
||
],
|
||
[
|
||
{"type": "layer", "label": ".?123", "target": "numbers", "width": 1.5},
|
||
{"type": "globe"},
|
||
{"type": "space", "width": 7.5},
|
||
{"type": "layer", "label": ".?123", "target": "numbers", "width": 1.5},
|
||
{"type": "dismiss"}
|
||
]
|
||
]
|
||
}
|
||
]
|
||
}
|