├── .DS_Store ├── .all-contributorsrc ├── .github └── workflows │ └── release.yml ├── .gitignore ├── .husky ├── .gitignore ├── commit-msg └── pre-commit ├── .lintstagedrc.json ├── .npmignore ├── .releaserc.json ├── README.md ├── VirtualKeyboard.js ├── back.png ├── commitlint.config.js ├── index.js ├── package-lock.json └── package.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukebrandonfarrell/react-native-screen-keyboard/f67a019b34ae74440828c81d66eb4df11ce32107/.DS_Store -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "lukebrandonfarrell", 10 | "name": "Luke Brandon Farrell", 11 | "avatar_url": "https://avatars3.githubusercontent.com/u/18139277?v=4", 12 | "profile": "http://www.lukebrandonfarrell.com", 13 | "contributions": [ 14 | "code", 15 | "doc", 16 | "infra" 17 | ] 18 | }, 19 | { 20 | "login": "aikewoody", 21 | "name": "Aike van den Brink", 22 | "avatar_url": "https://avatars.githubusercontent.com/u/17004429?v=4", 23 | "profile": "https://github.com/aikewoody", 24 | "contributions": [ 25 | "data", 26 | "code", 27 | "doc" 28 | ] 29 | }, 30 | { 31 | "login": "ajp8164", 32 | "name": "Andy Phillipson", 33 | "avatar_url": "https://avatars.githubusercontent.com/u/1063765?v=4", 34 | "profile": "https://github.com/ajp8164", 35 | "contributions": [ 36 | "code", 37 | "doc" 38 | ] 39 | }, 40 | { 41 | "login": "leonardoballand", 42 | "name": "Leonardo BALLAND", 43 | "avatar_url": "https://avatars.githubusercontent.com/u/5455556?v=4", 44 | "profile": "https://www.leonardoballand.com", 45 | "contributions": [ 46 | "code", 47 | "doc" 48 | ] 49 | }, 50 | { 51 | "login": "timvandijck", 52 | "name": "Tim Van Dijck", 53 | "avatar_url": "https://avatars.githubusercontent.com/u/4528796?v=4", 54 | "profile": "http://timvandijck.be", 55 | "contributions": [ 56 | "code" 57 | ] 58 | } 59 | ], 60 | "contributorsPerLine": 7, 61 | "projectName": "react-native-screen-keyboard", 62 | "projectOwner": "lukebrandonfarrell", 63 | "repoType": "github", 64 | "repoHost": "https://github.com", 65 | "skipCi": true, 66 | "commitConvention": "angular" 67 | } 68 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Release 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - main 8 | jobs: 9 | release: 10 | name: Release 11 | runs-on: ubuntu-18.04 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v1 15 | - name: Setup Node.js 16 | uses: actions/setup-node@v1 17 | with: 18 | node-version: 12 19 | - name: Install dependencies 20 | run: npm ci 21 | - name: Release 22 | env: 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 25 | run: npx semantic-release 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx --no-install commitlint --edit $1 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm run pre-commit 5 | -------------------------------------------------------------------------------- /.lintstagedrc.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ 4 | "prettier --write", 5 | "git add ." 6 | ] 7 | } 8 | 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.circleci 2 | /.github 3 | /example -------------------------------------------------------------------------------- /.releaserc.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "branches": ["master", "main", "next"] 4 | } 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-screen-keyboard 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | [![npm](https://img.shields.io/npm/v/react-native-screen-keyboard.svg?style=flat-square)](https://www.npmjs.com/package/react-native-screen-keyboard) 7 | [![npm licence](http://img.shields.io/npm/l/react-native-screen-keyboard.svg?style=flat-square)](https://npmjs.org/package/react-native-screen-keyboard) 8 | [![npm downloads](http://img.shields.io/npm/dt/react-native-screen-keyboard.svg?style=flat-square)](https://npmjs.org/package/react-native-screen-keyboard) 9 | 10 |
11 | 12 | ## Install 13 | 14 | To get started install via npm: 15 | ```sh 16 | npm install react-native-screen-keyboard 17 | ``` 18 | 19 | #### Usage 20 | 21 | Import: 22 | ```js 23 | import { VirtualKeyboard } from 'react-native-screen-keyboard'; 24 | ``` 25 | 26 | Then add it to your code: 27 | ```js 28 | (this.keyboard = ref)} 30 | keyDown={this.keyDown.bind(this)} 31 | /> 32 | 33 | // Callback function which receives the key pressed 34 | keyDown(key) { 35 | // Key pressed 36 | } 37 | ``` 38 | 39 | The back and custom key will pass a string, either `"back"` or `"custom"` to the keyDown callback. 40 | 41 | The `` also has a number of functions which can be triggered through refs. 42 | 43 | - `back()` this will execute the back action to delete one character. 44 | - `setText(text)` this will set the keyboard text to the given value. 45 | - `displayMessage(message)` this will create a popup above the 46 | keyboard displaying the given a message. The style of the popup can be customized through props. 47 | - `clearMessage()` this will clear the keyboard message dialog. 48 | - `enable()` this will enable the keyboard for input. 49 | - `disable()` this will disable the keyboard. 50 | 51 | #### VirtualKeyboard 52 | 53 | The `` uses two arrays to allow you to set keys and define custom functions for each key. 54 | 55 | | Prop | Type | Optional | Default | Description | 56 | |----------------------------|----------|----------|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 57 | | onRef | any | Yes | | onRef allows you to call the `throwError(message)` method. | 58 | | onKeyDown | function | Yes | | Callback function triggered when a key is pressed. Returns the key value. | 59 | | onChange | function | Yes | | Callback function triggered when a key is pressed. Returns the full string. | 60 | | onCustomKey | function | Yes | | Callback function triggered when custom left button is pressed, use with `onChange` | 61 | | onPressFunction | string | Yes | onPressIn | Determines which function to call when the user pressed a key. Could be one of the following three functions: `onPress`, `onPressIn` or `onPressOut`. For an explanation how the functions work take a look at the GitHub page from the [react-native-material-ripple](https://github.com/n4kz/react-native-material-ripple#properties) project. | 62 | | keyboard | array | Yes | See VirtualKeyboard.js | 4 x 3 matrix containing the value for each key. See VirtualKeyboard.js. | 63 | | keyboardFunc | array | Yes | See VirtualKeyboard.js | 4 x 3 matrix containing custom functions for each key. Pass null for no function. | 64 | | keyboardCustomKeyImage | number | Yes | null | Image for the custom key (bottom left key) | 65 | | keyboardCustomBackKey | element | Yes | backAsset | Element for the back key (bottom right key) | 66 | | keyDisabled | array | Yes | See VirtualKeyboard.js | 4 x 3 matrix containing the disabled value for each key. See VirtualKeyboard.js. | 67 | | keyboardMessageDisplayTime | number | Yes | 3000 | Time in milliseconds for the message dialog to automatically clear. | 68 | | vibration | bool | Yes | false | Key / Tactile vibration enabled | 69 | | keyboardStyle | object | Yes | See VirtualKeyboard.js | Style applied to the keyboard. | 70 | | keyboardDisabledStyle | object | Yes | See VirtualKeyboard.js | Style applied when the keyboard is disabled. | 71 | | keyCustomStyle | array | Yes | See VirtualKeyboard.js | 4 x 3 matrix containing a custom style for each key. Pass null for default style or to use keyStyle as an override. | 72 | | keyStyle | object | Yes | See VirtualKeyboard.js | Style applied to each key on the keyboard. | 73 | | keyTextStyle | object | Yes | See VirtualKeyboard.js | Style applied to the text inside each key. | 74 | | keyImageStyle | object | Yes | See VirtualKeyboard.js | Style applied to image in a key. If an image is passed. | 75 | | messageStyle | object | Yes | See VirtualKeyboard.js | Style applied to popup error. Can set the background colour here. | 76 | | messageTextStyle | object | Yes | See VirtualKeyboard.js | Style applied to the text inside the popup error. | 77 | | messageTestID | string | Yes | "MessageContainer" | TestID belonging to the view component of the popup error. | 78 | | messageTextTestID | string | Yes | "Message" | TestID belonging to the text component inside the popup error. | 79 | 80 | ## Contributing 81 | 82 | If you want to issue a PR, go ahead ;) 83 | 84 | ## License 85 | 86 | This project is licensed under the MIT License 87 | 88 | ## Contributors ✨ 89 | 90 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 |
Luke Brandon Farrell
Luke Brandon Farrell

💻 📖 🚇
Aike van den Brink
Aike van den Brink

🔣 💻 📖
Andy Phillipson
Andy Phillipson

💻 📖
Leonardo BALLAND
Leonardo BALLAND

💻 📖
Tim Van Dijck
Tim Van Dijck

💻
106 | 107 | 108 | 109 | 110 | 111 | 112 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 113 | -------------------------------------------------------------------------------- /VirtualKeyboard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Luke Brandon Farrell 3 | * @description Keyboard component with message and interactive keys 4 | */ 5 | 6 | import React, { Component } from "react"; 7 | import { 8 | View, 9 | Image, 10 | Text, 11 | StyleSheet, 12 | Platform, 13 | Vibration, 14 | } from "react-native"; 15 | import Ripple from "react-native-material-ripple"; 16 | import PropTypes from "prop-types"; 17 | import { 18 | TextInputPropTypes, 19 | ViewPropTypes, 20 | } from "deprecated-react-native-prop-types"; 21 | 22 | const backAsset = require("./back.png"); 23 | 24 | class VirtualKeyboard extends Component { 25 | /** 26 | * [ Built-in React method. ] 27 | * 28 | * Setup the component. Executes when the component is created 29 | * 30 | * @param {object} props 31 | * 32 | */ 33 | constructor(props) { 34 | super(props); 35 | 36 | this.state = { 37 | text: "", 38 | disabled: false, 39 | message: null, 40 | }; 41 | } 42 | 43 | /** 44 | * [ Built-in React method. ] 45 | * 46 | * Executed when the component is mounted to the screen. 47 | */ 48 | componentDidMount() { 49 | if (this.props.onRef) { 50 | this.props.onRef(this); 51 | } 52 | } 53 | 54 | /** 55 | * [ Built-in React method. ] 56 | * 57 | * Executed when the component is unmounted from the screen 58 | */ 59 | componentWillUnmount() { 60 | if (this.props.onRef) { 61 | this.props.onRef(undefined); 62 | } 63 | } 64 | 65 | /** 66 | * [ Built-in React method. ] 67 | * 68 | * Executed when the components props are updated. 69 | */ 70 | componentDidUpdate(prevProps, prevState) { 71 | if (prevState.text !== this.state.text) { 72 | if (this.props.onChange) this.props.onChange(this.state.text); 73 | } 74 | } 75 | 76 | /** 77 | * [ Built-in React method. ] 78 | * 79 | * Allows us to render JSX to the screen 80 | */ 81 | render() { 82 | /** Styles */ 83 | const { containerStyle, keyboardDefaultStyle, keyboardRowStyle } = styles; 84 | /** Props */ 85 | const { 86 | keyboard, 87 | keyboardCustomKeyImage, 88 | keyboardCustomBackKey = backAsset, 89 | // Style Props 90 | keyboardStyle, 91 | } = this.props; 92 | /** Variables */ 93 | // Keyboard configuration. The default contains a key 94 | // for each number 0 - 9 and a back button. 95 | const defaultKeyboard = keyboard 96 | ? keyboard 97 | : [ 98 | [1, 2, 3], 99 | [4, 5, 6], 100 | [7, 8, 9], 101 | [keyboardCustomKeyImage, 0, keyboardCustomBackKey], 102 | ]; 103 | 104 | return ( 105 | 106 | {this.renderMessage()} 107 | 108 | { 109 | // Maps each array of numbers in the keyboardValues array 110 | defaultKeyboard.map((row, r) => { 111 | return ( 112 | 113 | { 114 | // Maps each number in row and creates key for that number 115 | row.map((element, k) => { 116 | return this.renderKey(element, r, k); 117 | }) 118 | } 119 | 120 | ); 121 | }) 122 | } 123 | 124 | 125 | ); 126 | } 127 | 128 | /** 129 | * Renders the message 130 | * 131 | * @return {*} 132 | */ 133 | renderMessage() { 134 | // Styles 135 | const { messageDefaultStyle, messageTextDefaultStyle } = styles; 136 | 137 | // Props 138 | const { 139 | // Style Props 140 | messageStyle, 141 | messageTextStyle, 142 | // TestID Props 143 | messageTestID, 144 | messageTextTestID, 145 | } = this.props; 146 | 147 | // State 148 | const { message } = this.state; 149 | 150 | if (message) { 151 | return ( 152 | 156 | 160 | {message} 161 | 162 | 163 | ); 164 | } 165 | 166 | return null; 167 | } 168 | 169 | /** 170 | * Renders a key on the keyboard 171 | * 172 | * @param entity 173 | * @param row 174 | * @param column 175 | * 176 | * @return {jsx} 177 | */ 178 | renderKey(entity, row, column) { 179 | /** Styles */ 180 | const { 181 | keyContainerStyle, 182 | keyboardDisabledDefaultStyle, 183 | keyDefaultStyle, 184 | keyTextDefaultStyle, 185 | keyImageDefaultStyle, 186 | } = styles; 187 | /** Props */ 188 | const { 189 | keyDisabled, 190 | keyboardFunc, 191 | keyboardDisabledStyle, 192 | vibration, 193 | onKeyDown, 194 | onChange, 195 | onPressFunction, 196 | // Style Props 197 | keyStyle, 198 | keyCustomStyle, 199 | keyTextStyle, 200 | keyImageStyle, 201 | } = this.props; 202 | /** State */ 203 | const { disabled } = this.state; 204 | /** Variables */ 205 | const keyDown = (value) => { 206 | this.setState({ 207 | text: this.resolveKeyDownVirtualKeyboard(this.state.text, value), 208 | }); 209 | 210 | if (onKeyDown) onKeyDown(value); 211 | }; 212 | 213 | // Custom functions for the keyboard key 214 | const keyboardFuncSet = keyboardFunc 215 | ? keyboardFunc 216 | : [ 217 | [null, null, null], 218 | [null, null, null], 219 | [null, null, null], 220 | [() => keyDown("custom"), null, () => keyDown("back")], 221 | ]; 222 | 223 | const _keyStyle = 224 | keyCustomStyle && keyCustomStyle[row][column] 225 | ? keyCustomStyle[row][column] 226 | : keyStyle; 227 | 228 | const _keyDisabled = keyDisabled && keyDisabled[row][column]; 229 | 230 | // Decide what type of element is passed as the key 231 | let keyJsx; 232 | if (React.isValidElement(entity)) { 233 | keyJsx = entity; 234 | } else if (keyboardFuncSet[row][column]) { 235 | keyJsx = ( 236 | 237 | ); 238 | } else { 239 | keyJsx = ( 240 | {entity} 241 | ); 242 | } 243 | 244 | // We want to block keyboard interactions if it has been disabled. 245 | if (!disabled) { 246 | const onPress = () => { 247 | if (vibration) Vibration.vibrate(50); 248 | 249 | keyboardFuncSet[row][column] 250 | ? keyboardFuncSet[row][column]() 251 | : keyDown(entity); 252 | }; 253 | return ( 254 | 268 | {keyJsx} 269 | 270 | ); 271 | } else { 272 | return ( 273 | 284 | {keyJsx} 285 | 286 | ); 287 | } 288 | } 289 | /** 290 | * Resolves a key press on virtual keyboard 291 | * 292 | * @param string 293 | * @param char 294 | */ 295 | resolveKeyDownVirtualKeyboard(string = "", char) { 296 | const newString = string; 297 | 298 | switch (char) { 299 | case "back": { 300 | return newString.substring(0, newString.length - 1); 301 | } 302 | case "custom": 303 | if (this.props.onCustomKey) this.props.onCustomKey(string); 304 | return string; 305 | default: { 306 | return newString.concat(char); 307 | } 308 | } 309 | } 310 | 311 | /** 312 | * Function used to set the keyboard text 313 | */ 314 | setText(text) { 315 | this.setState({ text }); 316 | } 317 | 318 | /** 319 | * Function used to execute back/delete 320 | */ 321 | back() { 322 | this.setState({ 323 | text: this.resolveKeyDownVirtualKeyboard(this.state.text, "back"), 324 | }); 325 | } 326 | 327 | /** 328 | * Function used to display a message above the keyboard 329 | * 330 | * @param message 331 | */ 332 | displayMessage(message) { 333 | this.setState( 334 | { 335 | message, 336 | }, 337 | () => { 338 | if (this.hideMessageTimeout) clearTimeout(this.hideMessageTimeout); 339 | 340 | this.hideMessageTimeout = setTimeout(() => { 341 | this.clearMessage(); 342 | }, this.props.keyboardMessageDisplayTime); 343 | } 344 | ); 345 | } 346 | 347 | /** 348 | * Function used to clear the message on the keyboard 349 | */ 350 | clearMessage() { 351 | this.setState({ message: null }); 352 | } 353 | 354 | /** 355 | * Function used to disable the keyboard 356 | */ 357 | disable() { 358 | this.setState({ 359 | disabled: true, 360 | }); 361 | } 362 | 363 | /** 364 | * Function used to enable the keyboard 365 | */ 366 | enable() { 367 | this.setState({ 368 | disabled: false, 369 | }); 370 | } 371 | } 372 | 373 | VirtualKeyboard.propTypes = { 374 | onRef: PropTypes.any, 375 | onKeyDown: PropTypes.func, 376 | onChange: PropTypes.func, 377 | onCustomKey: PropTypes.func, 378 | onPressFunction: PropTypes.oneOf(["onPress", "onPressIn", "onPressOut"]), 379 | keyboard: PropTypes.array, 380 | keyboardFunc: PropTypes.array, 381 | keyboardCustomKeyImage: PropTypes.number, 382 | keyboardCustomBackKey: PropTypes.element, 383 | keyboardMessageDisplayTime: PropTypes.number, 384 | keyDisabled: PropTypes.array, 385 | vibration: PropTypes.bool, 386 | // Style props 387 | keyboardStyle: ViewPropTypes.style, 388 | keyboardDisabledStyle: ViewPropTypes.style, 389 | keyStyle: ViewPropTypes.style, 390 | keyCustomStyle: ViewPropTypes.style, 391 | keyTextStyle: TextInputPropTypes.style, 392 | keyImageStyle: ViewPropTypes.style, 393 | messageStyle: ViewPropTypes.style, 394 | messageTextStyle: ViewPropTypes.style, 395 | // TestID props 396 | messageTestID: PropTypes.string, 397 | messageTextTestID: PropTypes.string, 398 | }; 399 | 400 | VirtualKeyboard.defaultProps = { 401 | // Keyboard functions. By default the text (number) in the 402 | // keyboard array will be passed via the keyDown callback. 403 | // Use this array to set custom functions for certain keys. 404 | keyboardFunc: null, 405 | keyboardMessageDisplayTime: 3000, 406 | onPressFunction: "onPressIn", 407 | vibration: false, 408 | messageTestID: "MessageContainer", 409 | messageTextTestID: "Message", 410 | }; 411 | 412 | const styles = StyleSheet.create({ 413 | containerStyle: { 414 | flex: null, 415 | width: "100%", 416 | flexDirection: "column", 417 | justifyContent: "flex-end", 418 | }, 419 | // Style applied to the keyboard. Must contain a height or 420 | // the keyboard will not be displayed. 421 | keyboardDefaultStyle: { 422 | height: 250, 423 | backgroundColor: "#FFF", 424 | }, 425 | keyboardRowStyle: { 426 | flex: 1, 427 | flexDirection: "row", 428 | }, 429 | keyContainerStyle: { 430 | flex: 1, 431 | flexDirection: "column", 432 | justifyContent: "center", 433 | alignItems: "center", 434 | }, 435 | // Style applied to keyboard when it is disabled. 436 | keyboardDisabledDefaultStyle: { 437 | backgroundColor: "#FFF", 438 | }, 439 | // Style the individual keys 440 | keyDefaultStyle: { 441 | backgroundColor: "#FFF", 442 | borderRightColor: "#e8e8e8", 443 | borderRightWidth: 1, 444 | borderBottomColor: "#e8e8e8", 445 | borderBottomWidth: 1, 446 | }, 447 | // Style for the text inside a key 448 | keyTextDefaultStyle: { 449 | ...Platform.select({ 450 | ios: { 451 | fontFamily: "HelveticaNeue", 452 | }, 453 | android: { 454 | fontFamily: "Roboto", 455 | }, 456 | }), 457 | fontWeight: "400", 458 | fontSize: 25, 459 | textAlign: "center", 460 | color: "#222222", 461 | }, 462 | // Style for an image inside a key 463 | keyImageDefaultStyle: { 464 | width: 28, 465 | height: 28, 466 | }, 467 | messageDefaultStyle: { 468 | height: 30, 469 | width: "100%", 470 | justifyContent: "center", 471 | alignItems: "center", 472 | backgroundColor: "#e8e8e8", 473 | }, 474 | messageTextDefaultStyle: { 475 | color: "#222222", 476 | fontSize: 15, 477 | fontWeight: "bold", 478 | }, 479 | }); 480 | 481 | export default VirtualKeyboard; 482 | -------------------------------------------------------------------------------- /back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lukebrandonfarrell/react-native-screen-keyboard/f67a019b34ae74440828c81d66eb4df11ce32107/back.png -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { extends: ['@commitlint/config-conventional'] }; 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import VirtualKeyboard from "./VirtualKeyboard"; 2 | 3 | export { VirtualKeyboard }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-screen-keyboard", 3 | "version": "1.2.3", 4 | "description": "On-screen keyboard with customisable keys and tactile / UI feedback 📱", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\"", 8 | "prepublishOnly": "pinst --disable", 9 | "postpublish": "pinst --enable", 10 | "pre-commit": "lint-staged", 11 | "postinstall": "husky install" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/lukebrandonfarrell/react-native-screen-keyboard.git" 16 | }, 17 | "author": "Luke Brandon Farrell", 18 | "license": "MIT", 19 | "bugs": { 20 | "url": "https://github.com/lukebrandonfarrell/react-native-screen-keyboard/issues" 21 | }, 22 | "homepage": "https://github.com/lukebrandonfarrell/react-native-screen-keyboard#readme", 23 | "dependencies": { 24 | "deprecated-react-native-prop-types": "^2.2.0", 25 | "react-native-material-ripple": "^0.9.1" 26 | }, 27 | "keywords": [ 28 | "on-screen", 29 | "on-screen-keyboard", 30 | "screen", 31 | "keyboard", 32 | "feedback", 33 | "react-native", 34 | "native", 35 | "javascript", 36 | "pins", 37 | "pin-code", 38 | "react-native-pins" 39 | ], 40 | "devDependencies": { 41 | "@commitlint/cli": "^12.1.4", 42 | "@commitlint/config-conventional": "^12.1.4", 43 | "husky": "^6.0.0", 44 | "lint-staged": "^11.0.0", 45 | "pinst": "^2.1.6", 46 | "prettier": "^2.3.0", 47 | "semantic-release": "^17.4.3" 48 | } 49 | } 50 | --------------------------------------------------------------------------------