diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..c50010d27d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 80, + "parser": "flow", + "singleQuote": true +} diff --git a/.travis.yml b/.travis.yml index 8428a38adf..6cf5047405 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,7 @@ cache: - node_modules install: - - npm i + - yarn script: - - npm run lint - - npm run test + - yarn run test diff --git a/ReactotronConfig.js b/ReactotronConfig.js new file mode 100644 index 0000000000..99d44c6617 --- /dev/null +++ b/ReactotronConfig.js @@ -0,0 +1,9 @@ +import Reactotron from "reactotron-react-native"; + +if (__DEV__) { + Reactotron.configure({ + host: "192.168.1.63" + }) // controls connection & communication settings + .useReactNative() // add all built-in react native plugins + .connect(); // let's connect! +} diff --git a/android/app/build.gradle b/android/app/build.gradle index cf53f571d5..f5c277763d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -106,6 +106,21 @@ android { abiFilters "armeabi-v7a", "x86" } } + signingConfigs { + release { + if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) { + storeFile file(MYAPP_RELEASE_STORE_FILE) + storePassword MYAPP_RELEASE_STORE_PASSWORD + keyAlias MYAPP_RELEASE_KEY_ALIAS + keyPassword MYAPP_RELEASE_KEY_PASSWORD + } + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } splits { abi { reset() @@ -136,6 +151,7 @@ android { } dependencies { + compile project(':react-native-vector-icons') compile project(':react-native-secure-storage') compile project(':react-native-camera') compile fileTree(dir: "libs", include: ["*.jar"]) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 26a1695fc8..6846063b3d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + @@ -8,13 +9,14 @@ android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" - android:allowBackup="false" + android:allowBackup="true" + android:testOnly="false" android:theme="@style/AppTheme"> + android:windowSoftInputMode="stateAlwaysHidden|adjustPan"> diff --git a/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf new file mode 100644 index 0000000000..1c8f5e910b Binary files /dev/null and b/android/app/src/main/assets/fonts/Entypo.ttf differ diff --git a/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf new file mode 100644 index 0000000000..b270f98519 Binary files /dev/null and b/android/app/src/main/assets/fonts/EvilIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Feather.ttf b/android/app/src/main/assets/fonts/Feather.ttf new file mode 100755 index 0000000000..244854c549 Binary files /dev/null and b/android/app/src/main/assets/fonts/Feather.ttf differ diff --git a/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/android/app/src/main/assets/fonts/FontAwesome.ttf differ diff --git a/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf new file mode 100644 index 0000000000..6cce217ddc Binary files /dev/null and b/android/app/src/main/assets/fonts/Foundation.ttf differ diff --git a/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf new file mode 100644 index 0000000000..307ad889aa Binary files /dev/null and b/android/app/src/main/assets/fonts/Ionicons.ttf differ diff --git a/android/app/src/main/assets/fonts/Manifold-CF-Bold.otf b/android/app/src/main/assets/fonts/Manifold-CF-Bold.otf new file mode 100755 index 0000000000..0cfd1a8f68 Binary files /dev/null and b/android/app/src/main/assets/fonts/Manifold-CF-Bold.otf differ diff --git a/android/app/src/main/assets/fonts/Manifold-CF-Demi-Bold.otf b/android/app/src/main/assets/fonts/Manifold-CF-Demi-Bold.otf new file mode 100755 index 0000000000..1e193816f8 Binary files /dev/null and b/android/app/src/main/assets/fonts/Manifold-CF-Demi-Bold.otf differ diff --git a/android/app/src/main/assets/fonts/Manifold-CF-Extra-Bold.otf b/android/app/src/main/assets/fonts/Manifold-CF-Extra-Bold.otf new file mode 100755 index 0000000000..86539a4604 Binary files /dev/null and b/android/app/src/main/assets/fonts/Manifold-CF-Extra-Bold.otf differ diff --git a/android/app/src/main/assets/fonts/Manifold-CF-Light.otf b/android/app/src/main/assets/fonts/Manifold-CF-Light.otf new file mode 100755 index 0000000000..7d595aea98 Binary files /dev/null and b/android/app/src/main/assets/fonts/Manifold-CF-Light.otf differ diff --git a/android/app/src/main/assets/fonts/Manifold-CF.otf b/android/app/src/main/assets/fonts/Manifold-CF.otf new file mode 100755 index 0000000000..98318acba0 Binary files /dev/null and b/android/app/src/main/assets/fonts/Manifold-CF.otf differ diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf new file mode 100644 index 0000000000..82524a0c12 Binary files /dev/null and b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf new file mode 100644 index 0000000000..7015564ad1 Binary files /dev/null and b/android/app/src/main/assets/fonts/MaterialIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf new file mode 100644 index 0000000000..09f5a96c05 Binary files /dev/null and b/android/app/src/main/assets/fonts/Octicons.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Black.ttf b/android/app/src/main/assets/fonts/Roboto-Black.ttf new file mode 100755 index 0000000000..689fe5cb3c Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Black.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-BlackItalic.ttf b/android/app/src/main/assets/fonts/Roboto-BlackItalic.ttf new file mode 100755 index 0000000000..0b4e0ee108 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-BlackItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Bold.ttf b/android/app/src/main/assets/fonts/Roboto-Bold.ttf new file mode 100755 index 0000000000..d3f01ad245 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Bold.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-BoldItalic.ttf b/android/app/src/main/assets/fonts/Roboto-BoldItalic.ttf new file mode 100755 index 0000000000..41cc1e7531 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-BoldItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Italic.ttf b/android/app/src/main/assets/fonts/Roboto-Italic.ttf new file mode 100755 index 0000000000..6a1cee5b29 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Italic.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Light.ttf b/android/app/src/main/assets/fonts/Roboto-Light.ttf new file mode 100755 index 0000000000..219063a578 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Light.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-LightItalic.ttf b/android/app/src/main/assets/fonts/Roboto-LightItalic.ttf new file mode 100755 index 0000000000..0e81e876fc Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-LightItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Medium.ttf b/android/app/src/main/assets/fonts/Roboto-Medium.ttf new file mode 100755 index 0000000000..1a7f3b0bba Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Medium.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-MediumItalic.ttf b/android/app/src/main/assets/fonts/Roboto-MediumItalic.ttf new file mode 100755 index 0000000000..003029527c Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-MediumItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Regular.ttf b/android/app/src/main/assets/fonts/Roboto-Regular.ttf new file mode 100755 index 0000000000..2c97eeadff Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Regular.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-Thin.ttf b/android/app/src/main/assets/fonts/Roboto-Thin.ttf new file mode 100755 index 0000000000..b74a4fd1a2 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-Thin.ttf differ diff --git a/android/app/src/main/assets/fonts/Roboto-ThinItalic.ttf b/android/app/src/main/assets/fonts/Roboto-ThinItalic.ttf new file mode 100755 index 0000000000..dd0ddb8526 Binary files /dev/null and b/android/app/src/main/assets/fonts/Roboto-ThinItalic.ttf differ diff --git a/android/app/src/main/assets/fonts/SimpleLineIcons.ttf b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf new file mode 100644 index 0000000000..6ecb686834 Binary files /dev/null and b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf new file mode 100644 index 0000000000..e4ae46c628 Binary files /dev/null and b/android/app/src/main/assets/fonts/Zocial.ttf differ diff --git a/android/app/src/main/java/com/nativesigner/EthkeyBridge.java b/android/app/src/main/java/com/nativesigner/EthkeyBridge.java index e8720ed7bb..aedcadcb13 100644 --- a/android/app/src/main/java/com/nativesigner/EthkeyBridge.java +++ b/android/app/src/main/java/com/nativesigner/EthkeyBridge.java @@ -108,4 +108,4 @@ public void decryptData(String data, String password, Promise promise) { private static native String ethkeyRandomPhrase(int words); private static native String ethkeyEncryptData(String data, String password); private static native String ethkeyDecryptData(String data, String password); -} \ No newline at end of file +} diff --git a/android/app/src/main/java/com/nativesigner/EthkeyBridgePackage.java b/android/app/src/main/java/com/nativesigner/EthkeyBridgePackage.java index 960114b94a..ff60677cf9 100644 --- a/android/app/src/main/java/com/nativesigner/EthkeyBridgePackage.java +++ b/android/app/src/main/java/com/nativesigner/EthkeyBridgePackage.java @@ -30,7 +30,6 @@ */ public class EthkeyBridgePackage implements ReactPackage { - @Override public List> createJSModules() { return Collections.emptyList(); } diff --git a/android/app/src/main/java/com/nativesigner/MainApplication.java b/android/app/src/main/java/com/nativesigner/MainApplication.java index 38bea54109..d5da064851 100644 --- a/android/app/src/main/java/com/nativesigner/MainApplication.java +++ b/android/app/src/main/java/com/nativesigner/MainApplication.java @@ -3,8 +3,9 @@ import android.app.Application; import com.facebook.react.ReactApplication; +import com.oblador.vectoricons.VectorIconsPackage; import com.reactlibrary.RNSecureStoragePackage; -import com.lwansbrough.RCTCamera.RCTCameraPackage; +import org.reactnative.camera.RNCameraPackage; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; @@ -25,8 +26,10 @@ public boolean getUseDeveloperSupport() { protected List getPackages() { return Arrays.asList( new MainReactPackage(), + new VectorIconsPackage(), new RNSecureStoragePackage(), - new RCTCameraPackage() + new RNCameraPackage(), + new EthkeyBridgePackage() ); } diff --git a/android/app/src/main/jniLibs/Android.mk b/android/app/src/main/jniLibs/Android.mk new file mode 100644 index 0000000000..aa9128fa6a --- /dev/null +++ b/android/app/src/main/jniLibs/Android.mk @@ -0,0 +1,7 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := libsigner +LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsigner.so +include $(PREBUILT_SHARED_LIBRARY) \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 1fd964e90b..f8c9d46ec7 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -18,3 +18,4 @@ # org.gradle.parallel=true android.useDeprecatedNdk=true +android.enableAapt2=false diff --git a/android/settings.gradle b/android/settings.gradle index 858a4fea3a..cfa88b0c2b 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'NativeSigner' +include ':react-native-vector-icons' +project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') include ':react-native-secure-storage' project(':react-native-secure-storage').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-secure-storage/android') include ':react-native-camera' diff --git a/index.android.js b/index.android.js index 943e140191..6480c7c7d9 100644 --- a/index.android.js +++ b/index.android.js @@ -21,7 +21,7 @@ */ import { AppRegistry, YellowBox } from 'react-native' -import App from './src/components/App' +import App from './src/App' YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated', 'Module RCTImageLoader']) AppRegistry.registerComponent('NativeSigner', () => App) diff --git a/index.ios.js b/index.ios.js index 943e140191..6480c7c7d9 100644 --- a/index.ios.js +++ b/index.ios.js @@ -21,7 +21,7 @@ */ import { AppRegistry, YellowBox } from 'react-native' -import App from './src/components/App' +import App from './src/App' YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated', 'Module RCTImageLoader']) AppRegistry.registerComponent('NativeSigner', () => App) diff --git a/src/reducers/index.js b/index.js similarity index 69% rename from src/reducers/index.js rename to index.js index 4985859993..6480c7c7d9 100644 --- a/src/reducers/index.js +++ b/index.js @@ -14,17 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -'use strict' +/** + * Sample React Native App + * https://github.com/facebook/react-native + * @flow + */ -import { combineReducers } from 'redux' -import accounts from './accounts' -import routes from './routes' -import scanner from './scanner' -import signer from './signer' +import { AppRegistry, YellowBox } from 'react-native' +import App from './src/App' +YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated', 'Module RCTImageLoader']) -export default combineReducers({ - accounts, - routes, - scanner, - signer -}) +AppRegistry.registerComponent('NativeSigner', () => App) diff --git a/ios/NativeSigner.xcodeproj/project.pbxproj b/ios/NativeSigner.xcodeproj/project.pbxproj index f8e2ca0922..f9ec936da7 100644 --- a/ios/NativeSigner.xcodeproj/project.pbxproj +++ b/ios/NativeSigner.xcodeproj/project.pbxproj @@ -10,6 +10,9 @@ 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* NativeSignerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* NativeSignerTests.m */; }; + 0A5DA78AED2F468C8025AF7C /* Roboto-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EA252ACE6F044BD88BDCD173 /* Roboto-Black.ttf */; }; + 0CFC8839F5B54F888E6C01DE /* Roboto-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = FAE70C1AAEEA45159C8CB0EA /* Roboto-ThinItalic.ttf */; }; + 11678D5AA28F4856922CC7B8 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 10272DAE2BF3436E83BD6293 /* Ionicons.ttf */; }; 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; @@ -18,6 +21,7 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 16614F66487241CE933918B8 /* Roboto-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 020454D0D3C74A398EC7F440 /* Roboto-Thin.ttf */; }; 1F426F8F208D2CC500CA43DB /* EthkeyBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F426F8E208D2CC500CA43DB /* EthkeyBridge.m */; }; 1F426F92208D32FA00CA43DB /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 1F426F93208D332A00CA43DB /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; @@ -26,9 +30,34 @@ 1F426F96208D336400CA43DB /* libsigner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F426F39208B7CC000CA43DB /* libsigner.a */; }; 1F426F9C208D358500CA43DB /* EthkeyBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F426F99208D358500CA43DB /* EthkeyBridge.swift */; }; 1F426F9D208D358500CA43DB /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F426F9A208D358500CA43DB /* String.swift */; }; + 25585941EFBA436796B325D3 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 75EB071F2F264C599EB44A84 /* Feather.ttf */; }; 2D0CDDA789254813913BC99F /* libRNSecureStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C53E8F3556242B0954F1A1B /* libRNSecureStorage.a */; }; + 3C31DDCB4CD0465084344D5F /* Manifold-CF-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 624E6C0FF4A64A97A7D51BEF /* Manifold-CF-Bold.otf */; }; + 3D7A98D07DE443E381067D3A /* Roboto-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 183C9D1307934735A4129705 /* Roboto-BlackItalic.ttf */; }; + 423E02567C044AF6832B2388 /* Roboto-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 53880E8FF84C419EB11ACA5C /* Roboto-Light.ttf */; }; 45F6516A44F949AB986ABB0F /* libRNCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FF44AAEAAE3484A8B2D6DD9 /* libRNCamera.a */; }; + 5DC40D98E51D492C8FF692B5 /* Manifold-CF-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 31AAF2CB51C04377BFC79634 /* Manifold-CF-Light.otf */; }; + 66E5EE9B2FAC4B64861A86BE /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DBF1BC87DE904C2C811D40C5 /* Entypo.ttf */; }; + 77AE2A2069B847F9B7EB4854 /* Manifold-CF.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2EC5DDFE054D4A68B1B7D900 /* Manifold-CF.otf */; }; + 7A7137D6EEDE40C184F30C15 /* Roboto-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5CD421FF72D947B0AA9EBABB /* Roboto-Regular.ttf */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 863C4F61A39C4CB5BB9ED42B /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F6875F0B79AF4BB4B8B0B7A1 /* Zocial.ttf */; }; + 8E884A9F327F4D81BA88C775 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A50B8B6830BF499D9F66CF30 /* FontAwesome.ttf */; }; + 95279244A36A49849FCE2DAE /* Roboto-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D592A5F1000548E09C637958 /* Roboto-Bold.ttf */; }; + A6DE194CA1E344F6B2BBDD09 /* Roboto-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5F744F56289845F0A1085BBB /* Roboto-MediumItalic.ttf */; }; + AD0B6F7EACB74BA7A42D2A2E /* Manifold-CF-Demi-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 5D4F46832A564A6C98432D76 /* Manifold-CF-Demi-Bold.otf */; }; + ADF793FFE1B140F68B67FCEE /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F740E38EB2B54179A78C97A7 /* Octicons.ttf */; }; + B43B3542B9ED441AB8AFBA0B /* Roboto-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 42D126E4D4D84C4784E2377B /* Roboto-Italic.ttf */; }; + B64E632F8A9D4350B4762ADB /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 670C31C3459C46DDB927608B /* MaterialCommunityIcons.ttf */; }; + D454D13D7C0D44298822620F /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D630DB4FC04F4C4A9AD56F57 /* EvilIcons.ttf */; }; + E02FD68844424E90A84EAF1E /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 56DDC9AA691C4827B7946155 /* Foundation.ttf */; }; + E3A6B5B55D1641AAA407A641 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 10936EC7FD3D4D4DBFEBA543 /* SimpleLineIcons.ttf */; }; + E410A27B9E084ABE93EBA6A3 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 56ECFD4738844A7590D8F08A /* MaterialIcons.ttf */; }; + E501D58522AE41A9AF18340A /* Roboto-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0A3530DA239B43579EF02112 /* Roboto-BoldItalic.ttf */; }; + ECA9271ADD0F4764B17DEBF0 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 659FAB33CEC8453DB21CAE19 /* libRNVectorIcons.a */; }; + EDCE1EC0CA1249279F03F2E2 /* Roboto-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E3DA81F74A0847378E71E280 /* Roboto-Medium.ttf */; }; + EE896FB251B94030AC713B6F /* Roboto-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8C99AB759A004CEB88AC4455 /* Roboto-LightItalic.ttf */; }; + F1569210427145DEBBB5B898 /* Manifold-CF-Extra-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = F198D2DE15BC4461B2308E3C /* Manifold-CF-Extra-Bold.otf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -109,6 +138,13 @@ remoteGlobalIDString = 4107012F1ACB723B00C6AA39; remoteInfo = RNCamera; }; + 1F50DECF20AF5609000AC551 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7FACC8DDFCBC4F378E80B4D0 /* RNVectorIcons.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 5DBEB1501B18CEA900B34395; + remoteInfo = RNVectorIcons; + }; 1FE167A02088EA11004A6284 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; @@ -309,6 +345,10 @@ 00E356EE1AD99517003FC87E /* NativeSignerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NativeSignerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* NativeSignerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NativeSignerTests.m; sourceTree = ""; }; + 020454D0D3C74A398EC7F440 /* Roboto-Thin.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Thin.ttf"; path = "../res/fonts/Roboto-Thin.ttf"; sourceTree = ""; }; + 0A3530DA239B43579EF02112 /* Roboto-BoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-BoldItalic.ttf"; path = "../res/fonts/Roboto-BoldItalic.ttf"; sourceTree = ""; }; + 10272DAE2BF3436E83BD6293 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; + 10936EC7FD3D4D4DBFEBA543 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* NativeSigner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NativeSigner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -319,6 +359,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NativeSigner/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NativeSigner/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 183C9D1307934735A4129705 /* Roboto-BlackItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-BlackItalic.ttf"; path = "../res/fonts/Roboto-BlackItalic.ttf"; sourceTree = ""; }; 1F426F39208B7CC000CA43DB /* libsigner.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsigner.a; path = ../rust/signer/libsigner.a; sourceTree = ""; }; 1F426F8E208D2CC500CA43DB /* EthkeyBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = EthkeyBridge.m; path = NativeSigner/EthkeyBridge.m; sourceTree = ""; }; 1F426F90208D31D200CA43DB /* signer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = signer.h; path = ../rust/signer/signer.h; sourceTree = ""; }; @@ -326,14 +367,39 @@ 1F426F9A208D358500CA43DB /* String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = String.swift; path = NativeSigner/String.swift; sourceTree = ""; }; 1F426F9B208D358500CA43DB /* NativeSigner-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NativeSigner-Bridging-Header.h"; path = "NativeSigner/NativeSigner-Bridging-Header.h"; sourceTree = ""; }; 1F7FFA3B208B691700FF717A /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; + 2EC5DDFE054D4A68B1B7D900 /* Manifold-CF.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Manifold-CF.otf"; path = "../res/fonts/Manifold-CF.otf"; sourceTree = ""; }; + 31AAF2CB51C04377BFC79634 /* Manifold-CF-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Manifold-CF-Light.otf"; path = "../res/fonts/Manifold-CF-Light.otf"; sourceTree = ""; }; + 42D126E4D4D84C4784E2377B /* Roboto-Italic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Italic.ttf"; path = "../res/fonts/Roboto-Italic.ttf"; sourceTree = ""; }; + 53880E8FF84C419EB11ACA5C /* Roboto-Light.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Light.ttf"; path = "../res/fonts/Roboto-Light.ttf"; sourceTree = ""; }; + 56DDC9AA691C4827B7946155 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; + 56ECFD4738844A7590D8F08A /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; + 5CD421FF72D947B0AA9EBABB /* Roboto-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Regular.ttf"; path = "../res/fonts/Roboto-Regular.ttf"; sourceTree = ""; }; + 5D4F46832A564A6C98432D76 /* Manifold-CF-Demi-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Manifold-CF-Demi-Bold.otf"; path = "../res/fonts/Manifold-CF-Demi-Bold.otf"; sourceTree = ""; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 5F744F56289845F0A1085BBB /* Roboto-MediumItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-MediumItalic.ttf"; path = "../res/fonts/Roboto-MediumItalic.ttf"; sourceTree = ""; }; + 624E6C0FF4A64A97A7D51BEF /* Manifold-CF-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Manifold-CF-Bold.otf"; path = "../res/fonts/Manifold-CF-Bold.otf"; sourceTree = ""; }; + 659FAB33CEC8453DB21CAE19 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; + 670C31C3459C46DDB927608B /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; 6C542BDCBB414412986234E5 /* RNSecureStorage.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNSecureStorage.xcodeproj; path = "../node_modules/react-native-secure-storage/ios/RNSecureStorage.xcodeproj"; sourceTree = ""; }; + 75EB071F2F264C599EB44A84 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 7FACC8DDFCBC4F378E80B4D0 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + 8C99AB759A004CEB88AC4455 /* Roboto-LightItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-LightItalic.ttf"; path = "../res/fonts/Roboto-LightItalic.ttf"; sourceTree = ""; }; 8FF44AAEAAE3484A8B2D6DD9 /* libRNCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCamera.a; sourceTree = ""; }; 9C53E8F3556242B0954F1A1B /* libRNSecureStorage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNSecureStorage.a; sourceTree = ""; }; + A50B8B6830BF499D9F66CF30 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; B38BFA063A3E431C803736AA /* RNCamera.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCamera.xcodeproj; path = "../node_modules/react-native-camera/ios/RNCamera.xcodeproj"; sourceTree = ""; }; + D592A5F1000548E09C637958 /* Roboto-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Bold.ttf"; path = "../res/fonts/Roboto-Bold.ttf"; sourceTree = ""; }; + D630DB4FC04F4C4A9AD56F57 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; + DBF1BC87DE904C2C811D40C5 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; DDFA123E816A46BBB8DF60B6 /* libRCTCamera.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTCamera.a; sourceTree = ""; }; + E3DA81F74A0847378E71E280 /* Roboto-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Medium.ttf"; path = "../res/fonts/Roboto-Medium.ttf"; sourceTree = ""; }; + EA252ACE6F044BD88BDCD173 /* Roboto-Black.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Black.ttf"; path = "../res/fonts/Roboto-Black.ttf"; sourceTree = ""; }; + F198D2DE15BC4461B2308E3C /* Manifold-CF-Extra-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Manifold-CF-Extra-Bold.otf"; path = "../res/fonts/Manifold-CF-Extra-Bold.otf"; sourceTree = ""; }; + F6875F0B79AF4BB4B8B0B7A1 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; + F740E38EB2B54179A78C97A7 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; + FAE70C1AAEEA45159C8CB0EA /* Roboto-ThinItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-ThinItalic.ttf"; path = "../res/fonts/Roboto-ThinItalic.ttf"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -362,6 +428,7 @@ 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 2D0CDDA789254813913BC99F /* libRNSecureStorage.a in Frameworks */, 45F6516A44F949AB986ABB0F /* libRNCamera.a in Frameworks */, + ECA9271ADD0F4764B17DEBF0 /* libRNVectorIcons.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -494,6 +561,7 @@ DDFA123E816A46BBB8DF60B6 /* libRCTCamera.a */, 9C53E8F3556242B0954F1A1B /* libRNSecureStorage.a */, 8FF44AAEAAE3484A8B2D6DD9 /* libRNCamera.a */, + 659FAB33CEC8453DB21CAE19 /* libRNVectorIcons.a */, ); name = "Recovered References"; sourceTree = ""; @@ -514,6 +582,14 @@ name = Products; sourceTree = ""; }; + 1F50DEC920AF5607000AC551 /* Products */ = { + isa = PBXGroup; + children = ( + 1F50DED020AF5609000AC551 /* libRNVectorIcons.a */, + ); + name = Products; + sourceTree = ""; + }; 1F7FFA15208B691700FF717A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -532,6 +608,41 @@ name = Products; sourceTree = ""; }; + 6D14AF58F6CE45DDBA2DE41C /* Resources */ = { + isa = PBXGroup; + children = ( + DBF1BC87DE904C2C811D40C5 /* Entypo.ttf */, + D630DB4FC04F4C4A9AD56F57 /* EvilIcons.ttf */, + 75EB071F2F264C599EB44A84 /* Feather.ttf */, + A50B8B6830BF499D9F66CF30 /* FontAwesome.ttf */, + 56DDC9AA691C4827B7946155 /* Foundation.ttf */, + 10272DAE2BF3436E83BD6293 /* Ionicons.ttf */, + 670C31C3459C46DDB927608B /* MaterialCommunityIcons.ttf */, + 56ECFD4738844A7590D8F08A /* MaterialIcons.ttf */, + F740E38EB2B54179A78C97A7 /* Octicons.ttf */, + 10936EC7FD3D4D4DBFEBA543 /* SimpleLineIcons.ttf */, + F6875F0B79AF4BB4B8B0B7A1 /* Zocial.ttf */, + EA252ACE6F044BD88BDCD173 /* Roboto-Black.ttf */, + 183C9D1307934735A4129705 /* Roboto-BlackItalic.ttf */, + D592A5F1000548E09C637958 /* Roboto-Bold.ttf */, + 0A3530DA239B43579EF02112 /* Roboto-BoldItalic.ttf */, + 42D126E4D4D84C4784E2377B /* Roboto-Italic.ttf */, + 53880E8FF84C419EB11ACA5C /* Roboto-Light.ttf */, + 8C99AB759A004CEB88AC4455 /* Roboto-LightItalic.ttf */, + E3DA81F74A0847378E71E280 /* Roboto-Medium.ttf */, + 5F744F56289845F0A1085BBB /* Roboto-MediumItalic.ttf */, + 5CD421FF72D947B0AA9EBABB /* Roboto-Regular.ttf */, + 020454D0D3C74A398EC7F440 /* Roboto-Thin.ttf */, + FAE70C1AAEEA45159C8CB0EA /* Roboto-ThinItalic.ttf */, + 624E6C0FF4A64A97A7D51BEF /* Manifold-CF-Bold.otf */, + 5D4F46832A564A6C98432D76 /* Manifold-CF-Demi-Bold.otf */, + F198D2DE15BC4461B2308E3C /* Manifold-CF-Extra-Bold.otf */, + 31AAF2CB51C04377BFC79634 /* Manifold-CF-Light.otf */, + 2EC5DDFE054D4A68B1B7D900 /* Manifold-CF.otf */, + ); + name = Resources; + sourceTree = ""; + }; 78C398B11ACF4ADC00677621 /* Products */ = { isa = PBXGroup; children = ( @@ -557,6 +668,7 @@ 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 6C542BDCBB414412986234E5 /* RNSecureStorage.xcodeproj */, B38BFA063A3E431C803736AA /* RNCamera.xcodeproj */, + 7FACC8DDFCBC4F378E80B4D0 /* RNVectorIcons.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -579,6 +691,7 @@ 83CBBA001A601CBA00E9B192 /* Products */, 1F3559852089081300E8521D /* Recovered References */, 1F7FFA15208B691700FF717A /* Frameworks */, + 6D14AF58F6CE45DDBA2DE41C /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -643,12 +756,13 @@ TargetAttributes = { 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; - DevelopmentTeam = 3CV4SNLYC6; + DevelopmentTeam = P2PX3JU8FT; + ProvisioningStyle = Automatic; TestTargetID = 13B07F861A680F5B00A75B9A; }; 13B07F861A680F5B00A75B9A = { - DevelopmentTeam = 3CV4SNLYC6; - LastSwiftMigration = 0930; + DevelopmentTeam = P2PX3JU8FT; + LastSwiftMigration = 930; }; }; }; @@ -716,6 +830,10 @@ ProductGroup = 1F3559AB2089081400E8521D /* Products */; ProjectRef = 6C542BDCBB414412986234E5 /* RNSecureStorage.xcodeproj */; }, + { + ProductGroup = 1F50DEC920AF5607000AC551 /* Products */; + ProjectRef = 7FACC8DDFCBC4F378E80B4D0 /* RNVectorIcons.xcodeproj */; + }, ); projectRoot = ""; targets = ( @@ -796,6 +914,13 @@ remoteRef = 1F4E397C208B620D00AA9D08 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 1F50DED020AF5609000AC551 /* libRNVectorIcons.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNVectorIcons.a; + remoteRef = 1F50DECF20AF5609000AC551 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 1FE167A12088EA11004A6284 /* libfishhook.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1001,6 +1126,34 @@ files = ( 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + 66E5EE9B2FAC4B64861A86BE /* Entypo.ttf in Resources */, + D454D13D7C0D44298822620F /* EvilIcons.ttf in Resources */, + 25585941EFBA436796B325D3 /* Feather.ttf in Resources */, + 8E884A9F327F4D81BA88C775 /* FontAwesome.ttf in Resources */, + E02FD68844424E90A84EAF1E /* Foundation.ttf in Resources */, + 11678D5AA28F4856922CC7B8 /* Ionicons.ttf in Resources */, + B64E632F8A9D4350B4762ADB /* MaterialCommunityIcons.ttf in Resources */, + E410A27B9E084ABE93EBA6A3 /* MaterialIcons.ttf in Resources */, + ADF793FFE1B140F68B67FCEE /* Octicons.ttf in Resources */, + E3A6B5B55D1641AAA407A641 /* SimpleLineIcons.ttf in Resources */, + 863C4F61A39C4CB5BB9ED42B /* Zocial.ttf in Resources */, + 0A5DA78AED2F468C8025AF7C /* Roboto-Black.ttf in Resources */, + 3D7A98D07DE443E381067D3A /* Roboto-BlackItalic.ttf in Resources */, + 95279244A36A49849FCE2DAE /* Roboto-Bold.ttf in Resources */, + E501D58522AE41A9AF18340A /* Roboto-BoldItalic.ttf in Resources */, + B43B3542B9ED441AB8AFBA0B /* Roboto-Italic.ttf in Resources */, + 423E02567C044AF6832B2388 /* Roboto-Light.ttf in Resources */, + EE896FB251B94030AC713B6F /* Roboto-LightItalic.ttf in Resources */, + EDCE1EC0CA1249279F03F2E2 /* Roboto-Medium.ttf in Resources */, + A6DE194CA1E344F6B2BBDD09 /* Roboto-MediumItalic.ttf in Resources */, + 7A7137D6EEDE40C184F30C15 /* Roboto-Regular.ttf in Resources */, + 16614F66487241CE933918B8 /* Roboto-Thin.ttf in Resources */, + 0CFC8839F5B54F888E6C01DE /* Roboto-ThinItalic.ttf in Resources */, + 3C31DDCB4CD0465084344D5F /* Manifold-CF-Bold.otf in Resources */, + AD0B6F7EACB74BA7A42D2A2E /* Manifold-CF-Demi-Bold.otf in Resources */, + F1569210427145DEBBB5B898 /* Manifold-CF-Extra-Bold.otf in Resources */, + 5DC40D98E51D492C8FF692B5 /* Manifold-CF-Light.otf in Resources */, + 77AE2A2069B847F9B7EB4854 /* Manifold-CF.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1072,7 +1225,9 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = 3CV4SNLYC6; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = P2PX3JU8FT; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -1080,13 +1235,9 @@ INFOPLIST_FILE = NativeSignerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NativeSigner.app/NativeSigner"; }; name = Debug; @@ -1096,18 +1247,17 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = 3CV4SNLYC6; + DEVELOPMENT_TEAM = P2PX3JU8FT; INFOPLIST_FILE = NativeSignerTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + "OTHER_LDFLAGS[arch=*]" = " -lc++"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NativeSigner.app/NativeSigner"; }; name = Release; @@ -1119,14 +1269,14 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; - DEVELOPMENT_TEAM = 3CV4SNLYC6; + DEVELOPMENT_TEAM = P2PX3JU8FT; ENABLE_BITCODE = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../node_modules/react-native-camera/ios", "$(SRCROOT)/../node_modules/react-native-secure-storage/ios/**", - "$(SRCROOT)/../node_modules/react-native-camera/ios/**", "$(SRCROOT)/../rust/signer", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); INFOPLIST_FILE = NativeSigner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1138,6 +1288,7 @@ "-ObjC", "-lc++", ); + PRODUCT_BUNDLE_IDENTIFIER = io.parity.NativeSigner; PRODUCT_NAME = NativeSigner; SWIFT_OBJC_BRIDGING_HEADER = "NativeSigner/NativeSigner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1153,7 +1304,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 3CV4SNLYC6; + DEVELOPMENT_TEAM = P2PX3JU8FT; ENABLE_BITCODE = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -1161,6 +1312,7 @@ "$(SRCROOT)/../node_modules/react-native-secure-storage/ios/**", "$(SRCROOT)/../node_modules/react-native-camera/ios/**", "$(SRCROOT)/../rust/signer", + "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); INFOPLIST_FILE = NativeSigner/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1171,6 +1323,7 @@ "-ObjC", "-lc++", ); + PRODUCT_BUNDLE_IDENTIFIER = io.parity.NativeSigner; PRODUCT_NAME = NativeSigner; SWIFT_OBJC_BRIDGING_HEADER = "NativeSigner/NativeSigner-Bridging-Header.h"; SWIFT_VERSION = 3.0; diff --git a/ios/NativeSigner/Base.lproj/LaunchScreen.xib b/ios/NativeSigner/Base.lproj/LaunchScreen.xib index b12d791c97..f49154e0d2 100644 --- a/ios/NativeSigner/Base.lproj/LaunchScreen.xib +++ b/ios/NativeSigner/Base.lproj/LaunchScreen.xib @@ -1,9 +1,12 @@ - - + + + + + - - + + @@ -12,31 +15,23 @@ - - + + + - + - - - - - - + + + + + + + diff --git a/ios/NativeSigner/Info.plist b/ios/NativeSigner/Info.plist index a5a753449a..636ea5eddb 100644 --- a/ios/NativeSigner/Info.plist +++ b/ios/NativeSigner/Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 2.0 CFBundleSignature ???? CFBundleVersion - 1 + 6 LSRequiresIPhoneOS NSAppTransportSecurity @@ -39,6 +39,37 @@ Access to camera is required to scan qr code with transaction details NSMainNibFile LaunchScreen + UIAppFonts + + Entypo.ttf + EvilIcons.ttf + Feather.ttf + FontAwesome.ttf + Foundation.ttf + Ionicons.ttf + MaterialCommunityIcons.ttf + MaterialIcons.ttf + Octicons.ttf + SimpleLineIcons.ttf + Zocial.ttf + Roboto-Black.ttf + Roboto-BlackItalic.ttf + Roboto-Bold.ttf + Roboto-BoldItalic.ttf + Roboto-Italic.ttf + Roboto-Light.ttf + Roboto-LightItalic.ttf + Roboto-Medium.ttf + Roboto-MediumItalic.ttf + Roboto-Regular.ttf + Roboto-Thin.ttf + Roboto-ThinItalic.ttf + Manifold-CF-Bold.otf + Manifold-CF-Demi-Bold.otf + Manifold-CF-Extra-Bold.otf + Manifold-CF-Light.otf + Manifold-CF.otf + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/package.json b/package.json index c91d65baf2..fc7a2d0625 100644 --- a/package.json +++ b/package.json @@ -8,29 +8,27 @@ "ios": "yarn run build-rust-ios && yarn run cli run-ios", "build-rust-android": "cd rust/signer && make android", "android": "yarn run build-rust-android && yarn run cli run-android", - "cli": "node node_modules/react-native/local-cli/cli.js", "start": "yarn run ios", "test": "jest", - "lint": "standard", - "commit": "commit-wizard" + "lint": "", + "commit": "" }, "dependencies": { "bignumber.js": "^4.0.0", "debounce": "^1.0.0", + "hoist-non-react-statics": "^2.5.0", "prop-types": "^15.6.1", "react": "16.3.1", - "react-addons-pure-render-mixin": "^15.5.0", "react-native": "0.55.3", "react-native-camera": "^1.1.1", - "react-native-prompt": "^1.0.0", + "react-native-keyboard-aware-scroll-view": "^0.5.0", "react-native-qrcode": "^0.2.6", - "react-native-router-flux": "^4.0.0-beta.26", "react-native-secure-storage": "https://github.com/debris/react-native-secure-storage", + "react-native-simple-picker": "^2.1.0", "react-native-tabs": "^1.0.9", - "react-redux": "^5.0.7", - "react-static-container": "^1.0.1", - "redux": "^3.6.0", - "redux-thunk": "^2.2.0" + "react-native-vector-icons": "^4.6.0", + "react-navigation": "^2.0.1", + "unstated": "^2.1.1" }, "devDependencies": { "babel-eslint": "^7.2.1", @@ -39,36 +37,18 @@ "jest": "18.1.0", "jest-react-native": "^18.0.0", "pre-git": "^3.14.0", - "react-test-renderer": "15.4.2", - "standard": "^9.0.2" + "prettier": "1.12.1", + "reactotron-react-native": "^1.14.0" + }, + "rnpm": { + "assets": [ + "./res/fonts" + ] }, "jest": { "preset": "react-native", "setupFiles": [ "/jest-setup.js" ] - }, - "standard": { - "globals": [ - "it", - "describe", - "expect" - ], - "parser": "babel-eslint" - }, - "config": { - "pre-git": { - "pre-commit": [], - "pre-push": [ - "npm run lint", - "npm run test" - ], - "post-commit": [], - "post-checkout": [], - "post-merge": [] - } - }, - "release": { - "analyzeCommits": "simple-commit-message" } } diff --git a/res/fonts/LICENSE.txt b/res/fonts/LICENSE.txt new file mode 100755 index 0000000000..75b52484ea --- /dev/null +++ b/res/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/res/fonts/Manifold-CF-Bold.otf b/res/fonts/Manifold-CF-Bold.otf new file mode 100755 index 0000000000..0cfd1a8f68 Binary files /dev/null and b/res/fonts/Manifold-CF-Bold.otf differ diff --git a/res/fonts/Manifold-CF-Demi-Bold.otf b/res/fonts/Manifold-CF-Demi-Bold.otf new file mode 100755 index 0000000000..1e193816f8 Binary files /dev/null and b/res/fonts/Manifold-CF-Demi-Bold.otf differ diff --git a/res/fonts/Manifold-CF-Extra-Bold.otf b/res/fonts/Manifold-CF-Extra-Bold.otf new file mode 100755 index 0000000000..86539a4604 Binary files /dev/null and b/res/fonts/Manifold-CF-Extra-Bold.otf differ diff --git a/res/fonts/Manifold-CF-Light.otf b/res/fonts/Manifold-CF-Light.otf new file mode 100755 index 0000000000..7d595aea98 Binary files /dev/null and b/res/fonts/Manifold-CF-Light.otf differ diff --git a/res/fonts/Manifold-CF.otf b/res/fonts/Manifold-CF.otf new file mode 100755 index 0000000000..98318acba0 Binary files /dev/null and b/res/fonts/Manifold-CF.otf differ diff --git a/res/fonts/Roboto-Black.ttf b/res/fonts/Roboto-Black.ttf new file mode 100755 index 0000000000..689fe5cb3c Binary files /dev/null and b/res/fonts/Roboto-Black.ttf differ diff --git a/res/fonts/Roboto-BlackItalic.ttf b/res/fonts/Roboto-BlackItalic.ttf new file mode 100755 index 0000000000..0b4e0ee108 Binary files /dev/null and b/res/fonts/Roboto-BlackItalic.ttf differ diff --git a/res/fonts/Roboto-Bold.ttf b/res/fonts/Roboto-Bold.ttf new file mode 100755 index 0000000000..d3f01ad245 Binary files /dev/null and b/res/fonts/Roboto-Bold.ttf differ diff --git a/res/fonts/Roboto-BoldItalic.ttf b/res/fonts/Roboto-BoldItalic.ttf new file mode 100755 index 0000000000..41cc1e7531 Binary files /dev/null and b/res/fonts/Roboto-BoldItalic.ttf differ diff --git a/res/fonts/Roboto-Italic.ttf b/res/fonts/Roboto-Italic.ttf new file mode 100755 index 0000000000..6a1cee5b29 Binary files /dev/null and b/res/fonts/Roboto-Italic.ttf differ diff --git a/res/fonts/Roboto-Light.ttf b/res/fonts/Roboto-Light.ttf new file mode 100755 index 0000000000..219063a578 Binary files /dev/null and b/res/fonts/Roboto-Light.ttf differ diff --git a/res/fonts/Roboto-LightItalic.ttf b/res/fonts/Roboto-LightItalic.ttf new file mode 100755 index 0000000000..0e81e876fc Binary files /dev/null and b/res/fonts/Roboto-LightItalic.ttf differ diff --git a/res/fonts/Roboto-Medium.ttf b/res/fonts/Roboto-Medium.ttf new file mode 100755 index 0000000000..1a7f3b0bba Binary files /dev/null and b/res/fonts/Roboto-Medium.ttf differ diff --git a/res/fonts/Roboto-MediumItalic.ttf b/res/fonts/Roboto-MediumItalic.ttf new file mode 100755 index 0000000000..003029527c Binary files /dev/null and b/res/fonts/Roboto-MediumItalic.ttf differ diff --git a/res/fonts/Roboto-Regular.ttf b/res/fonts/Roboto-Regular.ttf new file mode 100755 index 0000000000..2c97eeadff Binary files /dev/null and b/res/fonts/Roboto-Regular.ttf differ diff --git a/res/fonts/Roboto-Thin.ttf b/res/fonts/Roboto-Thin.ttf new file mode 100755 index 0000000000..b74a4fd1a2 Binary files /dev/null and b/res/fonts/Roboto-Thin.ttf differ diff --git a/res/fonts/Roboto-ThinItalic.ttf b/res/fonts/Roboto-ThinItalic.ttf new file mode 100755 index 0000000000..dd0ddb8526 Binary files /dev/null and b/res/fonts/Roboto-ThinItalic.ttf differ diff --git a/res/wordlist.json b/res/wordlist.json new file mode 100644 index 0000000000..a84e0bef7a --- /dev/null +++ b/res/wordlist.json @@ -0,0 +1 @@ +["abacus","abdomen","abdominal","abide","abiding","ability","ablaze","able","abnormal","abrasion","abrasive","abreast","abridge","abroad","abruptly","absence","absentee","absently","absinthe","absolute","absolve","abstain","abstract","absurd","accent","acclaim","acclimate","accompany","account","accuracy","accurate","accustom","acetone","achiness","aching","acid","acorn","acquaint","acquire","acre","acrobat","acronym","acting","action","activate","activator","active","activism","activist","activity","actress","acts","acutely","acuteness","aeration","aerobics","aerosol","aerospace","afar","affair","affected","affecting","affection","affidavit","affiliate","affirm","affix","afflicted","affluent","afford","affront","aflame","afloat","aflutter","afoot","afraid","afterglow","afterlife","aftermath","aftermost","afternoon","aged","ageless","agency","agenda","agent","aggregate","aghast","agile","agility","aging","agnostic","agonize","agonizing","agony","agreeable","agreeably","agreed","agreeing","agreement","aground","ahead","ahoy","aide","aids","aim","ajar","alabaster","alarm","albatross","album","alfalfa","algebra","algorithm","alias","alibi","alienable","alienate","aliens","alike","alive","alkaline","alkalize","almanac","almighty","almost","aloe","aloft","aloha","alone","alongside","aloof","alphabet","alright","although","altitude","alto","aluminum","alumni","always","amaretto","amaze","amazingly","amber","ambiance","ambiguity","ambiguous","ambition","ambitious","ambulance","ambush","amendable","amendment","amends","amenity","amiable","amicably","amid","amigo","amino","amiss","ammonia","ammonium","amnesty","amniotic","among","amount","amperage","ample","amplifier","amplify","amply","amuck","amulet","amusable","amused","amusement","amuser","amusing","anaconda","anaerobic","anagram","anatomist","anatomy","anchor","anchovy","ancient","android","anemia","anemic","aneurism","anew","angelfish","angelic","anger","angled","angler","angles","angling","angrily","angriness","anguished","angular","animal","animate","animating","animation","animator","anime","animosity","ankle","annex","annotate","announcer","annoying","annually","annuity","anointer","another","answering","antacid","antarctic","anteater","antelope","antennae","anthem","anthill","anthology","antibody","antics","antidote","antihero","antiquely","antiques","antiquity","antirust","antitoxic","antitrust","antiviral","antivirus","antler","antonym","antsy","anvil","anybody","anyhow","anymore","anyone","anyplace","anything","anytime","anyway","anywhere","aorta","apache","apostle","appealing","appear","appease","appeasing","appendage","appendix","appetite","appetizer","applaud","applause","apple","appliance","applicant","applied","apply","appointee","appraisal","appraiser","apprehend","approach","approval","approve","apricot","april","apron","aptitude","aptly","aqua","aqueduct","arbitrary","arbitrate","ardently","area","arena","arguable","arguably","argue","arise","armadillo","armband","armchair","armed","armful","armhole","arming","armless","armoire","armored","armory","armrest","army","aroma","arose","around","arousal","arrange","array","arrest","arrival","arrive","arrogance","arrogant","arson","art","ascend","ascension","ascent","ascertain","ashamed","ashen","ashes","ashy","aside","askew","asleep","asparagus","aspect","aspirate","aspire","aspirin","astonish","astound","astride","astrology","astronaut","astronomy","astute","atlantic","atlas","atom","atonable","atop","atrium","atrocious","atrophy","attach","attain","attempt","attendant","attendee","attention","attentive","attest","attic","attire","attitude","attractor","attribute","atypical","auction","audacious","audacity","audible","audibly","audience","audio","audition","augmented","august","authentic","author","autism","autistic","autograph","automaker","automated","automatic","autopilot","available","avalanche","avatar","avenge","avenging","avenue","average","aversion","avert","aviation","aviator","avid","avoid","await","awaken","award","aware","awhile","awkward","awning","awoke","awry","axis","babble","babbling","babied","baboon","backache","backboard","backboned","backdrop","backed","backer","backfield","backfire","backhand","backing","backlands","backlash","backless","backlight","backlit","backlog","backpack","backpedal","backrest","backroom","backshift","backside","backslid","backspace","backspin","backstab","backstage","backtalk","backtrack","backup","backward","backwash","backwater","backyard","bacon","bacteria","bacterium","badass","badge","badland","badly","badness","baffle","baffling","bagel","bagful","baggage","bagged","baggie","bagginess","bagging","baggy","bagpipe","baguette","baked","bakery","bakeshop","baking","balance","balancing","balcony","balmy","balsamic","bamboo","banana","banish","banister","banjo","bankable","bankbook","banked","banker","banking","banknote","bankroll","banner","bannister","banshee","banter","barbecue","barbed","barbell","barber","barcode","barge","bargraph","barista","baritone","barley","barmaid","barman","barn","barometer","barrack","barracuda","barrel","barrette","barricade","barrier","barstool","bartender","barterer","bash","basically","basics","basil","basin","basis","basket","batboy","batch","bath","baton","bats","battalion","battered","battering","battery","batting","battle","bauble","bazooka","blabber","bladder","blade","blah","blame","blaming","blanching","blandness","blank","blaspheme","blasphemy","blast","blatancy","blatantly","blazer","blazing","bleach","bleak","bleep","blemish","blend","bless","blighted","blimp","bling","blinked","blinker","blinking","blinks","blip","blissful","blitz","blizzard","bloated","bloating","blob","blog","bloomers","blooming","blooper","blot","blouse","blubber","bluff","bluish","blunderer","blunt","blurb","blurred","blurry","blurt","blush","blustery","boaster","boastful","boasting","boat","bobbed","bobbing","bobble","bobcat","bobsled","bobtail","bodacious","body","bogged","boggle","bogus","boil","bok","bolster","bolt","bonanza","bonded","bonding","bondless","boned","bonehead","boneless","bonelike","boney","bonfire","bonnet","bonsai","bonus","bony","boogeyman","boogieman","book","boondocks","booted","booth","bootie","booting","bootlace","bootleg","boots","boozy","borax","boring","borough","borrower","borrowing","boss","botanical","botanist","botany","botch","both","bottle","bottling","bottom","bounce","bouncing","bouncy","bounding","boundless","bountiful","bovine","boxcar","boxer","boxing","boxlike","boxy","breach","breath","breeches","breeching","breeder","breeding","breeze","breezy","brethren","brewery","brewing","briar","bribe","brick","bride","bridged","brigade","bright","brilliant","brim","bring","brink","brisket","briskly","briskness","bristle","brittle","broadband","broadcast","broaden","broadly","broadness","broadside","broadways","broiler","broiling","broken","broker","bronchial","bronco","bronze","bronzing","brook","broom","brought","browbeat","brownnose","browse","browsing","bruising","brunch","brunette","brunt","brush","brussels","brute","brutishly","bubble","bubbling","bubbly","buccaneer","bucked","bucket","buckle","buckshot","buckskin","bucktooth","buckwheat","buddhism","buddhist","budding","buddy","budget","buffalo","buffed","buffer","buffing","buffoon","buggy","bulb","bulge","bulginess","bulgur","bulk","bulldog","bulldozer","bullfight","bullfrog","bullhorn","bullion","bullish","bullpen","bullring","bullseye","bullwhip","bully","bunch","bundle","bungee","bunion","bunkbed","bunkhouse","bunkmate","bunny","bunt","busboy","bush","busily","busload","bust","busybody","buzz","cabana","cabbage","cabbie","cabdriver","cable","caboose","cache","cackle","cacti","cactus","caddie","caddy","cadet","cadillac","cadmium","cage","cahoots","cake","calamari","calamity","calcium","calculate","calculus","caliber","calibrate","calm","caloric","calorie","calzone","camcorder","cameo","camera","camisole","camper","campfire","camping","campsite","campus","canal","canary","cancel","candied","candle","candy","cane","canine","canister","cannabis","canned","canning","cannon","cannot","canola","canon","canopener","canopy","canteen","canyon","capable","capably","capacity","cape","capillary","capital","capitol","capped","capricorn","capsize","capsule","caption","captivate","captive","captivity","capture","caramel","carat","caravan","carbon","cardboard","carded","cardiac","cardigan","cardinal","cardstock","carefully","caregiver","careless","caress","caretaker","cargo","caring","carless","carload","carmaker","carnage","carnation","carnival","carnivore","carol","carpenter","carpentry","carpool","carport","carried","carrot","carrousel","carry","cartel","cartload","carton","cartoon","cartridge","cartwheel","carve","carving","carwash","cascade","case","cash","casing","casino","casket","cassette","casually","casualty","catacomb","catalog","catalyst","catalyze","catapult","cataract","catatonic","catcall","catchable","catcher","catching","catchy","caterer","catering","catfight","catfish","cathedral","cathouse","catlike","catnap","catnip","catsup","cattail","cattishly","cattle","catty","catwalk","caucasian","caucus","causal","causation","cause","causing","cauterize","caution","cautious","cavalier","cavalry","caviar","cavity","cedar","celery","celestial","celibacy","celibate","celtic","cement","census","ceramics","ceremony","certainly","certainty","certified","certify","cesarean","cesspool","chafe","chaffing","chain","chair","chalice","challenge","chamber","chamomile","champion","chance","change","channel","chant","chaos","chaperone","chaplain","chapped","chaps","chapter","character","charbroil","charcoal","charger","charging","chariot","charity","charm","charred","charter","charting","chase","chasing","chaste","chastise","chastity","chatroom","chatter","chatting","chatty","cheating","cheddar","cheek","cheer","cheese","cheesy","chef","chemicals","chemist","chemo","cherisher","cherub","chess","chest","chevron","chevy","chewable","chewer","chewing","chewy","chief","chihuahua","childcare","childhood","childish","childless","childlike","chili","chill","chimp","chip","chirping","chirpy","chitchat","chivalry","chive","chloride","chlorine","choice","chokehold","choking","chomp","chooser","choosing","choosy","chop","chosen","chowder","chowtime","chrome","chubby","chuck","chug","chummy","chump","chunk","churn","chute","cider","cilantro","cinch","cinema","cinnamon","circle","circling","circular","circulate","circus","citable","citadel","citation","citizen","citric","citrus","city","civic","civil","clad","claim","clambake","clammy","clamor","clamp","clamshell","clang","clanking","clapped","clapper","clapping","clarify","clarinet","clarity","clash","clasp","class","clatter","clause","clavicle","claw","clay","clean","clear","cleat","cleaver","cleft","clench","clergyman","clerical","clerk","clever","clicker","client","climate","climatic","cling","clinic","clinking","clip","clique","cloak","clobber","clock","clone","cloning","closable","closure","clothes","clothing","cloud","clover","clubbed","clubbing","clubhouse","clump","clumsily","clumsy","clunky","clustered","clutch","clutter","coach","coagulant","coastal","coaster","coasting","coastland","coastline","coat","coauthor","cobalt","cobbler","cobweb","cocoa","coconut","cod","coeditor","coerce","coexist","coffee","cofounder","cognition","cognitive","cogwheel","coherence","coherent","cohesive","coil","coke","cola","cold","coleslaw","coliseum","collage","collapse","collar","collected","collector","collide","collie","collision","colonial","colonist","colonize","colony","colossal","colt","coma","come","comfort","comfy","comic","coming","comma","commence","commend","comment","commerce","commode","commodity","commodore","common","commotion","commute","commuting","compacted","compacter","compactly","compactor","companion","company","compare","compel","compile","comply","component","composed","composer","composite","compost","composure","compound","compress","comprised","computer","computing","comrade","concave","conceal","conceded","concept","concerned","concert","conch","concierge","concise","conclude","concrete","concur","condense","condiment","condition","condone","conducive","conductor","conduit","cone","confess","confetti","confidant","confident","confider","confiding","configure","confined","confining","confirm","conflict","conform","confound","confront","confused","confusing","confusion","congenial","congested","congrats","congress","conical","conjoined","conjure","conjuror","connected","connector","consensus","consent","console","consoling","consonant","constable","constant","constrain","constrict","construct","consult","consumer","consuming","contact","container","contempt","contend","contented","contently","contents","contest","context","contort","contour","contrite","control","contusion","convene","convent","copartner","cope","copied","copier","copilot","coping","copious","copper","copy","coral","cork","cornball","cornbread","corncob","cornea","corned","corner","cornfield","cornflake","cornhusk","cornmeal","cornstalk","corny","coronary","coroner","corporal","corporate","corral","correct","corridor","corrode","corroding","corrosive","corsage","corset","cortex","cosigner","cosmetics","cosmic","cosmos","cosponsor","cost","cottage","cotton","couch","cough","could","countable","countdown","counting","countless","country","county","courier","covenant","cover","coveted","coveting","coyness","cozily","coziness","cozy","crabbing","crabgrass","crablike","crabmeat","cradle","cradling","crafter","craftily","craftsman","craftwork","crafty","cramp","cranberry","crane","cranial","cranium","crank","crate","crave","craving","crawfish","crawlers","crawling","crayfish","crayon","crazed","crazily","craziness","crazy","creamed","creamer","creamlike","crease","creasing","creatable","create","creation","creative","creature","credible","credibly","credit","creed","creme","creole","crepe","crept","crescent","crested","cresting","crestless","crevice","crewless","crewman","crewmate","crib","cricket","cried","crier","crimp","crimson","cringe","cringing","crinkle","crinkly","crisped","crisping","crisply","crispness","crispy","criteria","critter","croak","crock","crook","croon","crop","cross","crouch","crouton","crowbar","crowd","crown","crucial","crudely","crudeness","cruelly","cruelness","cruelty","crumb","crummiest","crummy","crumpet","crumpled","cruncher","crunching","crunchy","crusader","crushable","crushed","crusher","crushing","crust","crux","crying","cryptic","crystal","cubbyhole","cube","cubical","cubicle","cucumber","cuddle","cuddly","cufflink","culinary","culminate","culpable","culprit","cultivate","cultural","culture","cupbearer","cupcake","cupid","cupped","cupping","curable","curator","curdle","cure","curfew","curing","curled","curler","curliness","curling","curly","curry","curse","cursive","cursor","curtain","curtly","curtsy","curvature","curve","curvy","cushy","cusp","cussed","custard","custodian","custody","customary","customer","customize","customs","cut","cycle","cyclic","cycling","cyclist","cylinder","cymbal","cytoplasm","cytoplast","dab","dad","daffodil","dagger","daily","daintily","dainty","dairy","daisy","dallying","dance","dancing","dandelion","dander","dandruff","dandy","danger","dangle","dangling","daredevil","dares","daringly","darkened","darkening","darkish","darkness","darkroom","darling","darn","dart","darwinism","dash","dastardly","data","datebook","dating","daughter","daunting","dawdler","dawn","daybed","daybreak","daycare","daydream","daylight","daylong","dayroom","daytime","dazzler","dazzling","deacon","deafening","deafness","dealer","dealing","dealmaker","dealt","dean","debatable","debate","debating","debit","debrief","debtless","debtor","debug","debunk","decade","decaf","decal","decathlon","decay","deceased","deceit","deceiver","deceiving","december","decency","decent","deception","deceptive","decibel","decidable","decimal","decimeter","decipher","deck","declared","decline","decode","decompose","decorated","decorator","decoy","decrease","decree","dedicate","dedicator","deduce","deduct","deed","deem","deepen","deeply","deepness","deface","defacing","defame","default","defeat","defection","defective","defendant","defender","defense","defensive","deferral","deferred","defiance","defiant","defile","defiling","define","definite","deflate","deflation","deflator","deflected","deflector","defog","deforest","defraud","defrost","deftly","defuse","defy","degraded","degrading","degrease","degree","dehydrate","deity","dejected","delay","delegate","delegator","delete","deletion","delicacy","delicate","delicious","delighted","delirious","delirium","deliverer","delivery","delouse","delta","deluge","delusion","deluxe","demanding","demeaning","demeanor","demise","democracy","democrat","demote","demotion","demystify","denatured","deniable","denial","denim","denote","dense","density","dental","dentist","denture","deny","deodorant","deodorize","departed","departure","depict","deplete","depletion","deplored","deploy","deport","depose","depraved","depravity","deprecate","depress","deprive","depth","deputize","deputy","derail","deranged","derby","derived","desecrate","deserve","deserving","designate","designed","designer","designing","deskbound","desktop","deskwork","desolate","despair","despise","despite","destiny","destitute","destruct","detached","detail","detection","detective","detector","detention","detergent","detest","detonate","detonator","detoxify","detract","deuce","devalue","deviancy","deviant","deviate","deviation","deviator","device","devious","devotedly","devotee","devotion","devourer","devouring","devoutly","dexterity","dexterous","diabetes","diabetic","diabolic","diagnoses","diagnosis","diagram","dial","diameter","diaper","diaphragm","diary","dice","dicing","dictate","dictation","dictator","difficult","diffused","diffuser","diffusion","diffusive","dig","dilation","diligence","diligent","dill","dilute","dime","diminish","dimly","dimmed","dimmer","dimness","dimple","diner","dingbat","dinghy","dinginess","dingo","dingy","dining","dinner","diocese","dioxide","diploma","dipped","dipper","dipping","directed","direction","directive","directly","directory","direness","dirtiness","disabled","disagree","disallow","disarm","disarray","disaster","disband","disbelief","disburse","discard","discern","discharge","disclose","discolor","discount","discourse","discover","discuss","disdain","disengage","disfigure","disgrace","dish","disinfect","disjoin","disk","dislike","disliking","dislocate","dislodge","disloyal","dismantle","dismay","dismiss","dismount","disobey","disorder","disown","disparate","disparity","dispatch","dispense","dispersal","dispersed","disperser","displace","display","displease","disposal","dispose","disprove","dispute","disregard","disrupt","dissuade","distance","distant","distaste","distill","distinct","distort","distract","distress","district","distrust","ditch","ditto","ditzy","dividable","divided","dividend","dividers","dividing","divinely","diving","divinity","divisible","divisibly","division","divisive","divorcee","dizziness","dizzy","doable","docile","dock","doctrine","document","dodge","dodgy","doily","doing","dole","dollar","dollhouse","dollop","dolly","dolphin","domain","domelike","domestic","dominion","dominoes","donated","donation","donator","donor","donut","doodle","doorbell","doorframe","doorknob","doorman","doormat","doornail","doorpost","doorstep","doorstop","doorway","doozy","dork","dormitory","dorsal","dosage","dose","dotted","doubling","douche","dove","down","dowry","doze","drab","dragging","dragonfly","dragonish","dragster","drainable","drainage","drained","drainer","drainpipe","dramatic","dramatize","drank","drapery","drastic","draw","dreaded","dreadful","dreadlock","dreamboat","dreamily","dreamland","dreamless","dreamlike","dreamt","dreamy","drearily","dreary","drench","dress","drew","dribble","dried","drier","drift","driller","drilling","drinkable","drinking","dripping","drippy","drivable","driven","driver","driveway","driving","drizzle","drizzly","drone","drool","droop","drop-down","dropbox","dropkick","droplet","dropout","dropper","drove","drown","drowsily","drudge","drum","dry","dubbed","dubiously","duchess","duckbill","ducking","duckling","ducktail","ducky","duct","dude","duffel","dugout","duh","duke","duller","dullness","duly","dumping","dumpling","dumpster","duo","dupe","duplex","duplicate","duplicity","durable","durably","duration","duress","during","dusk","dust","dutiful","duty","duvet","dwarf","dweeb","dwelled","dweller","dwelling","dwindle","dwindling","dynamic","dynamite","dynasty","dyslexia","dyslexic","each","eagle","earache","eardrum","earflap","earful","earlobe","early","earmark","earmuff","earphone","earpiece","earplugs","earring","earshot","earthen","earthlike","earthling","earthly","earthworm","earthy","earwig","easeful","easel","easiest","easily","easiness","easing","eastbound","eastcoast","easter","eastward","eatable","eaten","eatery","eating","eats","ebay","ebony","ebook","ecard","eccentric","echo","eclair","eclipse","ecologist","ecology","economic","economist","economy","ecosphere","ecosystem","edge","edginess","edging","edgy","edition","editor","educated","education","educator","eel","effective","effects","efficient","effort","eggbeater","egging","eggnog","eggplant","eggshell","egomaniac","egotism","egotistic","either","eject","elaborate","elastic","elated","elbow","eldercare","elderly","eldest","electable","election","elective","elephant","elevate","elevating","elevation","elevator","eleven","elf","eligible","eligibly","eliminate","elite","elitism","elixir","elk","ellipse","elliptic","elm","elongated","elope","eloquence","eloquent","elsewhere","elude","elusive","elves","email","embargo","embark","embassy","embattled","embellish","ember","embezzle","emblaze","emblem","embody","embolism","emboss","embroider","emcee","emerald","emergency","emission","emit","emote","emoticon","emotion","empathic","empathy","emperor","emphases","emphasis","emphasize","emphatic","empirical","employed","employee","employer","emporium","empower","emptier","emptiness","empty","emu","enable","enactment","enamel","enchanted","enchilada","encircle","enclose","enclosure","encode","encore","encounter","encourage","encroach","encrust","encrypt","endanger","endeared","endearing","ended","ending","endless","endnote","endocrine","endorphin","endorse","endowment","endpoint","endurable","endurance","enduring","energetic","energize","energy","enforced","enforcer","engaged","engaging","engine","engorge","engraved","engraver","engraving","engross","engulf","enhance","enigmatic","enjoyable","enjoyably","enjoyer","enjoying","enjoyment","enlarged","enlarging","enlighten","enlisted","enquirer","enrage","enrich","enroll","enslave","ensnare","ensure","entail","entangled","entering","entertain","enticing","entire","entitle","entity","entomb","entourage","entrap","entree","entrench","entrust","entryway","entwine","enunciate","envelope","enviable","enviably","envious","envision","envoy","envy","enzyme","epic","epidemic","epidermal","epidermis","epidural","epilepsy","epileptic","epilogue","epiphany","episode","equal","equate","equation","equator","equinox","equipment","equity","equivocal","eradicate","erasable","erased","eraser","erasure","ergonomic","errand","errant","erratic","error","erupt","escalate","escalator","escapable","escapade","escapist","escargot","eskimo","esophagus","espionage","espresso","esquire","essay","essence","essential","establish","estate","esteemed","estimate","estimator","estranged","estrogen","etching","eternal","eternity","ethanol","ether","ethically","ethics","euphemism","evacuate","evacuee","evade","evaluate","evaluator","evaporate","evasion","evasive","even","everglade","evergreen","everybody","everyday","everyone","evict","evidence","evident","evil","evoke","evolution","evolve","exact","exalted","example","excavate","excavator","exceeding","exception","excess","exchange","excitable","exciting","exclaim","exclude","excluding","exclusion","exclusive","excretion","excretory","excursion","excusable","excusably","excuse","exemplary","exemplify","exemption","exerciser","exert","exes","exfoliate","exhale","exhaust","exhume","exile","existing","exit","exodus","exonerate","exorcism","exorcist","expand","expanse","expansion","expansive","expectant","expedited","expediter","expel","expend","expenses","expensive","expert","expire","expiring","explain","expletive","explicit","explode","exploit","explore","exploring","exponent","exporter","exposable","expose","exposure","express","expulsion","exquisite","extended","extending","extent","extenuate","exterior","external","extinct","extortion","extradite","extras","extrovert","extrude","extruding","exuberant","fable","fabric","fabulous","facebook","facecloth","facedown","faceless","facelift","faceplate","faceted","facial","facility","facing","facsimile","faction","factoid","factor","factsheet","factual","faculty","fade","fading","failing","falcon","fall","false","falsify","fame","familiar","family","famine","famished","fanatic","fancied","fanciness","fancy","fanfare","fang","fanning","fantasize","fantastic","fantasy","fascism","fastball","faster","fasting","fastness","faucet","favorable","favorably","favored","favoring","favorite","fax","feast","federal","fedora","feeble","feed","feel","feisty","feline","felt-tip","feminine","feminism","feminist","feminize","femur","fence","fencing","fender","ferment","fernlike","ferocious","ferocity","ferret","ferris","ferry","fervor","fester","festival","festive","festivity","fetal","fetch","fever","fiber","fiction","fiddle","fiddling","fidelity","fidgeting","fidgety","fifteen","fifth","fiftieth","fifty","figment","figure","figurine","filing","filled","filler","filling","film","filter","filth","filtrate","finale","finalist","finalize","finally","finance","financial","finch","fineness","finer","finicky","finished","finisher","finishing","finite","finless","finlike","fiscally","fit","five","flaccid","flagman","flagpole","flagship","flagstick","flagstone","flail","flakily","flaky","flame","flammable","flanked","flanking","flannels","flap","flaring","flashback","flashbulb","flashcard","flashily","flashing","flashy","flask","flatbed","flatfoot","flatly","flatness","flatten","flattered","flatterer","flattery","flattop","flatware","flatworm","flavored","flavorful","flavoring","flaxseed","fled","fleshed","fleshy","flick","flier","flight","flinch","fling","flint","flip","flirt","float","flock","flogging","flop","floral","florist","floss","flounder","flyable","flyaway","flyer","flying","flyover","flypaper","foam","foe","fog","foil","folic","folk","follicle","follow","fondling","fondly","fondness","fondue","font","food","fool","footage","football","footbath","footboard","footer","footgear","foothill","foothold","footing","footless","footman","footnote","footpad","footpath","footprint","footrest","footsie","footsore","footwear","footwork","fossil","foster","founder","founding","fountain","fox","foyer","fraction","fracture","fragile","fragility","fragment","fragrance","fragrant","frail","frame","framing","frantic","fraternal","frayed","fraying","frays","freckled","freckles","freebase","freebee","freebie","freedom","freefall","freehand","freeing","freeload","freely","freemason","freeness","freestyle","freeware","freeway","freewill","freezable","freezing","freight","french","frenzied","frenzy","frequency","frequent","fresh","fretful","fretted","friction","friday","fridge","fried","friend","frighten","frightful","frigidity","frigidly","frill","fringe","frisbee","frisk","fritter","frivolous","frolic","from","front","frostbite","frosted","frostily","frosting","frostlike","frosty","froth","frown","frozen","fructose","frugality","frugally","fruit","frustrate","frying","gab","gaffe","gag","gainfully","gaining","gains","gala","gallantly","galleria","gallery","galley","gallon","gallows","gallstone","galore","galvanize","gambling","game","gaming","gamma","gander","gangly","gangrene","gangway","gap","garage","garbage","garden","gargle","garland","garlic","garment","garnet","garnish","garter","gas","gatherer","gathering","gating","gauging","gauntlet","gauze","gave","gawk","gazing","gear","gecko","geek","geiger","gem","gender","generic","generous","genetics","genre","gentile","gentleman","gently","gents","geography","geologic","geologist","geology","geometric","geometry","geranium","gerbil","geriatric","germicide","germinate","germless","germproof","gestate","gestation","gesture","getaway","getting","getup","giant","gibberish","giblet","giddily","giddiness","giddy","gift","gigabyte","gigahertz","gigantic","giggle","giggling","giggly","gigolo","gilled","gills","gimmick","girdle","giveaway","given","giver","giving","gizmo","gizzard","glacial","glacier","glade","gladiator","gladly","glamorous","glamour","glance","glancing","glandular","glare","glaring","glass","glaucoma","glazing","gleaming","gleeful","glider","gliding","glimmer","glimpse","glisten","glitch","glitter","glitzy","gloater","gloating","gloomily","gloomy","glorified","glorifier","glorify","glorious","glory","gloss","glove","glowing","glowworm","glucose","glue","gluten","glutinous","glutton","gnarly","gnat","goal","goatskin","goes","goggles","going","goldfish","goldmine","goldsmith","golf","goliath","gonad","gondola","gone","gong","good","gooey","goofball","goofiness","goofy","google","goon","gopher","gore","gorged","gorgeous","gory","gosling","gossip","gothic","gotten","gout","gown","grab","graceful","graceless","gracious","gradation","graded","grader","gradient","grading","gradually","graduate","graffiti","grafted","grafting","grain","granddad","grandkid","grandly","grandma","grandpa","grandson","granite","granny","granola","grant","granular","grape","graph","grapple","grappling","grasp","grass","gratified","gratify","grating","gratitude","gratuity","gravel","graveness","graves","graveyard","gravitate","gravity","gravy","gray","grazing","greasily","greedily","greedless","greedy","green","greeter","greeting","grew","greyhound","grid","grief","grievance","grieving","grievous","grill","grimace","grimacing","grime","griminess","grimy","grinch","grinning","grip","gristle","grit","groggily","groggy","groin","groom","groove","grooving","groovy","grope","ground","grouped","grout","grove","grower","growing","growl","grub","grudge","grudging","grueling","gruffly","grumble","grumbling","grumbly","grumpily","grunge","grunt","guacamole","guidable","guidance","guide","guiding","guileless","guise","gulf","gullible","gully","gulp","gumball","gumdrop","gumminess","gumming","gummy","gurgle","gurgling","guru","gush","gusto","gusty","gutless","guts","gutter","guy","guzzler","gyration","habitable","habitant","habitat","habitual","hacked","hacker","hacking","hacksaw","had","haggler","haiku","half","halogen","halt","halved","halves","hamburger","hamlet","hammock","hamper","hamster","hamstring","handbag","handball","handbook","handbrake","handcart","handclap","handclasp","handcraft","handcuff","handed","handful","handgrip","handgun","handheld","handiness","handiwork","handlebar","handled","handler","handling","handmade","handoff","handpick","handprint","handrail","handsaw","handset","handsfree","handshake","handstand","handwash","handwork","handwoven","handwrite","handyman","hangnail","hangout","hangover","hangup","hankering","hankie","hanky","haphazard","happening","happier","happiest","happily","happiness","happy","harbor","hardcopy","hardcore","hardcover","harddisk","hardened","hardener","hardening","hardhat","hardhead","hardiness","hardly","hardness","hardship","hardware","hardwired","hardwood","hardy","harmful","harmless","harmonica","harmonics","harmonize","harmony","harness","harpist","harsh","harvest","hash","hassle","haste","hastily","hastiness","hasty","hatbox","hatchback","hatchery","hatchet","hatching","hatchling","hate","hatless","hatred","haunt","haven","hazard","hazelnut","hazily","haziness","hazing","hazy","headache","headband","headboard","headcount","headdress","headed","header","headfirst","headgear","heading","headlamp","headless","headlock","headphone","headpiece","headrest","headroom","headscarf","headset","headsman","headstand","headstone","headway","headwear","heap","heat","heave","heavily","heaviness","heaving","hedge","hedging","heftiness","hefty","helium","helmet","helper","helpful","helping","helpless","helpline","hemlock","hemstitch","hence","henchman","henna","herald","herbal","herbicide","herbs","heritage","hermit","heroics","heroism","herring","herself","hertz","hesitancy","hesitant","hesitate","hexagon","hexagram","hubcap","huddle","huddling","huff","hug","hula","hulk","hull","human","humble","humbling","humbly","humid","humiliate","humility","humming","hummus","humongous","humorist","humorless","humorous","humpback","humped","humvee","hunchback","hundredth","hunger","hungrily","hungry","hunk","hunter","hunting","huntress","huntsman","hurdle","hurled","hurler","hurling","hurray","hurricane","hurried","hurry","hurt","husband","hush","husked","huskiness","hut","hybrid","hydrant","hydrated","hydration","hydrogen","hydroxide","hyperlink","hypertext","hyphen","hypnoses","hypnosis","hypnotic","hypnotism","hypnotist","hypnotize","hypocrisy","hypocrite","ibuprofen","ice","iciness","icing","icky","icon","icy","idealism","idealist","idealize","ideally","idealness","identical","identify","identity","ideology","idiocy","idiom","idly","igloo","ignition","ignore","iguana","illicitly","illusion","illusive","image","imaginary","imagines","imaging","imbecile","imitate","imitation","immature","immerse","immersion","imminent","immobile","immodest","immorally","immortal","immovable","immovably","immunity","immunize","impaired","impale","impart","impatient","impeach","impeding","impending","imperfect","imperial","impish","implant","implement","implicate","implicit","implode","implosion","implosive","imply","impolite","important","importer","impose","imposing","impotence","impotency","impotent","impound","imprecise","imprint","imprison","impromptu","improper","improve","improving","improvise","imprudent","impulse","impulsive","impure","impurity","iodine","iodize","ion","ipad","iphone","ipod","irate","irk","iron","irregular","irrigate","irritable","irritably","irritant","irritate","islamic","islamist","isolated","isolating","isolation","isotope","issue","issuing","italicize","italics","item","itinerary","itunes","ivory","ivy","jab","jackal","jacket","jackknife","jackpot","jailbird","jailbreak","jailer","jailhouse","jalapeno","jam","janitor","january","jargon","jarring","jasmine","jaundice","jaunt","java","jawed","jawless","jawline","jaws","jaybird","jaywalker","jazz","jeep","jeeringly","jellied","jelly","jersey","jester","jet","jiffy","jigsaw","jimmy","jingle","jingling","jinx","jitters","jittery","job","jockey","jockstrap","jogger","jogging","john","joining","jokester","jokingly","jolliness","jolly","jolt","jot","jovial","joyfully","joylessly","joyous","joyride","joystick","jubilance","jubilant","judge","judgingly","judicial","judiciary","judo","juggle","juggling","jugular","juice","juiciness","juicy","jujitsu","jukebox","july","jumble","jumbo","jump","junction","juncture","june","junior","juniper","junkie","junkman","junkyard","jurist","juror","jury","justice","justifier","justify","justly","justness","juvenile","kabob","kangaroo","karaoke","karate","karma","kebab","keenly","keenness","keep","keg","kelp","kennel","kept","kerchief","kerosene","kettle","kick","kiln","kilobyte","kilogram","kilometer","kilowatt","kilt","kimono","kindle","kindling","kindly","kindness","kindred","kinetic","kinfolk","king","kinship","kinsman","kinswoman","kissable","kisser","kissing","kitchen","kite","kitten","kitty","kiwi","kleenex","knapsack","knee","knelt","knickers","knoll","koala","kooky","kosher","krypton","kudos","kung","labored","laborer","laboring","laborious","labrador","ladder","ladies","ladle","ladybug","ladylike","lagged","lagging","lagoon","lair","lake","lance","landed","landfall","landfill","landing","landlady","landless","landline","landlord","landmark","landmass","landmine","landowner","landscape","landside","landslide","language","lankiness","lanky","lantern","lapdog","lapel","lapped","lapping","laptop","lard","large","lark","lash","lasso","last","latch","late","lather","latitude","latrine","latter","latticed","launch","launder","laundry","laurel","lavender","lavish","laxative","lazily","laziness","lazy","lecturer","left","legacy","legal","legend","legged","leggings","legible","legibly","legislate","lego","legroom","legume","legwarmer","legwork","lemon","lend","length","lens","lent","leotard","lesser","letdown","lethargic","lethargy","letter","lettuce","level","leverage","levers","levitate","levitator","liability","liable","liberty","librarian","library","licking","licorice","lid","life","lifter","lifting","liftoff","ligament","likely","likeness","likewise","liking","lilac","lilly","lily","limb","limeade","limelight","limes","limit","limping","limpness","line","lingo","linguini","linguist","lining","linked","linoleum","linseed","lint","lion","lip","liquefy","liqueur","liquid","lisp","list","litigate","litigator","litmus","litter","little","livable","lived","lively","liver","livestock","lividly","living","lizard","lubricant","lubricate","lucid","luckily","luckiness","luckless","lucrative","ludicrous","lugged","lukewarm","lullaby","lumber","luminance","luminous","lumpiness","lumping","lumpish","lunacy","lunar","lunchbox","luncheon","lunchroom","lunchtime","lung","lurch","lure","luridness","lurk","lushly","lushness","luster","lustfully","lustily","lustiness","lustrous","lusty","luxurious","luxury","lying","lyrically","lyricism","lyricist","lyrics","macarena","macaroni","macaw","mace","machine","machinist","magazine","magenta","maggot","magical","magician","magma","magnesium","magnetic","magnetism","magnetize","magnifier","magnify","magnitude","magnolia","mahogany","maimed","majestic","majesty","majorette","majority","makeover","maker","makeshift","making","malformed","malt","mama","mammal","mammary","mammogram","manager","managing","manatee","mandarin","mandate","mandatory","mandolin","manger","mangle","mango","mangy","manhandle","manhole","manhood","manhunt","manicotti","manicure","manifesto","manila","mankind","manlike","manliness","manly","manmade","manned","mannish","manor","manpower","mantis","mantra","manual","many","map","marathon","marauding","marbled","marbles","marbling","march","mardi","margarine","margarita","margin","marigold","marina","marine","marital","maritime","marlin","marmalade","maroon","married","marrow","marry","marshland","marshy","marsupial","marvelous","marxism","mascot","masculine","mashed","mashing","massager","masses","massive","mastiff","matador","matchbook","matchbox","matcher","matching","matchless","material","maternal","maternity","math","mating","matriarch","matrimony","matrix","matron","matted","matter","maturely","maturing","maturity","mauve","maverick","maximize","maximum","maybe","mayday","mayflower","moaner","moaning","mobile","mobility","mobilize","mobster","mocha","mocker","mockup","modified","modify","modular","modulator","module","moisten","moistness","moisture","molar","molasses","mold","molecular","molecule","molehill","mollusk","mom","monastery","monday","monetary","monetize","moneybags","moneyless","moneywise","mongoose","mongrel","monitor","monkhood","monogamy","monogram","monologue","monopoly","monorail","monotone","monotype","monoxide","monsieur","monsoon","monstrous","monthly","monument","moocher","moodiness","moody","mooing","moonbeam","mooned","moonlight","moonlike","moonlit","moonrise","moonscape","moonshine","moonstone","moonwalk","mop","morale","morality","morally","morbidity","morbidly","morphine","morphing","morse","mortality","mortally","mortician","mortified","mortify","mortuary","mosaic","mossy","most","mothball","mothproof","motion","motivate","motivator","motive","motocross","motor","motto","mountable","mountain","mounted","mounting","mourner","mournful","mouse","mousiness","moustache","mousy","mouth","movable","move","movie","moving","mower","mowing","much","muck","mud","mug","mulberry","mulch","mule","mulled","mullets","multiple","multiply","multitask","multitude","mumble","mumbling","mumbo","mummified","mummify","mummy","mumps","munchkin","mundane","municipal","muppet","mural","murkiness","murky","murmuring","muscular","museum","mushily","mushiness","mushroom","mushy","music","musket","muskiness","musky","mustang","mustard","muster","mustiness","musty","mutable","mutate","mutation","mute","mutilated","mutilator","mutiny","mutt","mutual","muzzle","myself","myspace","mystified","mystify","myth","nacho","nag","nail","name","naming","nanny","nanometer","nape","napkin","napped","napping","nappy","narrow","nastily","nastiness","national","native","nativity","natural","nature","naturist","nautical","navigate","navigator","navy","nearby","nearest","nearly","nearness","neatly","neatness","nebula","nebulizer","nectar","negate","negation","negative","neglector","negligee","negligent","negotiate","nemeses","nemesis","neon","nephew","nerd","nervous","nervy","nest","net","neurology","neuron","neurosis","neurotic","neuter","neutron","never","next","nibble","nickname","nicotine","niece","nifty","nimble","nimbly","nineteen","ninetieth","ninja","nintendo","ninth","nuclear","nuclei","nucleus","nugget","nullify","number","numbing","numbly","numbness","numeral","numerate","numerator","numeric","numerous","nuptials","nursery","nursing","nurture","nutcase","nutlike","nutmeg","nutrient","nutshell","nuttiness","nutty","nuzzle","nylon","oaf","oak","oasis","oat","obedience","obedient","obituary","object","obligate","obliged","oblivion","oblivious","oblong","obnoxious","oboe","obscure","obscurity","observant","observer","observing","obsessed","obsession","obsessive","obsolete","obstacle","obstinate","obstruct","obtain","obtrusive","obtuse","obvious","occultist","occupancy","occupant","occupier","occupy","ocean","ocelot","octagon","octane","october","octopus","ogle","oil","oink","ointment","okay","old","olive","olympics","omega","omen","ominous","omission","omit","omnivore","onboard","oncoming","ongoing","onion","online","onlooker","only","onscreen","onset","onshore","onslaught","onstage","onto","onward","onyx","oops","ooze","oozy","opacity","opal","open","operable","operate","operating","operation","operative","operator","opium","opossum","opponent","oppose","opposing","opposite","oppressed","oppressor","opt","opulently","osmosis","other","otter","ouch","ought","ounce","outage","outback","outbid","outboard","outbound","outbreak","outburst","outcast","outclass","outcome","outdated","outdoors","outer","outfield","outfit","outflank","outgoing","outgrow","outhouse","outing","outlast","outlet","outline","outlook","outlying","outmatch","outmost","outnumber","outplayed","outpost","outpour","output","outrage","outrank","outreach","outright","outscore","outsell","outshine","outshoot","outsider","outskirts","outsmart","outsource","outspoken","outtakes","outthink","outward","outweigh","outwit","oval","ovary","oven","overact","overall","overarch","overbid","overbill","overbite","overblown","overboard","overbook","overbuilt","overcast","overcoat","overcome","overcook","overcrowd","overdraft","overdrawn","overdress","overdrive","overdue","overeager","overeater","overexert","overfed","overfeed","overfill","overflow","overfull","overgrown","overhand","overhang","overhaul","overhead","overhear","overheat","overhung","overjoyed","overkill","overlabor","overlaid","overlap","overlay","overload","overlook","overlord","overlying","overnight","overpass","overpay","overplant","overplay","overpower","overprice","overrate","overreach","overreact","override","overripe","overrule","overrun","overshoot","overshot","oversight","oversized","oversleep","oversold","overspend","overstate","overstay","overstep","overstock","overstuff","oversweet","overtake","overthrow","overtime","overtly","overtone","overture","overturn","overuse","overvalue","overview","overwrite","owl","oxford","oxidant","oxidation","oxidize","oxidizing","oxygen","oxymoron","oyster","ozone","paced","pacemaker","pacific","pacifier","pacifism","pacifist","pacify","padded","padding","paddle","paddling","padlock","pagan","pager","paging","pajamas","palace","palatable","palm","palpable","palpitate","paltry","pampered","pamperer","pampers","pamphlet","panama","pancake","pancreas","panda","pandemic","pang","panhandle","panic","panning","panorama","panoramic","panther","pantomime","pantry","pants","pantyhose","paparazzi","papaya","paper","paprika","papyrus","parabola","parachute","parade","paradox","paragraph","parakeet","paralegal","paralyses","paralysis","paralyze","paramedic","parameter","paramount","parasail","parasite","parasitic","parcel","parched","parchment","pardon","parish","parka","parking","parkway","parlor","parmesan","parole","parrot","parsley","parsnip","partake","parted","parting","partition","partly","partner","partridge","party","passable","passably","passage","passcode","passenger","passerby","passing","passion","passive","passivism","passover","passport","password","pasta","pasted","pastel","pastime","pastor","pastrami","pasture","pasty","patchwork","patchy","paternal","paternity","path","patience","patient","patio","patriarch","patriot","patrol","patronage","patronize","pauper","pavement","paver","pavestone","pavilion","paving","pawing","payable","payback","paycheck","payday","payee","payer","paying","payment","payphone","payroll","pebble","pebbly","pecan","pectin","peculiar","peddling","pediatric","pedicure","pedigree","pedometer","pegboard","pelican","pellet","pelt","pelvis","penalize","penalty","pencil","pendant","pending","penholder","penknife","pennant","penniless","penny","penpal","pension","pentagon","pentagram","pep","perceive","percent","perch","percolate","perennial","perfected","perfectly","perfume","periscope","perish","perjurer","perjury","perkiness","perky","perm","peroxide","perpetual","perplexed","persecute","persevere","persuaded","persuader","pesky","peso","pessimism","pessimist","pester","pesticide","petal","petite","petition","petri","petroleum","petted","petticoat","pettiness","petty","petunia","phantom","phobia","phoenix","phonebook","phoney","phonics","phoniness","phony","phosphate","photo","phrase","phrasing","placard","placate","placidly","plank","planner","plant","plasma","plaster","plastic","plated","platform","plating","platinum","platonic","platter","platypus","plausible","plausibly","playable","playback","player","playful","playgroup","playhouse","playing","playlist","playmaker","playmate","playoff","playpen","playroom","playset","plaything","playtime","plaza","pleading","pleat","pledge","plentiful","plenty","plethora","plexiglas","pliable","plod","plop","plot","plow","ploy","pluck","plug","plunder","plunging","plural","plus","plutonium","plywood","poach","pod","poem","poet","pogo","pointed","pointer","pointing","pointless","pointy","poise","poison","poker","poking","polar","police","policy","polio","polish","politely","polka","polo","polyester","polygon","polygraph","polymer","poncho","pond","pony","popcorn","pope","poplar","popper","poppy","popsicle","populace","popular","populate","porcupine","pork","porous","porridge","portable","portal","portfolio","porthole","portion","portly","portside","poser","posh","posing","possible","possibly","possum","postage","postal","postbox","postcard","posted","poster","posting","postnasal","posture","postwar","pouch","pounce","pouncing","pound","pouring","pout","powdered","powdering","powdery","power","powwow","pox","praising","prance","prancing","pranker","prankish","prankster","prayer","praying","preacher","preaching","preachy","preamble","precinct","precise","precision","precook","precut","predator","predefine","predict","preface","prefix","preflight","preformed","pregame","pregnancy","pregnant","preheated","prelaunch","prelaw","prelude","premiere","premises","premium","prenatal","preoccupy","preorder","prepaid","prepay","preplan","preppy","preschool","prescribe","preseason","preset","preshow","president","presoak","press","presume","presuming","preteen","pretended","pretender","pretense","pretext","pretty","pretzel","prevail","prevalent","prevent","preview","previous","prewar","prewashed","prideful","pried","primal","primarily","primary","primate","primer","primp","princess","print","prior","prism","prison","prissy","pristine","privacy","private","privatize","prize","proactive","probable","probably","probation","probe","probing","probiotic","problem","procedure","process","proclaim","procreate","procurer","prodigal","prodigy","produce","product","profane","profanity","professed","professor","profile","profound","profusely","progeny","prognosis","program","progress","projector","prologue","prolonged","promenade","prominent","promoter","promotion","prompter","promptly","prone","prong","pronounce","pronto","proofing","proofread","proofs","propeller","properly","property","proponent","proposal","propose","props","prorate","protector","protegee","proton","prototype","protozoan","protract","protrude","proud","provable","proved","proven","provided","provider","providing","province","proving","provoke","provoking","provolone","prowess","prowler","prowling","proximity","proxy","prozac","prude","prudishly","prune","pruning","pry","psychic","public","publisher","pucker","pueblo","pug","pull","pulmonary","pulp","pulsate","pulse","pulverize","puma","pumice","pummel","punch","punctual","punctuate","punctured","pungent","punisher","punk","pupil","puppet","puppy","purchase","pureblood","purebred","purely","pureness","purgatory","purge","purging","purifier","purify","purist","puritan","purity","purple","purplish","purposely","purr","purse","pursuable","pursuant","pursuit","purveyor","pushcart","pushchair","pusher","pushiness","pushing","pushover","pushpin","pushup","pushy","putdown","putt","puzzle","puzzling","pyramid","pyromania","python","quack","quadrant","quail","quaintly","quake","quaking","qualified","qualifier","qualify","quality","qualm","quantum","quarrel","quarry","quartered","quarterly","quarters","quartet","quench","query","quicken","quickly","quickness","quicksand","quickstep","quiet","quill","quilt","quintet","quintuple","quirk","quit","quiver","quizzical","quotable","quotation","quote","rabid","race","racing","racism","rack","racoon","radar","radial","radiance","radiantly","radiated","radiation","radiator","radio","radish","raffle","raft","rage","ragged","raging","ragweed","raider","railcar","railing","railroad","railway","raisin","rake","raking","rally","ramble","rambling","ramp","ramrod","ranch","rancidity","random","ranged","ranger","ranging","ranked","ranking","ransack","ranting","rants","rare","rarity","rascal","rash","rasping","ravage","raven","ravine","raving","ravioli","ravishing","reabsorb","reach","reacquire","reaction","reactive","reactor","reaffirm","ream","reanalyze","reappear","reapply","reappoint","reapprove","rearrange","rearview","reason","reassign","reassure","reattach","reawake","rebalance","rebate","rebel","rebirth","reboot","reborn","rebound","rebuff","rebuild","rebuilt","reburial","rebuttal","recall","recant","recapture","recast","recede","recent","recess","recharger","recipient","recital","recite","reckless","reclaim","recliner","reclining","recluse","reclusive","recognize","recoil","recollect","recolor","reconcile","reconfirm","reconvene","recopy","record","recount","recoup","recovery","recreate","rectal","rectangle","rectified","rectify","recycled","recycler","recycling","reemerge","reenact","reenter","reentry","reexamine","referable","referee","reference","refill","refinance","refined","refinery","refining","refinish","reflected","reflector","reflex","reflux","refocus","refold","reforest","reformat","reformed","reformer","reformist","refract","refrain","refreeze","refresh","refried","refueling","refund","refurbish","refurnish","refusal","refuse","refusing","refutable","refute","regain","regalia","regally","reggae","regime","region","register","registrar","registry","regress","regretful","regroup","regular","regulate","regulator","rehab","reheat","rehire","rehydrate","reimburse","reissue","reiterate","rejoice","rejoicing","rejoin","rekindle","relapse","relapsing","relatable","related","relation","relative","relax","relay","relearn","release","relenting","reliable","reliably","reliance","reliant","relic","relieve","relieving","relight","relish","relive","reload","relocate","relock","reluctant","rely","remake","remark","remarry","rematch","remedial","remedy","remember","reminder","remindful","remission","remix","remnant","remodeler","remold","remorse","remote","removable","removal","removed","remover","removing","rename","renderer","rendering","rendition","renegade","renewable","renewably","renewal","renewed","renounce","renovate","renovator","rentable","rental","rented","renter","reoccupy","reoccur","reopen","reorder","repackage","repacking","repaint","repair","repave","repaying","repayment","repeal","repeated","repeater","repent","rephrase","replace","replay","replica","reply","reporter","repose","repossess","repost","repressed","reprimand","reprint","reprise","reproach","reprocess","reproduce","reprogram","reps","reptile","reptilian","repugnant","repulsion","repulsive","repurpose","reputable","reputably","request","require","requisite","reroute","rerun","resale","resample","rescuer","reseal","research","reselect","reseller","resemble","resend","resent","reset","reshape","reshoot","reshuffle","residence","residency","resident","residual","residue","resigned","resilient","resistant","resisting","resize","resolute","resolved","resonant","resonate","resort","resource","respect","resubmit","result","resume","resupply","resurface","resurrect","retail","retainer","retaining","retake","retaliate","retention","rethink","retinal","retired","retiree","retiring","retold","retool","retorted","retouch","retrace","retract","retrain","retread","retreat","retrial","retrieval","retriever","retry","return","retying","retype","reunion","reunite","reusable","reuse","reveal","reveler","revenge","revenue","reverb","revered","reverence","reverend","reversal","reverse","reversing","reversion","revert","revisable","revise","revision","revisit","revivable","revival","reviver","reviving","revocable","revoke","revolt","revolver","revolving","reward","rewash","rewind","rewire","reword","rework","rewrap","rewrite","rhyme","ribbon","ribcage","rice","riches","richly","richness","rickety","ricotta","riddance","ridden","ride","riding","rifling","rift","rigging","rigid","rigor","rimless","rimmed","rind","rink","rinse","rinsing","riot","ripcord","ripeness","ripening","ripping","ripple","rippling","riptide","rise","rising","risk","risotto","ritalin","ritzy","rival","riverbank","riverbed","riverboat","riverside","riveter","riveting","roamer","roaming","roast","robbing","robe","robin","robotics","robust","rockband","rocker","rocket","rockfish","rockiness","rocking","rocklike","rockslide","rockstar","rocky","rogue","roman","romp","rope","roping","roster","rosy","rotten","rotting","rotunda","roulette","rounding","roundish","roundness","roundup","roundworm","routine","routing","rover","roving","royal","rubbed","rubber","rubbing","rubble","rubdown","ruby","ruckus","rudder","rug","ruined","rule","rumble","rumbling","rummage","rumor","runaround","rundown","runner","running","runny","runt","runway","rupture","rural","ruse","rush","rust","rut","sabbath","sabotage","sacrament","sacred","sacrifice","sadden","saddlebag","saddled","saddling","sadly","sadness","safari","safeguard","safehouse","safely","safeness","saffron","saga","sage","sagging","saggy","said","saint","sake","salad","salami","salaried","salary","saline","salon","saloon","salsa","salt","salutary","salute","salvage","salvaging","salvation","same","sample","sampling","sanction","sanctity","sanctuary","sandal","sandbag","sandbank","sandbar","sandblast","sandbox","sanded","sandfish","sanding","sandlot","sandpaper","sandpit","sandstone","sandstorm","sandworm","sandy","sanitary","sanitizer","sank","santa","sapling","sappiness","sappy","sarcasm","sarcastic","sardine","sash","sasquatch","sassy","satchel","satiable","satin","satirical","satisfied","satisfy","saturate","saturday","sauciness","saucy","sauna","savage","savanna","saved","savings","savior","savor","saxophone","say","scabbed","scabby","scalded","scalding","scale","scaling","scallion","scallop","scalping","scam","scandal","scanner","scanning","scant","scapegoat","scarce","scarcity","scarecrow","scared","scarf","scarily","scariness","scarring","scary","scavenger","scenic","schedule","schematic","scheme","scheming","schilling","schnapps","scholar","science","scientist","scion","scoff","scolding","scone","scoop","scooter","scope","scorch","scorebook","scorecard","scored","scoreless","scorer","scoring","scorn","scorpion","scotch","scoundrel","scoured","scouring","scouting","scouts","scowling","scrabble","scraggly","scrambled","scrambler","scrap","scratch","scrawny","screen","scribble","scribe","scribing","scrimmage","script","scroll","scrooge","scrounger","scrubbed","scrubber","scruffy","scrunch","scrutiny","scuba","scuff","sculptor","sculpture","scurvy","scuttle","secluded","secluding","seclusion","second","secrecy","secret","sectional","sector","secular","securely","security","sedan","sedate","sedation","sedative","sediment","seduce","seducing","segment","seismic","seizing","seldom","selected","selection","selective","selector","self","seltzer","semantic","semester","semicolon","semifinal","seminar","semisoft","semisweet","senate","senator","send","senior","senorita","sensation","sensitive","sensitize","sensually","sensuous","sepia","september","septic","septum","sequel","sequence","sequester","series","sermon","serotonin","serpent","serrated","serve","service","serving","sesame","sessions","setback","setting","settle","settling","setup","sevenfold","seventeen","seventh","seventy","severity","shabby","shack","shaded","shadily","shadiness","shading","shadow","shady","shaft","shakable","shakily","shakiness","shaking","shaky","shale","shallot","shallow","shame","shampoo","shamrock","shank","shanty","shape","shaping","share","sharpener","sharper","sharpie","sharply","sharpness","shawl","sheath","shed","sheep","sheet","shelf","shell","shelter","shelve","shelving","sherry","shield","shifter","shifting","shiftless","shifty","shimmer","shimmy","shindig","shine","shingle","shininess","shining","shiny","ship","shirt","shivering","shock","shone","shoplift","shopper","shopping","shoptalk","shore","shortage","shortcake","shortcut","shorten","shorter","shorthand","shortlist","shortly","shortness","shorts","shortwave","shorty","shout","shove","showbiz","showcase","showdown","shower","showgirl","showing","showman","shown","showoff","showpiece","showplace","showroom","showy","shrank","shrapnel","shredder","shredding","shrewdly","shriek","shrill","shrimp","shrine","shrink","shrivel","shrouded","shrubbery","shrubs","shrug","shrunk","shucking","shudder","shuffle","shuffling","shun","shush","shut","shy","siamese","siberian","sibling","siding","sierra","siesta","sift","sighing","silenced","silencer","silent","silica","silicon","silk","silliness","silly","silo","silt","silver","similarly","simile","simmering","simple","simplify","simply","sincere","sincerity","singer","singing","single","singular","sinister","sinless","sinner","sinuous","sip","siren","sister","sitcom","sitter","sitting","situated","situation","sixfold","sixteen","sixth","sixties","sixtieth","sixtyfold","sizable","sizably","size","sizing","sizzle","sizzling","skater","skating","skedaddle","skeletal","skeleton","skeptic","sketch","skewed","skewer","skid","skied","skier","skies","skiing","skilled","skillet","skillful","skimmed","skimmer","skimming","skimpily","skincare","skinhead","skinless","skinning","skinny","skintight","skipper","skipping","skirmish","skirt","skittle","skydiver","skylight","skyline","skype","skyrocket","skyward","slab","slacked","slacker","slacking","slackness","slacks","slain","slam","slander","slang","slapping","slapstick","slashed","slashing","slate","slather","slaw","sled","sleek","sleep","sleet","sleeve","slept","sliceable","sliced","slicer","slicing","slick","slider","slideshow","sliding","slighted","slighting","slightly","slimness","slimy","slinging","slingshot","slinky","slip","slit","sliver","slobbery","slogan","sloped","sloping","sloppily","sloppy","slot","slouching","slouchy","sludge","slug","slum","slurp","slush","sly","small","smartly","smartness","smasher","smashing","smashup","smell","smelting","smile","smilingly","smirk","smite","smith","smitten","smock","smog","smoked","smokeless","smokiness","smoking","smoky","smolder","smooth","smother","smudge","smudgy","smuggler","smuggling","smugly","smugness","snack","snagged","snaking","snap","snare","snarl","snazzy","sneak","sneer","sneeze","sneezing","snide","sniff","snippet","snipping","snitch","snooper","snooze","snore","snoring","snorkel","snort","snout","snowbird","snowboard","snowbound","snowcap","snowdrift","snowdrop","snowfall","snowfield","snowflake","snowiness","snowless","snowman","snowplow","snowshoe","snowstorm","snowsuit","snowy","snub","snuff","snuggle","snugly","snugness","speak","spearfish","spearhead","spearman","spearmint","species","specimen","specked","speckled","specks","spectacle","spectator","spectrum","speculate","speech","speed","spellbind","speller","spelling","spendable","spender","spending","spent","spew","sphere","spherical","sphinx","spider","spied","spiffy","spill","spilt","spinach","spinal","spindle","spinner","spinning","spinout","spinster","spiny","spiral","spirited","spiritism","spirits","spiritual","splashed","splashing","splashy","splatter","spleen","splendid","splendor","splice","splicing","splinter","splotchy","splurge","spoilage","spoiled","spoiler","spoiling","spoils","spoken","spokesman","sponge","spongy","sponsor","spoof","spookily","spooky","spool","spoon","spore","sporting","sports","sporty","spotless","spotlight","spotted","spotter","spotting","spotty","spousal","spouse","spout","sprain","sprang","sprawl","spray","spree","sprig","spring","sprinkled","sprinkler","sprint","sprite","sprout","spruce","sprung","spry","spud","spur","sputter","spyglass","squabble","squad","squall","squander","squash","squatted","squatter","squatting","squeak","squealer","squealing","squeamish","squeegee","squeeze","squeezing","squid","squiggle","squiggly","squint","squire","squirt","squishier","squishy","stability","stabilize","stable","stack","stadium","staff","stage","staging","stagnant","stagnate","stainable","stained","staining","stainless","stalemate","staleness","stalling","stallion","stamina","stammer","stamp","stand","stank","staple","stapling","starboard","starch","stardom","stardust","starfish","stargazer","staring","stark","starless","starlet","starlight","starlit","starring","starry","starship","starter","starting","startle","startling","startup","starved","starving","stash","state","static","statistic","statue","stature","status","statute","statutory","staunch","stays","steadfast","steadier","steadily","steadying","steam","steed","steep","steerable","steering","steersman","stegosaur","stellar","stem","stench","stencil","step","stereo","sterile","sterility","sterilize","sterling","sternness","sternum","stew","stick","stiffen","stiffly","stiffness","stifle","stifling","stillness","stilt","stimulant","stimulate","stimuli","stimulus","stinger","stingily","stinging","stingray","stingy","stinking","stinky","stipend","stipulate","stir","stitch","stock","stoic","stoke","stole","stomp","stonewall","stoneware","stonework","stoning","stony","stood","stooge","stool","stoop","stoplight","stoppable","stoppage","stopped","stopper","stopping","stopwatch","storable","storage","storeroom","storewide","storm","stout","stove","stowaway","stowing","straddle","straggler","strained","strainer","straining","strangely","stranger","strangle","strategic","strategy","stratus","straw","stray","streak","stream","street","strength","strenuous","strep","stress","stretch","strewn","stricken","strict","stride","strife","strike","striking","strive","striving","strobe","strode","stroller","strongbox","strongly","strongman","struck","structure","strudel","struggle","strum","strung","strut","stubbed","stubble","stubbly","stubborn","stucco","stuck","student","studied","studio","study","stuffed","stuffing","stuffy","stumble","stumbling","stump","stung","stunned","stunner","stunning","stunt","stupor","sturdily","sturdy","styling","stylishly","stylist","stylized","stylus","suave","subarctic","subatomic","subdivide","subdued","subduing","subfloor","subgroup","subheader","subject","sublease","sublet","sublevel","sublime","submarine","submerge","submersed","submitter","subpanel","subpar","subplot","subprime","subscribe","subscript","subsector","subside","subsiding","subsidize","subsidy","subsoil","subsonic","substance","subsystem","subtext","subtitle","subtly","subtotal","subtract","subtype","suburb","subway","subwoofer","subzero","succulent","such","suction","sudden","sudoku","suds","sufferer","suffering","suffice","suffix","suffocate","suffrage","sugar","suggest","suing","suitable","suitably","suitcase","suitor","sulfate","sulfide","sulfite","sulfur","sulk","sullen","sulphate","sulphuric","sultry","superbowl","superglue","superhero","superior","superjet","superman","supermom","supernova","supervise","supper","supplier","supply","support","supremacy","supreme","surcharge","surely","sureness","surface","surfacing","surfboard","surfer","surgery","surgical","surging","surname","surpass","surplus","surprise","surreal","surrender","surrogate","surround","survey","survival","survive","surviving","survivor","sushi","suspect","suspend","suspense","sustained","sustainer","swab","swaddling","swagger","swampland","swan","swapping","swarm","sway","swear","sweat","sweep","swell","swept","swerve","swifter","swiftly","swiftness","swimmable","swimmer","swimming","swimsuit","swimwear","swinger","swinging","swipe","swirl","switch","swivel","swizzle","swooned","swoop","swoosh","swore","sworn","swung","sycamore","sympathy","symphonic","symphony","symptom","synapse","syndrome","synergy","synopses","synopsis","synthesis","synthetic","syrup","system","t-shirt","tabasco","tabby","tableful","tables","tablet","tableware","tabloid","tackiness","tacking","tackle","tackling","tacky","taco","tactful","tactical","tactics","tactile","tactless","tadpole","taekwondo","tag","tainted","take","taking","talcum","talisman","tall","talon","tamale","tameness","tamer","tamper","tank","tanned","tannery","tanning","tantrum","tapeless","tapered","tapering","tapestry","tapioca","tapping","taps","tarantula","target","tarmac","tarnish","tarot","tartar","tartly","tartness","task","tassel","taste","tastiness","tasting","tasty","tattered","tattle","tattling","tattoo","taunt","tavern","thank","that","thaw","theater","theatrics","thee","theft","theme","theology","theorize","thermal","thermos","thesaurus","these","thesis","thespian","thicken","thicket","thickness","thieving","thievish","thigh","thimble","thing","think","thinly","thinner","thinness","thinning","thirstily","thirsting","thirsty","thirteen","thirty","thong","thorn","those","thousand","thrash","thread","threaten","threefold","thrift","thrill","thrive","thriving","throat","throbbing","throng","throttle","throwaway","throwback","thrower","throwing","thud","thumb","thumping","thursday","thus","thwarting","thyself","tiara","tibia","tidal","tidbit","tidiness","tidings","tidy","tiger","tighten","tightly","tightness","tightrope","tightwad","tigress","tile","tiling","till","tilt","timid","timing","timothy","tinderbox","tinfoil","tingle","tingling","tingly","tinker","tinkling","tinsel","tinsmith","tint","tinwork","tiny","tipoff","tipped","tipper","tipping","tiptoeing","tiptop","tiring","tissue","trace","tracing","track","traction","tractor","trade","trading","tradition","traffic","tragedy","trailing","trailside","train","traitor","trance","tranquil","transfer","transform","translate","transpire","transport","transpose","trapdoor","trapeze","trapezoid","trapped","trapper","trapping","traps","trash","travel","traverse","travesty","tray","treachery","treading","treadmill","treason","treat","treble","tree","trekker","tremble","trembling","tremor","trench","trend","trespass","triage","trial","triangle","tribesman","tribunal","tribune","tributary","tribute","triceps","trickery","trickily","tricking","trickle","trickster","tricky","tricolor","tricycle","trident","tried","trifle","trifocals","trillion","trilogy","trimester","trimmer","trimming","trimness","trinity","trio","tripod","tripping","triumph","trivial","trodden","trolling","trombone","trophy","tropical","tropics","trouble","troubling","trough","trousers","trout","trowel","truce","truck","truffle","trump","trunks","trustable","trustee","trustful","trusting","trustless","truth","try","tubby","tubeless","tubular","tucking","tuesday","tug","tuition","tulip","tumble","tumbling","tummy","turban","turbine","turbofan","turbojet","turbulent","turf","turkey","turmoil","turret","turtle","tusk","tutor","tutu","tux","tweak","tweed","tweet","tweezers","twelve","twentieth","twenty","twerp","twice","twiddle","twiddling","twig","twilight","twine","twins","twirl","twistable","twisted","twister","twisting","twisty","twitch","twitter","tycoon","tying","tyke","udder","ultimate","ultimatum","ultra","umbilical","umbrella","umpire","unabashed","unable","unadorned","unadvised","unafraid","unaired","unaligned","unaltered","unarmored","unashamed","unaudited","unawake","unaware","unbaked","unbalance","unbeaten","unbend","unbent","unbiased","unbitten","unblended","unblessed","unblock","unbolted","unbounded","unboxed","unbraided","unbridle","unbroken","unbuckled","unbundle","unburned","unbutton","uncanny","uncapped","uncaring","uncertain","unchain","unchanged","uncharted","uncheck","uncivil","unclad","unclaimed","unclamped","unclasp","uncle","unclip","uncloak","unclog","unclothed","uncoated","uncoiled","uncolored","uncombed","uncommon","uncooked","uncork","uncorrupt","uncounted","uncouple","uncouth","uncover","uncross","uncrown","uncrushed","uncured","uncurious","uncurled","uncut","undamaged","undated","undaunted","undead","undecided","undefined","underage","underarm","undercoat","undercook","undercut","underdog","underdone","underfed","underfeed","underfoot","undergo","undergrad","underhand","underline","underling","undermine","undermost","underpaid","underpass","underpay","underrate","undertake","undertone","undertook","undertow","underuse","underwear","underwent","underwire","undesired","undiluted","undivided","undocked","undoing","undone","undrafted","undress","undrilled","undusted","undying","unearned","unearth","unease","uneasily","uneasy","uneatable","uneaten","unedited","unelected","unending","unengaged","unenvied","unequal","unethical","uneven","unexpired","unexposed","unfailing","unfair","unfasten","unfazed","unfeeling","unfiled","unfilled","unfitted","unfitting","unfixable","unfixed","unflawed","unfocused","unfold","unfounded","unframed","unfreeze","unfrosted","unfrozen","unfunded","unglazed","ungloved","unglue","ungodly","ungraded","ungreased","unguarded","unguided","unhappily","unhappy","unharmed","unhealthy","unheard","unhearing","unheated","unhelpful","unhidden","unhinge","unhitched","unholy","unhook","unicorn","unicycle","unified","unifier","uniformed","uniformly","unify","unimpeded","uninjured","uninstall","uninsured","uninvited","union","uniquely","unisexual","unison","unissued","unit","universal","universe","unjustly","unkempt","unkind","unknotted","unknowing","unknown","unlaced","unlatch","unlawful","unleaded","unlearned","unleash","unless","unleveled","unlighted","unlikable","unlimited","unlined","unlinked","unlisted","unlit","unlivable","unloaded","unloader","unlocked","unlocking","unlovable","unloved","unlovely","unloving","unluckily","unlucky","unmade","unmanaged","unmanned","unmapped","unmarked","unmasked","unmasking","unmatched","unmindful","unmixable","unmixed","unmolded","unmoral","unmovable","unmoved","unmoving","unnamable","unnamed","unnatural","unneeded","unnerve","unnerving","unnoticed","unopened","unopposed","unpack","unpadded","unpaid","unpainted","unpaired","unpaved","unpeeled","unpicked","unpiloted","unpinned","unplanned","unplanted","unpleased","unpledged","unplowed","unplug","unpopular","unproven","unquote","unranked","unrated","unraveled","unreached","unread","unreal","unreeling","unrefined","unrelated","unrented","unrest","unretired","unrevised","unrigged","unripe","unrivaled","unroasted","unrobed","unroll","unruffled","unruly","unrushed","unsaddle","unsafe","unsaid","unsalted","unsaved","unsavory","unscathed","unscented","unscrew","unsealed","unseated","unsecured","unseeing","unseemly","unseen","unselect","unselfish","unsent","unsettled","unshackle","unshaken","unshaved","unshaven","unsheathe","unshipped","unsightly","unsigned","unskilled","unsliced","unsmooth","unsnap","unsocial","unsoiled","unsold","unsolved","unsorted","unspoiled","unspoken","unstable","unstaffed","unstamped","unsteady","unsterile","unstirred","unstitch","unstopped","unstuck","unstuffed","unstylish","unsubtle","unsubtly","unsuited","unsure","unsworn","untagged","untainted","untaken","untamed","untangled","untapped","untaxed","unthawed","unthread","untidy","untie","until","untimed","untimely","untitled","untoasted","untold","untouched","untracked","untrained","untreated","untried","untrimmed","untrue","untruth","unturned","untwist","untying","unusable","unused","unusual","unvalued","unvaried","unvarying","unveiled","unveiling","unvented","unviable","unvisited","unvocal","unwanted","unwarlike","unwary","unwashed","unwatched","unweave","unwed","unwelcome","unwell","unwieldy","unwilling","unwind","unwired","unwitting","unwomanly","unworldly","unworn","unworried","unworthy","unwound","unwoven","unwrapped","unwritten","unzip","upbeat","upchuck","upcoming","upcountry","update","upfront","upgrade","upheaval","upheld","uphill","uphold","uplifted","uplifting","upload","upon","upper","upright","uprising","upriver","uproar","uproot","upscale","upside","upstage","upstairs","upstart","upstate","upstream","upstroke","upswing","uptake","uptight","uptown","upturned","upward","upwind","uranium","urban","urchin","urethane","urgency","urgent","urging","urologist","urology","usable","usage","useable","used","uselessly","user","usher","usual","utensil","utility","utilize","utmost","utopia","utter","vacancy","vacant","vacate","vacation","vagabond","vagrancy","vagrantly","vaguely","vagueness","valiant","valid","valium","valley","valuables","value","vanilla","vanish","vanity","vanquish","vantage","vaporizer","variable","variably","varied","variety","various","varmint","varnish","varsity","varying","vascular","vaseline","vastly","vastness","veal","vegan","veggie","vehicular","velcro","velocity","velvet","vendetta","vending","vendor","veneering","vengeful","venomous","ventricle","venture","venue","venus","verbalize","verbally","verbose","verdict","verify","verse","version","versus","vertebrae","vertical","vertigo","very","vessel","vest","veteran","veto","vexingly","viability","viable","vibes","vice","vicinity","victory","video","viewable","viewer","viewing","viewless","viewpoint","vigorous","village","villain","vindicate","vineyard","vintage","violate","violation","violator","violet","violin","viper","viral","virtual","virtuous","virus","visa","viscosity","viscous","viselike","visible","visibly","vision","visiting","visitor","visor","vista","vitality","vitalize","vitally","vitamins","vivacious","vividly","vividness","vixen","vocalist","vocalize","vocally","vocation","voice","voicing","void","volatile","volley","voltage","volumes","voter","voting","voucher","vowed","vowel","voyage","wackiness","wad","wafer","waffle","waged","wager","wages","waggle","wagon","wake","waking","walk","walmart","walnut","walrus","waltz","wand","wannabe","wanted","wanting","wasabi","washable","washbasin","washboard","washbowl","washcloth","washday","washed","washer","washhouse","washing","washout","washroom","washstand","washtub","wasp","wasting","watch","water","waviness","waving","wavy","whacking","whacky","wham","wharf","wheat","whenever","whiff","whimsical","whinny","whiny","whisking","whoever","whole","whomever","whoopee","whooping","whoops","why","wick","widely","widen","widget","widow","width","wieldable","wielder","wife","wifi","wikipedia","wildcard","wildcat","wilder","wildfire","wildfowl","wildland","wildlife","wildly","wildness","willed","willfully","willing","willow","willpower","wilt","wimp","wince","wincing","wind","wing","winking","winner","winnings","winter","wipe","wired","wireless","wiring","wiry","wisdom","wise","wish","wisplike","wispy","wistful","wizard","wobble","wobbling","wobbly","wok","wolf","wolverine","womanhood","womankind","womanless","womanlike","womanly","womb","woof","wooing","wool","woozy","word","work","worried","worrier","worrisome","worry","worsening","worshiper","worst","wound","woven","wow","wrangle","wrath","wreath","wreckage","wrecker","wrecking","wrench","wriggle","wriggly","wrinkle","wrinkly","wrist","writing","written","wrongdoer","wronged","wrongful","wrongly","wrongness","wrought","xbox","xerox","yahoo","yam","yanking","yapping","yard","yarn","yeah","yearbook","yearling","yearly","yearning","yeast","yelling","yelp","yen","yesterday","yiddish","yield","yin","yippee","yo-yo","yodel","yoga","yogurt","yonder","yoyo","yummy","zap","zealous","zebra","zen","zeppelin","zero","zestfully","zesty","zigzagged","zipfile","zipping","zippy","zips","zit","zodiac","zombie","zone","zoning","zookeeper","zoologist","zoology","zoom"] diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000000..cda2387797 --- /dev/null +++ b/src/App.js @@ -0,0 +1,267 @@ +/* eslint-disable */ + +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +'use strict'; +import '../ReactotronConfig'; + +import React, { Component } from 'react'; +import { Provider as UnstatedProvider, Subscribe, Container } from 'unstated'; +import { + View, + Text, + Image, + StyleSheet, + AppState, + Alert, + StatusBar +} from 'react-native'; +import { + createStackNavigator, + createBottomTabNavigator, + HeaderTitle, + Header, + HeaderBackButton, + withNavigation +} from 'react-navigation'; +import Icon from 'react-native-vector-icons/MaterialIcons'; +import { default as HomeHeader } from './components/Header'; +import HeaderLeftHome from './components/HeaderLeftHome'; +import SecurityHeader from './components/SecurityHeader'; +import Background from './components/Background'; +import TabBarBottom from './components/TabBarBottom'; +import TouchableItem from './components/TouchableItem'; +import Loading from './screens/Loading'; +import Security from './screens/Security'; +import QrScanner from './screens/QrScanner'; +import AccountList from './screens/AccountList'; +import AccountAdd from './screens/AccountAdd'; +import AccountNew from './screens/AccountNew'; +import AccountNetworkChooser from './screens/AccountNetworkChooser'; +import AccountRecover from './screens/AccountRecover'; +import AccountBackup from './screens/AccountBackup'; +import AccountPin from './screens/AccountPin'; +import AccountDetails from './screens/AccountDetails'; +import AccountEdit from './screens/AccountEdit'; +import TxDetails from './screens/TxDetails'; +import { AccountUnlock, AccountUnlockAndSign } from './screens/AccountUnlock'; +import SignedTx from './screens/SignedTx'; +import colors from './colors'; + +export default class App extends Component { + render() { + return ( + + + + + + ); + } +} + +const globalStackNavigationOptions = { + headerTintColor: colors.card_bg, + headerRight: , + headerStyle: { + backgroundColor: colors.bg, + height: 60, + paddingTop: 0, + paddingBottom: 0, + padding: 14, + borderBottomWidth: 0.5, + borderBottomColor: colors.bg_text_sec + }, + headerTitleStyle: { + display: 'none' + }, + headerBackTitleStyle: { + fontSize: 20, + fontWeight: '500', + fontFamily: 'Manifold CF' + } +}; + +// A workaround for https://github.com/react-navigation/react-navigation/issues/88 +const SecurityHeaderBackButton = withNavigation( + class _HeaderBackButton extends Component { + render() { + const { navigation } = this.props; + return ( + navigation.goBack(null)} + /> + ); + } + } +); + +const Screens = createStackNavigator( + { + Loading: { + screen: Loading + }, + Security: { + screen: createStackNavigator( + { + Security: { + screen: Security, + navigationOptions: { + headerTintColor: colors.card_bg, + headerLeft: , + headerRight: null + } + } + }, + { + headerMode: 'screen', + navigationOptions: globalStackNavigationOptions + } + ) + }, + Welcome: { + screen: createStackNavigator( + { + AccountAdd: { + screen: AccountAdd, + navigationOptions: { + headerLeft: + } + }, + AccountNetworkChooser: { + screen: AccountNetworkChooser + }, + AccountNew: { + screen: AccountNew + }, + AccountRecover: { + screen: AccountRecover + }, + AccountBackup: { + screen: AccountBackup + }, + AccountPin: { + screen: AccountPin + } + }, + { + navigationOptions: globalStackNavigationOptions, + initialRouteParams: { + isWelcome: true + } + } + ) + }, + Tabs: { + screen: createBottomTabNavigator( + { + Scanner: { + screen: createStackNavigator( + { + QrScanner: { + screen: QrScanner, + navigationOptions: { + headerLeft: + } + }, + TxDetails: { + screen: TxDetails + }, + AccountUnlockAndSign: { + screen: AccountUnlockAndSign + }, + SignedTx: { + screen: SignedTx + } + }, + { + navigationOptions: globalStackNavigationOptions + } + ) + }, + Accounts: { + screen: createStackNavigator( + { + AccountList: { + screen: AccountList, + navigationOptions: { + headerLeft: + } + }, + AccountNew: { + screen: AccountNew + }, + AccountAdd: { + screen: AccountAdd + }, + AccountNetworkChooser: { + screen: AccountNetworkChooser + }, + AccountRecover: { + screen: AccountRecover + }, + AccountBackup: { + screen: AccountBackup + }, + AccountPin: { + screen: AccountPin + }, + AccountDetails: { + screen: AccountDetails + }, + AccountUnlock: { + screen: AccountUnlock + }, + AccountEdit: { + screen: AccountEdit + } + }, + { + mode: 'card', + // cardStyle: { backgroundColor: 'transparent' }, + // transitionConfig: () => ({ + // containerStyle: { + // backgroundColor: 'transparent' + // } + // }), + navigationOptions: globalStackNavigationOptions + } + ) + } + }, + { + tabBarComponent: props => , + tabBarPosition: 'bottom' + } + ) + } + }, + { + headerMode: 'none', + mode: 'card', + // transitionConfig: (): Object => ({ + // containerStyle: { + // backgroundColor: 'transparent' + // } + // }), + // cardStyle: { backgroundColor: 'transparent' } + } +); diff --git a/src/actions/accounts.js b/src/actions/accounts.js deleted file mode 100644 index 594740dbc3..0000000000 --- a/src/actions/accounts.js +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import { Alert, Keyboard } from 'react-native' -import { Actions } from 'react-native-router-flux' -import { - ADD_ACCOUNT, SELECT_ACCOUNT, DELETE_ACCOUNT, MODIFY_ACCOUNT, SET_NEW_PIN, SET_OLD_PIN, SET_ACCOUNTS -} from '../constants/AccountActions' -import { encryptData, decryptData } from '../util/native' - -export function addAccount (pin) { - return async function (dispatch, getState) { - try { - let account = getState().accounts.selected - if (!account) { - return - } - - if (account.newPin !== pin) { - Alert.alert('PIN must be the same') - return - } - - let seed = await encryptData(account.seed, pin) - dispatch({ - type: ADD_ACCOUNT, - account: { - encryptedSeed: seed, - address: account.address, - name: account.name - } - }) - Actions.popTo('accountList') - Alert.alert('Account Created') - } catch (e) { - console.error(e) - } - } -} - -export function selectAccount (account) { - return { - type: SELECT_ACCOUNT, - account - } -} - -export function deleteAccount (account) { - return { - type: DELETE_ACCOUNT, - account - } -} - -export function modifyAccount (account, modifications) { - return { - type: MODIFY_ACCOUNT, - account, - modifications - } -} - -export function setOldPin (pin) { - return async function (dispatch, getState) { - let account = getState().accounts.selected - if (!account) { - return - } - - try { - await decryptData(account.encryptedSeed, pin) - dispatch({ - type: SET_OLD_PIN, - pin - }) - Actions.accountSetPin() - } catch (e) { - Alert.alert('Invalid PIN') - } - } -} - -export function setNewPin (pin) { - return function (dispatch) { - dispatch({ - type: SET_NEW_PIN, - pin - }) - Actions.accountConfirmPin() - } -} - -export function setAccounts (accounts) { - return { - type: SET_ACCOUNTS, - accounts - } -} - -export function changePin (newPin) { - return async function (dispatch, getState) { - let account = getState().accounts.selected - if (!account) { - return - } - - if (account.newPin !== newPin) { - Alert.alert('New PIN must be the same') - return - } - - Keyboard.dismiss() - - try { - let seed = await decryptData(account.encryptedSeed, account.oldPin) - let encryptedSeed = await encryptData(seed, newPin) - - dispatch(modifyAccount(account, { - encryptedSeed: encryptedSeed - })) - - Actions.popTo('accountDetails') - Alert.alert('PIN changed') - } catch (e) { - // this is unreachanle if setOldPin was called before - console.error(e) - } - } -} diff --git a/src/actions/scanner.js b/src/actions/scanner.js deleted file mode 100644 index 775c523bf3..0000000000 --- a/src/actions/scanner.js +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import { Alert } from 'react-native' -import { Actions } from 'react-native-router-flux' -import { ENABLE_SCANNER, DISABLE_SCANNER, DISABLE_SCANNER_WARNINGS, RESET_SCANNER } from '../constants/ScannerActions' -import { selectAccount } from './accounts' -import { scannedTx, scannedData } from './signer' -import transaction from '../util/transaction' -import { keccak, ethSign } from '../util/native' - -export function enableScanner () { - return { - type: ENABLE_SCANNER - } -} - -export function disableScanner () { - return { - type: DISABLE_SCANNER - } -} - -export function disableScannerWarnings () { - return { - type: DISABLE_SCANNER_WARNINGS - } -} - -export function resetScanner () { - return { - type: RESET_SCANNER - } -} - -export function displayScannerWarning (warning) { - return function (dispatch, getState) { - if (getState().scanner.shouldDisplayWarning) { - dispatch(disableScannerWarnings()) - Alert.alert(warning, undefined, [{ - text: 'OK', - onPress: () => { - dispatch(enableScanner()) - } - }]) - } else { - dispatch(enableScanner()) - } - } -} - -function findAccountWithAddress (getState, address) { - return getState().accounts.all.find(account => { - return account.address.toLowerCase() === address.toLowerCase() - }) -} - -function hasAccounts (getState) { - return getState().accounts.all.length !== 0 -} - -export function scannerDispatch (data) { - return async function (dispatch, getState) { - if (!getState().scanner.scannerEnabled) { - return - } - - dispatch(disableScanner()) - try { - if (!hasAccounts(getState)) { - dispatch(displayScannerWarning('No accounts found')) - return - } - - let txRequest = JSON.parse(data) - let account = findAccountWithAddress(getState, txRequest.data.account) - if (!account) { - dispatch(displayScannerWarning('You are not able to sign transaction X from ' + txRequest.data.account)) - return - } - - if (txRequest.action === 'signTransaction') { - let tx = await transaction(txRequest.data.rlp) - let hash = await keccak(txRequest.data.rlp) - dispatch(selectAccount(account)) - dispatch(scannedTx(hash, tx)) - Actions.txDetails() - dispatch(resetScanner()) - } else if (txRequest.action === 'signTransactionHash') { - var details = txRequest.data.details - details.isSafe = false - let hash = txRequest.data.hash - dispatch(selectAccount(account)) - dispatch(scannedTx(hash, details)) - Actions.txDetails() - dispatch(resetScanner()) - } else if (txRequest.action === 'signData') { - let data = txRequest.data.data - let hash = await ethSign(txRequest.data.data) - dispatch(selectAccount(account)) - dispatch(scannedData(hash, data)) - Actions.dataDetails() - dispatch(resetScanner()) - } else { - dispatch(displayScannerWarning('Invalid request')) - dispatch(resetScanner()) - return - } - } catch (e) { - console.error(e) - dispatch(displayScannerWarning('Invalid transaction ' + e)) - } - } -} diff --git a/src/actions/signer.js b/src/actions/signer.js deleted file mode 100644 index 9378bda3c7..0000000000 --- a/src/actions/signer.js +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import { Alert } from 'react-native' -import { Actions } from 'react-native-router-flux' -import { NEW_SCANNED_TX, NEW_SCANNED_DATA, SIGN_HASH } from '../constants/SignerActions' -import { brainWalletSign, decryptData } from '../util/native' - -export function scannedTx (hash, transaction) { - return { - type: NEW_SCANNED_TX, - hash, - transaction - } -} - -export function scannedData (hash, data) { - return { - type: NEW_SCANNED_DATA, - hash, - data - } -} - -export function signHash (pin) { - return async function (dispatch, getState) { - try { - let account = getState().accounts.selected - let hash = getState().signer.hashToSign - let seed = await decryptData(account.encryptedSeed, pin) - let signature = await brainWalletSign(seed, hash) - dispatch({ - type: SIGN_HASH, - signature: signature - }) - Actions.qrViewTx() - } catch (e) { - Alert.alert('Invalid PIN') - } - } -} diff --git a/src/util/store.js b/src/colors.js similarity index 72% rename from src/util/store.js rename to src/colors.js index 597c494e05..1efefcba4a 100644 --- a/src/util/store.js +++ b/src/colors.js @@ -14,10 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -'use strict' - -import { createStore, applyMiddleware } from 'redux' -import thunk from 'redux-thunk' -import reducers from '../reducers' - -export default createStore(reducers, applyMiddleware(thunk)) +export default { + bg: '#1D1D1D', + bg_text: '#FFFFFF', + bg_text_sec: '#B4B5B0', + bg_positive: '#72E762', + bg_warning: '#FAE265', + bg_alert: '#ED332B', + bg_text_positive: '#72E762', + card_bg: '#F9F9F9', + card_text: '#1A1A1A', + card_bg_text_sec: '#B4B5B0' +}; diff --git a/src/components/AccountAddress.js b/src/components/AccountAddress.js deleted file mode 100644 index 9de831853d..0000000000 --- a/src/components/AccountAddress.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { Text } from 'react-native' -import AppStyles from '../styles' - -export default class AccountAddress extends Component { - static propTypes = { - address: PropTypes.string - } - - render () { - return ( - {this.props.address ? '0x' + this.props.address : 'Unknown'} - ) - } -} diff --git a/src/components/AccountCard.js b/src/components/AccountCard.js new file mode 100644 index 0000000000..d725ee4ada --- /dev/null +++ b/src/components/AccountCard.js @@ -0,0 +1,153 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// @flow + +import React from 'react'; +import PropTypes from 'prop-types'; +import { + View, + Text, + Platform, + StyleSheet, + TouchableNativeFeedback, + TouchableOpacity, + ViewPropTypes +} from 'react-native'; +import AccountIcon from './AccountIcon'; +import Card from './Card'; +import TouchableItem from './TouchableItem'; +import { + NETWORK_LIST, + NETWORK_TITLES, + NETWORK_COLOR, + DEFAULT_NETWORK_COLOR +} from '../constants'; +import colors from '../colors'; + +export default class AccountCard extends React.PureComponent<{ + title: ?string, + address: string, + chainId: string, + onPress: () => any +}> { + static propTypes = { + title: PropTypes.string, + address: PropTypes.string.isRequired, + style: ViewPropTypes.style, + chainId: PropTypes.string, + onPress: PropTypes.func + }; + + static defaultProps = { + title: 'no name' + }; + + render() { + const { address, chainId, style, onPress } = this.props; + let { title } = this.props; + title = title.length ? title : AccountCard.defaultProps.title; + + return ( + + + + + + + {title} + + + 0x{address} + + + + + + {NETWORK_TITLES[chainId]} + + + + + ); + } +} + +const styles = StyleSheet.create({ + body: { + paddingBottom: 20 + }, + content: { + flexDirection: 'row', + backgroundColor: colors.card_bg, + padding: 10 + }, + icon: { + width: 47, + height: 47 + }, + desc: { + flexDirection: 'column', + justifyContent: 'space-between', + paddingLeft: 10, + flex: 1 + }, + footer: { + backgroundColor: '#977CF6', + flexDirection: 'row-reverse', + padding: 5 + }, + titleText: { + fontFamily: 'Roboto', + fontSize: 20 + }, + secondaryText: { + fontFamily: 'Roboto', + color: colors.bg_text_sec, + fontWeight: '500', + fontSize: 14 + }, + footerText: { + fontFamily: 'Roboto', + color: colors.card_bg, + fontWeight: 'bold' + } +}); diff --git a/src/components/AccountDetails.js b/src/components/AccountDetails.js deleted file mode 100644 index 7356ca91fe..0000000000 --- a/src/components/AccountDetails.js +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { StyleSheet, View, ScrollView, Text, TextInput, TouchableOpacity } from 'react-native' -import AppStyles from '../styles' -import AccountIcon from './AccountIcon' -import QrView from './QrView' - -export default class AccountDetails extends Component { - static propTypes = { - account: PropTypes.shape({ - address: PropTypes.string.isRequired - }).isRequired, - onNameChange: PropTypes.func.isRequired, - onChangePin: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired - } - - state = { - isEditing: false, - name: this.props.account.name - } - - startEdit = () => { - this.setEditing(true) - this.setState({ - name: this.props.account.name - }) - } - - cancelEdit = () => { - this.setEditing(false) - } - - finishEdit = () => { - this.setEditing(false) - this.props.onNameChange(this.props.account, this.state.name) - } - - updateName = (name) => { - this.setState({ name }) - } - - setEditing (isEditing) { - this.setState({ isEditing }) - } - - render () { - return ( - - - - - Name - { this.state.isEditing - ? ( - - ) : ( - {this.props.account.name ? this.props.account.name : 'no name'} - ) - } - - - - - Address - 0x{this.props.account.address} - - - - - - - - this.props.onChangePin(this.props.account)} - > - Change PIN - - this.props.onDelete(this.props.account)} - > - Delete - - - - ) - } -} - -const styles = StyleSheet.create({ - wrapper: { - borderRadius: 5 - }, - qr: { - padding: 10, - marginTop: 20 - }, - deleteText: { - textAlign: 'right' - }, - changePinText: { - textAlign: 'left', - color: 'green' - }, - actionsContainer: { - marginTop: 40, - flexDirection: 'row' - }, - actionButtonContainer: { - flex: 1 - } -}) diff --git a/src/components/AccountDetailsCard.js b/src/components/AccountDetailsCard.js new file mode 100644 index 0000000000..e0eaa0a2ca --- /dev/null +++ b/src/components/AccountDetailsCard.js @@ -0,0 +1,149 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// @flow + +import React from 'react'; +import PropTypes from 'prop-types'; +import { + View, + Text, + Platform, + StyleSheet, + TouchableNativeFeedback, + TouchableOpacity +} from 'react-native'; +import Card from './Card'; +import AccountIcon from './AccountIcon'; +import TouchableItem from './TouchableItem'; +import { + NETWORK_LIST, + NETWORK_TITLES, + NETWORK_COLOR, + DEFAULT_NETWORK_COLOR +} from '../constants'; +import colors from '../colors'; + +export default class AccountDetailsCard extends React.PureComponent<{ + title: string, + address: string, + chainId: string, + onPress: () => any +}> { + static propTypes = { + title: PropTypes.string.isRequired, + address: PropTypes.string.isRequired, + chainId: PropTypes.string, + onPress: PropTypes.func + }; + + render() { + const { title, address, chainId, onPress } = this.props; + + return ( + + + + + + {title} + Tap to edit account + + + + + 0x{address} + + + + + + {NETWORK_TITLES[chainId]} + + + + ); + } +} + +const styles = StyleSheet.create({ + body: { + padding: 20, + backgroundColor: colors.card_bg + }, + content: { + flexDirection: 'row', + backgroundColor: colors.card_bg + }, + icon: { + width: 70, + height: 70 + }, + desc: { + flexDirection: 'column', + paddingLeft: 10, + flex: 1 + }, + footer: { + backgroundColor: '#977CF6', + flexDirection: 'row-reverse', + padding: 5 + }, + titleText: { + fontSize: 20 + }, + editText: { + paddingTop: 12, + color: colors.bg_text_sec, + fontWeight: '500', + fontSize: 15 + }, + addressText: { + paddingTop: 20, + color: colors.bg, + fontWeight: '700', + fontSize: 16 + }, + footerText: { + color: colors.card_bg, + fontWeight: 'bold' + } +}); diff --git a/src/components/AccountIcon.js b/src/components/AccountIcon.js index 068b0b1051..22f89d83be 100644 --- a/src/components/AccountIcon.js +++ b/src/components/AccountIcon.js @@ -14,50 +14,56 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -'use strict' +'use strict'; -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { Image, View, StyleSheet } from 'react-native' -import { blockiesIcon } from '../util/native' +import React from 'react'; +import PropTypes from 'prop-types'; +import { Image, View, StyleSheet } from 'react-native'; +import { blockiesIcon } from '../util/native'; -async function displayIcon (self, seed) { - try { - let icon = await blockiesIcon(seed) - self.setState({ - icon: icon - }) - } catch (e) { - console.log(e) +export default class AccountIcon extends React.PureComponent { + + constructor(...args) { + super(...args); + this.displayIcon = this.displayIcon.bind(this); } -} -export default class AccountIcon extends Component { static propTypes = { seed: PropTypes.string.isRequired - } + }; - state = {} + state = {}; + + async displayIcon(seed) { + try { + let icon = await blockiesIcon(seed); + this.setState({ + icon: icon + }); + } catch (e) { + console.log(e); + } + } - componentDidMount () { - displayIcon(this, this.props.seed) + componentDidMount() { + this.displayIcon(this.props.seed); } - componentWillReceiveProps (newProps) { + componentWillReceiveProps(newProps) { if (newProps.seed !== this.props.seed) { - displayIcon(this, newProps.seed) + this.displayIcon(newProps.seed); } } - render () { + render() { return ( - ) + ); } } @@ -65,4 +71,4 @@ const styles = StyleSheet.create({ identicon: { alignItems: 'center' } -}) +}); diff --git a/src/components/AccountIconChooser.js b/src/components/AccountIconChooser.js new file mode 100644 index 0000000000..7800466ff6 --- /dev/null +++ b/src/components/AccountIconChooser.js @@ -0,0 +1,149 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// @flow + +import React from 'react'; +import PropTypes from 'prop-types'; +import { + View, + Text, + StyleSheet, + ListView, + TouchableOpacity +} from 'react-native'; +import { brainWalletAddress, words } from '../util/native'; +import colors from '../colors'; +import Card from './Card'; +import AccountIcon from './AccountIcon'; + +export default class AccountIconChooser extends React.PureComponent<{ + value: string, + onChange: () => any +}> { + static propTypes = { + value: PropTypes.string, + onChange: PropTypes.func + }; + + constructor(props) { + super(props); + this.icons = []; + const iconsDS = new ListView.DataSource({ + rowHasChanged: (r1, r2) => true + }); + this.state = { iconsDS }; + } + + refreshIcons = async () => { + try { + this.icons = [ + ...this.icons, + ...(await Promise.all( + Array(10) + .join(' ') + .split(' ') + .map(async () => { + const seed = await words(); + return { + seed, + address: (await brainWalletAddress(seed)).toLowerCase() + }; + }) + )) + ]; + this.setState({ iconsDS: this.state.iconsDS.cloneWithRows(this.icons) }); + } catch (e) { + console.error(e); + } + }; + + componentDidMount() { + this.refreshIcons(); + } + + render() { + const { value, onChange } = this.props; + + return ( + + { + const selected = address.toLowerCase() === value.toLowerCase(); + const style = [styles.icon]; + return ( + this.props.onChange({ address, seed })} + > + + + ); + }} + /> + + {value ? `0x${value}` : `Select an identicon`} + + + ); + } +} + +const styles = StyleSheet.create({ + body: { + flex: 1, + flexDirection: 'column', + marginBottom: 20, + padding: 20, + backgroundColor: colors.card_bg + }, + icons: { + backgroundColor: colors.card_bg + }, + icon: { + width: 50, + height: 50, + margin: 6, + padding: 5 + }, + iconBorder: { + borderWidth: 6, + borderColor: colors.card_bg + }, + selected: { + borderColor: colors.bg + }, + addressText: { + fontFamily: 'Roboto', + paddingTop: 20, + color: colors.bg, + fontWeight: '700', + fontSize: 14 + } +}); diff --git a/src/components/AccountList.js b/src/components/AccountList.js deleted file mode 100644 index 3762887415..0000000000 --- a/src/components/AccountList.js +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -'use strict' - -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { Button, View, Text, ListView, StatusBar, StyleSheet } from 'react-native' -import AccountListRow from './AccountListRow' -import AppStyles from '../styles' - -export default class AccountList extends Component { - static propTypes = { - accounts: PropTypes.arrayOf(PropTypes.shape({ - address: PropTypes.string.isRequired - })).isRequired, - onNewAccount: PropTypes.func.isRequired, - onAccountSelected: PropTypes.func.isRequired - } - - constructor (props) { - super(props) - const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}) - this.state = { - dataSource: ds.cloneWithRows(props.accounts) - } - } - - componentWillReceiveProps (nextProps) { - this.setState({ - dataSource: this.state.dataSource.cloneWithRows(nextProps.accounts) - }) - } - - render () { - if (!this.props.accounts.length) { - return ( - - - - To sign transactions you need at least one account. - - -