Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#362 Changed the expanded keyboard for more languages #397

Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/).
### 🎨 Design Changes

- iPad keyboards are now more reflective of their system keyboard counterparts for devices above a certain width ([#33](https://github.com/scribe-org/Scribe-iOS/issues/33), [#352](https://github.com/scribe-org/Scribe-iOS/issues/352)).
- Vertical spacing between keys on iPads has been decreased so that keys are more square and thus more in line with system keyboards.

### 🐞 Bug Fixes

Expand Down
11 changes: 7 additions & 4 deletions Keyboards/KeyboardsBase/InterfaceVariables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ var letterKeyWidth = CGFloat(0)
var numSymKeyWidth = CGFloat(0)
var isFirstKeyboardLoad = false
var disableAccentCharacters = false
// Constants for scaling key widths and heights.
// Constants and variables for scaling key widths and heights.
let scalarAlternatesBtnYPad = 0.2
let scalarAlternatesBtnYPhone = 0.15
let scalarCommandKeyCornerRadiusLandscapeViewPad = 7.5
Expand All @@ -56,13 +56,16 @@ let scalarKeyCornerRadiusPad = 9.0
let scalarKeyCornerRadiusPhone = 6.0
let scalarFontPad = 0.475
let scalarFontPhone = 0.435
let scalarIndentKeyWidth = 1.65
let scalarLetterNumSymKeyWidth = 0.9
let scalarLetterNumSymKeyWidthLandscapeViewPad = 1.2
let scalarLetterNumSymKeyWidthLandscapeViewPhone = 1.5
var scalarSpecialKeysWidth = disableAccentCharacters ? 2.2 : 1.0
let scalarIndentKeyWidth = 1.7
let scalarShiftKeyWidth = 1.4
var scalarReturnKeyWidth = disableAccentCharacters ? 2.2 : 1.0
var scalarShiftKeyWidth = 1.4
var scalarRightShiftKeyWidth = 2.2
var scalarSpecialKeysWidth = disableAccentCharacters ? 2.2 : 1.0
var scalarDeleteKeyWidth = disableAccentCharacters ? 2.2 : 1.0
var scalarCapsLockKeyWidth = 1.8

// Keyboard elements.
var spaceBar = String()
Expand Down
31 changes: 22 additions & 9 deletions Keyboards/KeyboardsBase/KeyboardKeys.swift
Original file line number Diff line number Diff line change
Expand Up @@ -267,31 +267,44 @@ class KeyboardKey: UIButton {
/// Adjusts the width of a key if it's one of the special characters on the iPad keyboard.
func adjustPadKeyWidth() {
if usingExpandedKeyboard {
scalarSpecialKeysWidth = (disableAccentCharacters && keyboardState != .symbols) ? 2.2 : 1.0
scalarReturnKeyWidth = (disableAccentCharacters && keyboardState != .symbols) ? 2.2 : 1.0
scalarCapsLockKeyWidth = 1.3
scalarDeleteKeyWidth = 1.65
scalarReturnKeyWidth = 1.3
scalarShiftKeyWidth = 1.5
scalarSpecialKeysWidth = 1.0

if key == "ABC" || key == "АБВ" {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * 1).isActive = true
} else if ["delete", "#+=", "selectKeyboard", SpecialKeys.capsLock].contains(key) {
} else if ["#+=", "selectKeyboard"].contains(key) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarSpecialKeysWidth).isActive = true
} else if ["delete"].contains(key) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarDeleteKeyWidth).isActive = true
} else if [SpecialKeys.capsLock].contains(key) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarSpecialKeysWidth).isActive = true // *2 scalarSpecialKeysWidth = 1
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarCapsLockKeyWidth).isActive = true
} else if [SpecialKeys.indent].contains(key) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarIndentKeyWidth).isActive = true // scalarIndentKeyWidth
} else if ["shift"].contains(key) {
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarIndentKeyWidth).isActive = true
} else if ["shift"].contains(key) && idx == 0 {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarShiftKeyWidth).isActive = true // scalarShiftKeyWidth
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarShiftKeyWidth).isActive = true
} else if ["shift"].contains(key) && (idx > 0) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarRightShiftKeyWidth).isActive = true
} else if ["return"].contains(key) {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarReturnKeyWidth).isActive = true // scalarReturnKeyWidth
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarReturnKeyWidth).isActive = true
} else if ["123", ".?123", "return", "hideKeyboard"].contains(key) {
if key == "return"
&& (controllerLanguage == "Portuguese" || controllerLanguage == "Italian" || commandState == .translate)
&& row == 1
&& DeviceType.isPad
{
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * 1.5).isActive = true
widthAnchor.constraint(equalToConstant: numSymKeyWidth * scalarReturnKeyWidth).isActive = true
} else {
layer.setValue(true, forKey: "isSpecial")
widthAnchor.constraint(equalToConstant: numSymKeyWidth * 1).isActive = true
Expand Down
60 changes: 39 additions & 21 deletions Keyboards/KeyboardsBase/KeyboardViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,19 @@ class KeyboardViewController: UIInputViewController {
keyboardHeight = 270
}
} else if DeviceType.isPad {
if isLandscapeView {
keyboardHeight = 420
// Expanded keyboard on larger iPads can be higher.
if UIScreen.main.bounds.width > 768 {
if isLandscapeView {
keyboardHeight = 430
} else {
keyboardHeight = 360
}
} else {
keyboardHeight = 340
if isLandscapeView {
keyboardHeight = 420
} else {
keyboardHeight = 340
}
}
}

Expand Down Expand Up @@ -1603,6 +1612,7 @@ class KeyboardViewController: UIInputViewController {
}
if DeviceType.isPad
&& key == "a"
&& !usingExpandedKeyboard
&& (controllerLanguage == "Portuguese"
|| controllerLanguage == "Italian"
|| commandState == .translate)
Expand All @@ -1612,29 +1622,23 @@ class KeyboardViewController: UIInputViewController {
}
if DeviceType.isPad
&& key == "@"
&& !usingExpandedKeyboard
&& (controllerLanguage == "Portuguese"
|| controllerLanguage == "Italian"
|| commandState == .translate)
{
leftPadding = keyWidth / 3
addPadding(to: stackView1, width: leftPadding, key: "@")
}
if DeviceType.isPad
&& key == "$"
&& controllerLanguage == "Italian"
{
leftPadding = keyWidth / 3
addPadding(to: stackView1, width: leftPadding, key: "$")
}
if DeviceType.isPad
&& key == "€"
&& !usingExpandedKeyboard
&& (controllerLanguage == "Portuguese"
|| commandState == .translate)
{
leftPadding = keyWidth / 3
addPadding(to: stackView1, width: leftPadding, key: "€")
}
// }

keyboardKeys.append(btn)
if !usingExpandedKeyboard {
Expand Down Expand Up @@ -1954,16 +1958,30 @@ class KeyboardViewController: UIInputViewController {
view?.isLayoutMarginsRelativeArrangement = true

// Set edge insets for stack views to provide vertical key spacing.
if view == stackViewNum {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 4, right: 0)
} else if view == stackView0 {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 8, right: 0)
} else if view == stackView1 {
view?.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 6, right: 0)
} else if view == stackView2 {
view?.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 6, right: 0)
} else if view == stackView3 {
view?.layoutMargins = UIEdgeInsets(top: 6, left: 0, bottom: 5, right: 0)
if DeviceType.isPad {
if view == stackViewNum {
view?.layoutMargins = UIEdgeInsets(top: 4, left: 0, bottom: 4, right: 0)
} else if view == stackView0 {
view?.layoutMargins = UIEdgeInsets(top: 2, left: 0, bottom: 6, right: 0)
} else if view == stackView1 {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 4, right: 0)
} else if view == stackView2 {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 4, right: 0)
} else if view == stackView3 {
view?.layoutMargins = UIEdgeInsets(top: 4, left: 0, bottom: 3, right: 0)
}
} else {
if view == stackViewNum {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 4, right: 0)
} else if view == stackView0 {
view?.layoutMargins = UIEdgeInsets(top: 3, left: 0, bottom: 8, right: 0)
} else if view == stackView1 {
view?.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 6, right: 0)
} else if view == stackView2 {
view?.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 6, right: 0)
} else if view == stackView3 {
view?.layoutMargins = UIEdgeInsets(top: 6, left: 0, bottom: 5, right: 0)
}
}
}

Expand Down
12 changes: 6 additions & 6 deletions Keyboards/LanguageKeyboards/Danish/DAInterfaceVariables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,18 @@ public enum DanishKeyboardConstants {

// Expanded iPad keyboard layouts for wider devices.
static let letterKeysPadExpanded = [
["$", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "'", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "å", "@", "*"],
["kr", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "´", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "å", "@", "¨"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", "æ", "ø", "'", "return"],
["shift", "<", "z", "x", "c", "v", "b", "n", "m", ",", ".", "-", "shift"],
["shift", "*", "z", "x", "c", "v", "b", "n", "m", ",", ".", "-", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let symbolKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "—"],
[SpecialKeys.capsLock, "°", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "", "?", "!", "≠", "'", "\"", "_", "€", ",", ".", "-", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
12 changes: 6 additions & 6 deletions Keyboards/LanguageKeyboards/English/ENInterfaceVariables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,18 @@ public enum EnglishKeyboardConstants {

// Expanded iPad keyboard layouts for wider devices.
static let letterKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "delete"],
["~", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "\\"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "return"],
["shift", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "shift"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", ":", ";", "'", "return"],
["shift", "-", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let symbolKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "~"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "—", "~", "°"],
[SpecialKeys.capsLock, "-", "\\", ":", ";", "(", ")", "&", "@", "$", "£", "¥", "€", "return"], // "undo"
["shift", "", "?", "!", "≠", "'", "\"", "|", "_", ".", ",", "/", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,18 @@ public enum FrenchKeyboardConstants {

// Expanded iPad keyboard layouts for wider devices.
static let letterKeysPadExpanded = [
["@", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "°", "", "delete"],
[SpecialKeys.indent, "a", "z", "e", "r", "t", "y", "u", "i", "o", "p", "^", "$", "*"],
[SpecialKeys.capsLock, "q", "s", "d", "f", "g", "h", "j", "k", "l", "m", "", "%", "return"],
["shift", "/", "w", "x", "c", "v", "b", "n", ",", ".", "<", ">", "shift"],
["@", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "ç", "à", "delete"],
[SpecialKeys.indent, "a", "z", "e", "r", "t", "y", "u", "i", "o", "p", "^", "+", "*"],
[SpecialKeys.capsLock, "q", "s", "d", "f", "g", "h", "j", "k", "l", "m", "ù", "#", "return"],
["shift", "/", "w", "x", "c", "v", "b", "n", ":", "-", ",", ".", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let symbolKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "§"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
[SpecialKeys.indent, "\"", "|", "§", "[", "]", "{", "}", "-", "%", "=", "^", "+", "*"],
[SpecialKeys.capsLock, "/", "", "_", "(", ")", "&", "$", "£", "¥", "", "@", "#", "return"], // "undo"
["shift", "'", "?", "!", "~", "", "°", ";", ":", "-", ",", ".", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public enum FrenchQWERTYKeyboardConstants {
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "~"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
["shift", "", "?", "!", "", "°", "'", "\"", "_", ",", ".", "€", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
14 changes: 7 additions & 7 deletions Keyboards/LanguageKeyboards/German/DEInterfaceVariables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,23 +85,23 @@ public enum GermanKeyboardConstants {
["^", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "ß", "´", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "ü", "+", "*"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", "ö", "ä", "#", "return"],
["shift", "<", "y", "x", "c", "v", "b", "n", "m", ",", ".", "-", "shift"],
["shift", "'", "y", "x", "c", "v", "b", "n", "m", "-", ",", ".", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let letterKeysPadExpandedDisableAccents = [
["^", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "ß", "´", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "+", "*"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", "#", "return"],
["shift", "<", "y", "x", "c", "v", "b", "n", "m", ",", ".", "-", "shift"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "=", "+", "*"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", "/", "@", "#", "return"],
["shift", "'", "y", "x", "c", "v", "b", "n", "m", "-", ",", ".", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let symbolKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "§"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
[SpecialKeys.indent, "\"", "|", "§", "[", "]", "{", "}", "", "%", "^", "=", "+", "*"],
[SpecialKeys.capsLock, ":", ";", "(", ")", "&", "$", "£", "¥", "", "/", "@", "#", "return"], // "undo"
["shift", "'", "?", "!", "~", "", "°", "", "_", "-", ",", ".", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
8 changes: 4 additions & 4 deletions Keyboards/LanguageKeyboards/Hebrew/HEInterfaceVariables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,10 @@ public enum HebrewKeyboardConstants {
]

static let symbolKeysPadExpanded = [
["±", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "redo"
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "—"],
[SpecialKeys.capsLock, "°", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "", "return"], // "undo"
["shift", "", "?", "!", "~", "", "'", "\"", "_", ",", ".", "-", "shift"], // "redo"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,18 @@ public enum ItalianKeyboardConstants {

// Expanded iPad keyboard layouts for wider devices.
static let letterKeysPadExpanded = [
["\\", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "'", "ì", "delete"],
["\\", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "", "ì", "delete"],
[SpecialKeys.indent, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "è", "+", "*"],
[SpecialKeys.capsLock, "a", "s", "d", "f", "g", "h", "j", "k", "l", "ò", "à", "ù", "return"],
["shift", "<", "z", "x", "c", "v", "b", "n", "m", ",", ".", ">", "shift"],
["shift", "'", "z", "x", "c", "v", "b", "n", "m", "-", ",", ".", "shift"],
["selectKeyboard", ".?123", "space", ".?123", "hideKeyboard"], // "microphone", "scribble"
]

static let symbolKeysPadExpanded = [
["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "<", ">", "delete"],
[SpecialKeys.indent, "[", "]", "{", "}", "#", "%", "^", "*", "+", "=", "\"", "|", "§"],
[SpecialKeys.capsLock, "-", "/", ":", ";", "(", ")", "$", "&", "@", "£", "¥", "~", "return"], // "undo"
["shift", "...", ".", ",", "?", "!", "'", "\"", "_", ""], // "shift"
[SpecialKeys.capsLock, "°", "/", ":", ";", "(", ")", "&", "@", "$", "£", "¥", "~", "return"], // "undo"
["shift", "", "?", "!", "≠", "'", "\"", "_", "€", "-", ",", ".", "shift"], // "shift"
["selectKeyboard", "ABC", "space", "ABC", "hideKeyboard"], // "microphone", "scribble"
]

Expand Down
Loading