Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

KeyboardKit

VersionPlatformSwift 5.3MIT LicenseTwitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target'MyApp'dopod'KeyboardKit'endtarget'MyKeyboard'dopod'KeyboardKit'endpost_installdo |installer|
installer.pods_project.targets.eachdo |target|
target.build_configurations.eachdo |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY']='No'endendend

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to your hosting app as well, but the keyboard extension must have it.

You should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra properties like keyboardContext, keyboardActionHandler, keyboardAppearance etc. The extension will also get access to autocomplete logic, extensions and much more.

KeyboardInputViewController has a setup(with:) function that can be used to setup your extension with any SwiftUI view. This will make it the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward. The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

🇸🇪 Localization

KeyboardKit is localized in the following languages:

  • 🇺🇸 English (US - Default)

  • 🇩🇰 Danish

  • 🇳🇱 Dutch

  • 🇬🇧 English (UK)

  • 🇫🇮 Finnish

  • 🇫🇷 French

  • 🇩🇪 German

  • 🇮🇹 Italian

  • 🇳🇴 Norwegian

  • 🇪🇸 Spanish

  • 🇸🇪 Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

📦 Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

💥 Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

😊 Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

🔤 Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

⌨️ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

🎨 Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

🗯 Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

💡Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

✋ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

🔈 Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi LogoAnomaly Software LogoMilo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

About

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages