example/ivy: make ivy work again

This CL allows a (super) outdated Xcode project - the Pob Pike's Ivy
work again and can compile and run on the latest iOS (tested on iOS 15
beta 8).

There are some changes to the project that might be worth mentioning:

- The UIWebView is deprecated in iOS 10, this CL migrates the code to
use the latest recommended WKWebView.
- The old project does not compatible with iOS 9 and later, the CL upgrades
the development target to iOS 14, and makes it compatible with all
all orientation (Portrait, landscape, upside down).
- The old Launch.storyboard is deprecated, the Main.storyboard cannot
be opened (will cause Xcode crash), this change slightly reworked on
the UI management, and merges the purpose of Launch.storyboard as well
as Main.storyboard into the single Main.storyboard.
- Injects a meta tag into the HTML header so that the fonts are properly
scaled on (very) high-resolution display.
- The app is not only tested on a simulator but also physically tested
on an iPhone 12 Pro.

See screenshots:

- iOS Home: https://changkun.de/midgard/img/ivy-ios-home.png
- iOS Help: https://changkun.de/midgard/img/ivy-ios-help.png
- Mac Home: https://changkun.de/midgard/img/ivy-mac-home.png
- Mac Help: https://changkun.de/midgard/img/ivy-mac-help.png

Change-Id: I1b8dec6b17d5722fddb1011453b3c8f86e4900e4
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/346949
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Hajime Hoshi <hajimehoshi@gmail.com>
Trust: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/example/ivy/ios/README.md b/example/ivy/ios/README.md
index 4eee9bc..d086aa8 100644
--- a/example/ivy/ios/README.md
+++ b/example/ivy/ios/README.md
@@ -6,9 +6,22 @@
 implementation of Ivy. Run:
 
 ```
-go get robpike.io/ivy
+go install golang.org/x/mobile/cmd/gomobile@latest 
+go install golang.org/x/mobile/cmd/gobind@latest
+```
+
+to install `gomobile` and `gobind`. Then:
+
+```
+mkdir work; cd work
+go mod init work
+go get -d golang.org/x/mobile/bind@latest
+go get -d robpike.io/ivy/mobile
 gomobile bind -target=ios robpike.io/ivy/mobile
 ```
 
 Place the mobile.framework directory in this directory, and
 then open ivy.xcodeproj in Xcode.
+
+You have to specify Development Team for code signing certificate in:
+Project Settings -> Targets -> Signing & Capabilities -> Signing -> Team.
\ No newline at end of file
diff --git a/example/ivy/ios/ivy.xcodeproj/project.pbxproj b/example/ivy/ios/ivy.xcodeproj/project.pbxproj
index 8e6d974..335b7ce 100644
--- a/example/ivy/ios/ivy.xcodeproj/project.pbxproj
+++ b/example/ivy/ios/ivy.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		7DC2F7EA26DFD9870026EBED /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DC2F7E826DFCF750026EBED /* WebKit.framework */; };
+		7DC2F7ED26DFD9890026EBED /* mobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4C2833A1B98889100878964 /* mobile.framework */; };
 		B461D25D1B31B27700EC4870 /* tape.html in Resources */ = {isa = PBXBuildFile; fileRef = B461D25C1B31B27700EC4870 /* tape.html */; };
 		B48878331B2E714100C7CC3C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B488780C1B2D1C3F00C7CC3C /* AppDelegate.m */; };
 		B48878341B2E714100C7CC3C /* IvyController.m in Sources */ = {isa = PBXBuildFile; fileRef = B488780F1B2D1C3F00C7CC3C /* IvyController.m */; };
@@ -15,21 +17,10 @@
 		B48878381B2E719000C7CC3C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B48878111B2D1C3F00C7CC3C /* Main.storyboard */; };
 		B48878391B2E719000C7CC3C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B48878141B2D1C3F00C7CC3C /* Images.xcassets */; };
 		B488783D1B2F9CD500C7CC3C /* DocsController.m in Sources */ = {isa = PBXBuildFile; fileRef = B488783C1B2F9CD500C7CC3C /* DocsController.m */; };
-		B4F12E871B3834120077D7AC /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B4F12E861B3834120077D7AC /* Launch.storyboard */; };
-		B4FB2A9A1B9890540087EE14 /* mobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4C2833A1B98889100878964 /* mobile.framework */; };
 /* End PBXBuildFile section */
 
-/* Begin PBXContainerItemProxy section */
-		B488781E1B2D1C3F00C7CC3C /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = B48877FC1B2D1C3F00C7CC3C /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = B48878031B2D1C3F00C7CC3C;
-			remoteInfo = ivy;
-		};
-/* End PBXContainerItemProxy section */
-
 /* Begin PBXFileReference section */
+		7DC2F7E826DFCF750026EBED /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
 		B461D25C1B31B27700EC4870 /* tape.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = tape.html; sourceTree = "<group>"; };
 		B48878041B2D1C3F00C7CC3C /* ivy.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ivy.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		B48878081B2D1C3F00C7CC3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -45,7 +36,6 @@
 		B488783B1B2F9CD500C7CC3C /* DocsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocsController.h; sourceTree = "<group>"; };
 		B488783C1B2F9CD500C7CC3C /* DocsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DocsController.m; sourceTree = "<group>"; };
 		B4C2833A1B98889100878964 /* mobile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mobile.framework; sourceTree = "<group>"; };
-		B4F12E861B3834120077D7AC /* Launch.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -53,26 +43,29 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				B4FB2A9A1B9890540087EE14 /* mobile.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		B488781A1B2D1C3F00C7CC3C /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
+				7DC2F7ED26DFD9890026EBED /* mobile.framework in Frameworks */,
+				7DC2F7EA26DFD9870026EBED /* WebKit.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		7DC2F7E726DFCF740026EBED /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				7DC2F7E826DFCF750026EBED /* WebKit.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 		B48877FB1B2D1C3F00C7CC3C = {
 			isa = PBXGroup;
 			children = (
 				B4C2833A1B98889100878964 /* mobile.framework */,
 				B48878061B2D1C3F00C7CC3C /* ivy */,
 				B48878051B2D1C3F00C7CC3C /* Products */,
+				7DC2F7E726DFCF740026EBED /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -97,7 +90,6 @@
 				B48878311B2DF1B200C7CC3C /* Suggestion.m */,
 				B461D25C1B31B27700EC4870 /* tape.html */,
 				B48878111B2D1C3F00C7CC3C /* Main.storyboard */,
-				B4F12E861B3834120077D7AC /* Launch.storyboard */,
 				B48878141B2D1C3F00C7CC3C /* Images.xcassets */,
 				B48878071B2D1C3F00C7CC3C /* Supporting Files */,
 			);
@@ -139,22 +131,17 @@
 		B48877FC1B2D1C3F00C7CC3C /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 0640;
+				LastUpgradeCheck = 1300;
 				ORGANIZATIONNAME = "The Go Authors";
 				TargetAttributes = {
 					B48878031B2D1C3F00C7CC3C = {
 						CreatedOnToolsVersion = 6.1.1;
-						DevelopmentTeam = YE84DJ86AZ;
-					};
-					B488781C1B2D1C3F00C7CC3C = {
-						CreatedOnToolsVersion = 6.1.1;
-						TestTargetID = B48878031B2D1C3F00C7CC3C;
 					};
 				};
 			};
 			buildConfigurationList = B48877FF1B2D1C3F00C7CC3C /* Build configuration list for PBXProject "ivy" */;
 			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
+			developmentRegion = en;
 			hasScannedForEncodings = 0;
 			knownRegions = (
 				en,
@@ -176,19 +163,11 @@
 			buildActionMask = 2147483647;
 			files = (
 				B48878381B2E719000C7CC3C /* Main.storyboard in Resources */,
-				B4F12E871B3834120077D7AC /* Launch.storyboard in Resources */,
 				B48878391B2E719000C7CC3C /* Images.xcassets in Resources */,
 				B461D25D1B31B27700EC4870 /* tape.html in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		B488781B1B2D1C3F00C7CC3C /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
@@ -204,23 +183,8 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		B48878191B2D1C3F00C7CC3C /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXSourcesBuildPhase section */
 
-/* Begin PBXTargetDependency section */
-		B488781F1B2D1C3F00C7CC3C /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = B48878031B2D1C3F00C7CC3C /* ivy */;
-			targetProxy = B488781E1B2D1C3F00C7CC3C /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
 /* Begin PBXVariantGroup section */
 		B48878111B2D1C3F00C7CC3C /* Main.storyboard */ = {
 			isa = PBXVariantGroup;
@@ -237,25 +201,37 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = arm64;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				COPY_PHASE_STRIP = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
@@ -268,9 +244,9 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				MTL_ENABLE_DEBUG_INFO = YES;
-				ONLY_ACTIVE_ARCH = NO;
+				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALID_ARCHS = "arm64 x86_64 armv7";
@@ -281,18 +257,28 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD)";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
 				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -300,13 +286,14 @@
 				ENABLE_NS_ASSERTIONS = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -320,12 +307,13 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
+				DEVELOPMENT_TEAM = "";
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)",
 				);
 				INFOPLIST_FILE = ivy/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
@@ -344,18 +332,20 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
+				DEVELOPMENT_TEAM = "";
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)",
 				);
 				INFOPLIST_FILE = ivy/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)",
 				);
 				ONLY_ACTIVE_ARCH = NO;
+				PRODUCT_BUNDLE_IDENTIFIER = "com.google.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = ivy;
 				STRIP_STYLE = debugging;
 				TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/example/ivy/ios/ivy/AppDelegate.h b/example/ivy/ios/ivy/AppDelegate.h
index 0585c7d..3901653 100644
--- a/example/ivy/ios/ivy/AppDelegate.h
+++ b/example/ivy/ios/ivy/AppDelegate.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#import <UIKit/UIKit.h>
+#import <WebKit/WebKit.h>
 #import "Suggestion.h"
 #import "IvyController.h"
 
 @interface AppDelegate
-    : UIResponder <UIApplicationDelegate, UITextFieldDelegate, UIWebViewDelegate>
+    : UIResponder <UIApplicationDelegate, UITextFieldDelegate, WKUIDelegate>
 
 @property (strong, nonatomic) UIWindow *window;
 
diff --git a/example/ivy/ios/ivy/Base.lproj/Main.storyboard b/example/ivy/ios/ivy/Base.lproj/Main.storyboard
index b773a75..db250c1 100644
--- a/example/ivy/ios/ivy/Base.lproj/Main.storyboard
+++ b/example/ivy/ios/ivy/Base.lproj/Main.storyboard
@@ -1,7 +1,11 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="mTw-C8-NzX">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19158" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="mTw-C8-NzX">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <accessibilityOverrides isEnabled="YES"/>
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19141"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
         <!--Docs-->
@@ -13,28 +17,31 @@
                         <viewControllerLayoutGuide type="bottom" id="Yrx-qe-pYd"/>
                     </layoutGuides>
                     <view key="view" contentMode="scaleToFill" id="a4n-1z-obZ">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <webView opaque="NO" tag="11" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fk4-q0-6a2">
-                                <rect key="frame" x="16" y="64" width="568" height="528"/>
+                            <wkWebView opaque="NO" tag="11" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xlZ-tR-6QP">
+                                <rect key="frame" x="20" y="96" width="374" height="758"/>
                                 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
-                                <dataDetectorType key="dataDetectorTypes"/>
-                            </webView>
+                                <wkWebViewConfiguration key="configuration">
+                                    <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
+                                    <wkPreferences key="preferences"/>
+                                </wkWebViewConfiguration>
+                            </wkWebView>
                         </subviews>
                         <color key="backgroundColor" red="0.9882352941176471" green="0.98039215686274506" blue="0.81176470588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <constraints>
-                            <constraint firstItem="fk4-q0-6a2" firstAttribute="top" secondItem="a4n-1z-obZ" secondAttribute="top" constant="64" id="NP8-Ie-n5Y"/>
-                            <constraint firstAttribute="trailing" secondItem="fk4-q0-6a2" secondAttribute="trailing" constant="16" id="e1b-5n-MOa"/>
-                            <constraint firstAttribute="bottom" secondItem="fk4-q0-6a2" secondAttribute="bottom" constant="8" id="fAM-W8-Lfc"/>
-                            <constraint firstItem="fk4-q0-6a2" firstAttribute="leading" secondItem="a4n-1z-obZ" secondAttribute="leading" constant="16" id="fpe-JV-je0"/>
+                            <constraint firstItem="xlZ-tR-6QP" firstAttribute="trailing" secondItem="a4n-1z-obZ" secondAttribute="trailingMargin" id="GP2-Wr-Bh9"/>
+                            <constraint firstItem="xlZ-tR-6QP" firstAttribute="top" secondItem="TeY-hL-zeC" secondAttribute="bottom" constant="8" symbolic="YES" id="Vvo-yF-z4a"/>
+                            <constraint firstItem="Yrx-qe-pYd" firstAttribute="top" secondItem="xlZ-tR-6QP" secondAttribute="bottom" constant="8" symbolic="YES" id="afC-pF-Eom"/>
+                            <constraint firstItem="xlZ-tR-6QP" firstAttribute="leading" secondItem="a4n-1z-obZ" secondAttribute="leadingMargin" id="wxq-1W-9XD"/>
                         </constraints>
                     </view>
                     <navigationItem key="navigationItem" title="Documentation" id="lf7-H3-aZF"/>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="HMz-gF-Hp5" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="1725" y="386"/>
+            <point key="canvasLocation" x="1724.6305418719212" y="384.80000000000001"/>
         </scene>
         <!--Ivy Controller-->
         <scene sceneID="tne-QT-ifu">
@@ -45,67 +52,82 @@
                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                     </layoutGuides>
                     <view key="view" contentMode="scaleAspectFit" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <textField opaque="NO" clipsSubviews="YES" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Type an expression" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="9SS-TP-C7c" userLabel="InputField">
-                                <rect key="frame" x="16" y="538" width="568" height="30"/>
+                                <rect key="frame" x="20" y="817" width="374" height="34"/>
                                 <color key="backgroundColor" red="0.98823529409999999" green="0.98039215690000003" blue="0.81176470590000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                 <rect key="contentStretch" x="1" y="1" width="1" height="1"/>
                                 <fontDescription key="fontDescription" name="Menlo-Bold" family="Menlo" pointSize="14"/>
                                 <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="alphabet" keyboardAppearance="alert" enablesReturnKeyAutomatically="YES"/>
                             </textField>
-                            <webView opaque="NO" tag="2" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Tgh-Lc-vbE">
-                                <rect key="frame" x="16" y="64" width="568" height="466"/>
+                            <wkWebView opaque="NO" tag="2" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ga1-Py-9re">
+                                <rect key="frame" x="20" y="88" width="374" height="721"/>
                                 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
-                                <dataDetectorType key="dataDetectorTypes"/>
-                            </webView>
+                                <wkWebViewConfiguration key="configuration">
+                                    <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
+                                    <wkPreferences key="preferences"/>
+                                </wkWebViewConfiguration>
+                            </wkWebView>
                         </subviews>
                         <color key="backgroundColor" red="0.9882352941176471" green="0.98039215686274506" blue="0.81176470588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <constraints>
-                            <constraint firstItem="9SS-TP-C7c" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" constant="16" id="L0M-Fx-f5N"/>
-                            <constraint firstAttribute="bottom" secondItem="9SS-TP-C7c" secondAttribute="bottom" constant="32" id="Xn1-j6-As3"/>
-                            <constraint firstItem="Tgh-Lc-vbE" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" constant="16" id="aoL-2Z-ve3"/>
-                            <constraint firstAttribute="trailing" secondItem="Tgh-Lc-vbE" secondAttribute="trailing" constant="16" id="fY6-BA-NIh"/>
-                            <constraint firstItem="Tgh-Lc-vbE" firstAttribute="top" secondItem="8bC-Xf-vdC" secondAttribute="top" constant="64" id="jmc-WH-cl4"/>
-                            <constraint firstItem="Tgh-Lc-vbE" firstAttribute="width" secondItem="9SS-TP-C7c" secondAttribute="width" id="vR1-iG-UWH"/>
-                            <constraint firstItem="9SS-TP-C7c" firstAttribute="top" secondItem="Tgh-Lc-vbE" secondAttribute="bottom" constant="8" id="xgU-d0-9TL"/>
+                            <constraint firstItem="ga1-Py-9re" firstAttribute="trailing" secondItem="9SS-TP-C7c" secondAttribute="trailing" id="3b6-rZ-W4R"/>
+                            <constraint firstItem="9SS-TP-C7c" firstAttribute="top" secondItem="ga1-Py-9re" secondAttribute="bottom" constant="8" id="B3O-hi-PRD"/>
+                            <constraint firstItem="ga1-Py-9re" firstAttribute="trailing" secondItem="8bC-Xf-vdC" secondAttribute="trailingMargin" id="Fxh-TE-BtG"/>
+                            <constraint firstItem="ga1-Py-9re" firstAttribute="leading" secondItem="9SS-TP-C7c" secondAttribute="leading" id="MhN-JS-MpC"/>
+                            <constraint firstItem="wfy-db-euE" firstAttribute="top" secondItem="9SS-TP-C7c" secondAttribute="bottom" constant="11" id="Yvi-br-VHk"/>
+                            <constraint firstItem="ga1-Py-9re" firstAttribute="top" secondItem="8bC-Xf-vdC" secondAttribute="topMargin" id="p9M-sp-ZwC"/>
+                            <constraint firstItem="ga1-Py-9re" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leadingMargin" id="pOi-3s-hrr"/>
                         </constraints>
                     </view>
-                    <navigationItem key="navigationItem" title="Ivy" id="KhW-J4-UcU">
-                        <barButtonItem key="rightBarButtonItem" title="Help" id="GSn-BW-al6">
+                    <navigationItem key="navigationItem" title="Ivy" id="9fD-A5-WTg">
+                        <barButtonItem key="rightBarButtonItem" title="Help" id="aDa-GJ-VpX">
                             <connections>
-                                <segue destination="rfr-rm-AXI" kind="show" id="bNF-6S-rOa"/>
+                                <segue destination="rfr-rm-AXI" kind="show" id="kuc-xA-dyM"/>
                             </connections>
                         </barButtonItem>
                     </navigationItem>
                     <connections>
-                        <outlet property="bottomConstraint" destination="Xn1-j6-As3" id="EKm-WV-Y1w"/>
+                        <outlet property="bottomConstraint" destination="Yvi-br-VHk" id="EKm-WV-Y1w"/>
                     </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="1069" y="386"/>
+            <point key="canvasLocation" x="990.40178571428567" y="382.60869565217394"/>
         </scene>
         <!--Navigation Controller-->
         <scene sceneID="ZgV-45-Pf8">
             <objects>
                 <navigationController automaticallyAdjustsScrollViewInsets="NO" id="mTw-C8-NzX" sceneMemberID="viewController">
                     <toolbarItems/>
-                    <navigationBar key="navigationBar" opaque="NO" contentMode="scaleToFill" barStyle="black" id="aev-Tm-XK3">
-                        <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+                    <navigationBar key="navigationBar" opaque="NO" contentMode="scaleToFill" id="aev-Tm-XK3">
+                        <rect key="frame" x="0.0" y="44" width="414" height="44"/>
                         <autoresizingMask key="autoresizingMask"/>
                         <color key="backgroundColor" red="1" green="1" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                        <color key="tintColor" cocoaTouchSystemColor="lightTextColor"/>
+                        <color key="barTintColor" red="1" green="1" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <navigationBarAppearance key="standardAppearance">
+                            <color key="backgroundColor" red="1" green="1" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        </navigationBarAppearance>
+                        <navigationBarAppearance key="compactAppearance">
+                            <color key="backgroundColor" red="1" green="1" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        </navigationBarAppearance>
+                        <navigationBarAppearance key="scrollEdgeAppearance">
+                            <color key="backgroundColor" red="1" green="1" blue="0.80392156859999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        </navigationBarAppearance>
                     </navigationBar>
                     <nil name="viewControllers"/>
+                    <toolbar key="toolbar" opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="smI-B7-WbU">
+                        <autoresizingMask key="autoresizingMask"/>
+                    </toolbar>
                     <connections>
                         <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="Nyy-d4-AXi"/>
                     </connections>
                 </navigationController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="i1l-Sg-DC5" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
-            <point key="canvasLocation" x="305" y="-371"/>
+            <point key="canvasLocation" x="271" y="386"/>
         </scene>
     </scenes>
 </document>
diff --git a/example/ivy/ios/ivy/DocsController.h b/example/ivy/ios/ivy/DocsController.h
index c29682e..beb2685 100644
--- a/example/ivy/ios/ivy/DocsController.h
+++ b/example/ivy/ios/ivy/DocsController.h
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-#import <UIKit/UIKit.h>
+#import <WebKit/WebKit.h>
 
 // DocsController displays the documentation page.
 @interface DocsController : UIViewController
diff --git a/example/ivy/ios/ivy/DocsController.m b/example/ivy/ios/ivy/DocsController.m
index 641d6e3..c9c57cf 100644
--- a/example/ivy/ios/ivy/DocsController.m
+++ b/example/ivy/ios/ivy/DocsController.m
@@ -5,7 +5,9 @@
 #import "DocsController.h"
 #import "mobile/Mobile.h"
 
-@interface DocsController ()
+@interface DocsController () {
+    WKWebView *webView;
+}
 
 @end
 
@@ -14,13 +16,21 @@
 - (void)viewDidLoad
 {
     [super viewDidLoad];
-    UIWebView *webView = (UIWebView *)[self.view viewWithTag:11];
+    webView = (WKWebView *)[self.view viewWithTag:11];
     NSString *helpHTML = MobileHelp();
-    [webView loadHTMLString:helpHTML baseURL:NULL];
-    if ([self respondsToSelector:@selector(
-                                     setAutomaticallyAdjustsScrollViewInsets:)]) {
-        self.automaticallyAdjustsScrollViewInsets = NO;
-    }
+    NSRange r = [helpHTML rangeOfString:@"<head>"];
+    NSString *html = [helpHTML substringToIndex:r.location];
+
+    // With the following meta tag, WKWebView displays the fonts more nicely.
+    NSString *meta = @"<meta name='viewport' \
+        content='width=device-width, initial-scale=1.0, maximum-scale=1.0, \
+        minimum-scale=1.0, user-scalable=no'>";
+
+    html = [html stringByAppendingString:@"<head>"];
+    html = [html stringByAppendingString:meta];
+    html = [html stringByAppendingString:[helpHTML substringFromIndex:r.location]];
+
+    [webView loadHTMLString:html baseURL:NULL];
 }
 
 - (void)didReceiveMemoryWarning
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json
index 295161a..466150b 100644
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -1,74 +1,272 @@
 {
   "images" : [
     {
+      "filename" : "icon-40.png",
       "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "2x"
+      "scale" : "2x",
+      "size" : "20x20"
     },
     {
+      "filename" : "icon-60.png",
       "idiom" : "iphone",
-      "size" : "29x29",
-      "scale" : "3x"
+      "scale" : "3x",
+      "size" : "20x20"
     },
     {
+      "filename" : "icon-58.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-87.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-80.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "icon-120.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "icon-120.png",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "icon-180.png",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "icon-20.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "icon-40.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "icon-29.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-58.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-40.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "icon-80.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "icon-76.png",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "icon-152.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "icon-167.png",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "83.5x83.5"
+    },
+    {
+      "filename" : "icon-1024.png",
+      "idiom" : "ios-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
+    },
+    {
+      "filename" : "icon-120.png",
+      "idiom" : "car",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "icon-180.png",
+      "idiom" : "car",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "icon-48.png",
+      "idiom" : "watch",
+      "role" : "notificationCenter",
+      "scale" : "2x",
+      "size" : "24x24",
+      "subtype" : "38mm"
+    },
+    {
+      "filename" : "icon-55.png",
+      "idiom" : "watch",
+      "role" : "notificationCenter",
+      "scale" : "2x",
+      "size" : "27.5x27.5",
+      "subtype" : "42mm"
+    },
+    {
+      "filename" : "icon-58.png",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-87.png",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "icon-80.png",
+      "idiom" : "watch",
+      "role" : "appLauncher",
+      "scale" : "2x",
       "size" : "40x40",
-      "idiom" : "iphone",
-      "filename" : "ivy-ios-80.png",
-      "scale" : "2x"
+      "subtype" : "38mm"
     },
     {
-      "size" : "40x40",
-      "idiom" : "iphone",
-      "filename" : "apple-touch-icon-120x120-1.png",
-      "scale" : "3x"
+      "filename" : "icon-88.png",
+      "idiom" : "watch",
+      "role" : "appLauncher",
+      "scale" : "2x",
+      "size" : "44x44",
+      "subtype" : "40mm"
     },
     {
-      "size" : "60x60",
-      "idiom" : "iphone",
-      "filename" : "apple-touch-icon-120x120.png",
-      "scale" : "2x"
+      "filename" : "icon-100.png",
+      "idiom" : "watch",
+      "role" : "appLauncher",
+      "scale" : "2x",
+      "size" : "50x50",
+      "subtype" : "44mm"
     },
     {
-      "size" : "60x60",
-      "idiom" : "iphone",
-      "filename" : "ivy-ios-180.png",
-      "scale" : "3x"
+      "filename" : "icon-172.png",
+      "idiom" : "watch",
+      "role" : "quickLook",
+      "scale" : "2x",
+      "size" : "86x86",
+      "subtype" : "38mm"
     },
     {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "1x"
+      "filename" : "icon-196.png",
+      "idiom" : "watch",
+      "role" : "quickLook",
+      "scale" : "2x",
+      "size" : "98x98",
+      "subtype" : "42mm"
     },
     {
-      "idiom" : "ipad",
-      "size" : "29x29",
-      "scale" : "2x"
+      "filename" : "icon-216.png",
+      "idiom" : "watch",
+      "role" : "quickLook",
+      "scale" : "2x",
+      "size" : "108x108",
+      "subtype" : "44mm"
     },
     {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "1x"
+      "filename" : "icon-1024.png",
+      "idiom" : "watch-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
     },
     {
-      "idiom" : "ipad",
-      "size" : "40x40",
-      "scale" : "2x"
+      "filename" : "icon-16.png",
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "16x16"
     },
     {
-      "size" : "76x76",
-      "idiom" : "ipad",
-      "filename" : "apple-touch-icon-76x76.png",
-      "scale" : "1x"
+      "filename" : "icon-32.png",
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "16x16"
     },
     {
-      "size" : "76x76",
-      "idiom" : "ipad",
-      "filename" : "apple-touch-icon-152x152.png",
-      "scale" : "2x"
+      "filename" : "icon-32.png",
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "32x32"
+    },
+    {
+      "filename" : "icon-64.png",
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "32x32"
+    },
+    {
+      "filename" : "icon-128.png",
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "128x128"
+    },
+    {
+      "filename" : "icon-256.png",
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "128x128"
+    },
+    {
+      "filename" : "icon-256.png",
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "256x256"
+    },
+    {
+      "filename" : "icon-512.png",
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "256x256"
+    },
+    {
+      "filename" : "icon-512.png",
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "512x512"
+    },
+    {
+      "filename" : "icon-1024.png",
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "512x512"
     }
   ],
   "info" : {
-    "version" : 1,
-    "author" : "xcode"
+    "author" : "xcode",
+    "version" : 1
   }
-}
\ No newline at end of file
+}
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png
deleted file mode 100644
index f3db5c3..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120-1.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120.png
deleted file mode 100644
index f3db5c3..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-120x120.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-152x152.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-152x152.png
deleted file mode 100644
index 0a495d3..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-152x152.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-76x76.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-76x76.png
deleted file mode 100644
index b0be2a7..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/apple-touch-icon-76x76.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-100.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-100.png
new file mode 100644
index 0000000..4e5e8d5
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-100.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-1024.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-1024.png
new file mode 100644
index 0000000..731baac
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-1024.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-120.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-120.png
new file mode 100644
index 0000000..af31842
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-120.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-128.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-128.png
new file mode 100644
index 0000000..61ddbf1
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-128.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-152.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-152.png
new file mode 100644
index 0000000..e6b1af5
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-152.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-16.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-16.png
new file mode 100644
index 0000000..dd8fc79
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-16.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-167.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-167.png
new file mode 100644
index 0000000..0bfb7a6
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-167.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-172.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-172.png
new file mode 100644
index 0000000..c83545b
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-172.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-180.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-180.png
new file mode 100644
index 0000000..4ca288e
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-180.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-196.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-196.png
new file mode 100644
index 0000000..3f71308
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-196.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-20.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-20.png
new file mode 100644
index 0000000..ca3b5e7
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-20.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-216.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-216.png
new file mode 100644
index 0000000..c0f27b3
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-216.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-256.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-256.png
new file mode 100644
index 0000000..c5d4aa8
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-256.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-29.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-29.png
new file mode 100644
index 0000000..a50b9ab
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-29.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-32.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-32.png
new file mode 100644
index 0000000..f087f8c
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-32.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-40.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-40.png
new file mode 100644
index 0000000..5a1b2b3
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-40.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-48.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-48.png
new file mode 100644
index 0000000..04e5647
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-48.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-512.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-512.png
new file mode 100644
index 0000000..87aa566
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-512.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-55.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-55.png
new file mode 100644
index 0000000..469cedc
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-55.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-58.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-58.png
new file mode 100644
index 0000000..cfb50b0
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-58.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-60.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-60.png
new file mode 100644
index 0000000..fb0ae29
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-60.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-64.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-64.png
new file mode 100644
index 0000000..442830d
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-64.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-76.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-76.png
new file mode 100644
index 0000000..292ac86
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-76.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-80.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-80.png
new file mode 100644
index 0000000..39755e6
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-80.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-87.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-87.png
new file mode 100644
index 0000000..72a8f26
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-87.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-88.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-88.png
new file mode 100644
index 0000000..177a834
--- /dev/null
+++ b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/icon-88.png
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-180.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-180.png
deleted file mode 100644
index 2c996eb..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-180.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-80.png b/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-80.png
deleted file mode 100644
index 1e3c7c1..0000000
--- a/example/ivy/ios/ivy/Images.xcassets/AppIcon.appiconset/ivy-ios-80.png
+++ /dev/null
Binary files differ
diff --git a/example/ivy/ios/ivy/Info.plist b/example/ivy/ios/ivy/Info.plist
index 559e2b5..aad4905 100644
--- a/example/ivy/ios/ivy/Info.plist
+++ b/example/ivy/ios/ivy/Info.plist
@@ -2,6 +2,8 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>UIUserInterfaceStyle</key>
+	<string>Light</string>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>en</string>
 	<key>CFBundleDisplayName</key>
@@ -9,7 +11,7 @@
 	<key>CFBundleExecutable</key>
 	<string>$(EXECUTABLE_NAME)</string>
 	<key>CFBundleIdentifier</key>
-	<string>com.google.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
@@ -30,6 +32,8 @@
 	<string>Main</string>
 	<key>UIRequiredDeviceCapabilities</key>
 	<array/>
+	<key>UIRequiresFullScreen</key>
+	<false/>
 	<key>UISupportedInterfaceOrientations</key>
 	<array>
 		<string>UIInterfaceOrientationPortrait</string>
@@ -41,6 +45,8 @@
 	<array>
 		<string>UIInterfaceOrientationPortrait</string>
 		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
 	</array>
 </dict>
 </plist>
diff --git a/example/ivy/ios/ivy/IvyController.h b/example/ivy/ios/ivy/IvyController.h
index 3bca62a..0d78d9c 100644
--- a/example/ivy/ios/ivy/IvyController.h
+++ b/example/ivy/ios/ivy/IvyController.h
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+#import <WebKit/WebKit.h>
 #import <UIKit/UIKit.h>
 #import "Suggestion.h"
 
 // IvyController displays the main app view.
 @interface IvyController
-    : UIViewController <UITextFieldDelegate, UIWebViewDelegate,
+    : UIViewController <UITextFieldDelegate, WKUIDelegate,
                         SuggestionDelegate>
 
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint;
 
-// A text input field coupled to an output "tape", rendered with a UIWebView.
+// A text input field coupled to an output "tape", rendered with a WKWebView.
 @property (strong, nonatomic) UITextField *input;
 @property (strong, nonatomic) Suggestion *suggestionView;
-@property (strong, nonatomic) UIWebView *tape;
+@property (strong, nonatomic) WKWebView *tape;
 
 @end
diff --git a/example/ivy/ios/ivy/IvyController.m b/example/ivy/ios/ivy/IvyController.m
index f8ccaea..42e4dd7 100644
--- a/example/ivy/ios/ivy/IvyController.m
+++ b/example/ivy/ios/ivy/IvyController.m
@@ -23,8 +23,8 @@
     self.suggestionView = [[Suggestion alloc] init];
     self.suggestionView.delegate = self;
 
-    self.tape = (UIWebView *)[self.view viewWithTag:2];
-    self.tape.delegate = self;
+    self.tape = [self.view viewWithTag:2];
+    self.tape.UIDelegate = self;
 
     [[NSNotificationCenter defaultCenter]
         addObserver:self
@@ -46,10 +46,15 @@
         [[NSBundle mainBundle] URLForResource:@"tape" withExtension:@"html"];
     NSURLRequest *request = [NSURLRequest requestWithURL:bundleURL];
     [self.tape loadRequest:request];
-    self.tape.delegate = self;
+    self.tape.UIDelegate = self;
     [self.input becomeFirstResponder];
 }
 
+- (void)viewDidAppear:(BOOL)animated
+{
+    [self.view endEditing:YES];
+}
+
 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
 {
     if ([textField isEqual:self.input]) {
@@ -77,8 +82,8 @@
         [self
             appendTape:[NSString stringWithFormat:@"<b>%@</b>", [self.input text]]];
         NSString *expr = [self.input.text stringByAppendingString:@"\n"];
-        NSString *result;
-        NSError *err = MobileEval(expr, &result);
+        NSError *err;
+        NSString *result = MobileEval(expr, &err);
         if (err != nil) {
             result = err.description;
         }
@@ -130,7 +135,7 @@
         delay:0
         options:options
         animations:^{
-        self.bottomConstraint.constant = kbFrame.size.height + 32;
+        self.bottomConstraint.constant = kbFrame.size.height;
         [self.view layoutIfNeeded];
         }
         completion:^(BOOL finished) {
@@ -166,14 +171,14 @@
 - (void)scrollTapeToBottom
 {
     NSString *scroll = @"window.scrollBy(0, document.body.offsetHeight);";
-    [self.tape stringByEvaluatingJavaScriptFromString:scroll];
+    [self.tape evaluateJavaScript:scroll completionHandler:nil];
 }
 
 - (void)appendTape:(NSString *)text
 {
     NSString *injectSrc = @"appendDiv('%@');";
     NSString *runToInject = [NSString stringWithFormat:injectSrc, text];
-    [self.tape stringByEvaluatingJavaScriptFromString:runToInject];
+    [self.tape evaluateJavaScript:runToInject completionHandler:nil];
 }
 
 @end
diff --git a/example/ivy/ios/ivy/Launch.storyboard b/example/ivy/ios/ivy/Launch.storyboard
deleted file mode 100644
index 10ce963..0000000
--- a/example/ivy/ios/ivy/Launch.storyboard
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Je6-Vd-UK0">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
-    </dependencies>
-    <scenes>
-        <!--Ivy-->
-        <scene sceneID="Cg9-fz-KQ0">
-            <objects>
-                <viewController id="q4c-m3-eMP" sceneMemberID="viewController">
-                    <layoutGuides>
-                        <viewControllerLayoutGuide type="top" id="aQh-FK-ySS"/>
-                        <viewControllerLayoutGuide type="bottom" id="g6W-0l-hXo"/>
-                    </layoutGuides>
-                    <view key="view" contentMode="scaleToFill" id="EGD-xr-ybO">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Type an expression" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="8Hr-jh-68p">
-                                <rect key="frame" x="16" y="538" width="568" height="30"/>
-                                <color key="backgroundColor" red="0.9882352941176471" green="0.98039215686274506" blue="0.81176470588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="14"/>
-                                <textInputTraits key="textInputTraits"/>
-                            </textField>
-                        </subviews>
-                        <color key="backgroundColor" red="0.9882352941176471" green="0.98039215686274506" blue="0.81176470588235294" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                        <constraints>
-                            <constraint firstAttribute="bottom" secondItem="8Hr-jh-68p" secondAttribute="bottom" constant="32" id="9Iw-uB-UB9"/>
-                            <constraint firstAttribute="trailing" secondItem="8Hr-jh-68p" secondAttribute="trailing" constant="16" id="OJq-r1-Z32"/>
-                            <constraint firstItem="8Hr-jh-68p" firstAttribute="leading" secondItem="EGD-xr-ybO" secondAttribute="leading" constant="16" id="SZn-Fs-u3S"/>
-                        </constraints>
-                    </view>
-                    <navigationItem key="navigationItem" title="Ivy" id="r1v-ZR-dJA"/>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="jy3-Sq-DLe" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="1281" y="-205"/>
-        </scene>
-        <!--Navigation Controller-->
-        <scene sceneID="fyF-Os-Uj2">
-            <objects>
-                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="Je6-Vd-UK0" sceneMemberID="viewController">
-                    <toolbarItems/>
-                    <navigationBar key="navigationBar" contentMode="scaleToFill" barStyle="black" id="W8Y-Y5-bE1">
-                        <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
-                        <autoresizingMask key="autoresizingMask"/>
-                    </navigationBar>
-                    <nil name="viewControllers"/>
-                    <connections>
-                        <segue destination="q4c-m3-eMP" kind="relationship" relationship="rootViewController" id="R2u-45-ffm"/>
-                    </connections>
-                </navigationController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="r6I-II-OCI" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="469" y="-205"/>
-        </scene>
-    </scenes>
-</document>
diff --git a/example/ivy/ios/ivy/Suggestion.m b/example/ivy/ios/ivy/Suggestion.m
index 509d587..193c846 100644
--- a/example/ivy/ios/ivy/Suggestion.m
+++ b/example/ivy/ios/ivy/Suggestion.m
@@ -169,7 +169,7 @@
 
                  if ([self.delegate
                          respondsToSelector:@selector(suggestionReplace:)]) {
-                   NSString *t = text;
+                   NSString *t = self->text;
                    if (t == nil) {
                      t = @"";
                    }
@@ -177,8 +177,8 @@
                      // Special case for +, -, *, /.
                      t = [t stringByAppendingString:button.currentTitle];
                    } else {
-                     t = [text stringByReplacingCharactersInRange:
-                                   range withString:button.currentTitle];
+                     t = [self->text stringByReplacingCharactersInRange:
+                          self->range withString:button.currentTitle];
                    }
                    [self performSelector:@selector(suggestionReplace:)
                               withObject:t
diff --git a/example/ivy/ios/ivy/en.lproj/Main.strings b/example/ivy/ios/ivy/en.lproj/Main.strings
new file mode 100644
index 0000000..ba0d8b7
--- /dev/null
+++ b/example/ivy/ios/ivy/en.lproj/Main.strings
@@ -0,0 +1,18 @@
+
+/* Class = "UITextField"; placeholder = "Type an expression"; ObjectID = "9SS-TP-C7c"; */
+"9SS-TP-C7c.placeholder" = "Type an expression";
+
+/* Class = "UIViewController"; title = "Ivy Controller"; ObjectID = "BYZ-38-t0r"; */
+"BYZ-38-t0r.title" = "Ivy Controller";
+
+/* Class = "UIBarButtonItem"; title = "Help"; ObjectID = "GSn-BW-al6"; */
+"GSn-BW-al6.title" = "Help";
+
+/* Class = "UINavigationItem"; title = "Ivy"; ObjectID = "KhW-J4-UcU"; */
+"KhW-J4-UcU.title" = "Ivy";
+
+/* Class = "UINavigationItem"; title = "Documentation"; ObjectID = "lf7-H3-aZF"; */
+"lf7-H3-aZF.title" = "Documentation";
+
+/* Class = "UIViewController"; title = "Docs"; ObjectID = "rfr-rm-AXI"; */
+"rfr-rm-AXI.title" = "Docs";
diff --git a/example/ivy/ios/ivy/tape.html b/example/ivy/ios/ivy/tape.html
index 67369b7..4b9c796 100644
--- a/example/ivy/ios/ivy/tape.html
+++ b/example/ivy/ios/ivy/tape.html
@@ -5,18 +5,19 @@
 -->
 <html>
 <head>
+<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'>
 <style>
 body {
 	padding: 0;
 	margin: 0;
+	margin-top: 20px;
 	font-family: Menlo, monospace;
 }
 
 .flowhide {
 	text-overflow: ellipsis;
-	word-break: break-all;
-	white-space: nowrap;
-	overflow: hidden;
+	word-break: break-word;
+	overflow-wrap: break-word;
 }
 
 .flowshow {
@@ -29,8 +30,8 @@
 	el.classList.toggle("flowshow");
 }
 function appendDiv(text) {
-    var el = document.createElement("div");
-    el.classList.add("flowhide");
+	var el = document.createElement("div");
+	el.classList.add("flowhide");
 	el.innerHTML = text;
 	el.onclick = function() {
 		flowclick(el);