KeyboardKit will only deprecate code in minor
versions. Deprecated code will be removed in major
versions.
This release contains a bunch of new features that makes the keyboard behave more like the native keyboards when typing, for instance auto-capitalization and auto-lowercasing.
This release separates action handling from action behavior, which I hope makes the code cleaner and easier to test and simplifies reusing behavior outside of an action handling context.
KeyboardActionBehavior
specifies how a keyboard action should behave.StandardKeyboardActionBehavior
specifies a standard behavior for a western keyboard.
You can create your own behaviors as well as subclass and override parts of the standard behavior.
Note that this is an experimental feature that may have to be revisited before 4.0.
KeyboardContext
has a newpreferredKeyboardType
property.StandardKeyboardActionBehavior
has caps-lock double tap logic.UITextDocumentProxy
has a newisCursorAtNewSentence
property.UITextDocumentProxy
has a newisCursorAtNewWord
property.UITextDocumentProxy
has a newendSentence
function that removes any space before the cursor, then closes the sentence.UITextDocumentProxy
has a newsentenceDelimiters
property.UITextDocumentProxy
has a newwordDelimiters
property.
- The caps-lock double tap logic is moved from double-tap on shift to the new action behavior.
- The sentence ending logic is moved from double-tap on space to the new action behavior.
- The sentence ending logic is no longer based on double-tap, which makes it easier to use.
KeyboardAction
standardDoubleTapAction
is not defined for any actions anymore.KeyboardInputViewController
changeKeyboardType
has no time interval anymore.
- The standard keyboard layout has been fixed to use the correct caps-lock button image.
KeyboardAction
endSentenceAction
has been moved toUITextDocumentProxy+EndSentence
.KeyboardAction
standardDoubleTapAction
is not used internally anymore.KeyboardContext
changeKeyboardType
is not used internally anymore.KeyboardType
canBeReplaced
is not used internally anymore.StandardKeyboardActionHandler
handleKeyboardSwitch
is renamed tohandleKeyboardTypeChange
.StandardKeyboardActionHandler
preferredKeyboardType
has been moved to the action behavior.
These deprecations will be removed in v 4.0.
This release contains improvements to the input set logic:
- There is a new
KeyboardInputProvider
protocol. StandardKeyboardInputProvider
tries to use the current locale (fallback to English) and can be inherited.StaticKeyboardInputProvider
uses three static input sets.InputSet+English
has been renamed toInputSet+Locale
and has more sets.InputSet+Locale
extension has support for basic English, German, Italian and Swedish.StandardKeyboardInputProvider
is used by default in the context, but you can change this at anytime.
The release also introduces a new "keyboard layout" concept, where a keyboard layout is an input set with surrounding actions:
- There is a new
KeyboardLayout
struct. - There is a new
KeyboardLayoutProvider
protocol.StandardKeyboardLayoutProvider
uses the current context and can be inherited.StaticKeyboardLayoutProvider
uses a static layout that is provided at init.
StandardKeyboardLayoutProvider
is used by default in the context, but you can change this at anytime.
There are new properties in the KeyboardContext
.
This release also makes it easier to resolve system keyboard dimensions:
CGFloat+Keyboard
has utils to resolve the standard keyboard row height.KeyboardStackViewComponent
s use this new standard height as default height.UIEdgeInsets+Keyboard
has utils to resolve the standard keyboard row item insets.KeyboardButtonRowComponent
s use these new standard insets as default insets.
The demos have been updated with these changes.
- The context controller propertis are marked as
@unowned
to fix a memory leak.
CGFloat+KeyboardDimensions
is deprecated and will be removed in 4.0.KeyboardContext
'scontroller
is now deprecated and will be removed in 4.0 .Usage is strongly discouraged. Use the context instead.
KeyboardContext
has new properties to make the new input and layout additions possible. If you have created your own context, you will have to add these.
This version contains new features:
EmojiCategory
is nowCodable
.EmojiCategory
has afallbackDisplayEmoji
that is used as system button text if no custom button image used.KeyboardAction
now has a standard tap action for.emojiCategory
.KeyboardContext
now has anemojiCategory
property.
This version contains new protocols and classes:
KeyboardInputViewController
has new, emptyperformAutocomplete
andresetAutocomplete
functions that are called by the system at proper times.- The new
AutocompleteSuggestions
typealias makes the autocomplete apis cleaner. - There is a new
AutocompleteContext
protocol that can be used to manage suggestions. - There is a new
StandardAutocompleteContext
implementation ofAutocompleteContext
. - There is a new
UITextDocumentProxy
property to check if the proxy cursor is at the end of the current word.
- The "end sentence" action that is used by space double taps, uses the new proxy property to only close when the cursor is at the end of a word.
In this version:
- A memory leak was fixed by making all
StandardBookActionHandler
actions use[weak self]
. - The UIKit button shadow logic was improved by @jackhumbert.
This version fixes a bug, where the globe button that is used by the demo keyboards didn't do anything.
This version also fixes the system image's font weight.
This version removes all previously deprecated parts of the library and adds improved support for SwiftUI and iOS 13.
If you upgrade from an older version to 3.0
and have many breaking changes, upgrading to 2.9
first provides deprecation help that may make the transition easier.
There is a new KeyboardContext
, which provides important contextual information.
StandardKeyboardContext
is the standard, non-observable implementation.ObservableKeyboardContext
is an iOS 13+ required, observable implementation.StandardKeyboardActionHandler
now automatically handles keyboard type switching and only delays if an action has a double-tap action.StandardKeyboardActionHandler
now automatically switches to certain keyboards after certain actions, as defined byhandleKeyboardSwitch(after:on:)
andpreferredKeyboardType(after:on:)
.
There are new KeyboardAction
types and properties:
.control
represents the system..systemImage
can be used with SF Symbols..systemFont
and.systemTextStyle
provide system look information.
There is a new System
namespace with utils to help you build native-imitating system keyboards.
There is a new KeyboardInputSet
concept that will simplify building language-specific keyboards. For now, it contains English characters, numerics and symbols.
The demo project contains a new KeyboardKitSwiftUIPreviews
in which you can preview KeyboardKitSwiftUI views.
- This repository has a new SwiftUI-based demo app, which is still in development.
KeyboardImageButton
supports the newsystemImage
action.
KeyboardInputViewController
deviceOrientation
has been converted to a generalUIInputViewController
extension.setupNextKeyboardButton
has been converted to a generalUIInputViewController
extension.
-
KeyboardInputViewController
has a newkeyboardContext
property. -
StandardKeyboardContext
is used by default, whenever a keyboard extension is created. -
ObservableKeyboardContext
is used by whenever a keyboard switches over to use SwiftUI. -
KeyboardInputViewController
keyboardActionHandler
has been moved toKeyboardContext
. -
KeyboardInputViewController
canChangeKeyboardType
has been moved toKeyboardType
. -
KeyboardInputViewController
changeKeyboardType
has been moved toKeyboardContext
. -
KeyboardInputViewController
changeKeyboardTypeDelay
is now an argument inchangeKeyboardType
. -
KeyboardInputViewController
keyboardType
has been moved to the context. -
AutocompleteToolbar
has been renamed toAutocompleteToolbarView
. -
EmojiCategory.frequents
has been renamed tofrequent
. -
KeyboardActionHandler
now requirescanHandle(_:on:)
to be implemented. -
KeyboardAction
has new action types. -
KeyboardAction
has fewerisXXX
properties. -
KeyboardAction
.capsLock
andshiftDown
are now part ofKeyboardAction.shift
. -
KeyboardActionRow.from
has been changed to an initializer. -
KeyboardActionRows.from
has been changed to an initializer. -
KeyboardImageActions
has been converted to aKeyboardActionRow+Images
extension initializer. -
KeyboardToolbar
has been renamed toKeyboardToolbarView
. -
The
shouldChangeToAlphabeticLowercase
has been replaced with the automatic switching mentioned above. -
The
isKeyboardEnabled
function now uses afor
as external argument name.
AutocompleteBugFixTimer
AutocompleteSuggestionProvider
provideAutocompleteSuggestions
KeyboardAction
switchKeyboard
KeyboardAction
switchToKeyboard
KeyboardAction
standardInputViewControllerAction
KeyboardAction
standardTextDocumentProxyAction
KeyboardActionHandler
handleTap/Repeat/LongPress
KeyboardActionHandler
handle
gesture onUIView
KeyboardInputViewController
addSwitchKeyboardGesture
PersistedKeyboardSetting
init with keyStandardKeyboardActionHandler
init
with feedback instancesStandardKeyboardActionHandler
action
for viewStandardKeyboardActionHandler
animationButtonTap
StandardKeyboardActionHandler
giveHapticFeedbackForLongPress/Repeat/Tap
StandardKeyboardActionHandler
longPress/repeat/tapAction
for viewStandardKeyboardActionHandler
handleLongPress/Repeat/Tap
StandardKeyboardActionHandler
triggerAudio/HapticFeedback
UIColor
clearTappable
UIInputViewController
createAutocompleteBugFixTimer
UIView
add/removeLongPress/Repeating/TapAction
isKeyboardEnabled
global function
This version updates external test dependencies to their latest versions.
This version removes the subview fiddling from KeyboardCollectionVew
to the built-in subclasses, since it can ruin the view hierarchy for collection views that don't add custom views to the cells.
This version adds an .emoji
keyboard action, which can be used if you need to separate characters from emojis.
This version also extracts the logic of KeyboardAction
standardTapAction
into:
standardTapActionForController
standardTapActionForProxy
This makes it possible to use the standard function in other ways, should you need it.
This version also makes actions
of KeyboardCollectionView
mutable, causing changes to this property to refresh the view.
This is the last minor version before 3.0
, which will remove a bunch of deprecated members.
This version adds more features, fixes some bugs and deprecates many parts of the library.
A big change, which is not fully covered in these notes, is that KeyboardInputViewController
and StandardKeyboardActionHandler
now handles changing keyboard types. Even if you have to fill a "type" with meaning in your app, you now have implemented logic to help you handle this.
Thanks to @eduardoxlau, the demo also has an improved emoji keyboard.
KeyboardAction
has newstandardTap/DoubleTap/LongPress/Repeat
action properties.KeyboardInputViewController
has a newdeviceOrientation
property.KeyboardInputViewController
has a newkeyboardType
property.KeyboardInputViewController
has newcan/changeKeyboardType
functions and properties.KeyboardInputViewController
has a newsetupKeyboard
function.StandardKeyboardActionHandler
has more logic for handling keyboard type changes.- The new
EmojiCategory
enum represents the native iOS emoji keyboard categories. - The new
KeyboardStateInspector
can be implemented to get info about the keyboard.
- The demo now switches to caps lock when shift is double-tapped.
- The standard tap animation does not scale up as much as before.
- The standard haptic feedback for tap is light impact instead of medium.
KeyboardAction.switchKeyboard
has been renamed tonextKeyboard
.KeyboardAction.switchToKeyboard
has been renamed tokeyboardType
.KeyboardAction.standardInputViewControllerAction
has been renamed tostandardTapAction
.KeyboardAction.standardTextDocumentProxyAction
is no longer used by the system`.addSwitchKeyboardGesture(to:)
has been renamed toaddNextKeyboardGesture(to:)
.- The global
isKeyboardEnabled
has been replaced with a newKeyboardStateInspector
protocol.
- Double tap handling for space no longer inserts an additional space.
KeyboardType.alphabetic
now uses aKeyboardShiftState
property instead of a bool for if it's upper-cased or not.KeyboardAction.switchToKeyboard
is now an alias forkeyboardType
. You can still use it when defining actions, but if you switch overKeyboardAction
, you have to usekeyboardType
instead ofswitchToKeyboard
.
This version fixes some division by zero bugs.
This version fixes a gesture-related memory leak by no longer using the gesture extensions that caused the problem. Instead, KeyboardInputViewController
has a new set of internal gesture extensions that helps with adding gestures to a button.
This version also adds double-tap action handling to KeyboardKit. It's handled like taps, long presses and repeating actions, but it has no default logic. To handle it, create a custom action handler and override handle(_ gesture:,on action:, sender:)
.
KeyboardKit does not put any rules on the gesture handling. If you return an action for both a single tap and a double tap, both will be triggered.
- A new
.doubleTap
keyboard gesture.
- The
UIView
addLongPressAction
extension is deprecated. - The
UIView
removeLongPressAction
extension is deprecated. - The
UIView
addRepeatingAction
extension is deprecated. - The
UIView
removeRepeatingAction
extension is deprecated. - The
UIView
addTapAction
extension is deprecated. - The
UIView
removeTapAction
extension is deprecated.
This version upgrades the podspec's Swift version.
This version upgrades its Nimble and Mockery dependencies.
These versions adjust the keyboard settings url.
This version adds the very first (and so far limited) support for SwiftUI
. Many new features are iOS 13-specific.
This version also deprecates a bunch of action handling logic and adds new functions that doesn't rely on UIView
.
-
KeyboardInputViewController
has a newsetupNextKeyboardButton(...)
which turns anyUIButton
into a system-handled "next keyboard" button. -
NextKeyboardUIButton
makes use of this new functionality, and sets itself up with aglobe
icon as well. -
PhotoImageService
andStandardPhotoImageService
can be used to save images to photos with a completion instead of a target and a selector. -
KeyboardImageActions
makes it easy to create a bunch of.image
actions from a set of image names. -
KeyboardActionHandler
has a newopen handle(_ gesture:on:view:)
which is already implemented inStandardKeyboardActionHandler
. -
The global
isKeyboardEnabled
function can be used to check if a certain keyboard extension is enabled or not. -
The
keyboardSettings
URL
extension is a convenience extension for finding the url to application settings. -
The
evened(for gridSize: Int)
[KeyboardAction]
extension appends enough.none
actions to evenly fit the grid size. -
The
saveToPhotos(completion:)
UIImage
extension is a completion-based way of saving images to photos.
There are some new views that can be used in SwiftUI-based apps and keyboard extensions:
-
KeyboardGrid
distributes actions evenly within a grid. -
KeyboardGridRow
is used for each row in the grid. -
KeyboardHostingController
can be used to wrap anyView
in a keyboard extension. -
KeyboardImageButton
view lets you show an.image
action orImage
in aButton
. -
NextKeyboardButton
sets itself up with aglobe
icon and works as a standard "next keyboard" button. -
PersistedKeyboardSetting
is a new property wrapper for persisting settings inUserDefaults
. -
Color.clearInteractable
can be used instead of.clear
to allow gestures to be detected. -
Image.globe
returns the icon that is used for "next keyboard". -
KeyboardInputViewController
setup(with:View)
sets up aKeyboardHostingController
. -
View
withClearInteractableBackground()
can be used to make an entire view interactable.
Note that KeyboardKitSwiftUI
is a separate framework, which you have to import to get access to these features.
There are some new UIKit features and extensions:
NextKeyboardUIButton
sets itself up with aglobe
icon and works as a standard "next keyboard" button.UIImage.globe
returns the icon that is used for "next keyboard".
All UIKit-specific functionality is placed in the UIKit
folder. UIKit logic that can be used in SwiftUI is outside it.
isInputAction
now includes.space
.isSystemAction
no longer includes.space
.
UIColor.clearTappable
has been renamed toUIColor.clearInteractable
.KeyboardActionHandler
has deprecated the gesture-explicit handle functions.KeyboardActionHandler
has deprecated the view-explicit handle function in favor of an optionalAny
sender variant.StandardKeyboardActionHandler
has deprecated a bunch ofUIView
-explicit functions in favor of an optionalAny
sender variant.
This version fixes a bug, where moveCursorForward
moved the cursor incorrectly.
This version adds enableScrolling()
and disableScrolling()
to AutocompleteToolbar
. This makes it possible to make the entire toolbar scroll if its content doesn't fit the screen.
This version adds more autocomplete functionality:
AutocompleteToolbar
has a new convenience initializer that makes it even easier to setup autocomplete.AutocompleteToolbarLabel
is the default autocomplete item view and can be tapped to send text to the text document proxy.AutocompleteToolbarLabel
behaves like the native iOS autocomplete view and displays centered text until the text must scroll.- Autocomplete no longer requires the bugfix timer. Instead, just let the action handler request autocomplete suggestions when a tap action is triggered.
The StandardKeyboardActionHandler
has new functionality:
animationButtonTap()
- can be overridden to change the default animation of tapped buttons.
Deprecations:
- The
AutocompleteBugFixTimer
and all timer-related logic has been deprecated. - The
AutoCompleteSuggestionProvider
'sprovideAutocompleteSuggestions(for:completion:)
is deprecated and replaced withautocompleteSuggestions(for:completion:)
. - The
StandardKeyboardActionHandler
'shandleXXX(on:)
are now deprecated and replaced withhandle(:on:view:)
.
This version adds a bunch of features, tweaks some behaviors and deprecates some logic:
New stuff:
- There is a new
KeyboardActionGesture
that will be used to streamline the action handling api:s. - There is a new
AudioFeedback
enum that describes various types of audio feedback. - There is a new
AudioFeedbackConfiguration
that lets you gather all configurations in one place. - There is a new
HapticFeedback.standardFeedback(for:)
function that replaces the old specific properties. - There is a new
HapticFeedbackConfiguration
that lets you gather all configurations in one place. - There is a new
StandardKeyboardActionHandler
init that uses this new configuration. - There is a new
StandardKeyboardActionHandler.triggerAudioFeedback(for:)
that can be used to trigger audio feedback. - There is a new
StandardKeyboardActionHandler.triggerHapticFeedback(for:on:)
that replaces the old gesture-specific ones. - There is a new
StandardKeyboardActionHandler.gestureAction(for:)
function that is used by the implementation. The old ones are still around. - There is a new
KeyboardType.images
case that is used by the demo.
Changed behavior:
- There is a new
standardButtonShadow
Shadow
property that can be used to mimic the native button shadow.
Deprecated stuff:
- The old
StandardKeyboardActionHandler.init(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForLongPress(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForRepeat(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForTap(...)
is deprecated, use the new one. - The old
HapticFeedback.standardTapFeedback
andstandardLongPressFeedback
have been replaced by the new function.
The old handle
functions are still declared in the KeyboardActionHandler
protocol, but will be removed in the next major version.
This version adds Xcode 11 and iOS 13 support, including support for dark mode and high contrast color variants.
This version adds autocomplete support, which includes an autocomplete suggestion provider protocol, a new toolbar and new extensions.
The new AutocompleteSuggestionProvider
protocol describes how to provide your keyboard with autocomplete suggestions. You can implement it in any way you like, e.g. to use a built-in suggestion database or by connecting to an external data source, using network requests. Note that the network option will be a lot slower and also require you to request full access from your users.
The new AutocompleteToolbar
is a toolbar that can display any results you receive from your suggestion provider (or any list of strings for that matter). Just trigger the provider anytíme the text changes and route the result to the toolbar. The toolbar can be populated with any kind of views. Have a look at the demo app for an example.
The new UITextDocumentProxy+CurrentWord
extension helps you get the word that is (most probably) being typed. You could use this when requesting autocomplete suggestions, if you only want to autocomplete the current word.
Besides these additions, there are a bunch of new extensions, like UITextDocumentProxy
deleteBackwards(times:)
, which lets you delete a certain number of characters. Have a look at the Extensions
namespace for a complete list.
There is also a new KeyboardShiftState
enum that you can use to keep track of which state your keyboard has, if any. This enum is extracted from demo app code that was provided by @arampak earlier this year.
IMPORTANT iOS has a bug that causes textWillChange
and textDidChange
to not be called when the user types, only when the cursor moves. This causes autocomplete problems, since the current word is not changing as the user types. Due to this, the input view controller must use an ugly hack to force the text document proxy to update. Have a look at the demo app to see how this is done.
This version solves some major bugs in the repeating gesture recognizer and makes some public
parts of the library open
.
The standard action handler now handles repeating actions for backspace. You can customize this in the same way as you customize tap and long press handling.
You can test the new repeating logic in the demo app.
This version adds more keyboard actions that don't exist in iOS, but that may serve a functional or semantical purpose in your apps:
command
custom(name:)
escape
function
option
tab
The new custom
action is a fallback that you can use if the existing action set is insufficient for your specific app.
I have added a RepeatingGestureRecognizer
and an extension that you can use to apply it as well. It has a custom initial delay as well as a custom repeat interval, that will let you tap and hold a button to repeat its action. In the next update, I will apply this to the backspace and arrow buttons.
Thanks to @arampak, the demo app now handles shift state and long press better, to make the overall experience much nicer and close to the native keyboard. The keyboard buttons also registers tap events over the entire button area, not just the button view.
This version makes a bunch of previously internal extensions public. It also adds a lot more unit tests so that almost all parts of the library are tested.
The default tap animation has been configured to allow user interaction, which reduces the frustrating tap lag that was present in 2.0.0.
I have added a KeyboardToolbar
class, which you can use to create toolbars. It's super simple so far, and only creates a stack view to which you can any views you like.
This version adds a public shadow extension to the main library and shuffles classes and extensions around. It also restructures the example project to make it less cluttered.
I noticed that the build number bump still (and randomly) bumps the build number incorrectly, which causes build errors. I have therefore abandoned this approach, and instead fixes the build number to 1 in all targets.
This version aim at streamlining the library and remove or refactor parts that make it hard to maintain. It contains several breaking changes, but I hope that the changes will make it easier for you as well, as the library moves forward.
Most notably, the view controller inheritance model has been completely removed. Instead, there is only one KeyboardInputViewController
. It has a stack view to which you can add any views you like, like the built-in KeyboardButtonRow
and KeyboardCollectionView
, which means that your custom keyboards is now based on components that you can combine.
Since KeyboardInputViewController
therefore can display multiple keyboards at once, it doesn't make any sense to have a single keyboard
property. You can still use structs to organize your actions (in fact, I recommend it - have a look at the demo app), but you don't have to.
All action handling has been moved from the view controller to KeyboardActionHandler
as well. KeyboardInputViewController
use a StandardActionHandler
by default, but you can replace this by setting keyboardActionHandler
to any KeyboardActionHandler
. This is required if you want to use certain actions types, like .image
.
New KeyboardAction
s are added and nextKeyboard
has been renamed to switchKeyboard
. Action equality logic has also been removed, so instead of isNone
, you should use == .none
from now on. All help properties like image
and imageName
are removed as well, since they belong in the app. These are the new action types
- capsLock
- dismissKeyboard
- moveCursorBackward
- moveCursorForward
- shift
- shiftDown
- switchToKeyboard(type)
KeyboardInputViewController
will now resize the extension to the size of the stack view, or any other size constraints you may set. The old setHeight(to:)
function has therefore been removed.
This version upgrades KeyboardKit
to Swift 5 and has many breaking changes:
KeyboardInputViewController
has been renamed toKeyboardViewController
CollectionKeyboardInputViewController
has been renamed toCollectionKeyboardViewController
GridKeyboardInputViewController
has been renamed toGridKeyboardViewController
KeyboardAlerter
has been renamed toKeyboardAlert
ToastAlerter
has been renamed toToastAlert
ToastAlert
now has two nested view classesView
andLabel
ToastAlert
's two style function has changed signatureToastAlerterAppearance
is now an internalToastAlert.Appearance
struct- Most extensions have been made internal, to avoid exposing them externally
Keyboard
has been given an optional ID, which can be used to uniquely identify a keyboard. This makes it easier to manage multiple keyboards in an app.
KeyboardInputViewController
implements the KeyboardPresenter
protocol, which means that you can set the new optional id
property to make a KeyboardSetting
exclusive to that presenter. This is nice if your app has multiple keyboards. If you do not specify an id, the settings behave just like before.
A PR by micazeve is merged. It limits the current page index that is persisted for a keyboard, to avoid bugs if the page count has changed since persisting the value.
This version updates KeyboardKit to Swift 4.2
and makes it ready for Xcode 10.
The grid keyboard view controller uses a new way to calculate the available item space and item size for a certain number of rows and buttons per row. This means that we can now use top and bottom content insets to create vertical margins for grid-based keyboards.
I previously used the async image functions to quickly setup a lot of images for "emoji" keyboards. Since I didn't use a collection view for emoji keyboards then, all image views were created at the same time, which caused rendering delays. By using the async image approach, image loading was moved from the main thread and allowed individual images to appear when they were loaded instead of waiting for all images to load before any image could be displayed.
However, KeyboardKit
now has collection view-based keyboards, which are better suited for the task above, since they only render the cells they need. This will solve the image loading issues, which means that the async image extensions will no longer be needed. I have therefore removed UIImage+Async
and the Threading
folder from the library, to keep it as small as possible.
No functional changes, just README updates and improvements. The version bump is required to give CocoaPod users the latest docs.
This is a complete rewrite of the entire library. KeyboardKit now targets iOS 11 and the code has been improved a lot. Check out the demo app to see how to setup keyboards from now on.