dessalines / thumb-key Goto Github PK
View Code? Open in Web Editor NEWA privacy-conscious Android keyboard made for your thumbs
License: GNU Affero General Public License v3.0
A privacy-conscious Android keyboard made for your thumbs
License: GNU Affero General Public License v3.0
button for switching languages
hi! this really seems like a promising idea for a keyboard, but for me a few things are missing that are pretty essential, at least for me
ill list them and try to give ideas on tow to improve/add these things:
1 absolutely necessary
in thumbkey this could be done by setting maybe a main and a secondary language in the settings. then, when you swipe left on the enter key, the language would switch between them
2 would be pretty cool
more characters, i.e. i was looking for "+" yet couldnt find it, maybe im just blind
emoji keyboard (i know this was already mentioned)
swiping on the delete key not to delete words, but characters precisely, like florisboard
better theming, specifically for me the lines between keys dont really fit, maybe "corner radius" and "lines between keys" settings could improve the look a lot
thank you! i know this app is still in early developement but still i think with these changes it could turn into something even better :)
It would be nice, especially while learning this keyboard, to have different colored letters around the H-key and also the smaller letters around the other main keys.
So: J,Q,B,K,P,V,X,Y a different color from the main keys
And: W,G,U,M,L,C,F,D either the same color as the J,Q... set or another different color.
This would provide some additional contrast to make it easier when identifying the letters while learning the keyboard.
I figured you could either make this a default option, or allow a toggle switch to change the colors on those letters.
Thanks!
If you keep taping space bar, the results are different depending if the auto-capitalize is On or Off.
While Off: Double space will create a period. If you press it again, it will change the period for a comma, again for question mark, again for exclamation mark, again for colon. ( '.' → ',' → '?' → '!' → ':' )
While On: Double space will create a period. If you press it again, it will just create another space.
Hi,
I have tried to make the file with german layout. For the letter-frequency I just asked wikipedia. I had to add the "Umlaute" aka diphtongs i think and i decided to place near the ordinary letters, e.g. "Ö" near "O" etc. Same thing for the "ß".
I hope I did not destroy the syntax with the extra-letters. It was great if you could yous my proposal.
Greatings
Rick
Because of requests of users, I modified Russian layout and as result I got Ukranian layout. I use this frequency list.
IE auomatically switch to numeric keyboard on those input types.
Use a better direction algorithm:
https://stackoverflow.com/questions/3967238/javascript-formula-to-get-direction-from-x-y-coordinates
Maybe try to implement a swipe detection for spacebar that does arrow left/right every N pixels of swipe gesture?
In the middle button there are two 'г' letters but no 'к' letter anywhere.
It's a feature that I can't imagine leaving behind, after using other keyboards. It makes correcting mistakes much easier.
Hello,
Would be great to have keys optimised for french typing
Thanks
Hi, I've created russian layout. I took frequency list from "Russian National Corpus" (НКРЯ). I suppose that at top left corner placed the most frequent letters (such а, о, е). Also, I placed "ъ" and "ё" at bottom right corner of bottom left corner because almost all natives write "е" instead of "ё", because of its identity to "е" (although, all official documents must write "ё" and not "е" instead). "ъ", because small group of words have it. E.g. "подъезд", "отъехать", etc. So, this way "ё" and "ъ" cannot be written accidentally.
It should looks like this:
package com.dessalines.thumbkey.keyboards
import android.view.KeyEvent
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDropDown
import androidx.compose.material.icons.outlined.ArrowDropUp
import androidx.compose.material.icons.outlined.KeyboardBackspace
import androidx.compose.material.icons.outlined.KeyboardReturn
import androidx.compose.material.icons.outlined.Numbers
import androidx.compose.material.icons.outlined.Settings
import com.dessalines.thumbkey.utils.ColorVariant
import com.dessalines.thumbkey.utils.FontSizeVariant
import com.dessalines.thumbkey.utils.KeyAction
import com.dessalines.thumbkey.utils.KeyC
import com.dessalines.thumbkey.utils.KeyDisplay
import com.dessalines.thumbkey.utils.KeyItemC
import com.dessalines.thumbkey.utils.KeyboardC
import com.dessalines.thumbkey.utils.KeyboardMode
import com.dessalines.thumbkey.utils.SwipeDirection
val thumbkeyV4Keyboard = KeyboardC(
arrayOf(
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("н"),
action = KeyAction.CommitText("н"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("щ"),
action = KeyAction.CommitText("щ")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("е"),
action = KeyAction.CommitText("е"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("й"),
action = KeyAction.CommitText("й")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("б"),
action = KeyAction.CommitText("б")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("э"),
action = KeyAction.CommitText("э")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("о"),
action = KeyAction.CommitText("о"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("з"),
action = KeyAction.CommitText("з")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("г"),
action = KeyAction.CommitText("г")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("ь"),
action = KeyAction.CommitText("ь")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Settings),
action = KeyAction.GotoSettings,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("с"),
action = KeyAction.CommitText("с"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ю"),
action = KeyAction.CommitText("ю")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("т"),
action = KeyAction.CommitText("т"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("у"),
action = KeyAction.CommitText("у")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("д"),
action = KeyAction.CommitText("д")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("л"),
action = KeyAction.CommitText("л")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("к"),
action = KeyAction.CommitText("к")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("м"),
action = KeyAction.CommitText("м")
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("п"),
action = KeyAction.CommitText("п")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("ы"),
action = KeyAction.CommitText("ы")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("я"),
action = KeyAction.CommitText("я")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("а"),
action = KeyAction.CommitText("а"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("х"),
action = KeyAction.CommitText("х")
),
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("ч"),
action = KeyAction.CommitText("ч")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("ж"),
action = KeyAction.CommitText("ж")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.ArrowDropUp),
action = KeyAction.ToggleShiftMode(true),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Numbers),
action = KeyAction.ToggleNumericMode(true),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("в"),
action = KeyAction.CommitText("в"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ф"),
action = KeyAction.CommitText("ф")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("р"),
action = KeyAction.CommitText("р"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("ц"),
action = KeyAction.CommitText("ц")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("'"),
action = KeyAction.CommitText("'"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("-"),
action = KeyAction.CommitText("-"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("."),
action = KeyAction.CommitText("."),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay(","),
action = KeyAction.CommitText(","),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("и"),
action = KeyAction.CommitText("и"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("ш"),
action = KeyAction.CommitText("ш")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ъ"),
action = KeyAction.CommitText("ъ")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ё"),
action = KeyAction.CommitText("ё")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardBackspace),
action = KeyAction.SendEvent(
KeyEvent(
KeyEvent.ACTION_DOWN,
KeyEvent
.KEYCODE_DEL
)
),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.TOP_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.BOTTOM_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
)
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay(" "),
action = KeyAction.CommitText(" ")
),
nextTapActions = arrayOf(
KeyAction.ReplaceLastText(", ", trimCount = 1),
KeyAction.ReplaceLastText(". "),
KeyAction.ReplaceLastText("? "),
KeyAction.ReplaceLastText("! "),
KeyAction.ReplaceLastText(": ")
),
backgroundColor = ColorVariant.SURFACE_VARIANT,
widthMultiplier = 3
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardReturn),
action = KeyAction.IMECompleteAction,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
)
)
)
val thumbkeyV4KeyboardShifted = KeyboardC(
arrayOf(
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("Н"),
action = KeyAction.CommitText("Н"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Щ"),
action = KeyAction.CommitText("Щ")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("Е"),
action = KeyAction.CommitText("Е"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("Й"),
action = KeyAction.CommitText("Й")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Б"),
action = KeyAction.CommitText("Б")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Э"),
action = KeyAction.CommitText("Э")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("О"),
action = KeyAction.CommitText("О"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("З"),
action = KeyAction.CommitText("З")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Г"),
action = KeyAction.CommitText("Г")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ь"),
action = KeyAction.CommitText("Ь")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Settings),
action = KeyAction.GotoSettings,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("С"),
action = KeyAction.CommitText("С"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ю"),
action = KeyAction.CommitText("Ю")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("т"),
action = KeyAction.CommitText("Т"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("У"),
action = KeyAction.CommitText("У")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("Д"),
action = KeyAction.CommitText("Д")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Л"),
action = KeyAction.CommitText("Л")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("К"),
action = KeyAction.CommitText("К")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("М"),
action = KeyAction.CommitText("М")
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("П"),
action = KeyAction.CommitText("П")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ы"),
action = KeyAction.CommitText("Ы")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("Я"),
action = KeyAction.CommitText("Я")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("А"),
action = KeyAction.CommitText("А"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("Х"),
action = KeyAction.CommitText("Х")
),
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ч"),
action = KeyAction.CommitText("Ч")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ж"),
action = KeyAction.CommitText("Ж")
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.ArrowDropDown),
action = KeyAction.ToggleShiftMode(false),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Numbers),
action = KeyAction.ToggleNumericMode(true),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("В"),
action = KeyAction.CommitText("В"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ф"),
action = KeyAction.CommitText("Ф")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("Р"),
action = KeyAction.CommitText("Р"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("Ц"),
action = KeyAction.CommitText("Ц")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("'"),
action = KeyAction.CommitText("'"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("-"),
action = KeyAction.CommitText("-"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("."),
action = KeyAction.CommitText("."),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay(","),
action = KeyAction.CommitText(","),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("И"),
action = KeyAction.CommitText("И"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ш"),
action = KeyAction.CommitText("Ш")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ъ"),
action = KeyAction.CommitText("Ъ")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ё"),
action = KeyAction.CommitText("Ё")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardBackspace),
action = KeyAction.SendEvent(
KeyEvent(
KeyEvent.ACTION_DOWN,
KeyEvent
.KEYCODE_DEL
)
),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.TOP_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.BOTTOM_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
)
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay(" "),
action = KeyAction.CommitText(" ")
),
nextTapActions = arrayOf(
KeyAction.ReplaceLastText(", ", trimCount = 1),
KeyAction.ReplaceLastText(". "),
KeyAction.ReplaceLastText("? "),
KeyAction.ReplaceLastText("! "),
KeyAction.ReplaceLastText(": ")
),
backgroundColor = ColorVariant.SURFACE_VARIANT,
widthMultiplier = 3
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardReturn),
action = KeyAction.IMECompleteAction,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
)
)
)
val THUMBKEY_V4_KEYBOARD_MODES: Map<KeyboardMode, KeyboardC> = mapOf(
KeyboardMode.MAIN to thumbkeyV4Keyboard,
KeyboardMode.SHIFTED to thumbkeyV4KeyboardShifted,
KeyboardMode.NUMERIC to numericKeyboard
)
P.S. sorry, idk where I should attach the code.
Have a guide for how to use this.
Just tried this out, and something I noticed immediately was that it automatically switches to capital letters only after typing a period. Entering a question mark or exclamation point does not automatically transition the next key to an uppercase letter, even though those punctuations also end a sentence. (As an aside: it is also noticeably more work to type an exclamation point or question mark compared to a period, which felt inconvenient.)
Additionally, if you type one capital letter and then immediately delete it, it doesn't remember that you wanted to type a capital letter (after typing the capital letter, it switches to lowercase, but doesn't switch back to uppercase if you delete the letter because you want to type a different capital letter instead).
Lastly, it seems to start with a capital letter the first time you switch to the keyboard, but if you switch to another application without switching the keyboard, it doesn't default to a capital letter when focusing on a text field in that other application.
Just wanted to share some feedback, but overall I'm intrigued by the keyboard. I'm not sure how long it would take to get used to, yet, but improving the logic around automatic switching to uppercase would certainly make it easier for me to adopt even before the layout becomes familiar.
I made it based in this frequency list and following the position guidelines. It looks like that:
package com.dessalines.thumbkey.keyboards
import android.view.KeyEvent
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDropDown
import androidx.compose.material.icons.outlined.ArrowDropUp
import androidx.compose.material.icons.outlined.KeyboardBackspace
import androidx.compose.material.icons.outlined.KeyboardReturn
import androidx.compose.material.icons.outlined.Numbers
import androidx.compose.material.icons.outlined.Settings
import com.dessalines.thumbkey.utils.ColorVariant
import com.dessalines.thumbkey.utils.FontSizeVariant
import com.dessalines.thumbkey.utils.KeyAction
import com.dessalines.thumbkey.utils.KeyC
import com.dessalines.thumbkey.utils.KeyDisplay
import com.dessalines.thumbkey.utils.KeyItemC
import com.dessalines.thumbkey.utils.KeyboardC
import com.dessalines.thumbkey.utils.KeyboardMode
import com.dessalines.thumbkey.utils.SwipeDirection
val thumbkeyV4Keyboard = KeyboardC(
arrayOf(
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("n"),
action = KeyAction.CommitText("n"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("v"),
action = KeyAction.CommitText("v")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("m"),
action = KeyAction.CommitText("m"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("h"),
action = KeyAction.CommitText("h")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("o"),
action = KeyAction.CommitText("o"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("c"),
action = KeyAction.CommitText("c")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("ç"),
action = KeyAction.CommitText("ç"),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ó"),
action = KeyAction.CommitText("ó"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("õ"),
action = KeyAction.CommitText("õ"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("ô"),
action = KeyAction.CommitText("ô"),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Settings),
action = KeyAction.GotoSettings,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("r"),
action = KeyAction.CommitText("r"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("p"),
action = KeyAction.CommitText("p")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("d"),
action = KeyAction.CommitText("d"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("x"),
action = KeyAction.CommitText("x")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("w"),
action = KeyAction.CommitText("w")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("f"),
action = KeyAction.CommitText("f")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("b"),
action = KeyAction.CommitText("b")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("q"),
action = KeyAction.CommitText("q")
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("k"),
action = KeyAction.CommitText("k")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("z"),
action = KeyAction.CommitText("z")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("j"),
action = KeyAction.CommitText("j")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("e"),
action = KeyAction.CommitText("e"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("t"),
action = KeyAction.CommitText("t")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.ArrowDropUp),
action = KeyAction.ToggleShiftMode(true),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("é"),
action = KeyAction.CommitText("é"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("ê"),
action = KeyAction.CommitText("ê"),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Numbers),
action = KeyAction.ToggleNumericMode(true),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("s"),
action = KeyAction.CommitText("s"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("l"),
action = KeyAction.CommitText("l")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("i"),
action = KeyAction.CommitText("i"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("g"),
action = KeyAction.CommitText("g")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("í"),
action = KeyAction.CommitText("í"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("y"),
action = KeyAction.CommitText("y")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("'"),
action = KeyAction.CommitText("'"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("."),
action = KeyAction.CommitText("."),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay(","),
action = KeyAction.CommitText(","),
color = ColorVariant.MUTED
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("-"),
action = KeyAction.CommitText("-"),
color = ColorVariant.MUTED
),
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("a"),
action = KeyAction.CommitText("a"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("u"),
action = KeyAction.CommitText("u")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("ú"),
action = KeyAction.CommitText("ú"),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("á"),
action = KeyAction.CommitText("á"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("ã"),
action = KeyAction.CommitText("ã"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("à"),
action = KeyAction.CommitText("à"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("â"),
action = KeyAction.CommitText("â"),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardBackspace),
action = KeyAction.SendEvent(
KeyEvent(
KeyEvent.ACTION_DOWN,
KeyEvent
.KEYCODE_DEL
)
),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.TOP_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.BOTTOM_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
)
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay(" "),
action = KeyAction.CommitText(" ")
),
nextTapActions = arrayOf(
KeyAction.ReplaceLastText(", ", trimCount = 1),
KeyAction.ReplaceLastText(". "),
KeyAction.ReplaceLastText("? "),
KeyAction.ReplaceLastText("! "),
KeyAction.ReplaceLastText(": ")
),
backgroundColor = ColorVariant.SURFACE_VARIANT,
widthMultiplier = 3
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardReturn),
action = KeyAction.IMECompleteAction,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
)
)
)
val thumbkeyV4KeyboardShifted = KeyboardC(
arrayOf(
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("N"),
action = KeyAction.CommitText("N"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("V"),
action = KeyAction.CommitText("V")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("M"),
action = KeyAction.CommitText("M"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("H"),
action = KeyAction.CommitText("H")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("O"),
action = KeyAction.CommitText("O"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("C"),
action = KeyAction.CommitText("C")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("Ç"),
action = KeyAction.CommitText("Ç"),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ó"),
action = KeyAction.CommitText("Ó"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Õ"),
action = KeyAction.CommitText("Õ"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("Ô"),
action = KeyAction.CommitText("Ô"),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Settings),
action = KeyAction.GotoSettings,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("R"),
action = KeyAction.CommitText("R"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("P"),
action = KeyAction.CommitText("P")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("D"),
action = KeyAction.CommitText("D"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("X"),
action = KeyAction.CommitText("X")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("W"),
action = KeyAction.CommitText("W")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("F"),
action = KeyAction.CommitText("F")
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("B"),
action = KeyAction.CommitText("B")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Q"),
action = KeyAction.CommitText("Q")
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("K"),
action = KeyAction.CommitText("K")
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay("Z"),
action = KeyAction.CommitText("Z")
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("J"),
action = KeyAction.CommitText("J")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("E"),
action = KeyAction.CommitText("E"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("T"),
action = KeyAction.CommitText("T")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("Ê"),
action = KeyAction.CommitText("Ê"),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("É"),
action = KeyAction.CommitText("É"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.ArrowDropDown),
action = KeyAction.ToggleShiftMode(false),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.Numbers),
action = KeyAction.ToggleNumericMode(true),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("S"),
action = KeyAction.CommitText("S"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("L"),
action = KeyAction.CommitText("L")
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("I"),
action = KeyAction.CommitText("I"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("G"),
action = KeyAction.CommitText("G")
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Í"),
action = KeyAction.CommitText("Í"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Y"),
action = KeyAction.CommitText("Y")
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("'"),
action = KeyAction.CommitText("'"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("."),
action = KeyAction.CommitText("."),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_LEFT to KeyC(
display = KeyDisplay.TextDisplay(","),
action = KeyAction.CommitText(","),
color = ColorVariant.MUTED
),
SwipeDirection.LEFT to KeyC(
display = KeyDisplay.TextDisplay("-"),
action = KeyAction.CommitText("-"),
color = ColorVariant.MUTED
),
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay("A"),
action = KeyAction.CommitText("A"),
size = FontSizeVariant.LARGE,
color = ColorVariant.PRIMARY
),
swipes = mapOf(
SwipeDirection.TOP_LEFT to KeyC(
display = KeyDisplay.TextDisplay("U"),
action = KeyAction.CommitText("U")
),
SwipeDirection.TOP to KeyC(
display = KeyDisplay.TextDisplay("Ú"),
action = KeyAction.CommitText("Ú"),
color = ColorVariant.MUTED
),
SwipeDirection.TOP_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Á"),
action = KeyAction.CommitText("Á"),
color = ColorVariant.MUTED
),
SwipeDirection.RIGHT to KeyC(
display = KeyDisplay.TextDisplay("Ã"),
action = KeyAction.CommitText("Ã"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM_RIGHT to KeyC(
display = KeyDisplay.TextDisplay("À"),
action = KeyAction.CommitText("À"),
color = ColorVariant.MUTED
),
SwipeDirection.BOTTOM to KeyC(
display = KeyDisplay.TextDisplay("Â"),
action = KeyAction.CommitText("Â"),
color = ColorVariant.MUTED
)
)
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardBackspace),
action = KeyAction.SendEvent(
KeyEvent(
KeyEvent.ACTION_DOWN,
KeyEvent
.KEYCODE_DEL
)
),
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
swipes = mapOf(
SwipeDirection.LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.TOP_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
),
SwipeDirection.BOTTOM_LEFT to KeyC(
action = KeyAction.DeleteLastWord,
display = null
)
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
),
arrayOf(
KeyItemC(
center = KeyC(
display = KeyDisplay.TextDisplay(" "),
action = KeyAction.CommitText(" ")
),
nextTapActions = arrayOf(
KeyAction.ReplaceLastText(", ", trimCount = 1),
KeyAction.ReplaceLastText(". "),
KeyAction.ReplaceLastText("? "),
KeyAction.ReplaceLastText("! "),
KeyAction.ReplaceLastText(": ")
),
backgroundColor = ColorVariant.SURFACE_VARIANT,
widthMultiplier = 3
),
KeyItemC(
center = KeyC(
display = KeyDisplay.IconDisplay(Icons.Outlined.KeyboardReturn),
action = KeyAction.IMECompleteAction,
size = FontSizeVariant.LARGE,
color = ColorVariant.SECONDARY
),
backgroundColor = ColorVariant.SURFACE_VARIANT
)
)
)
)
val THUMBKEY_V4_KEYBOARD_MODES: Map<KeyboardMode, KeyboardC> = mapOf(
KeyboardMode.MAIN to thumbkeyV4Keyboard,
KeyboardMode.SHIFTED to thumbkeyV4KeyboardShifted,
KeyboardMode.NUMERIC to numericKeyboard
)
I wonder if this would be possible. I don't know what it requires but I would guess Android has that capability builtin. I know rkkr/simple-keyboard has this functionality.
I use ? frequently, it would be nice if it was accessible on the main keyboard without hitting #.
Thanks.
The C and the O/Ö have been swapped so that the vowels are on the right and the consonants are on the left, according to the layout specifications.
Please fix double 'г' in Ukrainian layout, pasting 'E' letter after changing to lover case in Russian layout, and, if it possible, fully rewrite system of keys for loading here from json like this: {"ru":{{}{}{}{}{}{}}{{}{}{}{}{}{}{}{}{}}}} or someone else (I'm bad in json), just implement this idea. And please, add key for changing keyboard layout, I use it now, but going to program settings and changing layout is very uncomfortable. Many thanks and good luck!
Currently there's no icon.
Add auto update feature as in LibreTube and other such open source apps. As it is really ineffective to download and install all the way round.
For example: words like 'pull', 'bull', 'wdym', 'fuck'. Typing any of these words and than pressing space bar will substitute the last 2 letters for a period.
This could either be done by implementing an already existing android emoji picker, or by trying to build a custom one into thumb key.
I'm leaning toward the former, so I don't have to maintain it, and solve all the emoji related issues that might come up.
edit:
Unfortunately the former solution isn't working for the existing 2 emoji picker libraries I've tried. There appear to be no good jetpack compose emoji pickers yet.
I tried using this as my daily keyboard for the last 2 days, this is probably the only thing I consider a real "issue" preventing me from using it further rather than an "enhancement"
After ~300ms (Normal 'long press') of holding the backspace, it should be repeated every ~40ms.
Swiping to erase words isn't my thing.
This should change to done, submit, etc.
I'm finding swipes have trouble registering with my left thumb. (My swipes are bad in general due to limited finger dexterity, they often go in the wrong direction so I often upped minimum swipe length in MessagEase which helped)
I suspect having this configurable will help alleviate the problem just as it did in MessagEase.
Hi. Here is a Finnish layout.
I don't have any devtools for Android. Would it be possible for you to make an apk for me to test (or I can simply test with the next release)?
Thanks!
For clarification, the f-droid and github versions will always remain free, but I'll probably do a paid / subscription-based play store version.
The dash seems much more componly used in text.
According to this wiki:
https://en.m.wikipedia.org/wiki/Frequency_analysis
"Likewise, TH, ER, ON, and AN are the most common pairs of letters (termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats."
Since you have extra space on some of the keys like T, E, A, and O, this would provide space to put bigrams and repeats in the corners of those letters if you wanted.
This non-FOSS keyboard does something similar, although some of the options are hidden until you actually slide the key, so I don't know if you can actually see it based off the play store description:
https://play.google.com/store/apps/details?id=com.combokey.plus
Thank you.
Currently its going to the main activity.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.