diff --git a/scripts/data/da/cli.json b/scripts/data/da/cli.json
new file mode 100644
index 0000000000..e3e0d1e260
--- /dev/null
+++ b/scripts/data/da/cli.json
@@ -0,0 +1,3680 @@
+{
+ "type": "angular",
+ "name": "ionic",
+ "summary": "",
+ "description": "",
+ "groups": [
+
+ ],
+ "commands": [
+ {
+ "name": "ionic build",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Build web assets and prepare your app for any platform targets",
+ "description": "`ionic build` will perform an Ionic build, which compiles web assets and prepares them for deployment.\n\n`ionic build` uses the Angular CLI. Use `ng build --help` to list all Angular CLI options for building your app. See the `ng build` [docs](https://angular.io/cli/build) for explanations. Options not listed below are considered advanced and can be passed to the `ng` CLI using the `--` separator after the Ionic CLI arguments. See the examples.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic build ",
+ "ionic build --prod"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ },
+ {
+ "name": "engine",
+ "type": "string",
+ "summary": "Target engine (e.g. `browser`, `cordova`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "engine"
+ }
+ },
+ {
+ "name": "platform",
+ "type": "string",
+ "summary": "Target platform on chosen engine (e.g. `ios`, `android`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "platform"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor add",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Add a native platform to your Ionic project",
+ "description": "`ionic capacitor add` will do the following:\n- Add a new platform specific folder to your project (ios, android, or electron)",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to add (e.g. `android`, `ios`, `electron`)",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor copy",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Copy web assets to native platforms",
+ "description": "`ionic capacitor copy` will do the following:\n- Copy the **www/** directory into your native platforms.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to copy (e.g. `android`, `ios`, `electron`)",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor open",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Open the IDE for a given native platform project",
+ "description": "`ionic capacitor open` will do the following:\n- Open the IDE for your native project (Xcode for iOS, Android Studio for Android)",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to open (e.g. `android`, `ios`)",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor run",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Run an Ionic project on a connected device",
+ "description": "`ionic capacitor run` will do the following:\n- Perform `ionic build` (or run the dev server from `ionic serve` with the `--livereload` option)\n- Copy web assets into the specified native platform\n- Open the IDE for your native project (Xcode for iOS, Android Studio for Android)\n\nOnce the web assets and configuration are copied into your native project, the app can run on devices and emulators/simulators using the native IDE. Unfortunately, programmatically building and launching the native project is not yet supported.\n\nFor Android and iOS, you can setup Remote Debugging on your device with browser development tools using these [docs](https://ionicframework.com/docs/developer-resources/developer-tips).",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic capacitor run ",
+ "ionic capacitor run android",
+ "ionic capacitor run android -l",
+ "ionic capacitor run ios --livereload",
+ "ionic capacitor run ios --livereload-url=http://localhost:8100"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to run (e.g. `android`, `ios`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "build",
+ "type": "boolean",
+ "summary": "Do not invoke Ionic build",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "address",
+ "type": "string",
+ "summary": "Use specific address for the dev server",
+ "default": "0.0.0.0",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "address"
+ }
+ },
+ {
+ "name": "port",
+ "type": "string",
+ "summary": "Use specific port for HTTP",
+ "default": "8100",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "p"
+ ],
+ "spec": {
+ "value": "port"
+ }
+ },
+ {
+ "name": "livereload",
+ "type": "boolean",
+ "summary": "Spin up dev server to live-reload www files",
+ "groups": [
+
+ ],
+ "aliases": [
+ "l"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "livereload-url",
+ "type": "string",
+ "summary": "Provide a custom URL to the dev server",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "url"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ },
+ {
+ "name": "ssl",
+ "type": "boolean",
+ "summary": "Use HTTPS for the dev server",
+ "groups": [
+ "experimental",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "devapp",
+ "type": "boolean",
+ "summary": "Publish DevApp service",
+ "default": false,
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor sync",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Sync (copy + update) an Ionic project",
+ "description": "`ionic capacitor sync` will do the following:\n- Copy web assets to all Capacitor native platforms\n- Update each Capacitor native platforms, such as any dependencies that need updating.\n- Install any discovered Capacitor or Cordova plugins.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to sync (e.g. `android`, `ios`, `electron`)",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic capacitor update",
+ "namespace": [
+ "ionic",
+ "capacitor"
+ ],
+ "summary": "Update Capacitor native platforms, install Capacitor/Cordova plugins",
+ "description": "`ionic capacitor update` will do the following:\n- Update each Capacitor native project, such as any dependencies that need updating.\n- Install any discovered Capacitor or Cordova plugins.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to update (e.g. `android`, `ios`, `electron`)",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic config get",
+ "namespace": [
+ "ionic",
+ "config"
+ ],
+ "summary": "Print config values",
+ "description": "This command reads and prints configuration values from the project's **./ionic.config.json** file. It can also operate on the global CLI configuration (**~/.ionic/config.json**) using the `--global` option.\n\nFor nested properties, separate nest levels with dots. For example, the property name `integrations.cordova` will look in the **integrations** object for the **cordova** property.\n\nWithout a `property` argument, this command prints out the entire config.\n\nFor multi-app projects, this command is scoped to the current project by default. To operate at the root of the project configuration file instead, use the `--root` option.\n\nIf you are using this command programmatically, you can use the `--json` option.\n\nThis command will sanitize config output for known sensitive fields (disabled when using `--json`).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic config get ",
+ "ionic config get id",
+ "ionic config get --global user.email",
+ "ionic config get -g npmClient"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "property",
+ "summary": "The property name you wish to get",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "global",
+ "type": "boolean",
+ "summary": "Use global CLI config",
+ "groups": [
+
+ ],
+ "aliases": [
+ "g"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Output config values in JSON",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "root",
+ "type": "boolean",
+ "summary": "Operate on root of **./ionic.config.json**",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic config set",
+ "namespace": [
+ "ionic",
+ "config"
+ ],
+ "summary": "Set config values",
+ "description": "This command writes configuration values to the project's **./ionic.config.json** file. It can also operate on the global CLI configuration (**~/.ionic/config.json**) using the `--global` option.\n\nFor nested properties, separate nest levels with dots. For example, the property name `integrations.cordova` will look in the **integrations** object for the **cordova** property.\n\nFor multi-app projects, this command is scoped to the current project by default. To operate at the root of the project configuration file instead, use the `--root` option.\n\nThis command will attempt to coerce `value` into a suitable JSON type. If it is JSON-parsable, such as `123`, `true`, `[]`, etc., then it takes the parsed result. Otherwise, the value is interpreted as a string. For stricter input, use `--json`, which will error with non-JSON values.\n\nBy default, if `property` exists and is an object or an array, the value is not overwritten. To disable this check and always overwrite the property, use `--force`.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic config set name newAppName",
+ "ionic config set name \"\\\"newAppName\\\"\" --json",
+ "ionic config set -g interactive false"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "property",
+ "summary": "The property name you wish to set",
+ "required": true
+ },
+ {
+ "name": "value",
+ "summary": "The new value of the given property",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "global",
+ "type": "boolean",
+ "summary": "Use global CLI config",
+ "groups": [
+
+ ],
+ "aliases": [
+ "g"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Always interpret `value` as JSON",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "force",
+ "type": "boolean",
+ "summary": "Always overwrite existing values",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "root",
+ "type": "boolean",
+ "summary": "Operate on root of **./ionic.config.json**",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic config unset",
+ "namespace": [
+ "ionic",
+ "config"
+ ],
+ "summary": "Delete config values",
+ "description": "This command deletes configuration values from the project's **./ionic.config.json** file. It can also operate on the global CLI configuration (**~/.ionic/config.json**) using the `--global` option.\n\nFor nested properties, separate nest levels with dots. For example, the property name `integrations.cordova` will look in the **integrations** object for the **cordova** property.\n\nFor multi-app projects, this command is scoped to the current project by default. To operate at the root of the project configuration file instead, use the `--root` option.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic config unset ",
+ "ionic config unset type",
+ "ionic config unset --global git.setup",
+ "ionic config unset -g interactive"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "property",
+ "summary": "The property name you wish to delete",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "global",
+ "type": "boolean",
+ "summary": "Use global CLI config",
+ "groups": [
+
+ ],
+ "aliases": [
+ "g"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "root",
+ "type": "boolean",
+ "summary": "Operate on root of **./ionic.config.json**",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic cordova build",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Build (prepare + compile) an Ionic project for a given platform",
+ "description": "Like running `cordova build` directly, but also builds web assets with configuration from `ionic build` and provides friendly checks.\n\nTo pass additional options to the Cordova CLI, use the `--` separator after the Ionic CLI arguments.\n\nThe Cordova CLI requires a separator for platform-specific arguments for Android [builds](https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#using-flags), so an additional separator is required for the Ionic CLI, but it is not required for iOS [builds](https://cordova.apache.org/docs/en/latest/guide/platforms/ios/index.html#using-flags). See the example commands for usage with separators. To avoid using flags, consider using `--buildConfig` with a **build.json** file.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova build android",
+ "ionic cordova build android --buildConfig=build.json",
+ "ionic cordova build android --prod --release -- -- --gradleArg=-PcdvBuildMultipleApks=true",
+ "ionic cordova build android --prod --release -- -- --keystore=filename.keystore --alias=myalias",
+ "ionic cordova build android --prod --release -- -- --minSdkVersion=21",
+ "ionic cordova build android --prod --release -- -- --versionCode=55",
+ "ionic cordova build android --prod --release --buildConfig=build.json",
+ "ionic cordova build ios",
+ "ionic cordova build ios --buildConfig=build.json",
+ "ionic cordova build ios --prod --release",
+ "ionic cordova build ios --prod --release -- --developmentTeam=\"ABCD\" --codeSignIdentity=\"iPhone Developer\" --packageType=\"app-store\"",
+ "ionic cordova build ios --prod --release --buildConfig=build.json"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to build (e.g. `android`, `ios`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "build",
+ "type": "boolean",
+ "summary": "Do not invoke an Ionic build",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "debug",
+ "type": "boolean",
+ "summary": "Mark as a debug build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "release",
+ "type": "boolean",
+ "summary": "Mark as a release build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "device",
+ "type": "boolean",
+ "summary": "Deploy build to a device",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "emulator",
+ "type": "boolean",
+ "summary": "Deploy build to an emulator",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "buildConfig",
+ "type": "string",
+ "summary": "Use the specified build configuration",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "file"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova compile",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Compile native platform code",
+ "description": "Like running `cordova compile` directly, but provides friendly checks.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova compile ios",
+ "ionic cordova compile ios --device",
+ "ionic cordova compile android"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to compile (`android`, `ios`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "debug",
+ "type": "boolean",
+ "summary": "Mark as a debug build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "release",
+ "type": "boolean",
+ "summary": "Mark as a release build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "device",
+ "type": "boolean",
+ "summary": "Deploy build to a device",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "emulator",
+ "type": "boolean",
+ "summary": "Deploy build to an emulator",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "buildConfig",
+ "type": "string",
+ "summary": "Use the specified build configuration",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "file"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova emulate",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Emulate an Ionic project on a simulator/emulator",
+ "description": "Like running `cordova run` or `cordova emulate` directly, but performs `ionic build` before deploying to the device or emulator. Optionally specify the `--livereload` option to use the dev server from `ionic serve` for livereload functionality.\n\nFor Android and iOS, you can setup Remote Debugging on your device with browser development tools using these [docs](https://ionicframework.com/docs/developer-resources/developer-tips).\n\nJust like with `ionic cordova build`, you can pass additional options to the Cordova CLI using the `--` separator. To pass additional options to the dev server, consider using `ionic serve` and the `--livereload-url` option.\n\nWith the experimental `--native-run` flag, this command will first use Cordova to build your app, and then it will run it on a device using the `native-run` [utility](https://github.com/ionic-team/native-run) instead of Cordova.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic cordova emulate android",
+ "ionic cordova emulate android --buildConfig=build.json",
+ "ionic cordova emulate android --prod --release -- -- --gradleArg=-PcdvBuildMultipleApks=true",
+ "ionic cordova emulate android --prod --release -- -- --keystore=filename.keystore --alias=myalias",
+ "ionic cordova emulate android --prod --release -- -- --minSdkVersion=21",
+ "ionic cordova emulate android --prod --release -- -- --versionCode=55",
+ "ionic cordova emulate android --prod --release --buildConfig=build.json",
+ "ionic cordova emulate android -l",
+ "ionic cordova emulate ios",
+ "ionic cordova emulate ios --buildConfig=build.json",
+ "ionic cordova emulate ios --livereload",
+ "ionic cordova emulate ios --livereload-url=http://localhost:8100",
+ "ionic cordova emulate ios --prod --release",
+ "ionic cordova emulate ios --prod --release -- --developmentTeam=\"ABCD\" --codeSignIdentity=\"iPhone Developer\" --packageType=\"app-store\"",
+ "ionic cordova emulate ios --prod --release --buildConfig=build.json"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to run (e.g. `android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "list",
+ "type": "boolean",
+ "summary": "List all available targets",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "build",
+ "type": "boolean",
+ "summary": "Do not invoke Ionic build",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "address",
+ "type": "string",
+ "summary": "Use specific address for the dev server",
+ "default": "0.0.0.0",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "address"
+ }
+ },
+ {
+ "name": "port",
+ "type": "string",
+ "summary": "Use specific port for HTTP",
+ "default": "8100",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "p"
+ ],
+ "spec": {
+ "value": "port"
+ }
+ },
+ {
+ "name": "livereload",
+ "type": "boolean",
+ "summary": "Spin up dev server to live-reload www files",
+ "groups": [
+
+ ],
+ "aliases": [
+ "l"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "livereload-url",
+ "type": "string",
+ "summary": "Provide a custom URL to the dev server",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "url"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ },
+ {
+ "name": "ssl",
+ "type": "boolean",
+ "summary": "Use HTTPS for the dev server",
+ "groups": [
+ "experimental",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "debug",
+ "type": "boolean",
+ "summary": "Mark as a debug build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "release",
+ "type": "boolean",
+ "summary": "Mark as a release build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "device",
+ "type": "boolean",
+ "summary": "Deploy build to a device",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "emulator",
+ "type": "boolean",
+ "summary": "Deploy build to an emulator",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "buildConfig",
+ "type": "string",
+ "summary": "Use the specified build configuration",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "file"
+ }
+ },
+ {
+ "name": "target",
+ "type": "string",
+ "summary": "Deploy build to a device (use `--list` to see all)",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "target"
+ }
+ },
+ {
+ "name": "native-run",
+ "type": "boolean",
+ "summary": "Use `native-run` instead of Cordova for running the app",
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "connect",
+ "type": "boolean",
+ "summary": "Do not tie the running app to the process",
+ "default": true,
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Output `--list` targets in JSON",
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova platform",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Manage Cordova platform targets",
+ "description": "Like running `cordova platform` directly, but adds default Ionic icons and splash screen resources (during `add`) and provides friendly checks.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova platform ",
+ "ionic cordova platform add ios",
+ "ionic cordova platform add android",
+ "ionic cordova platform rm ios"
+ ],
+ "aliases": [
+ "ionic cordova platforms"
+ ],
+ "inputs": [
+ {
+ "name": "action",
+ "summary": "`add`, `remove`, or `update` a platform; `ls`, `check`, or `save` all project platforms",
+ "required": false
+ },
+ {
+ "name": "platform",
+ "summary": "The platform that you would like to add (`android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "resources",
+ "type": "boolean",
+ "summary": "Do not pregenerate icons and splash screen resources (corresponds to `add`)",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova plugin",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Manage Cordova plugins",
+ "description": "Like running `cordova plugin` directly, but provides friendly checks.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova plugin ",
+ "ionic cordova plugin add cordova-plugin-inappbrowser@latest",
+ "ionic cordova plugin add phonegap-plugin-push --variable SENDER_ID=XXXXX",
+ "ionic cordova plugin rm cordova-plugin-camera"
+ ],
+ "aliases": [
+ "ionic cordova plugins"
+ ],
+ "inputs": [
+ {
+ "name": "action",
+ "summary": "`add` or `remove` a plugin; `ls` or `save` all project plugins",
+ "required": false
+ },
+ {
+ "name": "plugin",
+ "summary": "The name of the plugin (corresponds to `add` and `remove`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "force",
+ "type": "boolean",
+ "summary": "Force overwrite the plugin if it exists (corresponds to `add`)",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "variable",
+ "type": "string",
+ "summary": "Specify plugin variables",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "KEY=VALUE"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova prepare",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Copies assets to Cordova platforms, preparing them for native builds",
+ "description": "`ionic cordova prepare` will do the following:\n\n- Perform an Ionic build, which compiles web assets to **www/**.\n- Copy the **www/** directory into your Cordova platforms.\n- Transform **config.xml** into platform-specific manifest files.\n- Copy icons and splash screens from **resources/** to into your Cordova platforms.\n- Copy plugin files into specified platforms.\n\nYou may wish to use `ionic cordova prepare` if you run your project with Android Studio or Xcode.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova prepare ",
+ "ionic cordova prepare ios",
+ "ionic cordova prepare android"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform you would like to prepare (e.g. `android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "build",
+ "type": "boolean",
+ "summary": "Do not invoke an Ionic build",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova requirements",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Checks and print out all the requirements for platforms",
+ "description": "Like running `cordova requirements` directly, but provides friendly checks.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform for which you would like to gather requirements (`android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova resources",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Automatically create icon and splash screen resources",
+ "description": "Ionic can automatically generate perfectly sized icons and splash screens from source images (**.png**, **.psd**, or **.ai**) for your Cordova platforms.\n\nThe source image for icons should ideally be at least **1024×1024px** and located at **resources/icon.png**. The source image for splash screens should ideally be at least **2732×2732px** and located at **resources/splash.png**. If you used `ionic start`, there should already be default Ionic resources in the **resources/** directory, which you can overwrite.\n\nYou can also generate platform-specific icons and splash screens by placing them in the respective **resources//** directory. For example, to generate an icon for Android, place your image at **resources/android/icon.png**.\n\nBy default, this command will not regenerate resources whose source image has not changed. To disable this functionality and always overwrite generated images, use `--force`.\n\nFor best results, the splash screen's artwork should roughly fit within a square (**1200×1200px**) at the center of the image. You can use **[https://code.ionicframework.com/resources/splash.psd](https://code.ionicframework.com/resources/splash.psd)** as a template for your splash screen.\n\n`ionic cordova resources` will automatically update your **config.xml** to reflect the changes in the generated images, which Cordova then configures.\n\nCordova reference documentation:\n- Icons: **[https://cordova.apache.org/docs/en/latest/config_ref/images.html](https://cordova.apache.org/docs/en/latest/config_ref/images.html)**\n- Splash Screens: **[https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-splashscreen/)**\n\nThis command uses Ionic servers and we require you to be logged into your free Ionic account. Use `ionic login` to login.\n\nWith the experimental `--cordova-res` option, `ionic cordova resources` will generate resources locally using the `cordova-res` [utility](https://github.com/ionic-team/cordova-res).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic cordova resources ",
+ "ionic cordova resources ios",
+ "ionic cordova resources android"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform for which you would like to generate resources (`android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "force",
+ "type": "boolean",
+ "summary": "Force regeneration of resources",
+ "groups": [
+
+ ],
+ "aliases": [
+ "f"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "icon",
+ "type": "boolean",
+ "summary": "Generate icon resources",
+ "groups": [
+
+ ],
+ "aliases": [
+ "i"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "splash",
+ "type": "boolean",
+ "summary": "Generate splash screen resources",
+ "groups": [
+
+ ],
+ "aliases": [
+ "s"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "cordova-res",
+ "type": "boolean",
+ "summary": "Use `cordova-res` instead of Ionic resource server",
+ "groups": [
+ "experimental"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic cordova run",
+ "namespace": [
+ "ionic",
+ "cordova"
+ ],
+ "summary": "Run an Ionic project on a connected device",
+ "description": "Like running `cordova run` or `cordova emulate` directly, but performs `ionic build` before deploying to the device or emulator. Optionally specify the `--livereload` option to use the dev server from `ionic serve` for livereload functionality.\n\nFor Android and iOS, you can setup Remote Debugging on your device with browser development tools using these [docs](https://ionicframework.com/docs/developer-resources/developer-tips).\n\nJust like with `ionic cordova build`, you can pass additional options to the Cordova CLI using the `--` separator. To pass additional options to the dev server, consider using `ionic serve` and the `--livereload-url` option.\n\nWith the experimental `--native-run` flag, this command will first use Cordova to build your app, and then it will run it on a device using the `native-run` [utility](https://github.com/ionic-team/native-run) instead of Cordova.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic cordova run android",
+ "ionic cordova run android --buildConfig=build.json",
+ "ionic cordova run android --prod --release -- -- --gradleArg=-PcdvBuildMultipleApks=true",
+ "ionic cordova run android --prod --release -- -- --keystore=filename.keystore --alias=myalias",
+ "ionic cordova run android --prod --release -- -- --minSdkVersion=21",
+ "ionic cordova run android --prod --release -- -- --versionCode=55",
+ "ionic cordova run android --prod --release --buildConfig=build.json",
+ "ionic cordova run android -l",
+ "ionic cordova run ios",
+ "ionic cordova run ios --buildConfig=build.json",
+ "ionic cordova run ios --livereload",
+ "ionic cordova run ios --livereload-url=http://localhost:8100",
+ "ionic cordova run ios --prod --release",
+ "ionic cordova run ios --prod --release -- --developmentTeam=\"ABCD\" --codeSignIdentity=\"iPhone Developer\" --packageType=\"app-store\"",
+ "ionic cordova run ios --prod --release --buildConfig=build.json"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to run (e.g. `android`, `ios`)",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "list",
+ "type": "boolean",
+ "summary": "List all available targets",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "build",
+ "type": "boolean",
+ "summary": "Do not invoke Ionic build",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "address",
+ "type": "string",
+ "summary": "Use specific address for the dev server",
+ "default": "0.0.0.0",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "address"
+ }
+ },
+ {
+ "name": "port",
+ "type": "string",
+ "summary": "Use specific port for HTTP",
+ "default": "8100",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "p"
+ ],
+ "spec": {
+ "value": "port"
+ }
+ },
+ {
+ "name": "livereload",
+ "type": "boolean",
+ "summary": "Spin up dev server to live-reload www files",
+ "groups": [
+
+ ],
+ "aliases": [
+ "l"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "livereload-url",
+ "type": "string",
+ "summary": "Provide a custom URL to the dev server",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "url"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output source maps",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "c"
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ },
+ {
+ "name": "ssl",
+ "type": "boolean",
+ "summary": "Use HTTPS for the dev server",
+ "groups": [
+ "experimental",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "debug",
+ "type": "boolean",
+ "summary": "Mark as a debug build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "release",
+ "type": "boolean",
+ "summary": "Mark as a release build",
+ "groups": [
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "device",
+ "type": "boolean",
+ "summary": "Deploy build to a device",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "emulator",
+ "type": "boolean",
+ "summary": "Deploy build to an emulator",
+ "groups": [
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "buildConfig",
+ "type": "string",
+ "summary": "Use the specified build configuration",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "file"
+ }
+ },
+ {
+ "name": "target",
+ "type": "string",
+ "summary": "Deploy build to a device (use `--list` to see all)",
+ "groups": [
+ "advanced",
+ "cordova",
+ "cordova-cli",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "target"
+ }
+ },
+ {
+ "name": "native-run",
+ "type": "boolean",
+ "summary": "Use `native-run` instead of Cordova for running the app",
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "connect",
+ "type": "boolean",
+ "summary": "Do not tie the running app to the process",
+ "default": true,
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Output `--list` targets in JSON",
+ "groups": [
+ "experimental",
+ "native-run"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic deploy build",
+ "namespace": [
+ "ionic",
+ "deploy"
+ ],
+ "summary": "Create a deploy build on Appflow",
+ "description": "This command creates a deploy build on Ionic Appflow. While the build is running, it prints the remote build log to the terminal.\n\nCustomizing the build:\n- The `--environment` and `--channel` options can be used to customize the groups of values exposed to the build.\n\nApart from `--commit`, every option can be specified using the full name setup within the Appflow [Dashboard](https://dashboard.ionicframework.com).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic deploy build ",
+ "ionic deploy build --environment=\"My Custom Environment Name\"",
+ "ionic deploy build --commit=2345cd3305a1cf94de34e93b73a932f25baac77c",
+ "ionic deploy build --channel=\"Master\"",
+ "ionic deploy build --channel=\"Master\" --channel=\"My Custom Channel\""
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "environment",
+ "type": "string",
+ "summary": "The group of environment variables exposed to your build",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "channel",
+ "type": "string",
+ "summary": "The channel you want to auto deploy the build to. This can be repeated multiple times if multiple channels need to be specified.",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "commit",
+ "type": "string",
+ "summary": "Commit (defaults to HEAD)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "sha1"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic docs",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Open the Ionic documentation website",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "browser",
+ "type": "string",
+ "summary": "Specifies the browser to use (`safari`, `firefox`, `google chrome`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "w"
+ ],
+ "spec": {
+ "value": "browser"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic doctor check",
+ "namespace": [
+ "ionic",
+ "doctor"
+ ],
+ "summary": "Check the health of your Ionic project",
+ "description": "This command detects and prints common issues and suggested steps to fix them.\n\nSome issues can be fixed automatically. See `ionic doctor treat --help`.\n\nOptionally supply the `id` argument to check a single issue. Use `ionic doctor list` to list all known issues.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic doctor check ",
+ "ionic doctor check git-not-used"
+ ],
+ "aliases": [
+ "ionic doctor checkup",
+ "ionic doctor validate"
+ ],
+ "inputs": [
+ {
+ "name": "id",
+ "summary": "The issue identifier",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic doctor list",
+ "namespace": [
+ "ionic",
+ "doctor"
+ ],
+ "summary": "List all issues and their identifiers",
+ "description": "Issues can have various tags:\n- **treatable**: `ionic doctor treat` can attempt to fix the issue\n- **ignored**: configured not to be detected in `ionic doctor check` or `ionic doctor treat`\n- **explicit-detection**: issue is only detected explicitly with `ionic doctor check `\n\nYou can flip whether an issue is ignored or not by using `ionic config set -g doctor.issues..ignored true/false`, where `` matches an ID listed with this command.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic doctor ls"
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic doctor treat",
+ "namespace": [
+ "ionic",
+ "doctor"
+ ],
+ "summary": "Attempt to fix issues in your Ionic project",
+ "description": "This command detects and attempts to fix common issues. Before a fix is attempted, the steps are printed and a confirmation prompt is displayed.\n\nOptionally supply the `id` argument to attempt to fix a single issue. Use `ionic doctor list` to list all known issues.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic doctor treat ",
+ "ionic doctor treat git-not-used"
+ ],
+ "aliases": [
+ "ionic doctor fix"
+ ],
+ "inputs": [
+ {
+ "name": "id",
+ "summary": "The issue identifier",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic enterprise register",
+ "namespace": [
+ "ionic",
+ "enterprise"
+ ],
+ "summary": "Register your Product Key with this app",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "app-id",
+ "type": "string",
+ "summary": "The Ionic App ID",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "id"
+ }
+ },
+ {
+ "name": "key",
+ "type": "string",
+ "summary": "The Product Key",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "key"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic generate",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Automatically create framework features",
+ "description": "This command uses the Angular CLI to generate features such as `pages`, `components`, `directives`, `services`, etc.\n\n - For a full list of available types, use `npx ng g --help`\n - For a list of options for a types, use `npx ng g --help`\n\nYou can specify a path to nest your feature within any number of subdirectories. For example, specify a name of `\"pages/New Page\"` to generate page files at **src/app/pages/new-page/**.\n\nTo test a generator before file modifications are made, use the `--dry-run` option.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic generate ",
+ "ionic generate page",
+ "ionic generate page contact",
+ "ionic generate component contact/form",
+ "ionic generate component login-form --change-detection=OnPush",
+ "ionic generate directive ripple --skip-import",
+ "ionic generate service api/user"
+ ],
+ "aliases": [
+ "ionic g"
+ ],
+ "inputs": [
+ {
+ "name": "type",
+ "summary": "The type of feature (e.g. `page`, `component`, `directive`, `service`)",
+ "required": true
+ },
+ {
+ "name": "name",
+ "summary": "The name/path of the feature being generated",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic git remote",
+ "namespace": [
+ "ionic",
+ "git"
+ ],
+ "summary": "Adds/updates the Ionic Appflow git remote to your local Ionic app",
+ "description": "This command is used by `ionic link` when Ionic Appflow is used as the git host.\n\n`ionic git remote` will check the local repository for whether or not the git remote is properly set up. This command operates on the **ionic** remote. For advanced configuration, see **Settings** => **Git** in the app settings of the [Dashboard](https://dashboard.ionicframework.com).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic info",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Print project, system, and environment information",
+ "description": "This command is an easy way to share information about your setup. If applicable, be sure to run `ionic info` within your project directory to display even more information.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Print system/environment info in JSON format",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic init",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Initialize existing projects with Ionic",
+ "description": "This command will initialize the current directory with an **ionic.config.json** file.\n\n`ionic init` will prompt for a project name and then proceed to determine the type of your project. You can specify the `name` argument and `--type` option to provide these values via command-line.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic init ",
+ "ionic init \"My App\"",
+ "ionic init \"My App\" --type=angular"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "name",
+ "summary": "The name of your project (e.g. `myApp`, `\"My App\"`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "type",
+ "type": "string",
+ "summary": "Type of project (e.g. `angular`, `ionic-angular`, `ionic1`, `custom`)",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "type"
+ }
+ },
+ {
+ "name": "force",
+ "type": "boolean",
+ "summary": "Initialize even if a project already exists",
+ "default": false,
+ "groups": [
+
+ ],
+ "aliases": [
+ "f"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "project-id",
+ "type": "string",
+ "summary": "Specify a slug for your app",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "slug"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic integrations disable",
+ "namespace": [
+ "ionic",
+ "integrations"
+ ],
+ "summary": "Disable an integration",
+ "description": "Integrations, such as Cordova, can be disabled with this command.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "name",
+ "summary": "The integration to disable (e.g. `capacitor`, `cordova`, `enterprise`)",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic integrations enable",
+ "namespace": [
+ "ionic",
+ "integrations"
+ ],
+ "summary": "Add & enable integrations to your app",
+ "description": "Integrations, such as Cordova, can be enabled with this command. If the integration has never been added to the project, `ionic integrations enable` will download and add the integration.\n\nIntegrations can be re-added with the `--add` option.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "name",
+ "summary": "The integration to enable (e.g. `capacitor`, `cordova`, `enterprise`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "add",
+ "type": "boolean",
+ "summary": "Download and add the integration even if enabled",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "root",
+ "type": "string",
+ "summary": "Specify an alternative destination to download into when adding",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "path"
+ }
+ },
+ {
+ "name": "quiet",
+ "type": "boolean",
+ "summary": "Do not log file operations",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic integrations list",
+ "namespace": [
+ "ionic",
+ "integrations"
+ ],
+ "summary": "List available and active integrations in your app",
+ "description": "This command will print the status of integrations in Ionic projects. Integrations can be **enabled** (added and enabled), **disabled** (added but disabled), and **not added** (never added to the project).\n\n- To enable or add integrations, see `ionic integrations enable --help`\n- To disable integrations, see `ionic integrations disable --help`",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic integrations ls"
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic link",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Connect local apps to Ionic Appflow",
+ "description": "Link apps on Ionic Appflow to local Ionic projects with this command.\n\nIf the `id` argument is excluded, this command will prompt you to select an app from Ionic Appflow.\n\nIonic Appflow uses a git-based workflow to manage app updates. During the linking process, select **GitHub** (recommended) or **Ionic Appflow** as a git host. See our [documentation](https://ionicframework.com/docs/appflow/basics/git) for more information.\n\nUltimately, this command sets the **id** property in **./ionic.config.json**, which marks this app as linked.\n\nIf you are having issues linking, please get in touch with our [Support](https://ion.link/support-request).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic link ",
+ "ionic link a1b2c3d4"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "id",
+ "summary": "The Ionic Appflow ID of the app to link (e.g. `a1b2c3d4`)",
+ "required": false
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic login",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Login to Ionic Appflow",
+ "description": "Authenticate with Ionic Appflow and retrieve a user token, which is stored in the CLI config.\n\nIf the `IONIC_TOKEN` environment variable is set, the CLI will automatically authenticate you. To retrieve your user token, first use `ionic login`, then print the token by running the `ionic config get -g tokens.user` command.\n\nYou can also use `IONIC_EMAIL` and `IONIC_PASSWORD` environment variables for automatic authentication, but it is not recommended to store your password in plain text.\n\nIf you need to create an Ionic Appflow account, use `ionic signup`.\n\nIf you are having issues logging in, please get in touch with our [Support](https://ion.link/support-request).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic login ",
+ "ionic login john@example.com",
+ "ionic login hello@example.com secret"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "email",
+ "summary": "Your email address",
+ "required": true
+ },
+ {
+ "name": "password",
+ "summary": "Your password",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic logout",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Logout of Ionic Appflow",
+ "description": "Remove the Ionic Appflow user token from the CLI config.\n\nLogin again with `ionic login`.\n\nIf you need to create an Ionic Appflow account, use `ionic signup`.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic package build",
+ "namespace": [
+ "ionic",
+ "package"
+ ],
+ "summary": "Create a package build on Appflow",
+ "description": "This command creates a package build on Ionic Appflow. While the build is running, it prints the remote build log to the terminal. If the build is successful, it downloads the created app package file in the current directory.\n\nApart from `--commit`, every option can be specified using the full name setup within the Appflow [Dashboard](https://dashboard.ionicframework.com).\n\nThe `--security-profile` option is mandatory for any iOS build but not for Android debug builds.\n\nCustomizing the build:\n- The `--environment` and `--native-config` options can be used to customize the groups of values exposed to the build.\n- Override the preferred platform with `--target-platform`. This is useful for building older iOS apps.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic package build android debug",
+ "ionic package build ios development --security-profile=\"iOS Security Profile Name\"",
+ "ionic package build android debug --environment=\"My Custom Environment Name\"",
+ "ionic package build android debug --native-config=\"My Custom Native Config Name\"",
+ "ionic package build android debug --commit=2345cd3305a1cf94de34e93b73a932f25baac77c",
+ "ionic package build ios development --security-profile=\"iOS Security Profile Name\" --target-platform=\"iOS - Xcode 9\"",
+ "ionic package build ios development --security-profile=\"iOS Security Profile Name\" --build-file-name=my_custom_file_name.ipa"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "platform",
+ "summary": "The platform to package (`android`, `ios`)",
+ "required": true
+ },
+ {
+ "name": "type",
+ "summary": "The build type (`debug`, `release`, `development`, `ad-hoc`, `app-store`, `enterprise`)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "security-profile",
+ "type": "string",
+ "summary": "Security profile",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "environment",
+ "type": "string",
+ "summary": "The group of environment variables exposed to your build",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "native-config",
+ "type": "string",
+ "summary": "The group of native config variables exposed to your build",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "commit",
+ "type": "string",
+ "summary": "Commit (defaults to HEAD)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "sha1"
+ }
+ },
+ {
+ "name": "target-platform",
+ "type": "string",
+ "summary": "Target platform (`\"Android\"`, `\"iOS - Xcode 10 (Preferred)\"`, `\"iOS - Xcode 9\"`, `\"iOS - Xcode 8\"`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ },
+ {
+ "name": "build-file-name",
+ "type": "string",
+ "summary": "The name for the downloaded build file",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "name"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic repair",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Remove and recreate dependencies and generated files",
+ "description": "This command may be useful when obscure errors or issues are encountered. It removes and recreates dependencies of your project.\n\nFor Cordova apps, it removes and recreates the generated native project and the native dependencies of your project.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic serve",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Start a local dev server for app dev/testing",
+ "description": "Easily spin up a development server which launches in your browser. It watches for changes in your source files and automatically reloads with the updated build.\n\nBy default, `ionic serve` boots up a development server on all network interfaces and prints the external address(es) on which your app is being served. It also broadcasts your app to the Ionic DevApp on your network. To disable the DevApp and bind to `localhost`, use `--local`.\n\nTry the `--lab` option to see multiple platforms at once.\n\n`ionic serve` uses the Angular CLI. Use `ng serve --help` to list all Angular CLI options for serving your app. See the `ng serve` [docs](https://angular.io/cli/serve) for explanations. Options not listed below are considered advanced and can be passed to the Angular CLI using the `--` separator after the Ionic CLI arguments. See the examples.\n\nThe dev server can use HTTPS via the `--ssl` option **(experimental)**. There are several known issues with HTTPS. See issue [#3305](https://github.com/ionic-team/ionic-cli/issues/3305).",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "beta"
+ ],
+ "exampleCommands": [
+ "ionic serve ",
+ "ionic serve --local",
+ "ionic serve --lab",
+ "ionic serve -- --proxy-config proxy.conf.json"
+ ],
+ "aliases": [
+ "ionic s"
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "address",
+ "type": "string",
+ "summary": "Use specific address for the dev server",
+ "default": "0.0.0.0",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "address"
+ }
+ },
+ {
+ "name": "port",
+ "type": "string",
+ "summary": "Use specific port for HTTP",
+ "default": "8100",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "p"
+ ],
+ "spec": {
+ "value": "port"
+ }
+ },
+ {
+ "name": "livereload",
+ "type": "boolean",
+ "summary": "Do not spin up dev server--just serve files",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "lab-host",
+ "type": "string",
+ "summary": "Use specific address for Ionic Lab server",
+ "default": "localhost",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "host"
+ }
+ },
+ {
+ "name": "lab-port",
+ "type": "string",
+ "summary": "Use specific port for Ionic Lab server",
+ "default": "8200",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "port"
+ }
+ },
+ {
+ "name": "open",
+ "type": "boolean",
+ "summary": "Do not open a browser window",
+ "default": true,
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "local",
+ "type": "boolean",
+ "summary": "Disable external network usage",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "browser",
+ "type": "string",
+ "summary": "Specifies the browser to use (`safari`, `firefox`, `google chrome`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "w"
+ ],
+ "spec": {
+ "value": "browser"
+ }
+ },
+ {
+ "name": "browseroption",
+ "type": "string",
+ "summary": "Specifies a path to open to (`/#/tab/dash`)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "o"
+ ],
+ "spec": {
+ "value": "path"
+ }
+ },
+ {
+ "name": "lab",
+ "type": "boolean",
+ "summary": "Test your apps on multiple platform types in the browser",
+ "groups": [
+
+ ],
+ "aliases": [
+ "l"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "ssl",
+ "type": "boolean",
+ "summary": "Use HTTPS for the dev server",
+ "groups": [
+ "experimental",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "prod",
+ "type": "boolean",
+ "summary": "Flag to use the `production` configuration",
+ "groups": [
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "configuration",
+ "type": "string",
+ "summary": "Specify the configuration to use.",
+ "groups": [
+ "advanced",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "conf"
+ }
+ },
+ {
+ "name": "source-map",
+ "type": "boolean",
+ "summary": "Output sourcemaps",
+ "groups": [
+ "advanced",
+ "cordova"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "devapp",
+ "type": "boolean",
+ "summary": "Publish DevApp service",
+ "default": false,
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic signup",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Create an account for Ionic Appflow",
+ "description": "Learn more about Ionic Appflow: **[https://ion.link/appflow](https://ion.link/appflow)**\n\nIf you are having issues signing up, please get in touch with our [Support](https://ion.link/support-request).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh add",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "Add an SSH public key to Ionic",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "pubkey-path",
+ "summary": "Location of public key file to add to Ionic",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "use",
+ "type": "boolean",
+ "summary": "Use the newly added key as your default SSH key for Ionic",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh delete",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "Delete an SSH public key from Ionic",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic ssh remove",
+ "ionic ssh rm"
+ ],
+ "inputs": [
+ {
+ "name": "key-id",
+ "summary": "The ID of the public key to delete",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh generate",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "Generates a private and public SSH key pair",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic ssh g"
+ ],
+ "inputs": [
+ {
+ "name": "key-path",
+ "summary": "Destination of private key file",
+ "required": false
+ }
+ ],
+ "options": [
+ {
+ "name": "type",
+ "type": "string",
+ "summary": "The type of key to generate: `ecdsa`, `ed25519`, `rsa`",
+ "default": "rsa",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "t"
+ ],
+ "spec": {
+ "value": "type"
+ }
+ },
+ {
+ "name": "bits",
+ "type": "string",
+ "summary": "Number of bits in the key",
+ "default": "2048",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "b"
+ ],
+ "spec": {
+ "value": "bits"
+ }
+ },
+ {
+ "name": "annotation",
+ "type": "string",
+ "summary": "Annotation (comment) in public key. Your Ionic email address will be used",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "C"
+ ],
+ "spec": {
+ "value": "annotation"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh list",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "List your SSH public keys on Ionic",
+ "description": "",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic ssh ls"
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "json",
+ "type": "boolean",
+ "summary": "Output SSH keys in JSON",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ }
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh setup",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "Setup your Ionic Appflow SSH keys automatically",
+ "description": "This command offers a setup wizard for Ionic Appflow SSH keys using a series of prompts. For more control, see the commands available for managing SSH keys with the `ionic ssh --help` command. For an entirely manual approach, see **Personal Settings** => **SSH Keys** in the [Dashboard](https://dashboard.ionicframework.com/settings/ssh-keys).\n\nIf you are having issues setting up SSH keys, please get in touch with our [Support](https://ion.link/support-request).",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssh use",
+ "namespace": [
+ "ionic",
+ "ssh"
+ ],
+ "summary": "Set your active Ionic SSH key",
+ "description": "This command modifies the SSH configuration file (**~/.ssh/config**) to set an active private key for the **git.ionicjs.com** host. Read more about SSH configuration by running the `man ssh_config` command or by visiting online man [pages](https://linux.die.net/man/5/ssh_config).\n\nBefore making changes, `ionic ssh use` will print a diff and ask for permission to write the file.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "key-path",
+ "summary": "Location of private key file to use",
+ "required": true
+ }
+ ],
+ "options": [
+
+ ],
+ "type": "global"
+ },
+ {
+ "name": "ionic ssl generate",
+ "namespace": [
+ "ionic",
+ "ssl"
+ ],
+ "summary": "Generates an SSL key & certificate",
+ "description": "Uses OpenSSL to create a self-signed certificate for **localhost** (by default).\n\nAfter the certificate is generated, you will still need to add it to your system or browser as a trusted certificate.\n\nThe default directory for `--key-path` and `--cert-path` is `.ionic/ssl/`.",
+ "footnotes": [
+
+ ],
+ "groups": [
+ "experimental"
+ ],
+ "exampleCommands": [
+
+ ],
+ "aliases": [
+ "ionic ssl g"
+ ],
+ "inputs": [
+
+ ],
+ "options": [
+ {
+ "name": "key-path",
+ "type": "string",
+ "summary": "Destination of private key file",
+ "default": "./.ionic/ssl/key.pem",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "path"
+ }
+ },
+ {
+ "name": "cert-path",
+ "type": "string",
+ "summary": "Destination of certificate file",
+ "default": "./.ionic/ssl/cert.pem",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "path"
+ }
+ },
+ {
+ "name": "country-name",
+ "type": "string",
+ "summary": "The country name (C) of the SSL certificate",
+ "default": "US",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "C"
+ }
+ },
+ {
+ "name": "state-or-province-name",
+ "type": "string",
+ "summary": "The state or province name (ST) of the SSL certificate",
+ "default": "Wisconsin",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "ST"
+ }
+ },
+ {
+ "name": "locality-name",
+ "type": "string",
+ "summary": "The locality name (L) of the SSL certificate",
+ "default": "Madison",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "L"
+ }
+ },
+ {
+ "name": "organization-name",
+ "type": "string",
+ "summary": "The organization name (O) of the SSL certificate",
+ "default": "Ionic",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "O"
+ }
+ },
+ {
+ "name": "common-name",
+ "type": "string",
+ "summary": "The common name (CN) of the SSL certificate",
+ "default": "localhost",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "CN"
+ }
+ },
+ {
+ "name": "bits",
+ "type": "string",
+ "summary": "Number of bits in the key",
+ "default": "2048",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+ "b"
+ ],
+ "spec": {
+ "value": "bits"
+ }
+ }
+ ],
+ "type": "project"
+ },
+ {
+ "name": "ionic start",
+ "namespace": [
+ "ionic"
+ ],
+ "summary": "Create a new project",
+ "description": "This command creates a working Ionic app. It installs dependencies for you and sets up your project.\n\nRunning `ionic start` without any arguments will prompt you for information about your new project.\n\nThe first argument is your app's `name`. Don't worry--you can always change this later. The `--project-id` is generated from `name` unless explicitly specified.\n\nThe second argument is the `template` from which to generate your app. You can list all templates with the `--list` option. You can also specify a git repository URL for `template`, in which case the existing project will be cloned.\n\nUse the `--type` option to start projects using older versions of Ionic. For example, you can start an Ionic 3 project with `--type=ionic-angular`. Use `--list` to see all project types and templates.",
+ "footnotes": [
+
+ ],
+ "groups": [
+
+ ],
+ "exampleCommands": [
+ "ionic start ",
+ "ionic start --list",
+ "ionic start myApp",
+ "ionic start myApp blank",
+ "ionic start myApp tabs --cordova",
+ "ionic start myApp tabs --capacitor",
+ "ionic start myApp super --type=ionic-angular",
+ "ionic start myApp blank --type=ionic1",
+ "ionic start cordovaApp tabs --cordova",
+ "ionic start \"My App\" blank",
+ "ionic start \"Conference App\" https://github.com/ionic-team/ionic-conference-app"
+ ],
+ "aliases": [
+
+ ],
+ "inputs": [
+ {
+ "name": "name",
+ "summary": "The name of your new project (e.g. `myApp`, `\"My App\"`)",
+ "required": true
+ },
+ {
+ "name": "template",
+ "summary": "The starter template to use (e.g. `blank`, `tabs`; use `--list` to see all)",
+ "required": true
+ }
+ ],
+ "options": [
+ {
+ "name": "list",
+ "type": "boolean",
+ "summary": "List available starter templates",
+ "groups": [
+
+ ],
+ "aliases": [
+ "l"
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "type",
+ "type": "string",
+ "summary": "Type of project to start (e.g. `angular`, `ionic-angular`, `ionic1`)",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "type"
+ }
+ },
+ {
+ "name": "cordova",
+ "type": "boolean",
+ "summary": "Include Cordova integration",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "capacitor",
+ "type": "boolean",
+ "summary": "Include Capacitor integration",
+ "groups": [
+ "experimental"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "deps",
+ "type": "boolean",
+ "summary": "Do not install npm/yarn dependencies",
+ "default": true,
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "git",
+ "type": "boolean",
+ "summary": "Do not initialize a git repo",
+ "default": true,
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "link",
+ "type": "boolean",
+ "summary": "Do not ask to connect the app to Ionic Appflow",
+ "default": true,
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "true/false"
+ }
+ },
+ {
+ "name": "id",
+ "type": "string",
+ "summary": "Specify an app ID from the Ionic Appflow to link",
+ "groups": [
+
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "id"
+ }
+ },
+ {
+ "name": "pro-id",
+ "type": "string",
+ "summary": "Use the `--id` option",
+ "groups": [
+ "deprecated"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "id"
+ }
+ },
+ {
+ "name": "project-id",
+ "type": "string",
+ "summary": "Specify a slug for your app (used for the directory name and npm/yarn package name)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "slug"
+ }
+ },
+ {
+ "name": "package-id",
+ "type": "string",
+ "summary": "Specify the bundle ID/application ID for your app (reverse-DNS notation)",
+ "groups": [
+ "advanced"
+ ],
+ "aliases": [
+
+ ],
+ "spec": {
+ "value": "id"
+ }
+ }
+ ],
+ "type": "global"
+ }
+ ],
+ "aliases": [
+
+ ]
+}
diff --git a/scripts/data/da/native.json b/scripts/data/da/native.json
new file mode 100644
index 0000000000..bccb571481
--- /dev/null
+++ b/scripts/data/da/native.json
@@ -0,0 +1,3542 @@
+[
+ {
+ "packageName": "@ionic-native/abbyy-rtr",
+ "displayName": "ABBYY Real-Time Recognition",
+ "description": "\nThis plugin allows to use the Text Capture and Data Capture features of\nABBYY Real-Time Recognition SDK (RTR SDK) in apps.\n",
+ "usage": "\n```typescript\nimport { AbbyyRTR } from '@ionic-native/abbyy-rtr/ngx';\n\n\nconstructor(private abbyyRTR: AbbyyRTR) { }\n\n...\n\n\nthis.abbyyRTR.startTextCapture(options)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n\nthis.abbyyRTR.startDataCapture(options)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/abbyysdk/RTR-SDK.Cordova",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-abbyy-rtr-sdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/action-sheet",
+ "displayName": "Action Sheet",
+ "description": "\nThe ActionSheet plugin shows a native list of options the user can choose from.\n\nRequires Cordova plugin: `cordova-plugin-actionsheet`. For more info, please see the [ActionSheet plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-actionsheet).\n",
+ "usage": "\n```typescript\nimport { ActionSheet, ActionSheetOptions } from '@ionic-native/action-sheet/ngx';\n\nconstructor(private actionSheet: ActionSheet) { }\n\n...\n\n\nlet buttonLabels = ['Share via Facebook', 'Share via Twitter'];\n\nconst options: ActionSheetOptions = {\n title: 'What do you want with this image?',\n subtitle: 'Choose an action',\n buttonLabels: buttonLabels,\n addCancelButtonWithLabel: 'Cancel',\n addDestructiveButtonWithLabel: 'Delete',\n androidTheme: this.actionSheet.ANDROID_THEMES.THEME_HOLO_DARK,\n destructiveButtonLast: true\n}\n\nthis.actionSheet.show(options).then((buttonIndex: number) => {\n console.log('Button pressed: ' + buttonIndex);\n});\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-actionsheet",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-actionsheet"
+ }
+ },
+ {
+ "packageName": "@ionic-native/adjust",
+ "displayName": "Adjust",
+ "description": "\nThis is the Ionic Cordova SDK of Adjust™. You can read more about Adjust™ at adjust.com.\n\nRequires Cordova plugin: `com.adjust.sdk`. For more info, please see the [Adjust Cordova SDK](https://github.com/adjust/cordova_sdk)\n",
+ "usage": "\n```typescript\n import { Adjust, AdjustConfig, AdjustEnvironment } from '@ionic-native/adjust/ngx';\n\n constructor(private adjust: Adjust) { }\n\n ...\n\n const config = new AdjustConfig('APP-TOKEN-HERE', AdjustEnvironment.Sandbox);\n config.logLevel = AdjustLogLevel.Verbose;\n // Set other config properties.\n adjust.create(config);\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/adjust/cordova_sdk",
+ "cordovaPlugin": {
+ "name": "com.adjust.sdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/admob-free",
+ "displayName": "AdMob Free",
+ "description": "\nA free, no ad-sharing version of Google AdMob plugin for Cordova.\n\nRequires Cordova plugin: `cordova-plugin-admob-free`. For more info, please see the [AdMob Free plugin docs](https://github.com/ratson/cordova-plugin-admob-free).\n",
+ "usage": "\n```typescript\nimport { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free/ngx';\n\n\nconstructor(private admobFree: AdMobFree) { }\n\n\n...\n\n\nconst bannerConfig: AdMobFreeBannerConfig = {\n // add your config here\n // for the sake of this example we will just use the test config\n isTesting: true,\n autoShow: true\n};\nthis.admobFree.banner.config(bannerConfig);\n\nthis.admobFree.banner.prepare()\n .then(() => {\n // banner Ad is ready\n // if we set autoShow to false, then we will need to call the show method here\n })\n .catch(e => console.log(e));\n\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ratson/cordova-plugin-admob-free",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-admob-free"
+ }
+ },
+ {
+ "packageName": "@ionic-native/admob-plus",
+ "displayName": "AdMob Plus",
+ "description": "\nAdMob Plus is the successor of cordova-plugin-admob-free, which provides a cleaner API and build with modern tools.\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/admob-plus/admob-plus",
+ "cordovaPlugin": {
+ "name": "cordova-admob-plus"
+ }
+ },
+ {
+ "packageName": "@ionic-native/admob-pro",
+ "displayName": "AdMob Pro",
+ "description": "\nPlugin for Google Ads, including AdMob / DFP (DoubleClick for publisher) and mediations to other Ad networks.\n\nIMPORTANT NOTICE: this plugin takes a percentage out of your earnings if you profit more than $1,000. Read more about this on the plugin's repo. For a completely free alternative, see [AdMobPro Free](../admob-free).",
+ "usage": "\n```typescript\nimport { AdMobPro } from '@ionic-native/admob-pro/ngx';\nimport { Platform } from '@ionic/angular';\n\nconstructor(private admob: AdMobPro, private platform: Platform ) { }\n\nionViewDidLoad() {\n this.admob.onAdDismiss()\n .subscribe(() => { console.log('User dismissed ad'); });\n}\n\nonClick() {\n let adId;\n if(this.platform.is('android')) {\n adId = 'YOUR_ADID_ANDROID';\n } else if (this.platform.is('ios')) {\n adId = 'YOUR_ADID_IOS';\n }\n this.admob.prepareInterstitial({adId: adId})\n .then(() => { this.admob.showInterstitial(); });\n}\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/floatinghotpot/cordova-admob-pro",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-admobpro"
+ }
+ },
+ {
+ "packageName": "@ionic-native/admob",
+ "displayName": "Admob",
+ "description": "\nMost complete Admob plugin with support for [Tappx](http://www.tappx.com/?h=dec334d63287772de859bdb4e977fce6) ads.\nMonetize your apps and games with AdMob ads, using latest Google AdMob SDK. With this plugin you can show AdMob ads easily!\n\n**Supports:**\n- Banner ads (top and bottom)\n- Interstitial ads\n- Rewarded ads\n- [Tappx](http://www.tappx.com/?h=dec334d63287772de859bdb4e977fce6) ads\n",
+ "usage": "\n```typescript\nimport { Admob, AdmobOptions } from '@ionic-native/admob/ngx';\n\n\nconstructor(private admob: Admob) {\n // Admob options config\n const admobOptions: AdmobOptions = {\n publisherId: 'XXX-XXXX-XXXX',\n interstitialAdId: 'XXX-XXXX-XXXX',\n rewardedAdId: 'XXX-XXXX-XXXX',\n isTesting: true,\n autoShowBanner: false,\n autoShowInterstitial: false,\n autoShowRewarded: false,\n adSize: this.admob.AD_SIZE.BANNER\n };\n\n // Set admob options\n this.admob.setOptions(admobOptions)\n .then(() => console.log('Admob options have been successfully set'))\n .catch(err => console.error('Error setting admob options:', err));\n}\n\n\n\n// (Optionally) Load banner ad, in order to have it ready to show\nthis.admob.createBannerView()\n .then(() => console.log('Banner ad loaded'))\n .catch(err => console.error('Error loading banner ad:', err));\n\n\n// Show banner ad (createBannerView must be called before and onAdLoaded() event raised)\nthis.admob.onAdLoaded().subscribe((ad) => {\n if (ad.adType === this.admob.AD_TYPE.BANNER) {\n this.admob.showBannerAd()\n .then(() => console.log('Banner ad shown'))\n .catch(err => console.error('Error showing banner ad:', err));\n }\n});\n\n\n// Hide banner ad, but do not destroy it, so it can be shown later on\n// See destroyBannerView in order to hide and destroy banner ad\nthis.admob.showBannerAd(false)\n .then(() => console.log('Banner ad hidden'))\n .catch(err => console.error('Error hiding banner ad:', err));\n\n\n\n// Request an interstitial ad, in order to be shown later on\n// It is possible to autoshow it via options parameter, see docs\nthis.admob.requestInterstitialAd()\n .then(() => console.log('Interstitial ad loaded'))\n .catch(err => console.error('Error loading interstitial ad:', err));\n\n\n// Show an interstitial ad (requestInterstitialAd must be called before)\nthis.admob.onAdLoaded().subscribe((ad) => {\n if (ad.adType === this.admob.AD_TYPE.INTERSTITIAL) {\n this.admob.showInterstitialAd()\n .then(() => console.log('Interstitial ad shown'))\n .catch(err => console.error('Error showing interstitial ad:', err));\n }\n});\n\n\n// Request a rewarded ad\nthis.admob.requestRewardedAd()\n .then(() => console.log('Rewarded ad loaded'))\n .catch(err => console.error('Error loading rewarded ad:', err));\n\n\n// Show rewarded ad (requestRewardedAd must be called before)\nthis.admob.onAdLoaded().subscribe((ad) => {\n if (ad.adType === this.admob.AD_TYPE.REWARDED) {\n this.admob.showRewardedAd()\n .then(() => console.log('Rewarded ad shown'))\n .catch(err => console.error('Error showing rewarded ad:', err));\n }\n});\n\n\n// Hide and destroy banner or interstitial ad\nthis.admob.destroyBannerView()\n .then(() => console.log('Banner or interstitial ad destroyed'))\n .catch(err => console.error('Error destroying banner or interstitial ad:', err));\n\n\n\n// On Ad loaded event\nthis.admob.onAdLoaded().subscribe((ad) => {\n if (ad.adType === this.admob.AD_TYPE.BANNER) {\n console.log('Banner ad is loaded');\n this.admob.showBannerAd();\n } else if (ad.adType === this.admob.AD_TYPE.INTERSTITIAL) {\n console.log('Interstitial ad is loaded');\n this.admob.showInterstitialAd();\n } else if (ad.adType === this.admob.AD_TYPE.REWARDED) {\n console.log('Rewarded ad is loaded');\n this.admob.showRewardedAd();\n }\n});\n\n\n\n// On ad failed to load\nthis.admob.onAdFailedToLoad().subscribe(err => console.log('Error loading ad:', err));\n\n\n\n// On interstitial ad opened\nthis.admob.onAdOpened().subscribe(() => console.log('Interstitial ad opened'));\n\n\n\n// On interstitial ad closed\nthis.admob.onAdClosed().subscribe(() => console.log('Interstitial ad closed'));\n\n\n\n// On ad clicked and left application\nthis.admob.onAdLeftApplication().subscribe(() => console.log('Ad lefted application'));\n\n\n\n// On user ad rewarded\nthis.admob.onRewardedAd().subscribe(() => console.log('The user has been rewarded'));\n\n\n\n// On rewarded ad video started\nthis.admob.onRewardedAdVideoStarted().subscribe(() => console.log('Rewarded ad vieo started'));\n\n\n\n// On rewarded ad video completed\nthis.admob.onRewardedAdVideoCompleted().subscribe(() => console.log('Rewarded ad video completed'));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/appfeel/admob-google-cordova",
+ "cordovaPlugin": {
+ "name": "cordova-admob"
+ }
+ },
+ {
+ "packageName": "@ionic-native/aes-256",
+ "displayName": "AES256",
+ "description": "\nThis cordova ionic plugin allows you to perform AES 256 encryption and decryption on the plain text.\nIt's a cross-platform plugin which supports both Android and iOS.\nThe encryption and decryption are performed on the device native layer so that the performance is much faster.\n",
+ "usage": "\n```typescript\nimport { AES256 } from '@ionic-native/aes-256/ngx';\n\nprivate secureKey: string;\nprivate secureIV: string;\n\nconstructor(private aes256: AES256) {\n this.generateSecureKeyAndIV(); // To generate the random secureKey and secureIV\n}\n\n...\n\nasync generateSecureKeyAndIV() {\n this.secureKey = await this.aes256.generateSecureKey('random password 12345'); // Returns a 32 bytes string\n this.secureIV = await this.aes256.generateSecureIV('random password 12345'); // Returns a 16 bytes string\n}\n\nthis.aes256.encrypt(this.secureKey, this.secureIV, 'testdata')\n .then(res => console.log('Encrypted Data: ',res))\n .catch((error: any) => console.error(error));\n\nthis.aes256.decrypt(this.secureKey, this.secureIV, 'encryptedData')\n .then(res => console.log('Decrypted Data : ',res))\n .catch((error: any) => console.error(error));\n\n\n* this.aes256.generateSecureKey('random password 12345')\n .then(res => console.log('Secure Key : ',res))\n .catch((error: any) => console.error(error));\n\n\n* this.aes256.generateSecureIV('random password 12345')\n .then(res => console.log('Secure IV : ',res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Ideas2IT/cordova-aes256",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-aes256-encryption"
+ }
+ },
+ {
+ "packageName": "@ionic-native/alipay",
+ "displayName": "Alipay",
+ "description": "\nThis plugin facilitates the usage of Alipay 支付宝 in an Ionic apps with the integrated AlipaySDK dated on 20180601.\n\nRequires Cordova plugin: `cordova-plugin-gubnoi-alipay`. For more info, please see https://github.com/jing-zhou/cordova-plugin-alipay .\n",
+ "usage": "\n```typescript\nimport { Alipay } from '@ionic-native/alipay/ngx';\n\nconstructor(private alipay: Alipay) {\n\n//alipayOrder is a string that has been generated and signed by the server side.\nthis.alipay.pay(alipayOrder)\n .then(result => {\n console.log(result); // Success\n })\n .catch(error => {\n console.log(error); // Failed\n });\n\n}\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/jing-zhou/cordova-plugin-alipay",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-gubnoi-alipay"
+ }
+ },
+ {
+ "packageName": "@ionic-native/analytics-firebase",
+ "displayName": "Analytics Firebase",
+ "description": "\nGoogle Analytics Firebase plugin for Ionic Native apps.\n",
+ "usage": "\n```typescript\nimport { AnalyticsFirebase } from '@ionic-native/analytics-firebase';\n\n\nconstructor(private analyticsFirebase: AnalyticsFirebase) { }\n\n// Track an event with default events and params\nconst eventParams = {};\neventParams[this.analyticsFirebase.DEFAULT_PARAMS.LEVEL] = 29;\nthis.analyticsFirebase.logEvent(this.analyticsFirebase.DEFAULT_EVENTS.LEVEL_UP, eventParams)\n .then(() => console.log('Event successfully tracked'))\n .catch(err => console.log('Error tracking event:', err));\n\n// Track an event with custom events and params\nconst eventParams = {};\neventParams['my-prop'] = 29;\nthis.analyticsFirebase.logEvent('my-event', eventParams)\n .then(() => console.log('Event successfully tracked'))\n .catch(err => console.log('Error tracking event:', err));\n\n\n// Reset analytics data\nthis.analyticsFirebase.resetAnalyticsData()\n .then(() => console.log('Analytics data have been reset'))\n .catch(err => console.log('Error resetting analytics data:', err));\n\n\n// Track a screen view\nthis.analyticsFirebase.setCurrentScreen('Home')\n .then(() => console.log('View successfully tracked'))\n .catch(err => console.log('Error tracking view:', err));\n\n\n// Set user id\nthis.analyticsFirebase.setUserId('USER-ID')\n .then(() => console.log('User id successfully set'))\n .catch(err => console.log('Error setting user id:', err));\n\n\n// Set user property from default properties\nthis.analyticsFirebase.setUserProperty('KEY', 'VALUE')\n .then(() => console.log('User property successfully set'))\n .catch(err => console.log('Error setting user property:', err));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/appfeel/analytics-google",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-analytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/android-exoplayer",
+ "displayName": "Android ExoPlayer",
+ "description": "\nCordova media player plugin using Google's ExoPlayer framework.\n\nhttps://github.com/google/ExoPlayer\n",
+ "usage": "\n```typescript\nimport { AndroidExoPlayer } from '@ionic-native/android-exoplayer/ngx';\n\nconstructor(private androidExoPlayer: AndroidExoPlayer) { }\n\n...\n\nthis.androidExoPlayer.show({url: 'http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube'});\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/frontyard/cordova-plugin-exoplayer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-exoplayer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/android-fingerprint-auth",
+ "displayName": "Android Fingerprint Auth",
+ "description": "\nThis plugin will open a native dialog fragment prompting the user to authenticate using their fingerprint. If the device has a secure lockscreen (pattern, PIN, or password), the user may opt to authenticate using that method as a backup.",
+ "usage": "\n```typescript\nimport { AndroidFingerprintAuth } from '@ionic-native/android-fingerprint-auth/ngx';\n\nconstructor(private androidFingerprintAuth: AndroidFingerprintAuth) { }\n\n...\n\n\nthis.androidFingerprintAuth.isAvailable()\n .then((result)=> {\n if(result.isAvailable){\n // it is available\n\n this.androidFingerprintAuth.encrypt({ clientId: 'myAppName', username: 'myUsername', password: 'myPassword' })\n .then(result => {\n if (result.withFingerprint) {\n console.log('Successfully encrypted credentials.');\n console.log('Encrypted credentials: ' + result.token);\n } else if (result.withBackup) {\n console.log('Successfully authenticated with backup password!');\n } else console.log('Didn\\'t authenticate!');\n })\n .catch(error => {\n if (error === this.androidFingerprintAuth.ERRORS.FINGERPRINT_CANCELLED) {\n console.log('Fingerprint authentication cancelled');\n } else console.error(error)\n });\n\n } else {\n // fingerprint auth isn't available\n }\n })\n .catch(error => console.error(error));\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/mjwheatley/cordova-plugin-android-fingerprint-auth",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-android-fingerprint-auth"
+ }
+ },
+ {
+ "packageName": "@ionic-native/android-full-screen",
+ "displayName": "Android Full Screen",
+ "description": "\nThis plugin enables developers to offer users a true full screen experience in their Cordova and PhoneGap apps for Android.\nUsing Android 4.0+, you can use true full screen in \"lean mode\", the way you see in apps like YouTube, expanding the app right to the edges of the screen, hiding the status and navigation bars until the user next interacts. This is ideally suited to video or cut-scene content.\nIn Android 4.4+, however, you can now enter true full screen, fully interactive immersive mode. In this mode, your app will remain in true full screen until you choose otherwise; users can swipe down from the top of the screen to temporarily display the system UI.",
+ "usage": "\n```typescript\nimport { AndroidFullScreen } from '@ionic-native/android-full-screen/ngx';\n\nconstructor(private androidFullScreen: AndroidFullScreen) { }\n\n...\n\nthis.androidFullScreen.isImmersiveModeSupported()\n .then(() => console.log('Immersive mode supported'))\n .catch(err => console.log(err));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/mesmotronic/cordova-plugin-fullscreen",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-fullscreen"
+ }
+ },
+ {
+ "packageName": "@ionic-native/android-permissions",
+ "displayName": "Android Permissions",
+ "description": "\nThis plugin is designed to support Android new permissions checking mechanism.\n\nYou can find all permissions here: https://developer.android.com/reference/android/Manifest.permission.html\n",
+ "usage": "\n```\nimport { AndroidPermissions } from '@ionic-native/android-permissions/ngx';\n\n\nconstructor(private androidPermissions: AndroidPermissions) { }\n\n...\n\nthis.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.CAMERA).then(\n result => console.log('Has permission?',result.hasPermission),\n err => this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.CAMERA)\n);\n\nthis.androidPermissions.requestPermissions([this.androidPermissions.PERMISSION.CAMERA, this.androidPermissions.PERMISSION.GET_ACCOUNTS]);\n\n```\n\nAndroid 26 and above: due to Android 26's changes to permissions handling (permissions are requested at time of use rather than at runtime,) if your app does not include any functions (eg. other Ionic Native plugins) that utilize a particular permission, then `requestPermission()` and `requestPermissions()` will resolve immediately with no prompt shown to the user. Thus, you must include a function utilizing the feature you would like to use before requesting permission for it.\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/NeoLSN/cordova-plugin-android-permissions",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-android-permissions"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-availability",
+ "displayName": "App Availability",
+ "description": "\nThis plugin allows you to check if an app is installed on the user's device. It requires an URI Scheme (e.g. twitter://) on iOS or a Package Name (e.g com.twitter.android) on Android.\n\nRequires Cordova plugin: cordova-plugin-appavailability. For more info, please see the [AppAvailability plugin docs](https://github.com/ohh2ahh/AppAvailability).\n",
+ "usage": "\n```typescript\nimport { AppAvailability } from '@ionic-native/app-availability/ngx';\nimport { Platform } from 'ionic-angular';\n\nconstructor(private appAvailability: AppAvailability, private platform: Platform) { }\n\n...\n\nlet app;\n\nif (this.platform.is('ios')) {\n app = 'twitter://';\n} else if (this.platform.is('android')) {\n app = 'com.twitter.android';\n}\n\nthis.appAvailability.check(app)\n .then(\n (yes: boolean) => console.log(app + ' is available'),\n (no: boolean) => console.log(app + ' is NOT available')\n );\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ohh2ahh/AppAvailability",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appavailability"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-center-analytics",
+ "displayName": "App Center Analytics",
+ "description": "\nApp Center Analytics helps you understand user behavior and customer engagement to improve your app.\nThe SDK automatically captures session count and device properties like model, OS version, etc.\nYou can define your own custom events to measure things that matter to you.\nAll the information captured is available in the App Center portal for you to analyze the data.\n\nFor more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/analytics/cordova\n",
+ "usage": "\n```typescript\nimport { AppCenterAnalytics } from '@ionic-native/app-center-analytics/ngx';\n\n\nconstructor(private appCenterAnalytics: AppCenterAnalytics) { }\n\n...\n\nthis.appCenterAnalytics.setEnabled(true).then(() => {\n this.appCenterAnalytics.trackEvent('My Event', { TEST: 'HELLO_WORLD' }).then(() => {\n console.log('Custom event tracked');\n });\n});\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-analytics",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appcenter-analytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-center-crashes",
+ "displayName": "App Center Crashes",
+ "description": "\nApp Center Analytics helps you understand user behavior and customer engagement to improve your app.\nThe SDK automatically captures session count and device properties like model, OS version, etc.\nYou can define your own custom events to measure things that matter to you.\nAll the information captured is available in the App Center portal for you to analyze the data.\n\nFor more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/crashes/cordova\n",
+ "usage": "\n```typescript\nimport { AppCenterCrashes } from '@ionic-native/app-center-crashes/ngx';\n\n\nconstructor(private AppCenterCrashes: AppCenterCrashes) { }\n\n...\n\nthis.AppCenterCrashes.setEnabled(true).then(() => {\n this.AppCenterCrashes.lastSessionCrashReport().then(report => {\n console.log('Crash report', report);\n });\n});\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-crashes",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appcenter-crashes"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-center-push",
+ "displayName": "App Center Push",
+ "description": "\n\nFor more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/push/cordova\n",
+ "usage": "\n```typescript\nimport { AppCenterPush } from '@ionic-native/app-center-push/ngx';\n\n\nconstructor(private appCenterPush: AppCenterPush) { }\n\n...\n\nthis.appCenterPush.setEnabled(true).then(() => {\n this.appCenterPush.addEventListener('My Event').subscribe(pushNotification => {\n console.log('Recived push notification', pushNotification);\n });\n});\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-push",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appcenter-push"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-launcher",
+ "displayName": "App Launcher",
+ "description": "\nSimple Cordova plugin to see if other apps are installed and launch them.\n",
+ "usage": "\n```typescript\nimport { AppLauncher, AppLauncherOptions } from '@ionic-native/app-launcher/ngx';\nimport { Platform } from '@ionic/angular';\n\nconstructor(private appLauncher: AppLauncher, private platform: Platform) { }\n\n...\n\nconst options: AppLauncherOptions = {\n}\n\nif(this.platform.is('ios')) {\n options.uri = 'fb://'\n} else {\n options.packageName = 'com.facebook.katana'\n}\n\nthis.appLauncher.canLaunch(options)\n .then((canLaunch: boolean) => console.log('Facebook is available'))\n .catch((error: any) => console.error('Facebook is not available'));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/nchutchind/cordova-plugin-app-launcher",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-app-launcher"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-minimize",
+ "displayName": "App Minimize",
+ "description": "\nAppMinimize is a plugin to minimize the application on android devices\n",
+ "usage": "\n```typescript\nimport { Platfrom } from '@ionic/angular';\nimport { AppMinimize } from '@ionic-native/app-minimize/ngx';\n\n\nconstructor(private platform: Platform, private appMinimize: AppMinimize) { }\n\n...\n\nthis.platform.registerBackButtonAction(() => {\n this.appMinimize.minimize();\n});\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/tomloprod/cordova-plugin-appminimize",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appminimize"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-preferences",
+ "displayName": "App Preferences",
+ "description": "\nThis plugin allows you to read and write app preferences\n",
+ "usage": "\n```typescript\nimport { AppPreferences } from '@ionic-native/app-preferences/ngx';\n\nconstructor(private appPreferences: AppPreferences) { }\n\n...\n\nthis.appPreferences.fetch('key').then((res) => { console.log(res); });\n\n```\n\n",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "iOS",
+ "macOS",
+ "Windows 8",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/apla/me.apla.cordova.app-preferences",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-app-preferences"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-rate",
+ "displayName": "App Rate",
+ "description": "\nThe AppRate plugin makes it easy to prompt the user to rate your app, either now, later, or never.\n\nRequires Cordova plugin: cordova-plugin-apprate. For more info, please see the [AppRate plugin docs](https://github.com/pushandplay/cordova-plugin-apprate).\n",
+ "usage": "\n```typescript\nimport { AppRate } from '@ionic-native/app-rate/ngx';\n\nconstructor(private appRate: AppRate) { }\n\n...\n// set certain preferences\nthis.appRate.preferences.storeAppURL = {\n ios: '',\n android: 'market://details?id=',\n windows: 'ms-windows-store://review/?ProductId='\n}\n\nthis.appRate.promptForRating(true);\n\n// or, override the whole preferences object\nthis.appRate.preferences = {\n usesUntilPrompt: 3,\n storeAppURL: {\n ios: '',\n android: 'market://details?id=',\n windows: 'ms-windows-store://review/?ProductId='\n }\n}\n\nthis.appRate.promptForRating(false);\n```\n",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/pushandplay/cordova-plugin-apprate",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-apprate"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-update",
+ "displayName": "App Update",
+ "description": "\nThis plugin does self-update for android\n",
+ "usage": "\n\nYou should first host an XML file on your server with the following data in it:\n```xml\n\n 302048\n APK Name\n https://your-remote-api.com/YourApp.apk\n\n```\n\nThen use the following code:\n\n```typescript\nimport { AppUpdate } from '@ionic-native/app-update/ngx';\n\nconstructor(private appUpdate: AppUpdate) {\n\n const updateUrl = 'https://your-remote-api.com/update.xml';\n this.appUpdate.checkAppUpdate(updateUrl).then(() => { console.log('Update available') });\n\n}\n```\n\nThe plugin will compare the app version and update it automatically if the API has a newer version to install.",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/vaenow/cordova-plugin-app-update",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-app-update"
+ }
+ },
+ {
+ "packageName": "@ionic-native/app-version",
+ "displayName": "App Version",
+ "description": "\nReads the version of your app from the target build settings.\n\nRequires Cordova plugin: `cordova-plugin-app-version`. For more info, please see the [Cordova App Version docs](https://github.com/whiteoctober/cordova-plugin-app-version).\n",
+ "usage": "\n```typescript\nimport { AppVersion } from '@ionic-native/app-version/ngx';\n\nconstructor(private appVersion: AppVersion) { }\n\n...\n\n\nthis.appVersion.getAppName();\nthis.appVersion.getPackageName();\nthis.appVersion.getVersionCode();\nthis.appVersion.getVersionNumber();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/whiteoctober/cordova-plugin-app-version",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-app-version"
+ }
+ },
+ {
+ "packageName": "@ionic-native/apple-pay",
+ "displayName": "Apple Pay",
+ "description": "\nA dependency free Cordova plugin to provide Apple Pay functionality.\n",
+ "usage": "\n```typescript\nimport { ApplePay } from '@ionic-native/apple-pay/ngx';\n\n\nconstructor(private applePay: ApplePay) { }\n\n...\nasync applePay() {\n // This block is optional -- only if you need to update order items/shipping\n // methods in response to shipping method selections\n this.applePay.startListeningForShippingContactSelection()\n .subscribe(async selection => {\n try {\n await this.applePay.updateItemsAndShippingMethods({\n items: getFromSelection(selection),\n shippingMethods: getFromSelection(selection),\n });\n }\n catch {\n // handle update items error\n }\n });\n\n try {\n const applePayTransaction = await this.applePay.makePaymentRequest({\n items,\n shippingMethods,\n merchantIdentifier,\n currencyCode,\n countryCode,\n billingAddressRequirement: ['name', 'email', 'phone'],\n shippingAddressRequirement: 'none',\n shippingType: 'shipping'\n });\n\n const transactionStatus = await completeTransactionWithMerchant(applePayTransaction);\n await this.applePay.completeLastTransaction(transactionStatus);\n } catch {\n // handle payment request error\n // Can also handle stop complete transaction but these should normally not occur\n }\n\n // only if you started listening before\n await this.applePay.stopListeningForShippingContactSelection();\n}\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/samkelleher/cordova-plugin-applepay",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-applepay"
+ }
+ },
+ {
+ "packageName": "@ionic-native/apple-wallet",
+ "displayName": "Apple Wallet",
+ "description": "\nA Cordova plugin that enables users from Add Payment Cards to their Apple Wallet.\n",
+ "usage": "\n```typescript\nimport { AppleWallet } from '@ionic-native/apple-wallet/ngx';\n\n\nconstructor(private appleWallet: AppleWallet) { }\n\n\n...\n\n\n// Simple call to determine if the current device supports Apple Pay and has a supported card installed.\nthis.appleWallet.isAvailable()\n .then((res: boolean) => {\n // Expect res to be boolean\n })\n .catch((err) => {\n // Catch {{err}} here\n });\n\n\n...\n\n\n// Simple call to check existence and ellibagility to add a card\nthis.appleWallet.isCardExistInWalletOrWatch(data: CardPrimarySuffixData)\n .then((res: EligibilityData) => {\n // object contains boolean values that ensure that card is already exists in wallet or paired-watch\n })\n .catch((err) => {\n // Catch {{err}} here\n });\n\n\n...\n\n\n// Simple call to check out if there is any paired Watches so that you can toggle visibility of 'Add to Watch' button\nthis.appleWallet.isPairedWatchExist()\n .then((res: WatchExistData) => {\n // object contains boolean value that ensure that there is already a paired Watch\n })\n .catch((err) => {\n // Catch {{err}} here\n });\n\n\n...\n\n\n// Simple call with the configuration data needed to instantiate a new PKAddPaymentPassViewController object.\n// This method provides the data needed to create a request to add your payment pass (credit/debit card). After a successful callback, pass the certificate chain to your issuer server-side using our callback delegate method `AppleWallet.completeAddPaymentPass`. The issuer server-side should returns an encrypted JSON payload containing the encrypted card data, which is required to be get the final response\n\nthis.appleWallet.startAddPaymentPass(data: cardData)\n .then((res: SignatureCertificatesData) => {\n // User proceed and successfully asked to add card to his wallet\n // Use the callback response JSON payload to complete addition process\n })\n .catch((err) => {\n // Catch {{err}} here\n });\n\n\n...\n\n\nthis.appleWallet.completeAddPaymentPass(data: encryptedCardData)\n .then((res: string) => {\n // Expect res to be string either 'success' or 'error'\n })\n .catch((err) => {\n // Catch {{err}} here\n // Error and can not add the card, or something wrong happend\n // PKAddPaymentPassViewController will be dismissed\n });\n\n```",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/tomavic/cordova-apple-wallet",
+ "cordovaPlugin": {
+ "name": "cordova-apple-wallet"
+ }
+ },
+ {
+ "packageName": "@ionic-native/appodeal",
+ "displayName": "Appodeal",
+ "description": "\nPlugin to serve ads through native Appodeal SDKs\n",
+ "usage": "\n```typescript\nimport { Appodeal } from '@ionic-native/appodeal/ngx';\n\nconstructor(private appodeal: Appodeal) {\n\n const appKey = '';\n appodeal.initialize(appKey, appodeal.AD_TYPES.REWARDED_VIDEO);\n appodeal.show(appodeal.AD_TYPES.REWARDED_VIDEO);\n\n}\n```\n",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/appodeal/appodeal-cordova-plugin",
+ "cordovaPlugin": {
+ "name": "https://github.com/appodeal/appodeal-cordova-plugin.git"
+ }
+ },
+ {
+ "packageName": "@ionic-native/appsflyer",
+ "displayName": "Appsflyer",
+ "description": "\nAppsflyer Cordova SDK support for Attribution\n",
+ "usage": "\n```typescript\nimport { Appsflyer } from '@ionic-native/appsflyer/ngx';\n\n\nconstructor(private appsflyer: Appsflyer) { }\n\n...\n\n\nthis.appsflyer.initSdk(options);\n\n```\n",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/AppsFlyerSDK/cordova-plugin-appsflyer-sdk",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-appsflyer-sdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/audio-management",
+ "displayName": "Audio Management",
+ "description": "\nA Cordova plugin to manage volume of audio streams for: ring, music, notification and system. Possible\nringer values for those streams are: silent, vibrate and normal.\n",
+ "usage": "\n```typescript\nimport { AudioManagement } from '@ionic-native/audio-management/ngx';\n\n\nconstructor(public audioman: AudioManagement) { }\n\n...\n\nsetAudioMode() {\n this.audioman.setAudioMode(AudioManagement.AudioMode.NORMAL)\n .then(() => {\n console.log('Device audio mode is now NORMAL');\n })\n .catch((reason) => {\n console.log(reason);\n });\n}\n\ngetAudioMode() {\n this.audioman.getAudioMode()\n .then((value: AudioManagement.AudioModeReturn) => {\n console.log('Device audio mode is ' + value.label + ' (' + value.audioMode + ')');\n })\n .catch((reason) => {\n console.log(reason);\n });\n}\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/clovelCed/cordova-plugin-audiomanagement",
+ "cordovaPlugin": {
+ "name": "clovelced-plugin-audiomanagement"
+ }
+ },
+ {
+ "packageName": "@ionic-native/autostart",
+ "displayName": "Autostart",
+ "description": "\nThis plugin automatically starts your Android app after every boot or auto-update.\nYou can enable or disable the autostart function in your app.\n",
+ "usage": "\n```typescript\nimport { Autostart } from '@ionic-native/autostart/ngx';\n\n\nconstructor(private autostart: Autostart) { }\n\n...\n\nthis.autostart.enable();\n\nthis.autostart.disable();\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/ToniKorin/cordova-plugin-autostart",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-autostart"
+ }
+ },
+ {
+ "packageName": "@ionic-native/background-fetch",
+ "displayName": "Background Fetch",
+ "description": "\niOS Background Fetch Implementation. See: https://developer.apple.com/reference/uikit/uiapplication#1657399\niOS Background Fetch is basically an API which wakes up your app about every 15 minutes (during the user's prime-time hours) and provides your app exactly 30s of background running-time. This plugin will execute your provided callbackFn whenever a background-fetch event occurs. There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible value of UIApplicationBackgroundFetchIntervalMinimum -- iOS determines the rate automatically based upon device usage and time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is presumed to be sleeping, at 3am for example).\nFor more detail, please see https://github.com/transistorsoft/cordova-plugin-background-fetch\n",
+ "usage": "\n\n```typescript\nimport { BackgroundFetch, BackgroundFetchConfig } from '@ionic-native/background-fetch/ngx';\n\n\nconstructor(private backgroundFetch: BackgroundFetch) {\n\n const config: BackgroundFetchConfig = {\n stopOnTerminate: false, // Set true to cease background-fetch from operating after user \"closes\" the app. Defaults to true.\n }\n\n backgroundFetch.configure(config)\n .then(() => {\n console.log('Background Fetch initialized');\n\n this.backgroundFetch.finish();\n\n })\n .catch(e => console.log('Error initializing background fetch', e));\n\n // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin\n backgroundFetch.start();\n\n // Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.\n backgroundFetch.stop();\n\n\n}\n\n```",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/transistorsoft/cordova-plugin-background-fetch",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-background-fetch"
+ }
+ },
+ {
+ "packageName": "@ionic-native/background-geolocation",
+ "displayName": "Background Geolocation",
+ "description": "\nThis plugin provides foreground and background geolocation with battery-saving \"circular region monitoring\" and \"stop detection\". For\nmore detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation\n",
+ "usage": "\n\nBackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.\n\n```typescript\nimport { BackgroundGeolocation, BackgroundGeolocationConfig, BackgroundGeolocationResponse } from '@ionic-native/background-geolocation';\n\nconstructor(private backgroundGeolocation: BackgroundGeolocation) { }\n\n...\n\nconst config: BackgroundGeolocationConfig = {\n desiredAccuracy: 10,\n stationaryRadius: 20,\n distanceFilter: 30,\n debug: true, // enable this hear sounds for background-geolocation life-cycle.\n stopOnTerminate: false, // enable this to clear background location settings when the app terminates\n };\n\nthis.backgroundGeolocation.configure(config)\n .then(() => {\n\n this.backgroundGeolocation.on('location').subscribe((location: BackgroundGeolocationResponse) => {\n console.log(location);\n\n // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,\n // and the background-task may be completed. You must do this regardless if your operations are successful or not.\n // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.\n this.backgroundGeolocation.finish(); // FOR IOS ONLY\n });\n\n });\n\n// start recording location\nthis.backgroundGeolocation.start();\n\n// If you wish to turn OFF background-tracking, call the #stop method.\nthis.backgroundGeolocation.stop();\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/mauron85/cordova-plugin-background-geolocation",
+ "cordovaPlugin": {
+ "name": "@mauron85/cordova-plugin-background-geolocation"
+ }
+ },
+ {
+ "packageName": "@ionic-native/background-mode",
+ "displayName": "Background Mode",
+ "description": "\nCordova plugin to prevent the app from going to sleep while in background.\nRequires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, visit: https://github.com/katzer/cordova-plugin-background-mode",
+ "usage": "\n```typescript\nimport { BackgroundMode } from '@ionic-native/background-mode/ngx';\n\nconstructor(private backgroundMode: BackgroundMode) { }\n\n...\n\nthis.backgroundMode.enable();\n```\n",
+ "platforms": [
+ "AmazonFire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/katzer/cordova-plugin-background-mode",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-background-mode"
+ }
+ },
+ {
+ "packageName": "@ionic-native/backlight",
+ "displayName": "Backlight",
+ "description": "\nThis plugin adds turning on/off the device backlight.\n",
+ "usage": "\n```typescript\nimport { Backlight } from '@ionic-native/backlight/ngx';\n\nconstructor(private backlight: Backlight) { }\n\n...\n\n// Turn backlight on\nthis.backlight.on().then(() => console.log('backlight on'));\n\n// Turn backlight off\nthis.backlight.off().then(() => console.log('backlight off'));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/mebibou/cordova-plugin-backlight",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-backlight"
+ }
+ },
+ {
+ "packageName": "@ionic-native/badge",
+ "displayName": "Badge",
+ "description": "\nThe essential purpose of badge numbers is to enable an application to inform its users that it has something for them — for example, unread messages — when the application isn’t running in the foreground.\n\nRequires Cordova plugin: cordova-plugin-badge. For more info, please see the [Badge plugin docs](https://github.com/katzer/cordova-plugin-badge).\n",
+ "usage": "\n```typescript\nimport { Badge } from '@ionic-native/badge/ngx';\n\nconstructor(private badge: Badge) { }\n\n...\n\nthis.badge.set(10);\nthis.badge.increase(1);\nthis.badge.clear();\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/katzer/cordova-plugin-badge",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-badge"
+ }
+ },
+ {
+ "packageName": "@ionic-native/baidu-push",
+ "displayName": "Baidu Push",
+ "description": "\nThis plugin faciliates the use of Baidu Push notifications.\n",
+ "usage": "\n```typescript\nimport { BaiduPush } from '@ionic-native/baidu-push/ngx';\n\n\nconstructor(private baiduPush: BaiduPush) { }\n\n...\n\nthis.baiduPush.startWork('xxxxxx')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Ti-webdev/cordova-plugin-push-baidu.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-push-baidu"
+ }
+ },
+ {
+ "packageName": "@ionic-native/barcode-scanner",
+ "displayName": "Barcode Scanner",
+ "description": "\nThe Barcode Scanner Plugin opens a camera view and automatically scans a barcode, returning the data back to you.\n\nRequires Cordova plugin: `phonegap-plugin-barcodescanner`. For more info, please see the [BarcodeScanner plugin docs](https://github.com/phonegap/phonegap-plugin-barcodescanner).\n",
+ "usage": "\n```typescript\nimport { BarcodeScanner } from '@ionic-native/barcode-scanner/ngx';\n\nconstructor(private barcodeScanner: BarcodeScanner) { }\n\n...\n\n\nthis.barcodeScanner.scan().then(barcodeData => {\n console.log('Barcode data', barcodeData);\n}).catch(err => {\n\tconsole.log('Error', err);\n});\n```",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/phonegap/phonegap-plugin-barcodescanner",
+ "cordovaPlugin": {
+ "name": "phonegap-plugin-barcodescanner"
+ }
+ },
+ {
+ "packageName": "@ionic-native/base64-to-gallery",
+ "displayName": "Base64 To Gallery",
+ "description": "This plugin allows you to save base64 data as a png image into the device",
+ "usage": "\n```typescript\nimport { Base64ToGallery } from '@ionic-native/base64-to-gallery/ngx';\n\nconstructor(private base64ToGallery: Base64ToGallery) { }\n\n\n...\n\n\nthis.base64ToGallery.base64ToGallery(base64Data, { prefix: '_img' }).then(\n res => console.log('Saved image to gallery ', res),\n err => console.log('Error saving image to gallery ', err)\n);\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/Nexxa/cordova-base64-to-gallery",
+ "cordovaPlugin": {
+ "name": "cordova-base64-to-gallery"
+ }
+ },
+ {
+ "packageName": "@ionic-native/base64",
+ "displayName": "Base64",
+ "description": "\nThis Plugin is used to encode base64 of any file, it uses js code for iOS, but in case of android it uses native code to handle android versions lower than v.3\n",
+ "usage": "\n```typescript\nimport { Base64 } from '@ionic-native/base64/ngx';\n\nconstructor(private base64: Base64) { }\n\n...\n\nlet filePath: string = 'file:///...';\nthis.base64.encodeFile(filePath).then((base64File: string) => {\n console.log(base64File);\n}, (err) => {\n console.log(err);\n});\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/hazemhagrass/phonegap-base64",
+ "cordovaPlugin": {
+ "name": "com-badrit-base64"
+ }
+ },
+ {
+ "packageName": "@ionic-native/battery-status",
+ "displayName": "Battery Status",
+ "description": "\nRequires Cordova plugin: cordova-plugin-batterystatus. For more info, please see the [BatteryStatus plugin docs](https://github.com/apache/cordova-plugin-battery-status).\n",
+ "usage": "\n```typescript\nimport { BatteryStatus } from '@ionic-native/battery-status/ngx';\n\nconstructor(private batteryStatus: BatteryStatus) { }\n\n...\n\n\n// watch change in battery status\nconst subscription = this.batteryStatus.onChange().subscribe(status => {\n console.log(status.level, status.isPlugged);\n});\n\n// stop watch\nsubscription.unsubscribe();\n\n```",
+ "platforms": [
+ "iOS",
+ "Android",
+ "Windows",
+ "Browser"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-battery-status",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-battery-status"
+ }
+ },
+ {
+ "packageName": "@ionic-native/biocatch",
+ "displayName": "BioCatch",
+ "description": "\nBioCatch SDK Cordova support\n",
+ "usage": "\n```typescript\nimport { BioCatch } from '@ionic-native/biocatch';\n\n\nconstructor(private biocatch: BioCatch) { }\n\n...\n\n\nthis.biocatch.start('customer-session-1', 'http://example.com', 'some-public-key')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://bitbucket.org/whisprnd/biocatch-cordova-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-biocatch"
+ }
+ },
+ {
+ "packageName": "@ionic-native/ble",
+ "displayName": "BLE",
+ "description": "\nThis plugin enables communication between a phone and Bluetooth Low Energy (BLE) peripherals.\n\nThe plugin provides a simple JavaScript API for iOS and Android.\n\n- Scan for peripherals\n- Connect to a peripheral\n- Read the value of a characteristic\n- Write new value to a characteristic\n- Get notified when characteristic's value changes\n\nAdvertising information is returned when scanning for peripherals. Service, characteristic, and property info is returned when connecting to a peripheral. All access is via service and characteristic UUIDs. The plugin manages handles internally.\n\nSimultaneous connections to multiple peripherals are supported.\n",
+ "usage": "\n\n```typescript\n\nimport { BLE } from '@ionic-native/ble/ngx';\n\nconstructor(private ble: BLE) { }\n\n```\n\n## Peripheral Data\n\nPeripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.\n\n```typescript\n {\n 'name': 'Battery Demo',\n 'id': '20:FF:D0:FF:D1:C0',\n 'advertising': [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],\n 'rssi': -55\n }\n```\nAfter connecting, the peripheral object also includes service, characteristic and descriptor information.\n\n```typescript\n {\n 'name': 'Battery Demo',\n 'id': '20:FF:D0:FF:D1:C0',\n 'advertising': [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],\n 'rssi': -55,\n 'services': [\n '1800',\n '1801',\n '180f'\n ],\n 'characteristics': [\n {\n 'service': '1800',\n 'characteristic': '2a00',\n 'properties': [\n 'Read'\n ]\n },\n {\n 'service': '1800',\n 'characteristic': '2a01',\n 'properties': [\n 'Read'\n ]\n },\n {\n 'service': '1801',\n 'characteristic': '2a05',\n 'properties': [\n 'Read'\n ]\n },\n {\n 'service': '180f',\n 'characteristic': '2a19',\n 'properties': [\n 'Read'\n ],\n 'descriptors': [\n {\n 'uuid': '2901'\n },\n {\n 'uuid': '2904'\n }\n ]\n }\n ]\n }\n```\n\n## Advertising Data\nBluetooth advertising data is returned in when scanning for devices. The format varies depending on your platform. On Android advertising data will be the raw advertising bytes. iOS does not allow access to raw advertising data, so a dictionary of data is returned.\n\nThe advertising information for both Android and iOS appears to be a combination of advertising data and scan response data.\n\n### Android\n\n```typescript\n {\n 'name': 'demo',\n 'id': '00:1A:7D:DA:71:13',\n 'advertising': ArrayBuffer,\n 'rssi': -37\n }\n```\n\nConvert the advertising info to a Uint8Array for processing. `var adData = new Uint8Array(peripheral.advertising)`\n\n### iOS\n\nNote that iOS uses the string value of the constants for the [Advertisement Data Retrieval Keys](https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBCentralManagerDelegate_Protocol/index.html#//apple_ref/doc/constant_group/Advertisement_Data_Retrieval_Keys). This will likely change in the future.\n\n```typescript\n {\n 'name': 'demo',\n 'id': 'D8479A4F-7517-BCD3-91B5-3302B2F81802',\n 'advertising': {\n 'kCBAdvDataChannel': 37,\n 'kCBAdvDataServiceData': {\n 'FED8': {\n 'byteLength': 7 // data not shown\n }\n },\n 'kCBAdvDataLocalName': 'demo',\n 'kCBAdvDataServiceUUIDs': ['FED8'],\n 'kCBAdvDataManufacturerData': {\n 'byteLength': 7 // data not shown\n },\n 'kCBAdvDataTxPowerLevel': 32,\n 'kCBAdvDataIsConnectable': true\n },\n 'rssi': -53\n }\n```\n\n## Typed Arrays\n\nThis plugin uses typed Arrays or ArrayBuffers for sending and receiving data.\n\nThis means that you need convert your data to ArrayBuffers before sending and from ArrayBuffers when receiving.\n\n```typescript\n // ASCII only\n function stringToBytes(string) {\n var array = new Uint8Array(string.length);\n for (var i = 0, l = string.length; i < l; i++) {\n array[i] = string.charCodeAt(i);\n }\n return array.buffer;\n }\n\n // ASCII only\n function bytesToString(buffer) {\n return String.fromCharCode.apply(null, new Uint8Array(buffer));\n }\n```\nYou can read more about typed arrays in these articles on [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) and [HTML5 Rocks](http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/).\n\n## UUIDs\n\nUUIDs are always strings and not numbers. Some 16-bit UUIDs, such as '2220' look like integers, but they're not. (The integer 2220 is 0x8AC in hex.) This isn't a problem with 128 bit UUIDs since they look like strings 82b9e6e1-593a-456f-be9b-9215160ebcac. All 16-bit UUIDs should also be passed to methods as strings.\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/don/cordova-plugin-ble-central",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ble-central"
+ }
+ },
+ {
+ "packageName": "@ionic-native/blinkid",
+ "displayName": "BlinkId",
+ "description": "\nMicroblink SDK wrapper for barcode and document scanning. See the\nblinkid-phonegap repository for available recognizers and other settings\n",
+ "usage": "\n```typescript\nimport { BlinkId, RecognizerResultState } from '@ionic-native/blinkid/ngx';\n\nconstructor(private blinkId: BlinkId) { }\n\n...\n\nconst overlaySettings = new this.blinkId.DocumentOverlaySettings();\n\nconst usdlRecognizer = new this.blinkId.UsdlRecognizer();\nconst usdlSuccessFrameGrabber = new this.blinkId.SuccessFrameGrabberRecognizer(usdlRecognizer);\n\nconst barcodeRecognizer = new this.blinkId.BarcodeRecognizer();\nbarcodeRecognizer.scanPdf417 = true;\n\nconst recognizerCollection = new this.blinkId.RecognizerCollection([\n usdlSuccessFrameGrabber,\n barcodeRecognizer,\n]);\n\nconst canceled = await this.blinkId.scanWithCamera(\n overlaySettings,\n recognizerCollection,\n { ios: IOS_LICENSE_KEY, android: ANDROID_LICENSE_KEY },\n);\n\nif (!canceled) {\n if (usdlRecognizer.result.resultState === RecognizerResultState.valid) {\n const successFrame = usdlSuccessFrameGrabber.result.successFrame;\n if (successFrame) {\n this.base64Img = `data:image/jpg;base64, ${successFrame}`;\n this.fields = usdlRecognizer.result.fields;\n }\n } else {\n this.barcodeStringData = barcodeRecognizer.result.stringData;\n }\n}\n```\n",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/BlinkID/blinkid-phonegap",
+ "cordovaPlugin": {
+ "name": "blinkid-cordova"
+ }
+ },
+ {
+ "packageName": "@ionic-native/blinkup",
+ "displayName": "BlinkUp",
+ "description": "\nElectric Imp BlinkUp ionic plugin.\n",
+ "usage": "\n```typescript\nimport { BlinkUp } from '@ionic-native/blinkup/ngx';\n\nconst options = {\n apiKey: 'API_KEY',\n timeoutMs: 60000,\n ssid: 'MY_SSID',\n password: 'MY_PASSWORD'\n }\n BlinkUp.flashWifiBlinkUp(options).subscribe(\n (result) => console.log('Done'),\n (error) => console.log(error)\n )\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/SensorShare/cordova-plugin-blinkup",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-blinkup"
+ }
+ },
+ {
+ "packageName": "@ionic-native/bluetooth-le",
+ "displayName": "BluetoothLE",
+ "description": "\nThis plugin has the most complete implementation for interacting with Bluetooth LE devices on Android, iOS and partially Windows.\nIt's a wrap around [randdusing/cordova-plugin-bluetoothle](https://github.com/randdusing/cordova-plugin-bluetoothle/blob/master/readme.md) cordova plugin for Ionic.\nIt supports peripheral **and** central modes and covers most of the API methods available on Android and iOS.\n",
+ "usage": "\n```typescript\nimport { BluetoothLE } from '@ionic-native/bluetooth-le/ngx';\n\n\nconstructor(public bluetoothle: BluetoothLE, public plt: Platform) {\n\n this.plt.ready().then((readySource) => {\n\n console.log('Platform ready from', readySource);\n\n this.bluetoothle.initialize().then(ble => {\n console.log('ble', ble.status) // logs 'enabled'\n });\n\n });\n}\n\n```\n\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/randdusing/cordova-plugin-bluetoothle",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-bluetoothle"
+ }
+ },
+ {
+ "packageName": "@ionic-native/bluetooth-serial",
+ "displayName": "Bluetooth Serial",
+ "description": "This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino (not Android to Android or iOS to iOS).",
+ "usage": "\n```typescript\nimport { BluetoothSerial } from '@ionic-native/bluetooth-serial/ngx';\n\nconstructor(private bluetoothSerial: BluetoothSerial) { }\n\n\n// Write a string\nthis.bluetoothSerial.write('hello world').then(success, failure);\n\n// Array of int or bytes\nthis.bluetoothSerial.write([186, 220, 222]).then(success, failure);\n\n// Typed Array\nvar data = new Uint8Array(4);\ndata[0] = 0x41;\ndata[1] = 0x42;\ndata[2] = 0x43;\ndata[3] = 0x44;\nthis.bluetoothSerial.write(data).then(success, failure);\n\n// Array Buffer\nthis.bluetoothSerial.write(data.buffer).then(success, failure);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/don/BluetoothSerial",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-bluetooth-serial"
+ }
+ },
+ {
+ "packageName": "@ionic-native/braintree",
+ "displayName": "Braintree",
+ "description": "\nThis plugin enables the use of the Braintree Drop-In Payments UI in your Ionic applications on Android and iOS, using the native Drop-In UI for each platform (not the Javascript SDK).\n\n Ionic Native utilizes [a maintained fork](https://github.com/taracque/cordova-plugin-braintree) of the original `cordova-plugin-braintree`\n\n For information on how to use Apple Pay with this plugin, please refer to the [plugin documentation](https://github.com/Taracque/cordova-plugin-braintree#apple-pay-ios-only)\n\n**NOTE**: This is not a complete payments solution. All of the Braintree client-side UIs simply generate a payment nonce that must then be processed by your server to complete the payment.\nSee the [Braintree Node server documentation](https://developers.braintreepayments.com/start/hello-server/node) for details and a [sample Express server](https://github.com/braintree/braintree_express_example) that implements the required functionality.\n",
+ "usage": "\n```typescript\nimport { Braintree, ApplePayOptions, PaymentUIOptions } from '@ionic-native/braintree/ngx';\n\nconstructor(private braintree: Braintree) { }\n\n...\n\n// Your Braintree `Tokenization Key` from the Braintree dashboard.\n// Alternatively you can also generate this token server-side\n// using a client ID in order to allow users to use stored payment methods.\n// See the [Braintree Client Token documentation](https://developers.braintreepayments.com/reference/request/client-token/generate/node#customer_id) for details.\nconst BRAINTREE_TOKEN = '';\n\n// NOTE: Do not provide this unless you have configured your Apple Developer account\n// as well as your Braintree merchant account, otherwise the Braintree module will fail.\nconst appleOptions: ApplePayOptions = {\n merchantId: '',\n currency: 'USD',\n country: 'US'\n}\n\nconst paymentOptions: PaymentUIOptions = {\n amount: '14.99',\n primaryDescription: 'Your product or service (per /item, /month, /week, etc)',\n}\n\nthis.braintree.initialize(BRAINTREE_TOKEN)\n .then(() => this.braintree.setupApplePay(appleOptions))\n .then(() => this.braintree.presentDropInPaymentUI(paymentOptions))\n .then((result: PaymentUIResult) => {\n if (result.userCancelled) {\n console.log(\"User cancelled payment dialog.\");\n } else {\n console.log(\"User successfully completed payment!\");\n console.log(\"Payment Nonce: \" + result.nonce);\n console.log(\"Payment Result.\", result);\n }\n })\n .catch((error: string) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/taracque/cordova-plugin-braintree",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-braintree"
+ }
+ },
+ {
+ "packageName": "@ionic-native/branch-io",
+ "displayName": "BranchIo",
+ "description": "\nBranch.io is an attribution service for deeplinking and invitation links\n",
+ "usage": "\n```\nimport { BranchIo } from '@ionic-native/branch-io/ngx';\n\n\nconstructor(private branch: BranchIo) { }\n\n```\n",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/BranchMetrics/cordova-ionic-phonegap-branch-deep-linking",
+ "cordovaPlugin": {
+ "name": "branch-cordova-sdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/brightness",
+ "displayName": "Brightness",
+ "description": "\nThe Brightness plugin let you control the display brightness of your device.\n\nRequires Cordova plugin: `cordova-plugin-brightness`. For more info, please see the [Brightness plugin docs](https://github.com/mgcrea/cordova-plugin-brightness).\n",
+ "usage": "\n```typescript\nimport { Brightness } from '@ionic-native/brightness/ngx';\n\nconstructor(private brightness: Brightness) { }\n\n...\n\nlet brightnessValue = 0.8;\nthis.brightness.setBrightness(brightnessValue);\n```\n\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/mgcrea/cordova-plugin-brightness",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-brightness"
+ }
+ },
+ {
+ "packageName": "@ionic-native/broadcaster",
+ "displayName": "Broadcaster",
+ "description": "\nThis plugin adds exchanging events between native code and your app.\n",
+ "usage": "\n```typescript\nimport { Broadcaster } from '@ionic-native/broadcaster/ngx';\n\nconstructor(private broadcaster: Broadcaster) { }\n\n...\n\n// Listen to events from Native\nthis.broadcaster.addEventListener('eventName').subscribe((event) => console.log(event));\n\n// Send event to Native\nthis.broadcaster.fireNativeEvent('eventName', {}).then(() => console.log('success'));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Browser"
+ ],
+ "repo": "https://github.com/bsorrentino/cordova-broadcaster",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-broadcaster"
+ }
+ },
+ {
+ "packageName": "@ionic-native/browser-tab",
+ "displayName": "Browser Tab",
+ "description": "\nThis plugin provides an interface to in-app browser tabs that exist on some mobile platforms, specifically [Custom Tabs](http://developer.android.com/tools/support-library/features.html#custom-tabs) on Android (including the [Chrome Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) implementation), and [SFSafariViewController](https://developer.apple.com/library/ios/documentation/SafariServices/Reference/SFSafariViewController_Ref/) on iOS.\n",
+ "usage": "\n```typescript\nimport { BrowserTab } from '@ionic-native/browser-tab/ngx';\n\nconstructor(private browserTab: BrowserTab) {\n\n browserTab.isAvailable()\n .then(isAvailable => {\n if (isAvailable) {\n browserTab.openUrl('https://ionic.io');\n } else {\n // open URL with InAppBrowser instead or SafariViewController\n }\n });\n}\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/google/cordova-plugin-browsertab",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-browsertab"
+ }
+ },
+ {
+ "packageName": "@ionic-native/calendar",
+ "displayName": "Calendar",
+ "description": "\nThis plugin allows you to add events to the Calendar of the mobile device.\n\nRequires Cordova plugin: `cordova-plugin-calendar`. For more info, please see the [Calendar plugin docs](https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin).\n\n",
+ "usage": "\n```typescript\nimport { Calendar } from '@ionic-native/calendar/ngx';\n\nconstructor(private calendar: Calendar) { }\n\n\nthis.calendar.createCalendar('MyCalendar').then(\n (msg) => { console.log(msg); },\n (err) => { console.log(err); }\n);\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-calendar"
+ }
+ },
+ {
+ "packageName": "@ionic-native/call-directory",
+ "displayName": "Call Directory",
+ "description": "\nThis plugin can add phone numbers to an Callkit call directory extension. Call `reloadExtension` after using `addIdentification` and `removeIdentification`\nto process the changes in the call directory extension.\n",
+ "usage": "\n```typescript\nimport { CallDirectory } from '@ionic-native/call-directory/ngx';\n\n\nconstructor(private callDirectory: CallDirectory) { }\n\n\nlet items = [{label: \"Hello\", number: \"123\"}];\nthis.callDirectory.addIdentification(items)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\nthis.callDirectory.reloadExtension()\n .then(res: string) => console.log(res))\n .catch((error: any) => console.error(error));\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/GEDYSIntraWare/cordova-plugin-call-directory",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-call-directory"
+ }
+ },
+ {
+ "packageName": "@ionic-native/call-log",
+ "displayName": "Call Log",
+ "description": "\nThis plugin access the call history on a device and that can be filtered\n",
+ "usage": "\n```typescript\nimport { CallLog } from '@ionic-native/call-log/ngx';\n\n\nconstructor(private callLog: CallLog) { }\n\n````",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/creacore-team/cordova-plugin-calllog",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-calllog"
+ }
+ },
+ {
+ "packageName": "@ionic-native/call-number",
+ "displayName": "Call Number",
+ "description": "\nCall a number directly from your Cordova/Ionic application.\n**NOTE**: The iOS Simulator (and maybe Android Simulators) do not provide access to the phone subsystem.\n",
+ "usage": "\n```typescript\nimport { CallNumber } from '@ionic-native/call-number/ngx';\n\nconstructor(private callNumber: CallNumber) { }\n\n...\n\n\nthis.callNumber.callNumber(\"18001010101\", true)\n .then(res => console.log('Launched dialer!', res))\n .catch(err => console.log('Error launching dialer', err));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Rohfosho/CordovaCallNumberPlugin",
+ "cordovaPlugin": {
+ "name": "call-number"
+ }
+ },
+ {
+ "packageName": "@ionic-native/camera-preview",
+ "displayName": "Camera Preview",
+ "description": "\nShowing camera preview in HTML\n\nRequires Cordova plugin: `https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview.git`. For more info, please see the [Cordova Camera Preview docs](https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview).\n",
+ "usage": "\n```typescript\nimport { CameraPreview, CameraPreviewPictureOptions, CameraPreviewOptions, CameraPreviewDimensions } from '@ionic-native/camera-preview/ngx';\n\nconstructor(private cameraPreview: CameraPreview) { }\n\n...\n\n// camera options (Size and location). In the following example, the preview uses the rear camera and display the preview in the back of the webview\nconst cameraPreviewOpts: CameraPreviewOptions = {\n x: 0,\n y: 0,\n width: window.screen.width,\n height: window.screen.height,\n camera: 'rear',\n tapPhoto: true,\n previewDrag: true,\n toBack: true,\n alpha: 1\n}\n\n// start camera\nthis.cameraPreview.startCamera(cameraPreviewOpts).then(\n (res) => {\n console.log(res)\n },\n (err) => {\n console.log(err)\n });\n\n// Set the handler to run every time we take a picture\nthis.cameraPreview.setOnPictureTakenHandler().subscribe((result) => {\n console.log(result);\n // do something with the result\n});\n\n\n// picture options\nconst pictureOpts: CameraPreviewPictureOptions = {\n width: 1280,\n height: 1280,\n quality: 85\n}\n\n// take a picture\nthis.cameraPreview.takePicture(this.pictureOpts).then((imageData) => {\n this.picture = 'data:image/jpeg;base64,' + imageData;\n}, (err) => {\n console.log(err);\n this.picture = 'assets/img/test.jpg';\n});\n\n// take a snap shot\nthis.cameraPreview.takeSnapshot(this.pictureOpts).then((imageData) => {\n this.picture = 'data:image/jpeg;base64,' + imageData;\n}, (err) => {\n console.log(err);\n this.picture = 'assets/img/test.jpg';\n});\n\n\n// Switch camera\nthis.cameraPreview.switchCamera();\n\n// set color effect to negative\nthis.cameraPreview.setColorEffect('negative');\n\n// Stop the camera preview\nthis.cameraPreview.stopCamera();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-camera-preview"
+ }
+ },
+ {
+ "packageName": "@ionic-native/camera",
+ "displayName": "Camera",
+ "description": "\nTake a photo or capture video.\n\nRequires the Cordova plugin: `cordova-plugin-camera`. For more info, please see the [Cordova Camera Plugin Docs](https://github.com/apache/cordova-plugin-camera).\n\n[Warning] Since IOS 10 the camera requires permissions to be placed in your config.xml add\n```xml\n\n You can take photos\n\n```\ninside of the {\n // imageData is either a base64 encoded string or a file URI\n // If it's base64 (DATA_URL):\n let base64Image = 'data:image/jpeg;base64,' + imageData;\n}, (err) => {\n // Handle error\n});\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-camera",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-camera"
+ }
+ },
+ {
+ "packageName": "@ionic-native/card-io",
+ "displayName": "Card IO",
+ "description": "",
+ "usage": "\nThis plug-in exposes card.io credit card scanning.\n\n**NOTE**: If you would like to actually process a credit card charge, you might be interested in the [PayPal Cordova Plug-in](https://github.com/paypal/PayPal-Cordova-Plugin).\n\nRequires Cordova plugin: `card.io.cordova.mobilesdk`. For more info, please see the [Card IO plugin docs](https://github.com/card-io/card.io-Cordova-Plugin).\n\nNote: For use with iOS 10 + When building your app with the iOS 10 SDK +, you have to add some info to the info.plist file. This is due to increased security in iOS 10. Go to your app directory and search for the Info.plist file. Add the following lines in the main element.\n```xml\nNSCameraUsageDescription\nTo scan credit cards.\n```\n```typescript\nimport { CardIO } from '@ionic-native/card-io/ngx';\n\nconstructor(private cardIO: CardIO) { }\n\n...\n\n\nthis.cardIO.canScan()\n .then(\n (res: boolean) => {\n if(res){\n let options = {\n requireExpiry: true,\n requireCVV: false,\n requirePostalCode: false\n };\n this.cardIO.scan(options);\n }\n }\n );\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/card-io/card.io-Cordova-Plugin",
+ "cordovaPlugin": {
+ "name": "card.io.cordova.mobilesdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/chooser",
+ "displayName": "Chooser",
+ "description": "\nFile chooser plugin for Cordova.\n\nThe following must be added to config.xml to prevent crashing when selecting large files on Android:\n```xml\n\n \n \n \n\n```\n",
+ "usage": "\n```typescript\nimport { Chooser } from '@ionic-native/chooser/ngx';\n\n\nconstructor(private chooser: Chooser) { }\n\n...\n\n\nthis.chooser.getFile()\n .then(file => console.log(file ? file.name : 'canceled'))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/cyph/cordova-plugin-chooser",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-chooser"
+ }
+ },
+ {
+ "packageName": "@ionic-native/class-kit",
+ "displayName": "Class Kit",
+ "description": "Plugin for using Apple's ClassKit framework.\n\n\nPrerequisites:\nOnly works with Xcode 9.4 and iOS 11.4. Your Provisioning Profile must include the ClassKit capability. Read more about how to Request ClassKit Resources (https://developer.apple.com/contact/classkit/) in here: https://developer.apple.com/documentation/classkit/enabling_classkit_in_your_app.\nAlso note that you can’t test ClassKit behavior in Simulator because Schoolwork isn’t available in that environment.\n",
+ "usage": "\n```typescript\nimport { ClassKit, CCKContext, CCKBinaryItem, CCKQuantityItem, CCKScoreItem, CCKContextTopic, CCKContextType, CCKBinaryType } from '@ionic-native/class-kit/ngx';\n\n// Init contexts defined in XML file 'CCK-contexts.xml'\nconstructor( ..., private classKit: ClassKit) {\n platform.ready().then(() => {\n classKit.initContextsFromXml(\"classkitplugin://\")\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n });\n}\n\n...\n\n// Init context with identifier path\nconst context: CCKContext = {\n identifierPath: [\"parent_title_one\", \"child_one\", \"child_one_correct_quiz\"],\n title: \"child one correct quiz\",\n type: CCKContextType.exercise,\n topic: CCKContextTopic.science,\n displayOrder: 0\n};\n\nthis.classKit.addContext(\"classkitplugin://\", context)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Remove all contexts\nthis.classKit.removeContexts()\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Remove context with identifier path\nthis.classKit.removeContext([\"parent_title_one\", \"child_one\", \"child_one_correct_quiz\"])\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Begin a new activity or restart an activity for a given context\nthis.classKit.beginActivity([\"parent_title_one\", \"child_two\", \"child_two_quiz\"], false)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Adds a progress range to the active given activity\nthis.classKit.setProgressRange(0, 0.66)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Adds a progress to the active given activity\nthis.classKit.setProgress(0.66)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Adds activity information that is true or false, pass or fail, yes or no\nconst binaryItem: CCKBinaryItem = {\n identifier: \"child_two_quiz_IDENTIFIER_1\",\n title: \"CHILD TWO QUIZ 1\",\n type: CCKBinaryType.trueFalse,\n isCorrect: isCorrect,\n isPrimaryActivityItem: false\n};\n\nthis.classKit.setBinaryItem(binaryItem)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Adds activity information that signifies a score out of a possible maximum\nconst scoreItem: CCKScoreItem = {\n identifier: \"total_score\",\n title: \"Total Score :-)\",\n score: 0.66,\n maxScore: 1.0,\n isPrimaryActivityItem: true\n};\n\nthis.classKit.setScoreItem(scoreItem)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n\n// Activity information that signifies a quantity\nconst quantityItem: CCKQuantityItem = {\n identifier: \"quantity_item_hints\",\n title: \"Hints\",\n quantity: 12,\n isPrimaryActivityItem: false\n};\n\nthis.classKit.setQuantityItem(quantityItem)\n .then(() => console.log(\"success\"))\n .catch(e => console.log(\"error: \", e));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/sebastianbaar/cordova-plugin-classkit.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-classkit"
+ }
+ },
+ {
+ "packageName": "@ionic-native/clevertap",
+ "displayName": "CleverTap",
+ "description": "\nCordova Plugin that wraps CleverTap SDK for Android and iOS\n",
+ "usage": "\n```typescript\nimport { CleverTap } from '@ionic-native/clevertap/ngx';\n\nconstructor(private clevertap: CleverTap) { }\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/CleverTap/clevertap-cordova",
+ "cordovaPlugin": {
+ "name": "clevertap-cordova"
+ }
+ },
+ {
+ "packageName": "@ionic-native/clipboard",
+ "displayName": "Clipboard",
+ "description": "\nClipboard management plugin for Cordova that supports iOS, Android, and Windows Phone 8.\n\n",
+ "usage": "\n```typescript\nimport { Clipboard } from '@ionic-native/clipboard/ngx';\n\nconstructor(private clipboard: Clipboard) { }\n\n...\n\n\nthis.clipboard.copy('Hello world');\n\nthis.clipboard.paste().then(\n (resolve: string) => {\n alert(resolve);\n },\n (reject: string) => {\n alert('Error: ' + reject);\n }\n );\n\nthis.clipboard.clear();\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/ihadeed/cordova-clipboard",
+ "cordovaPlugin": {
+ "name": "cordova-clipboard"
+ }
+ },
+ {
+ "packageName": "@ionic-native/cloud-settings",
+ "displayName": "Cloud Settings",
+ "description": "\nStores app settings in cloud storage so if the user re-installs the app or installs it on a different device, the settings will be restored and available in the new installation.\n",
+ "usage": "\n```typescript\nimport { CloudSettings } from '@ionic-native/cloud-settings/ngx';\n\n\nconstructor(private cloudSettings: CloudSettings) { }\n\n...\n\nthis.cloudSettings.exists()\n .then((exists: boolean) => console.log(\"Saved settings exist: \" + exists) )\n\nthis.cloudSettings.load()\n .then((settings: any) => this.settings = settings)\n .catch((error: any) => console.error(error));\n\nthis.cloudSettings.save(this.settings)\n .then((savedSettings: any) => console.log(\"Saved settings: \" + JSON.stringify(savedSettings)))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/dpa99c/cordova-plugin-cloud-settings",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-cloud-settings"
+ }
+ },
+ {
+ "packageName": "@ionic-native/code-push",
+ "displayName": "Code Push",
+ "description": "\nCodePush plugin for Cordova by Microsoft that supports iOS and Android.\n\nFor more info, please see https://github.com/Dellos7/example-cordova-code-push-plugin\n",
+ "usage": "\n```typescript\nimport { CodePush } from '@ionic-native/code-push/ngx';\n\nconstructor(private codePush: CodePush) { }\n\n...\n\n// note - mostly error & completed methods of observable will not fire\n// as syncStatus will contain the current state of the update\nthis.codePush.sync().subscribe((syncStatus) => console.log(syncStatus));\n\nconst downloadProgress = (progress) => { console.log(`Downloaded ${progress.receivedBytes} of ${progress.totalBytes}`); }\nthis.codePush.sync({}, downloadProgress).subscribe((syncStatus) => console.log(syncStatus));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Microsoft/cordova-plugin-code-push",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-code-push"
+ }
+ },
+ {
+ "packageName": "@ionic-native/colored-browser-tabs",
+ "displayName": "Colored Browser Tabs",
+ "description": "\nThis plugin opens Chrome Custom Tabs on Android or SafariViewController on iOS\n",
+ "usage": "\n```typescript\nimport { ColoredBrowserTabs } from '@ionic-native/colored-browser-tabs/ngx';\n\n\nconstructor(private browserTabs: ColoredBrowserTabs) { }\n\n...\n\n\nthis.browserTabs.openTab('www.example.url', '#ffffff')\n .subscribe()\n\nthis.browserTabs.openTabWithAnimation('www.example.url', 'slide_x', '#ffffff')\n .subscribe()\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/TobyEb/cordova-plugin-colored-browser-tabs",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-colored-browser-tabs"
+ }
+ },
+ {
+ "packageName": "@ionic-native/contacts",
+ "displayName": "Contacts",
+ "description": "\nAccess and manage Contacts on the device.\n",
+ "usage": "\n\n```typescript\nimport { Contacts, Contact, ContactField, ContactName } from '@ionic-native/contacts/ngx';\n\nconstructor(private contacts: Contacts) { }\n\nlet contact: Contact = this.contacts.create();\n\ncontact.name = new ContactName(null, 'Smith', 'John');\ncontact.phoneNumbers = [new ContactField('mobile', '6471234567')];\ncontact.save().then(\n () => console.log('Contact saved!', contact),\n (error: any) => console.error('Error saving contact.', error)\n);\n\n```",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "Firefox OS",
+ "iOS",
+ "Ubuntu",
+ "Windows",
+ "Windows 8",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-contacts",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-contacts"
+ }
+ },
+ {
+ "packageName": "@ionic-native/couchbase-lite",
+ "displayName": "Couchbase Lite",
+ "description": "\nPlugin to install Couchbase Lite in your PhoneGap app on iOS or Android\n",
+ "usage": "\n```typescript\nimport { CouchbaseLite } from '@ionic-native/couchbase-lite/ngx';\nimport { Http } from '@angular/http';\nimport { Observable } from 'rxjs'\nconstructor(private couchbase: CouchbaseLite, private platform:Platform,private _http:Http) {\n this.initMethod();\n}\nurl:string;\ninitMethod() {\n this.couchbase.getURL().then((url)=> {\n this.url = url;\n })\n}\ngetUrl() {\n return this.url;\n}\n// DATABASES //\ncreateDatabase(database_name:string) {\n let url = this.getUrl();\n url = url+database_name;\n return this._http\n .put(url)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n })\n }\ndeleteDatabase(database_name:string) {\n let url = this.getUrl();\n url = url+database_name;\n return this._http\n .delete(url)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n })\n}\ngetAllDbs() {\n let url = this.getUrl();\n url = url+'_all_dbs';\n return this._http\n .get(url)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n })\n}\n// DOCUMENTS //\ngetAllDocuments(database_name:string){\n let url = this.getUrl();\n // include_docs=true will include a doc inside response, it is false by default\n url = url + database_name + '/_all_docs?include_docs=true';\n return this._http\n .get(url)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n }) .\n}\ncreateDocument(database_name:string,document){\n let url = this.getUrl();\n url = url + database_name;\n return this._http\n .post(url,document)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n }) .\n}\nlet document = {\n _id:'You can either specify the document ID (must be string) else couchbase generates one for your doc',\n data:{name:'sandman',age:25,city:pune}\n }\ncreateDocument('justbe', document);\n// successful response\n{ \"id\": \"string\",\"rev\": \"string\",\"ok\": true }\nupdateDocument(database_name:string,document){\n let url = this.getUrl();\n url = url + database_name + '/' + document._id;\n return this._http\n .put(url,document)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n }) .\n}\n// for updation of document your document must contain most recent rev(revision) id.\n// for each updation of document new rev id is get generated\n// successful response\n{ \"id\": \"string\",\"rev\": \"string(new revision id)\",\"ok\": true }\ndeleteDocument(database_name:string,document){\n let url = this.getUrl();\n url = url + database_name + '/' + document._id +'?rev='+doc._rev;\n return this._http\n .delete(url)\n .map(data => { this.results = data['results'] })\n .catch((error:any) => {\n return Observable.throw(error.json() || 'Couchbase Lite error');\n }) .\n}\n\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "couchbase-lite-phonegap-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/crop",
+ "displayName": "Crop",
+ "description": "Crops images",
+ "usage": "\n```typescript\nimport { Crop } from '@ionic-native/crop/ngx';\n\nconstructor(private crop: Crop) { }\n\n...\n\nthis.crop.crop('path/to/image.jpg', {quality: 75})\n .then(\n newImage => console.log('new image path is: ' + newImage),\n error => console.error('Error cropping image', error)\n );\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/jeduan/cordova-plugin-crop",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-crop"
+ }
+ },
+ {
+ "packageName": "@ionic-native/date-picker",
+ "displayName": "Date Picker",
+ "description": "\nThe DatePicker plugin allows the user to fetch date or time using native dialogs.\n",
+ "usage": "\n```typescript\nimport { DatePicker } from '@ionic-native/date-picker/ngx';\n\nconstructor(private datePicker: DatePicker) { }\n\n\n...\n\n\nthis.datePicker.show({\n date: new Date(),\n mode: 'date',\n androidTheme: this.datePicker.ANDROID_THEMES.THEME_HOLO_DARK\n}).then(\n date => console.log('Got date: ', date),\n err => console.log('Error occurred while getting date: ', err)\n);\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/VitaliiBlagodir/cordova-plugin-datepicker",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-datepicker"
+ }
+ },
+ {
+ "packageName": "@ionic-native/db-meter",
+ "displayName": "DB Meter",
+ "description": "This plugin defines a global DBMeter object, which permits to get the decibel values from the microphone.",
+ "usage": "\n```typescript\nimport { DBMeter } from '@ionic-native/db-meter/ngx';\n\nconstructor(private dbMeter: DBMeter) { }\n\n...\n\n\n// Start listening\nlet subscription = this.dbMeter.start().subscribe(\n data => console.log(data)\n);\n\n// Check if we are listening\nthis.dbMeter.isListening().then(\n isListening => console.log(isListening)\n);\n\n// Stop listening\nsubscription.unsubscribe();\n\n// Delete DBMeter instance from memory\nthis.dbMeter.delete().then(\n () => console.log('Deleted DB Meter instance'),\n error => console.log('Error occurred while deleting DB Meter instance')\n);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/akofman/cordova-plugin-dbmeter",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-dbmeter"
+ }
+ },
+ {
+ "packageName": "@ionic-native/deeplinks",
+ "displayName": "Deeplinks",
+ "description": "This plugin handles deeplinks on iOS and Android for both custom URL scheme links\nand Universal App Links.\n",
+ "usage": "\n```typescript\nimport { Deeplinks } from '@ionic-native/deeplinks/ngx';\n\nconstructor(private deeplinks: Deeplinks) { }\n\nthis.deeplinks.route({\n '/about-us': AboutPage,\n '/universal-links-test': AboutPage,\n '/products/:productId': ProductPage\n }).subscribe(match => {\n // match.$route - the route we matched, which is the matched entry from the arguments to route()\n // match.$args - the args passed in the link\n // match.$link - the full link data\n console.log('Successfully matched route', match);\n }, nomatch => {\n // nomatch.$link - the full link data\n console.error('Got a deeplink that didn\\'t match', nomatch);\n });\n```\n\nAlternatively, if you're using Ionic, there's a convenience method that takes a reference to a `NavController` and handles\nthe actual navigation for you:\n\n```typescript\nthis.deeplinks.routeWithNavController(this.navController, {\n '/about-us': AboutPage,\n '/products/:productId': ProductPage\n}).subscribe(match => {\n // match.$route - the route we matched, which is the matched entry from the arguments to route()\n // match.$args - the args passed in the link\n // match.$link - the full link data\n console.log('Successfully matched route', match);\n }, nomatch => {\n // nomatch.$link - the full link data\n console.error('Got a deeplink that didn\\'t match', nomatch);\n });\n```\n\nSee the [Ionic Deeplinks Demo](https://github.com/ionic-team/ionic2-deeplinks-demo/blob/master/app/app.ts) for an example of how to\nretrieve the `NavController` reference at runtime.\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS"
+ ],
+ "repo": "https://github.com/ionic-team/ionic-plugin-deeplinks",
+ "cordovaPlugin": {
+ "name": "ionic-plugin-deeplinks"
+ }
+ },
+ {
+ "packageName": "@ionic-native/device-accounts",
+ "displayName": "Device Accounts",
+ "description": "\nGets the Google accounts associated with the Android device\n",
+ "usage": "\n```typescript\nimport { DeviceAccounts } from '@ionic-native/device-accounts/ngx';\n\nconstructor(private deviceAccounts: DeviceAccounts) { }\n\n...\n\nthis.deviceAccounts.get()\n .then(accounts => console.log(accounts))\n .catch(error => console.error(error));\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/xUnholy/cordova-device-accounts",
+ "cordovaPlugin": {
+ "name": "cordova-device-accounts-v2"
+ }
+ },
+ {
+ "packageName": "@ionic-native/device-feedback",
+ "displayName": "Device Feedback",
+ "description": "\n\nPlugin that lets you provide haptic or acoustic feedback on Android devices.\n",
+ "usage": "\n```typescript\nimport { DeviceFeedback } from '@ionic-native/device-feedback/ngx';\n\nconstructor(private deviceFeedback: DeviceFeedback) { }\n\n...\n\n\nthis.deviceFeedback.acoustic();\n\nthis.deviceFeedback.haptic(0);\n\nthis.deviceFeedback.isFeedbackEnabled().then(feedback => {\n console.log(feedback);\n // {\n // acoustic: true,\n // haptic: true\n // }\n });\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/VVelda/device-feedback",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-velda-devicefeedback"
+ }
+ },
+ {
+ "packageName": "@ionic-native/device-motion",
+ "displayName": "Device Motion",
+ "description": "\nRequires Cordova plugin: `cordova-plugin-device-motion`. For more info, please see the [Device Motion docs](https://github.com/apache/cordova-plugin-device-motion).\n",
+ "usage": "\n```typescript\nimport { DeviceMotion, DeviceMotionAccelerationData } from '@ionic-native/device-motion/ngx';\n\nconstructor(private deviceMotion: DeviceMotion) { }\n\n...\n\n// Get the device current acceleration\nthis.deviceMotion.getCurrentAcceleration().then(\n (acceleration: DeviceMotionAccelerationData) => console.log(acceleration),\n (error: any) => console.log(error)\n);\n\n// Watch device acceleration\nvar subscription = this.deviceMotion.watchAcceleration().subscribe((acceleration: DeviceMotionAccelerationData) => {\n console.log(acceleration);\n});\n\n// Stop watch\nsubscription.unsubscribe();\n\n```",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "Firefox OS",
+ "iOS",
+ "Tizen",
+ "Ubuntu",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-device-motion",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-device-motion"
+ }
+ },
+ {
+ "packageName": "@ionic-native/device-orientation",
+ "displayName": "Device Orientation",
+ "description": "\nRequires Cordova plugin: `cordova-plugin-device-orientation`. For more info, please see the [Device Orientation docs](https://github.com/apache/cordova-plugin-device-orientation).\n",
+ "usage": "\n```typescript\n// DeviceOrientationCompassHeading is an interface for compass\nimport { DeviceOrientation, DeviceOrientationCompassHeading } from '@ionic-native/device-orientation/ngx';\n\nconstructor(private deviceOrientation: DeviceOrientation) { }\n\n...\n\n// Get the device current compass heading\nthis.deviceOrientation.getCurrentHeading().then(\n (data: DeviceOrientationCompassHeading) => console.log(data),\n (error: any) => console.log(error)\n);\n\n// Watch the device compass heading change\nvar subscription = this.deviceOrientation.watchHeading().subscribe(\n (data: DeviceOrientationCompassHeading) => console.log(data)\n);\n\n// Stop watching heading change\nsubscription.unsubscribe();\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "Firefox OS",
+ "iOS",
+ "Tizen",
+ "Ubuntu",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-device-orientation",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-device-orientation"
+ }
+ },
+ {
+ "packageName": "@ionic-native/device",
+ "displayName": "Device",
+ "description": "\nAccess information about the underlying device and platform.\n",
+ "usage": "\n```typescript\nimport { Device } from '@ionic-native/device/ngx';\n\nconstructor(private device: Device) { }\n\n...\n\nconsole.log('Device UUID is: ' + this.device.uuid);\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "macOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-device",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-device"
+ }
+ },
+ {
+ "packageName": "@ionic-native/diagnostic",
+ "displayName": "Diagnostic",
+ "description": "\nChecks whether device hardware features are enabled or available to the app, e.g. camera, GPS, wifi\n",
+ "usage": "\n```typescript\nimport { Diagnostic } from '@ionic-native/diagnostic/ngx';\n\nconstructor(private diagnostic: Diagnostic) { }\n\n...\n\nlet successCallback = (isAvailable) => { console.log('Is available? ' + isAvailable); }\nlet errorCallback = (e) => console.error(e);\n\nthis.diagnostic.isCameraAvailable().then(successCallback).catch(errorCallback);\n\nthis.diagnostic.isBluetoothAvailable().then(successCallback, errorCallback);\n\n\nthis.diagnostic.getBluetoothState()\n .then((state) => {\n if (state == this.diagnostic.bluetoothState.POWERED_ON){\n // do something\n } else {\n // do something else\n }\n }).catch(e => console.error(e));\n\n```\n\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/dpa99c/cordova-diagnostic-plugin",
+ "cordovaPlugin": {
+ "name": "cordova.plugins.diagnostic"
+ }
+ },
+ {
+ "packageName": "@ionic-native/dialogs",
+ "displayName": "Dialogs",
+ "description": "\nThis plugin gives you ability to access and customize the device native dialogs.\n\nRequires Cordova plugin: `cordova-plugin-dialogs`. For more info, please see the [Dialogs plugin docs](https://github.com/apache/cordova-plugin-dialogs).\n",
+ "usage": "\n```typescript\nimport { Dialogs } from '@ionic-native/dialogs/ngx';\n\nconstructor(private dialogs: Dialogs) { }\n\n...\n\nthis.dialogs.alert('Hello world')\n .then(() => console.log('Dialog dismissed'))\n .catch(e => console.log('Error displaying dialog', e));\n\n\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-dialogs",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-dialogs"
+ }
+ },
+ {
+ "packageName": "@ionic-native/dns",
+ "displayName": "DNS",
+ "description": "A plugin for Apache Cordova that enables applications to manually resolve hostnames into an underlying network address. This is mostly useful for determining whether there is a problem with the device's DNS server configuration.\n",
+ "usage": "\n```typescript\nimport { DNS } from '@ionic-native/dns/ngx';\n\n\nconstructor(private dns: DNS) { }\n\n...\nthis.dns.resolve(hostname)\n .then(\n address => console.log('Resolved ' + hostname + ' to ' + address),\n error => console.log('Failed to resolve ' + hostname + ': ' + error)\n );\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://bitbucket.org/zegeba/cordova-plugin-dns",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-dns"
+ }
+ },
+ {
+ "packageName": "@ionic-native/document-picker",
+ "displayName": "iOS DocumentPicker",
+ "description": "\n\nOpens the file picker on iOS for the user to select a file, returns a file URI.\nAllows the user to upload files from iCloud\n",
+ "usage": "\n```typescript\nimport { DocumentPicker } from '@ionic-native/document-picker/ngx';\n\nconstructor(private docPicker: DocumentPicker) { }\n\n...\n\nthis.docPicker.getFile('all')\n .then(uri => console.log(uri))\n .catch(e => console.log(e));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/iampossible/Cordova-DocPicker",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-documentpicker.DocumentPicker"
+ }
+ },
+ {
+ "packageName": "@ionic-native/document-viewer",
+ "displayName": "Document Viewer",
+ "description": "\nThis plugin offers a slim API to view PDF files which are either stored in the apps assets folder (/www/*) or in any other file system directory available via the cordova file plugin.\n",
+ "usage": "\n```typescript\nimport { DocumentViewer } from '@ionic-native/document-viewer/ngx';\n\n\nconstructor(private document: DocumentViewer) { }\n\n...\nconst options: DocumentViewerOptions = {\n title: 'My PDF'\n}\n\nthis.document.viewDocument('assets/myFile.pdf', 'application/pdf', options)\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/sitewaerts/cordova-plugin-document-viewer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-document-viewer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/downloader",
+ "displayName": "Downloader",
+ "description": "\nThis plugin is designed to support downloading files using Android DownloadManager.\n\n",
+ "usage": "\n```typescript\nimport { Downloader } from '@ionic-native/downloader/ngx';\n\n\nconstructor(private downloader: Downloader) { }\n\n...\n\n var request: DownloadRequest = {\n uri: YOUR_URI,\n title: 'MyDownload',\n description: '',\n mimeType: '',\n visibleInDownloadsUi: true,\n notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,\n destinationInExternalFilesDir: {\n dirType: 'Downloads',\n subPath: 'MyFile.apk'\n }\n };\n\n\n this.downloader.download(request)\n \t\t\t.then((location: string) => console.log('File downloaded at:'+location))\n \t\t\t.catch((error: any) => console.error(error));\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/Luka313/integrator-cordova-plugin-downloader.git",
+ "cordovaPlugin": {
+ "name": "integrator-cordova-plugin-downloader"
+ }
+ },
+ {
+ "packageName": "@ionic-native/email-composer",
+ "displayName": "Email Composer",
+ "description": "\n\nRequires Cordova plugin: cordova-plugin-email-composer. For more info, please see the [Email Composer plugin docs](https://github.com/hypery2k/cordova-email-plugin).\n\n",
+ "usage": "\n```typescript\nimport { EmailComposer } from '@ionic-native/email-composer/ngx';\n\nconstructor(private emailComposer: EmailComposer) { }\n\n...\n\n\nthis.emailComposer.isAvailable().then((available: boolean) =>{\n if(available) {\n //Now we know we can send\n }\n});\n\nlet email = {\n to: 'max@mustermann.de',\n cc: 'erika@mustermann.de',\n bcc: ['john@doe.com', 'jane@doe.com'],\n attachments: [\n 'file://img/logo.png',\n 'res://icon.png',\n 'base64:icon.png//iVBORw0KGgoAAAANSUhEUg...',\n 'file://README.pdf'\n ],\n subject: 'Cordova Icons',\n body: 'How are you? Nice greetings from Leipzig',\n isHtml: true\n}\n\n// Send a text message using default options\nthis.emailComposer.open(email);\n```\n\nYou can also assign aliases to email apps\n```ts\n// add alias\nthis.email.addAlias('gmail', 'com.google.android.gm');\n\n// then use alias when sending email\nthis.email.open({\n app: 'gmail',\n ...\n});\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows",
+ "macOS"
+ ],
+ "repo": "https://github.com/katzer/cordova-plugin-email-composer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-email-composer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/estimote-beacons",
+ "displayName": "Estimote Beacons\n",
+ "description": "\nThis plugin enables communication between a phone and Estimote Beacons peripherals.\n",
+ "usage": "\n```typescript\nimport { EstimoteBeacons } from '@ionic-native/estimote-beacons/ngx';\n\nconstructor(private eb: EstimoteBeacons) { }\n\n...\n\nthis.eb.requestAlwaysAuthorization();\n\nthis.eb.enableAnalytics(true);\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/evothings/phonegap-estimotebeacons",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-estimote"
+ }
+ },
+ {
+ "packageName": "@ionic-native/extended-device-information",
+ "displayName": "Extended Device Information",
+ "description": "\nRetrieves additional device information from the Device Hardware\n - memory\n - cpumhz\n - totalstorage\n - freestorage\n",
+ "usage": "\n```typescript\nimport { ExtendedDeviceInformation } from '@ionic-native/extended-device-information/ngx';\n\n\nconstructor(private extendedDeviceInformation: ExtendedDeviceInformation) { }\n\n...\n\nconsole.log('The Memory is: ' + this.extendedDeviceInformation.memory);\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/danielehrhardt/cordova-plugin-extended-device-information",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-extended-device-information"
+ }
+ },
+ {
+ "packageName": "@ionic-native/fabric",
+ "displayName": "Answers",
+ "description": "\nAPI for interacting with the Answers kit.\n\nhttps://docs.fabric.io/crashlytics/index.html\n",
+ "usage": "\n```typescript\nimport { Answers } from '@ionic-native/fabric/ngx';\n\n\nconstructor(private answers: Answers) { }\n\n...\n\nthis.answers.sendCustomEvent('SomeCustomEvent', { some: \"attributes\" })\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://www.npmjs.com/package/cordova-fabric-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-fabric-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/facebook",
+ "displayName": "Facebook",
+ "description": "\nUse the Facebook Connect plugin to obtain access to the native FB application on iOS and Android.\n\nRequires Cordova plugin: `cordova-plugin-facebook4`. For more info, please see the [Facebook Connect](https://github.com/jeduan/cordova-plugin-facebook4).\n\n#### Installation\n\n To use the FB plugin, you first have to create a new Facebook App inside of the Facebook developer portal at [https://developers.facebook.com/apps](https://developers.facebook.com/apps).\n\n[](https://developers.facebook.com/apps/)\n\nRetrieve the `App ID` and `App Name`.\n\n[](https://developers.facebook.com/apps/)\n\nThen type in the following command in your Terminal, where APP_ID and APP_NAME are the values from the Facebook Developer portal.\n\n```bash\n ionic cordova plugin add cordova-plugin-facebook4 --variable APP_ID=\"123456789\" --variable APP_NAME=\"myApplication\"\n```\n\nAfter, you'll need to add the native platforms you'll be using to your app in the Facebook Developer portal under your app's Settings:\n\n[](https://developers.facebook.com/apps/)\n\nClick `'Add Platform'`.\n\n[](https://developers.facebook.com/apps/)\n\nAt this point you'll need to open your project's [`config.xml`](https://cordova.apache.org/docs/en/latest/config_ref/index.html) file, found in the root directory of your project.\n\nTake note of the `id` for the next step:\n```\n\n```\n\nYou can also edit the `id` to whatever you'd like it to be.\n\n#### iOS Install\nUnder 'Bundle ID', add the `id` from your `config.xml` file:\n\n[](https://developers.facebook.com/apps/)\n\n\n#### Android Install\nUnder 'Google Play Package Name', add the `id` from your `config.xml` file:\n\n[](https://developers.facebook.com/apps/)\n\n\nAnd that's it! You can now make calls to Facebook using the plugin.\n\n## Events\n\nApp events allow you to understand the makeup of users engaging with your app, measure the performance of your Facebook mobile app ads, and reach specific sets of your users with Facebook mobile app ads.\n\n- [iOS] [https://developers.facebook.com/docs/ios/app-events](https://developers.facebook.com/docs/ios/app-events)\n- [Android] [https://developers.facebook.com/docs/android/app-events](https://developers.facebook.com/docs/android/app-events)\n- [JS] Does not have an Events API, so the plugin functions are empty and will return an automatic success\n\nActivation events are automatically tracked for you in the plugin.\n\nEvents are listed on the [insights page](https://www.facebook.com/insights/).\n\nFor tracking events, see `logEvent` and `logPurchase`.\n",
+ "usage": "\n```typescript\nimport { Facebook, FacebookLoginResponse } from '@ionic-native/facebook/ngx';\n\nconstructor(private fb: Facebook) { }\n\n...\n\nthis.fb.login(['public_profile', 'user_friends', 'email'])\n .then((res: FacebookLoginResponse) => console.log('Logged into Facebook!', res))\n .catch(e => console.log('Error logging into Facebook', e));\n\n\nthis.fb.logEvent(this.fb.EVENTS.EVENT_NAME_ADDED_TO_CART);\n\n```\n\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Browser"
+ ],
+ "repo": "https://github.com/jeduan/cordova-plugin-facebook4",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-facebook4"
+ }
+ },
+ {
+ "packageName": "@ionic-native/fcm",
+ "displayName": "FCM",
+ "description": "\nProvides basic functionality for Firebase Cloud Messaging\n",
+ "usage": "\n```typescript\nimport { FCM } from '@ionic-native/fcm/ngx';\n\nconstructor(private fcm: FCM) {}\n\n...\n\nthis.fcm.subscribeToTopic('marketing');\n\nthis.fcm.getToken().then(token => {\n backend.registerToken(token);\n});\n\nthis.fcm.onNotification().subscribe(data => {\n if(data.wasTapped){\n console.log(\"Received in background\");\n } else {\n console.log(\"Received in foreground\");\n };\n});\n\nthis.fcm.onTokenRefresh().subscribe(token => {\n backend.registerToken(token);\n});\n\nthis.fcm.unsubscribeFromTopic('marketing');\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/andrehtissot/cordova-plugin-fcm-with-dependecy-updated",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-fcm-with-dependecy-updated"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-chooser",
+ "displayName": "File Chooser",
+ "description": "\n\nOpens the file picker on Android for the user to select a file, returns a file URI.\n",
+ "usage": "\n```typescript\nimport { FileChooser } from '@ionic-native/file-chooser/ngx';\n\nconstructor(private fileChooser: FileChooser) { }\n\n...\n\nthis.fileChooser.open()\n .then(uri => console.log(uri))\n .catch(e => console.log(e));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/ihadeed/cordova-filechooser",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-filechooser"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-encryption",
+ "displayName": "File Encryption",
+ "description": "\nSimple file encryption for Cordova.\n",
+ "usage": "\n```typescript\nimport { FileEncryption } from '@ionic-native/file-encryption/ngx';\n\n\nconstructor(private fileEncryption: FileEncryption) { }\n\n...\n\nthis.fileEncryption.decrypt('assets/json/topSecret.json', 'secretKey');\n\nthis.fileEncryption.encrypt('assets/json/topSecret.json', 'secretKey');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/disusered/cordova-safe",
+ "cordovaPlugin": {
+ "name": "cordova-safe"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-opener",
+ "displayName": "File Opener",
+ "description": "\nThis plugin will open a file on your device file system with its default application.\n",
+ "usage": "\n```typescript\nimport { FileOpener } from '@ionic-native/file-opener/ngx';\n\nconstructor(private fileOpener: FileOpener) { }\n\n...\n\nthis.fileOpener.open('path/to/file.pdf', 'application/pdf')\n .then(() => console.log('File is opened'))\n .catch(e => console.log('Error opening file', e));\n\nthis.fileOpener.showOpenWithDialog('path/to/file.pdf', 'application/pdf')\n .then(() => console.log('File is opened'))\n .catch(e => console.log('Error opening file', e));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/pwlin/cordova-plugin-file-opener2",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-file-opener2"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-path",
+ "displayName": "File Path",
+ "description": "\n\nThis plugin allows you to resolve the native filesystem path for Android content URIs and is based on code in the aFileChooser library.\n",
+ "usage": "\n```typescript\nimport { FilePath } from '@ionic-native/file-path/ngx';\n\nconstructor(private filePath: FilePath) { }\n\n...\n\nthis.filePath.resolveNativePath(path)\n .then(filePath => console.log(filePath))\n .catch(err => console.log(err));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/hiddentao/cordova-plugin-filepath",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-filepath"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-picker",
+ "displayName": "iOS File Picker",
+ "description": "\n\nOpens the file picker on iOS for the user to select a file, returns a file URI.\n",
+ "usage": "\n```typescript\nimport { IOSFilePicker } from '@ionic-native/file-picker/ngx';\n\nconstructor(private filePicker: IOSFilePicker) { }\n\n...\n\nthis.filePicker.pickFile()\n .then(uri => console.log(uri))\n .catch(err => console.log('Error', err));\n\n```",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/jcesarmobile/FilePicker-Phonegap-iOS-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-filepicker"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file-transfer",
+ "displayName": "File Transfer\n",
+ "description": "\nThis plugin allows you to upload and download files.\n",
+ "usage": "\n```typescript\nimport { FileTransfer, FileUploadOptions, FileTransferObject } from '@ionic-native/file-transfer/ngx';\nimport { File } from '@ionic-native/file';\n\nconstructor(private transfer: FileTransfer, private file: File) { }\n\n...\n\nconst fileTransfer: FileTransferObject = this.transfer.create();\n\n// Upload a file:\nfileTransfer.upload(..).then(..).catch(..);\n\n// Download a file:\nfileTransfer.download(..).then(..).catch(..);\n\n// Abort active transfer:\nfileTransfer.abort();\n\n// full example\nupload() {\n let options: FileUploadOptions = {\n fileKey: 'file',\n fileName: 'name.jpg',\n headers: {}\n .....\n }\n\n fileTransfer.upload('', '', options)\n .then((data) => {\n // success\n }, (err) => {\n // error\n })\n}\n\ndownload() {\n const url = 'http://www.example.com/file.pdf';\n fileTransfer.download(url, this.file.dataDirectory + 'file.pdf').then((entry) => {\n console.log('download complete: ' + entry.toURL());\n }, (error) => {\n // handle error\n });\n}\n\n```\n\nTo store files in a different/publicly accessible directory, please refer to the following link\nhttps://github.com/apache/cordova-plugin-file#where-to-store-files\n",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Ubuntu",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-file-transfer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-file-transfer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/file",
+ "displayName": "File",
+ "description": "\nThis plugin implements a File API allowing read/write access to files residing on the device.\n\nThe File class implements static convenience functions to access files and directories.\n\nExample:\n```\nimport { File } from '@ionic-native/file/ngx';\n\nconstructor(private file: File) { }\n\n...\n\nthis.file.checkDir(this.file.dataDirectory, 'mydir').then(_ => console.log('Directory exists')).catch(err =>\n console.log('Directory doesn't exist'));\n\n```\n\n This plugin is based on several specs, including : The HTML5 File API http: //www.w3.org/TR/FileAPI/\n The (now-defunct) Directories and System extensions Latest: http: //www.w3.org/TR/2012/WD-file-system-api-20120417/\n Although most of the plugin code was written when an earlier spec was current: http:\n //www.w3.org/TR/2011/WD-file-system-api-20110419/ It also implements the FileWriter spec : http:\n //dev.w3.org/2009/dap/file-system/file-writer.html\n @interfaces\n IFile\n Entry\n DirectoryEntry\n DirectoryReader\n FileSystem\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "macOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-file",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-file"
+ }
+ },
+ {
+ "packageName": "@ionic-native/fingerprint-aio",
+ "displayName": "Fingerprint AIO",
+ "description": "\nUse simple fingerprint authentication on Android and iOS.\nRequires Cordova plugin: cordova-plugin-fingerprint-aio. For more info about plugin, vist: https://github.com/NiklasMerz/cordova-plugin-fingerprint-aio\n",
+ "usage": "\n```typescript\nimport { FingerprintAIO } from '@ionic-native/fingerprint-aio/ngx';\n\nconstructor(private faio: FingerprintAIO) { }\n\n...\n\nthis.faio.show({\n clientId: 'Fingerprint-Demo', //Android: Used for encryption. iOS: used for dialogue if no `localizedReason` is given.\n clientSecret: 'o7aoOMYUbyxaD23oFAnJ' //Necessary for Android encrpytion of keys. Use random secret key.\n disableBackup:true, //Only for Android(optional)\n localizedFallbackTitle: 'Use Pin', //Only for iOS\n localizedReason: 'Please authenticate' //Only for iOS\n})\n.then((result: any) => console.log(result))\n.catch((error: any) => console.log(error));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/NiklasMerz/cordova-plugin-fingerprint-aio",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-fingerprint-aio"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-analytics",
+ "displayName": "Firebase Analytics",
+ "description": "\nCordova plugin for Firebase Analytics\n\nGo to firebase console and export google-services.json and GoogleService-Info.plist. Put those files into the root of your cordova app folder.\n\nNOTE: on iOS in order to collect demographic, age, gender data etc. you should additionally include AdSupport.framework into your project.\n",
+ "usage": "\n```typescript\nimport { FirebaseAnalytics } from '@ionic-native/firebase-analytics/ngx';\n\n\nconstructor(private firebaseAnalytics: FirebaseAnalytics) { }\n\n...\n\nthis.firebaseAnalytics.logEvent('page_view', {page: \"dashboard\"})\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-analytics",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-analytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-authentication",
+ "displayName": "Firebase Authentication",
+ "description": "\nCordova plugin for Firebase Authentication\n",
+ "usage": "\n```typescript\nimport { FirebaseAuthentication } from '@ionic-native/firebase-authentication/ngx';\n\n\nconstructor(private firebaseAuthentication: FirebaseAuthentication) { }\n\n...\n\n\nthis.firebaseAuthentication.createUserWithEmailAndPassword('test@gmail.com', '123')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-authentication",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-authentication"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-config",
+ "displayName": "Firebase Config",
+ "description": "\nCordova plugin for Firebase Config\n",
+ "usage": "\n```typescript\nimport { FirebaseConfig } from '@ionic-native/firebase-config/ngx';\n\n\nconstructor(private firebaseConfig: FirebaseConfig) { }\n\n...\n\n\nthis.firebaseConfig.getBoolean('my_key')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-config",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-config"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-crash",
+ "displayName": "FirebaseCrash",
+ "description": "\nThis plugin brings crash reporting from Google Firebase to your Cordova project! Android and iOS supported.\n",
+ "usage": "\n```typescript\nimport { FirebaseCrash } from '@ionic-native/firebase-crash';\n\nconstructor(private firebaseCrash: FirebaseCrash) { }\n\n...\n\nthis.firebaseCrash.setUserId('123456789');\nthis.firebaseCrash.log('message');\nthis.firebaseCrash.logError('non fatal exception');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-crash",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-crash"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-crashlytics",
+ "displayName": "Firebase Crashlytics",
+ "description": "\nA Google Firebase Crashlytics plugin to enable capture of crash reports.\n",
+ "usage": "\n```typescript\nimport { FirebaseCrashlytics } from '@ionic-native/firebase-crashlytics/ngx';\n\n\nconstructor(private firebaseCrashlytics: FirebaseCrashlytics) { }\n\n...\n\n\nconst crashlytics = this.firebaseCrashlytics.initialize();\ncrashlytics.logException('my caught exception');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ReallySmallSoftware/cordova-plugin-firebase-crashlytics",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-crashlytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-dynamic-links",
+ "displayName": "Firebase Dynamic Links",
+ "description": "\nCordova plugin for Firebase Dynamic Links\n\nVariables APP_DOMAIN and APP_PATH specify web URL where your app will start an activity to handle the link. They also used to setup support for App Indexing.\nGo to firebase console and export google-services.json and GoogleService-Info.plist. Put those files into the root of your cordova app folder.\n\nPreferences:\n\nPreferences GoogleIOSClientId and GoogleAndroidClientId are used to setup dynamic links when you have an app for several platforms.\nYou can find values at your GoogleService-Info.plist (key ANDROID_CLIENT_ID) and google-services.json (key client[0].oauth_client[0].client_id).\n\nconfig.xml:\n```xml\n\n \n\n\n \n\n```",
+ "usage": "\n```typescript\nimport { FirebaseDynamicLinks } from '@ionic-native/firebase-dynamic-links/ngx';\n\n\nconstructor(private firebaseDynamicLinks: FirebaseDynamicLinks) { }\n\n...\n// Handle the logic here after opening the app with the Dynamic link\nthis.firebaseDynamicLinks.onDynamicLink()\n .subscribe((res: any) => console.log(res), (error:any) => console.log(error));\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-dynamiclinks",
+ "cordovaPlugin": {
+ "name": " cordova-plugin-firebase-dynamiclinks"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase-messaging",
+ "displayName": "Firebase Messaging",
+ "description": "\nCordova plugin for Firebase Messaging\n",
+ "usage": "\n```typescript\nimport { FirebaseMessaging } from '@ionic-native/firebase-messaging/ngx';\n\n\nconstructor(private firebaseMessaging: FirebaseMessaging) { }\n\n...\n\n\nthis.firebaseMessaging.logEvent('page_view', {page: \"dashboard\"})\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chemerisuk/cordova-plugin-firebase-messaging",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase-messaging"
+ }
+ },
+ {
+ "packageName": "@ionic-native/firebase",
+ "displayName": "Firebase",
+ "description": "\nThis plugin brings push notifications, analytics, event tracking, crash reporting and more from Google Firebase to your Cordova project! Android and iOS supported (including iOS 10).\n",
+ "usage": "\n```typescript\nimport { Firebase } from '@ionic-native/firebase/ngx';\n\nconstructor(private firebase: Firebase) { }\n\n...\n\nthis.firebase.getToken()\n .then(token => console.log(`The token is ${token}`)) // save the token server-side and use it to push notifications to this device\n .catch(error => console.error('Error getting token', error));\n\nthis.firebase.onNotificationOpen()\n .subscribe(data => console.log(`User opened a notification ${data}`));\n\nthis.firebase.onTokenRefresh()\n .subscribe((token: string) => console.log(`Got a new token ${token}`));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/arnesson/cordova-plugin-firebase",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-firebase"
+ }
+ },
+ {
+ "packageName": "@ionic-native/flashlight",
+ "displayName": "Flashlight",
+ "description": "This plugin allows you to switch the flashlight / torch of the device on and off.\n\nRequires Cordova plugin: `cordova-plugin-flashlight`. For more info, please see the [Flashlight plugin docs](https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin).\n",
+ "usage": "\n```typescript\nimport { Flashlight } from '@ionic-native/flashlight/ngx';\n\nconstructor(private flashlight: Flashlight) { }\n\n...\n\nthis.flashlight.switchOn();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-flashlight"
+ }
+ },
+ {
+ "packageName": "@ionic-native/flurry-analytics",
+ "displayName": "Flurry Analytics",
+ "description": "\nThis plugin connects to Flurry Analytics SDK\n",
+ "usage": "\n```typescript\nimport { FlurryAnalytics, FlurryAnalyticsObject, FlurryAnalyticsOptions } from '@ionic-native/flurry-analytics/ngx';\n\nconstructor(private flurryAnalytics: FlurryAnalytics) { }\n\n...\n\nconst options: FlurryAnalyticsOptions = {\n appKey: '', // REQUIRED\n reportSessionsOnClose: true,\n enableLogging: true\n}\n\nlet fa: FlurryAnalyticsObject = this.flurryAnalytics.create(options);\n\nfa.logEvent('event name')\n .then(() => console.log('Logged an event!'))\n .catch(e => console.log('Error logging the event', e));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/blakgeek/cordova-plugin-flurryanalytics",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-flurryanalytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/foreground-service",
+ "displayName": "Foreground Service",
+ "description": "\nThis plugin allows for android devices to continue running services in the background, using a\nforeground ongoing notification. This is targeted towards use with plugins such as\n'cordova-geolocation' that will not run while the app is in the background on android API 26+.\n\nFor android API 28+, the following xml snippet should be inserted into ```config.xml```:\n\n```\n...\n\n \n \n \n ...\n```",
+ "usage": "\n```typescript\nimport { ForegroundService } from '@ionic-native/foreground-service/ngx';\n\n\nconstructor(public foregroundService: ForegroundService) { }\n\n...\n\nstartService() {\n // Notification importance is optional, the default is 1 - Low (no sound or vibration)\n this.foregroundService.start('GPS Running', 'Background Service', 'drawable/fsicon');\n}\n\nstopService() {\n // Disable the foreground service\n this.foregroundService.stop();\n}\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/DavidBriglio/cordova-plugin-foreground-service",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-foreground-service"
+ }
+ },
+ {
+ "packageName": "@ionic-native/ftp",
+ "displayName": "FTP",
+ "description": "\nThis cordova plugin is created to use ftp (client) in web/js.\n",
+ "usage": "\n```typescript\nimport { FTP } from '@ionic-native/ftp/ngx';\n\n\nconstructor(private fTP: FTP) { }\n\n...\n\n\nthis.fTP.connect('ftp_host', 'ftp_user', 'ftp_password')\n .then((res: any) => console.log('Login successful', res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/xfally/cordova-plugin-ftp",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ftp"
+ }
+ },
+ {
+ "packageName": "@ionic-native/gao-de-location",
+ "displayName": "Gao De Location",
+ "description": "\nBecause the original GPS positioning uses Google Browser positioning, and Google withdraws from China, resulting in GPS Android positioning can not be positioned.\nGaode location can directly return address informationGaode location can directly return address information\n",
+ "usage": "\n```typescript\nimport { GaoDeLocation } from '@ionic-native/gao-de-location/ngx';\n\n\nconstructor(private gaoDeLocation: GaoDeLocation) { }\n\nthis.gaoDeLocation.getCurrentPosition()\n.then((res: PositionOptions) => console.log(res))\n.catch((error) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/waliu/cordova-plugin-gaodelocation-chenyu.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-gaodelocation-chenyu"
+ }
+ },
+ {
+ "packageName": "@ionic-native/geofence",
+ "displayName": "Geofence",
+ "description": "Monitors circular geofences around latitude/longitude coordinates, and sends a notification to the user when the boundary of a geofence is crossed. Notifications can be sent when the user enters and/or exits a geofence.\nGeofences persist after device reboot. Geofences will be monitored even when the app is not running.",
+ "usage": "\n```typescript\nimport { Geofence } from '@ionic-native/geofence/ngx';\n\n...\n\nconstructor(private geofence: Geofence) {\n // initialize the plugin\n geofence.initialize().then(\n // resolved promise does not return a value\n () => console.log('Geofence Plugin Ready'),\n (err) => console.log(err)\n )\n}\n\n...\n\nprivate addGeofence() {\n //options describing geofence\n let fence = {\n id: '69ca1b88-6fbe-4e80-a4d4-ff4d3748acdb', //any unique ID\n latitude: 37.285951, //center of geofence radius\n longitude: -121.936650,\n radius: 100, //radius to edge of geofence in meters\n transitionType: 3, //see 'Transition Types' below\n notification: { //notification settings\n id: 1, //any unique ID\n title: 'You crossed a fence', //notification title\n text: 'You just arrived to Gliwice city center.', //notification body\n openAppOnClick: true //open app when notification is tapped\n }\n }\n\n this.geofence.addOrUpdate(fence).then(\n () => console.log('Geofence added'),\n (err) => console.log('Geofence failed to add')\n );\n}\n\n```\n### Transition Types ###\nTransition type specifies whether the geofence should trigger when the user enters and/or leaves the geofence.\n\n#### Supported values ####\n- 1: Enter\n- 2: Leave\n- 3: Both\n\n### Defining a Geofence ###\nGeofences are defined by an object that is passed to `addOrUpdate()`. Object properties are:\n- id: Any unique ID for the geofence. This ID is used to remove and update a geofence\n- latitude: Latitude coordinate of the center of the geofence radius\n- longitude: Latitude coordinate of the center of the geofence radius\n- radius: Radius from the center to the edge of the geofence\n- transitionType: Type of geofence transition to monitor for. See 'Transition Types' above\n- notification: Object. Options for defining the notification sent when a geofence is crossed\n - id: Any unique ID\n - title: Notification title\n - text: Notification body\n - openAppOnClick: Boolean. Whether to open the app when the notification is tapped by the user\n\n### Troubleshooting ###\n#### I get compile errors when I run `ionic build ios` or `ionic run ios`. ####\nThis could be caused by the Cordova project directory in `/platforms/ios` not being named correctly.\nTry running `ionic cordova platform rm ` then run `ionic cordova platform add ` to recreate the\nplatform directories.\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/cowbell/cordova-plugin-geofence",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-geofence"
+ }
+ },
+ {
+ "packageName": "@ionic-native/geolocation",
+ "displayName": "Geolocation",
+ "description": "\nThis plugin provides information about the device's location, such as latitude and longitude. Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs.\n\n This API is based on the W3C Geolocation API Specification, and only executes on devices that don't already provide an implementation.\n\nFor iOS you have to add this configuration to your configuration.xml file\n```xml\n\n We use your location for full functionality of certain app features.\n\n```\n\n",
+ "usage": "\n\n```typescript\nimport { Geolocation } from '@ionic-native/geolocation/ngx';\n\n...\n\nconstructor(private geolocation: Geolocation) {}\n\n...\n\nthis.geolocation.getCurrentPosition().then((resp) => {\n // resp.coords.latitude\n // resp.coords.longitude\n}).catch((error) => {\n console.log('Error getting location', error);\n});\n\nlet watch = this.geolocation.watchPosition();\nwatch.subscribe((data) => {\n // data can be a set of coordinates, or an error (if an error occurred).\n // data.coords.latitude\n // data.coords.longitude\n});\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-geolocation",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-geolocation"
+ }
+ },
+ {
+ "packageName": "@ionic-native/globalization",
+ "displayName": "Globalization",
+ "description": "\nThis plugin obtains information and performs operations specific to the user's locale, language, and timezone.\n",
+ "usage": "\n```typescript\nimport { Globalization } from '@ionic-native/globalization/ngx';\n\nconstructor(private globalization: Globalization) { }\n\n\n...\n\n\nthis.globalization.getPreferredLanguage()\n .then(res => console.log(res))\n .catch(e => console.log(e));\n\n\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-globalization",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-globalization"
+ }
+ },
+ {
+ "packageName": "@ionic-native/google-analytics",
+ "displayName": "Google Analytics",
+ "description": "\nThis plugin connects to Google's native Universal Analytics SDK\nPrerequisites:\n- A Cordova 3.0+ project for iOS and/or Android\n- A Mobile App property through the Google Analytics Admin Console\n- (Android) Google Play Services SDK installed via [Android SDK Manager](https://developer.android.com/sdk/installing/adding-packages.html)",
+ "usage": "\n```typescript\nimport { GoogleAnalytics } from '@ionic-native/google-analytics/ngx';\n\nconstructor(private ga: GoogleAnalytics) { }\n\n...\n\nthis.ga.startTrackerWithId('YOUR_TRACKER_ID')\n .then(() => {\n console.log('Google analytics is ready now');\n this.ga.trackView('test');\n // Tracker is ready\n // You can now track pages or set additional information such as AppVersion or UserId\n })\n .catch(e => console.log('Error starting GoogleAnalytics', e));\n\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/danwilson/google-analytics-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-google-analytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/google-nearby",
+ "displayName": "Google Nearby",
+ "description": "\nThis plugin adds support for the Google Nearby Messages API.\n",
+ "usage": "\n```typescript\nimport { GoogleNearby } from '@ionic-native/google-nearby/ngx';\n\n\nconstructor(private googleNearby: GoogleNearby) { }\n\nthis.googleNearby.publish('Hello')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\nthis.googleNearby.subscribe()\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/hahahannes/cordova-plugin-google-nearby",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-google-nearby"
+ }
+ },
+ {
+ "packageName": "@ionic-native/google-play-games-services",
+ "displayName": "Google Play Games Services",
+ "description": "\nA Cordova plugin that let's you interact with Google Play Games Services.\n",
+ "usage": "\n```typescript\nimport { GooglePlayGamesServices } from '@ionic-native/google-play-games-services/ngx';\n\n\nconstructor(private googlePlayGamesServices: GooglePlayGamesServices) { }\n\n...\n\n// Authenticate with Play Games Services\nthis.googlePlayGamesServices.auth()\n .then(() => console.log('Logged in to Play Games Services'))\n .catch(e) => console.log('Error logging in Play Games Services', e);\n\n// Sign out of Play Games Services.\nthis.googlePlayGamesServices.signOut()\n .then(() => console.log('Logged out of Play Games Services'))\n .catch(e => console.log('Error logging out of Play Games Services', e);\n\n// Check auth status.\nthis.googlePlayGamesServices.isSignedIn()\n .then((signedIn: SignedInResponse) => {\n if (signedIn.isSignedIn) {\n hideLoginButton();\n }\n });\n\n// Fetch currently authenticated user's data.\nthis.googlePlayGamesServices.showPlayer().then((data: Player) => {\n console.log('Player data', data);\n});\n\n// Submit a score.\nthis.googlePlayGamesServices.submitScore({\n score: 100,\n leaderboardId: 'SomeLeaderboardId'\n});\n\n// Get the player score on a leaderboard.\nthis.googlePlayGamesServices.getPlayerScore({\n leaderboardId: 'SomeLeaderBoardId'\n}).then((data: PlayerScoreData) => {\n console.log('Player score', data);\n});\n\n// Show the native leaderboards window.\nthis.googlePlayGamesServices.showAllLeaderboards()\n .then(() => console.log('The leaderboard window is visible.'));\n\n// Show a signle native leaderboard window.\nthis.googlePlayGamesServices.showLeaderboard({\n leaderboardId: 'SomeLeaderBoardId'\n}).then(() => console.log('The leaderboard window is visible.'));\n\n// Unlock an achievement.\nthis.googlePlayGamesServices.unlockAchievement({\n achievementId: 'SomeAchievementId'\n}).then(() => console.log('Achievement unlocked'));\n\n// Incremement an achievement.\nthis.googlePlayGamesServices.incrementAchievement({\n step: 1,\n achievementId: 'SomeAchievementId'\n}).then(() => console.log('Achievement incremented'));\n\n// Show the native achievements window.\nthis.googlePlayGamesServices.showAchivements()\n .then(() => console.log('The achievements window is visible.'));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/artberri/cordova-plugin-play-games-services",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-play-games-services"
+ }
+ },
+ {
+ "packageName": "@ionic-native/google-plus",
+ "displayName": "Google Plus",
+ "description": "",
+ "usage": "\n```typescript\nimport { GooglePlus } from '@ionic-native/google-plus/ngx';\n\nconstructor(private googlePlus: GooglePlus) { }\n\n...\n\nthis.googlePlus.login({})\n .then(res => console.log(res))\n .catch(err => console.error(err));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-googleplus",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-googleplus"
+ }
+ },
+ {
+ "packageName": "@ionic-native/gyroscope",
+ "displayName": "Gyroscope",
+ "description": "Read Gyroscope sensor data",
+ "usage": "\n```typescript\nimport { Gyroscope, GyroscopeOrientation, GyroscopeOptions } from '@ionic-native/gyroscope/ngx';\n\n\nconstructor(private gyroscope: Gyroscope) { }\n\n...\n\n\nlet options: GyroscopeOptions = {\n frequency: 1000\n}\n\nthis.gyroscope.getCurrent(options)\n .then((orientation: GyroscopeOrientation) => {\n console.log(orientation.x, orientation.y, orientation.z, orientation.timestamp);\n })\n .catch()\n\n\nthis.gyroscope.watch()\n .subscribe((orientation: GyroscopeOrientation) => {\n console.log(orientation.x, orientation.y, orientation.z, orientation.timestamp);\n });\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/NeoLSN/cordova-plugin-gyroscope",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-gyroscope"
+ }
+ },
+ {
+ "packageName": "@ionic-native/hce",
+ "displayName": "hce",
+ "description": "\nHCE Cordova Wrapper\n",
+ "usage": "\n```typescript\nimport { hce } from '@ionic-native/hce/ngx';\n\n\nconstructor(private hce: hce) { }\n\n...\n\nfunction onCommand(command){\n var commandAsBytes = new Uint8Array(command);\n var commandAsString = hce.util.byteArrayToHexString(commandAsBytes);\n\n // do something with the command\n\n // send the response\n hce.sendReponse(commandResponse);\n}\nthis.hce.registerCommandCallback().then(onCommand);\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/don/cordova-plugin-hce",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-hce"
+ }
+ },
+ {
+ "packageName": "@ionic-native/header-color",
+ "displayName": "Header Color",
+ "description": "\nCordova plugin to change color of header in Android Multitask View\n",
+ "usage": "\n```typescript\nimport { HeaderColor } from '@ionic-native/header-color/ngx';\n\nconstructor(private headerColor: HeaderColor) { }\n\n...\n\nthis.headerColor.tint('#becb29');\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/tomloprod/cordova-plugin-headercolor",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-headercolor"
+ }
+ },
+ {
+ "packageName": "@ionic-native/health-kit",
+ "displayName": "Health Kit",
+ "description": "\nThe HealthKit plugin allows you to read data from and write data to the iOS 8+ HealthKit framework.\nAny data saved shows up in the iOS Health app and is available for other iOS apps.\n",
+ "usage": "\n```typescript\nimport { HealthKit } from '@ionic-native/health-kit/ngx';\n\n\nconstructor(private healthKit: HealthKit) { }\n\n...\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/Telerik-Verified-Plugins/HealthKit",
+ "cordovaPlugin": {
+ "name": "com.telerik.plugins.healthkit"
+ }
+ },
+ {
+ "packageName": "@ionic-native/health",
+ "displayName": "Health",
+ "description": "\nA plugin that abstracts fitness and health repositories like Apple HealthKit or Google Fit.\n",
+ "usage": "\n```typescript\nimport { Health } from '@ionic-native/health/ngx';\n\n\nconstructor(private health: Health) { }\n\n...\n\nthis.health.isAvailable()\n.then((available:boolean) => {\n console.log(available);\n this.health.requestAuthorization([\n 'distance', 'nutrition', //read and write permissions\n {\n read: ['steps'], //read only permission\n write: ['height', 'weight'] //write only permission\n }\n ])\n .then(res => console.log(res))\n .catch(e => console.log(e));\n})\n.catch(e => console.log(e));\n\n```\nSee description at https://github.com/dariosalvi78/cordova-plugin-health for a full list of Datatypes and see examples.\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/dariosalvi78/cordova-plugin-health",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-health"
+ }
+ },
+ {
+ "packageName": "@ionic-native/hot-code-push",
+ "displayName": "Hot Code Push",
+ "description": "\nHotCodePush plugin for Cordova that supports iOS and Android. This plugin allows you to keep your html, css and js files synced with your server.\n\nFor more info, please see the detailed wiki https://github.com/nordnet/cordova-hot-code-push/wiki\n",
+ "usage": "\n```typescript\nimport { HotCodePush } from '@ionic-native/hot-code-push/ngx';\n\nconstructor(private hotCodePush: HotCodePush) { }\n\n...\n\nhotCodePush.fetchUpdate(options).then(data => { console.log('Update available'); });\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/nordnet/cordova-hot-code-push",
+ "cordovaPlugin": {
+ "name": "cordova-hot-code-push"
+ }
+ },
+ {
+ "packageName": "@ionic-native/hotspot",
+ "displayName": "Hotspot",
+ "description": "\nA Cordova plugin for managing Hotspot networks on Android.\n\nRequires Cordova plugin: `cordova-plugin-hotspot`. For more info, please see the [Hotspot plugin docs](https://github.com/hypery2k/cordova-hotspot-plugin).\n",
+ "usage": "\n```typescript\nimport { Hotspot, HotspotNetwork } from '@ionic-native/hotspot/ngx';\n\nconstructor(private hotspot: Hotspot) { }\n\n...\n\n\nthis.hotspot.scanWifi().then((networks: HotspotNetwork[]) => {\n console.log(networks);\n});\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/hypery2k/cordova-hotspot-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-hotspot"
+ }
+ },
+ {
+ "packageName": "@ionic-native/http",
+ "displayName": "HTTP",
+ "description": "\nCordova / Phonegap plugin for communicating with HTTP servers. Supports iOS and Android.\n\nAdvantages over Javascript requests:\n- Background threading - all requests are done in a background thread\n- SSL Pinning\n",
+ "usage": "\n```typescript\nimport { HTTP } from '@ionic-native/http/ngx';\n\nconstructor(private http: HTTP) {}\n\n...\n\nthis.http.get('http://ionic.io', {}, {})\n .then(data => {\n\n console.log(data.status);\n console.log(data.data); // data received by server\n console.log(data.headers);\n\n })\n .catch(error => {\n\n console.log(error.status);\n console.log(error.error); // error message as string\n console.log(error.headers);\n\n });\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/silkimen/cordova-plugin-advanced-http",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-advanced-http"
+ }
+ },
+ {
+ "packageName": "@ionic-native/httpd",
+ "displayName": "Httpd",
+ "description": "\nEmbedded httpd for Cordova apps. Light weight HTTP server.",
+ "usage": "\n```typescript\nimport { Httpd, HttpdOptions } from '@ionic-native/httpd/ngx';\n\nconstructor(private httpd: Httpd) { }\n\n...\n\n\nlet options: HttpdOptions = {\n www_root: 'httpd_root', // relative path to app's www directory\n port: 80,\n localhost_only: false\n }\n\nthis.httpd.startServer(options).subscribe((data) => {\n console.log('Server is live');\n});\n\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "macOS"
+ ],
+ "repo": "https://github.com/floatinghotpot/cordova-httpd",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-httpd"
+ }
+ },
+ {
+ "packageName": "@ionic-native/hyper-track",
+ "displayName": "HyperTrack",
+ "description": "\nHyperTrack cordova plugin wrapper for Ionic Native. Location-based services provider.\nMake sure to include your publishable key at config.xml (see [HyperTrack Cordova Setup](https://docs.hypertrack.com/sdks/cordova/setup.html#step-2-configure-the-sdk)).\n",
+ "usage": "\n```typescript\nimport { HyperTrack } from '@ionic-native/hyper-track/ngx';\n\nconstructor(private hyperTrack: HyperTrack) { }\n\n// Check if app has location permissions enabled\nthis.hyperTrack.checkLocationPermission().then(response => {\n // response (String) can be \"true\" or \"false\"\n if (response != \"true\") {\n // Ask for permissions\n this.hyperTrack.requestPermissions().then(response => {}, error => {});\n }\n}, error => {});\n\n// Check if app has location services enabled\nthis.hyperTrack.checkLocationServices().then(response => {\n // response (String) can be \"true\" or \"false\"\n if (response != \"true\") {\n // Request services to be enabled\n this.hyperTrack.requestLocationServices().then(response => {}, error => {});\n }\n}, error => {});\n\n// First set the current user. This can be done via getOrCreateUser() or setUserId()\nthis.hyperTrack.setUserId(\"xxx\").then(user => {\n // user (String) is a String representation of a User's JSON\n\n this.hyperTrack.startTracking().then(userId => {}, trackingError => {});\n\n this.hyperTrack.createAndAssignAction('visit', 'lookupId','address', 20.12, -100.3).then(action => {\n // Handle action. It's a String representation of the Action's JSON. For example:\n // '{\"eta\":\"Jul 17, 2017 12:50:03 PM\",\"assigned_at\":\"Jul 17, 2017 12:34:38 PM\",,\"distance\":\"0.0\",...}'\n }, error => {});\n\n // You can complete an action with completeAction() or completeActionWithLookupId()\n this.hyperTrack.completeAction('action-id').then(response => {\n // Handle response (String). Should be \"OK\".\n }, error => {});\n\n this.hyperTrack.getCurrentLocation().then(location => {\n // Handle location. It's a String representation of a Location's JSON.For example:\n // '{\"mAccuracy\":22.601,,\"mLatitude\":23.123456, \"mLongitude\":-100.1234567, ...}'\n }, error => {});\n\n this.hyperTrack.stopTracking().then(success => {\n // Handle success (String). Should be \"OK\".\n }, error => {});\n\n}, error => {});*\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/hypertrack/hypertrack-cordova",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-hypertrack"
+ }
+ },
+ {
+ "packageName": "@ionic-native/ibeacon",
+ "displayName": "IBeacon",
+ "description": "\nThis plugin provides functions for working with iBeacons.\n\n The plugin's API closely mimics the one exposed through the [CLLocationManager](https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html) introduced in iOS 7.\n",
+ "usage": "\n\n```typescript\nimport { IBeacon } from '@ionic-native/ibeacon/ngx';\n\nconstructor(private ibeacon: IBeacon) { }\n\n...\n\n\n// Request permission to use location on iOS\nthis.ibeacon.requestAlwaysAuthorization();\n// create a new delegate and register it with the native layer\nlet delegate = this.ibeacon.Delegate();\n\n// Subscribe to some of the delegate's event handlers\ndelegate.didRangeBeaconsInRegion()\n .subscribe(\n data => console.log('didRangeBeaconsInRegion: ', data),\n error => console.error()\n );\ndelegate.didStartMonitoringForRegion()\n .subscribe(\n data => console.log('didStartMonitoringForRegion: ', data),\n error => console.error()\n );\ndelegate.didEnterRegion()\n .subscribe(\n data => {\n console.log('didEnterRegion: ', data);\n }\n );\n\nlet beaconRegion = this.ibeacon.BeaconRegion('deskBeacon','F7826DA6-ASDF-ASDF-8024-BC5B71E0893E');\n\nthis.ibeacon.startMonitoringForRegion(beaconRegion)\n .then(\n () => console.log('Native layer received the request to monitoring'),\n error => console.error('Native layer failed to begin monitoring: ', error)\n );\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/petermetz/cordova-plugin-ibeacon",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ibeacon"
+ }
+ },
+ {
+ "packageName": "@ionic-native/image-picker",
+ "displayName": "Image Picker",
+ "description": "\nCordova Plugin For Multiple Image Selection\n\nRequires Cordova plugin: `cordova-plugin-image-picker`.\nFor more info, please see the https://github.com/wymsee/cordova-imagePicker\n",
+ "usage": "\n```typescript\nimport { ImagePicker } from '@ionic-native/image-picker/ngx';\n\n\nconstructor(private imagePicker: ImagePicker) { }\n\n...\n\nthis.imagePicker.getPictures(options).then((results) => {\n for (var i = 0; i < results.length; i++) {\n console.log('Image URI: ' + results[i]);\n }\n}, (err) => { });\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Telerik-Verified-Plugins/ImagePicker",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-telerik-imagepicker"
+ }
+ },
+ {
+ "packageName": "@ionic-native/image-resizer",
+ "displayName": "Image Resizer",
+ "description": "\nCordova Plugin For Image Resize\n",
+ "usage": "\n```typescript\nimport { ImageResizer, ImageResizerOptions } from '@ionic-native/image-resizer/ngx';\n\nconstructor(private imageResizer: ImageResizer) { }\n\n...\n\nlet options = {\n uri: uri,\n folderName: 'Protonet',\n quality: 90,\n width: 1280,\n height: 1280\n} as ImageResizerOptions;\n\nthis.imageResizer\n .resize(options)\n .then((filePath: string) => console.log('FilePath', filePath))\n .catch(e => console.log(e));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/JoschkaSchulz/cordova-plugin-image-resizer",
+ "cordovaPlugin": {
+ "name": "info.protonet.imageresizer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/in-app-browser",
+ "displayName": "In App Browser",
+ "description": "Launches in app Browser",
+ "usage": "\n```typescript\nimport { InAppBrowser } from '@ionic-native/in-app-browser/ngx';\n\nconstructor(private iab: InAppBrowser) { }\n\n\n...\n\n\nconst browser = this.iab.create('https://ionicframework.com/');\n\nbrowser.executeScript(...);\n\nbrowser.insertCSS(...);\nbrowser.on('loadstop').subscribe(event => {\n browser.insertCSS({ code: \"body{color: red;\" });\n});\n\nbrowser.close();\n\n```",
+ "platforms": [
+ "AmazonFire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "macOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-inappbrowser",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-inappbrowser"
+ }
+ },
+ {
+ "packageName": "@ionic-native/in-app-purchase-2",
+ "displayName": "In App Purchase 2",
+ "description": "\n",
+ "usage": "\n```\nimport { InAppPurchase2 } from '@ionic-native/in-app-purchase-2/ngx';\n\n\nconstructor(private inAppPurchase2: InAppPurchase2) { }\n\n...\n\n\n```\n",
+ "platforms": [
+ "iOS",
+ "Android",
+ "Windows"
+ ],
+ "repo": "https://github.com/j3k0/cordova-plugin-purchase",
+ "cordovaPlugin": {
+ "name": "cc.fovea.cordova.purchase"
+ }
+ },
+ {
+ "packageName": "@ionic-native/in-app-purchase",
+ "displayName": "In App Purchase",
+ "description": "\nA lightweight Cordova plugin for in app purchases on iOS/Android.\n",
+ "usage": "\n```typescript\nimport { InAppPurchase } from '@ionic-native/in-app-purchase/ngx';\n\nconstructor(private iap: InAppPurchase) { }\n\n...\n\nthis.iap\n .getProducts(['prod1', 'prod2', ...])\n .then((products) => {\n console.log(products);\n // [{ productId: 'com.yourapp.prod1', 'title': '...', description: '...', price: '...' }, ...]\n })\n .catch((err) => {\n console.log(err);\n });\n\n\nthis.iap\n .buy('prod1')\n .then((data)=> {\n console.log(data);\n // {\n // transactionId: ...\n // receipt: ...\n // signature: ...\n // }\n })\n .catch((err)=> {\n console.log(err);\n });\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/AlexDisler/cordova-plugin-inapppurchase",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-inapppurchase"
+ }
+ },
+ {
+ "packageName": "@ionic-native/in-app-review",
+ "displayName": "In App Review",
+ "description": "\nThis plugin does use the iOS class SKStoreReviewController to open the inApp review popup available since iOS 10.3\n\nThis functionality only works on iOS devices\n\n",
+ "usage": "\n```typescript\nimport { InAppReview } from '@ionic-native/in-app-review/ngx';\n\n\nconstructor(private inAppReview: InAppReview) { }\n\n...\n\n\nthis.inAppReview.requestReview()\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/omaxlive/com.omarben.inappreview",
+ "cordovaPlugin": {
+ "name": "com.omarben.inappreview"
+ }
+ },
+ {
+ "packageName": "@ionic-native/index-app-content",
+ "displayName": "Index App Content",
+ "description": "\nThis plugin gives you a Javascript API to interact with Core Spotlight on iOS (=> iOS 9).\nYou can add, update and delete items to the spotlight search index.\nSpotlight Search will include these items in the result list. You can deep-link the search results with your app.\n",
+ "usage": "\n```typescript\nimport { IndexAppContent } from '@ionic-native/index-app-content/ngx';\n\n\nconstructor(private indexAppContent: IndexAppContent) { }\n\n...\n\nvar items = [\n {\n domain: 'com.my.domain',\n identifier: '88asdf7dsf',\n title: 'Foo',\n description: 'Bar',\n url: 'http://location/of/my/image.jpg',\n },\n {\n domain: 'com.other.domain',\n identifier: '9asd67g6a',\n title: 'Baz',\n description: 'Woot',\n url: 'http://location/of/my/image2.jpg',\n }\n];\n\nthis.indexAppContent.setItems(items)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/johanblomgren/cordova-plugin-indexappcontent",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-indexappcontent"
+ }
+ },
+ {
+ "packageName": "@ionic-native/insomnia",
+ "displayName": "Insomnia",
+ "description": "\nPrevent the screen of the mobile device from falling asleep.\n",
+ "usage": "\n```typescript\nimport { Insomnia } from '@ionic-native/insomnia/ngx';\n\nconstructor(private insomnia: Insomnia) { }\n\n...\n\nthis.insomnia.keepAwake()\n .then(\n () => console.log('success'),\n () => console.log('error')\n );\n\nthis.insomnia.allowSleepAgain()\n .then(\n () => console.log('success'),\n () => console.log('error')\n );\n```\n\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "Firefox OS",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-insomnia"
+ }
+ },
+ {
+ "packageName": "@ionic-native/instagram",
+ "displayName": "Instagram",
+ "description": "Share a photo with the instagram app\n",
+ "usage": "\n```typescript\nimport { Instagram } from '@ionic-native/instagram/ngx';\n\nconstructor(private instagram: Instagram) { }\n\n...\n\nthis.instagram.share('data:image/png;uhduhf3hfif33', 'Caption')\n .then(() => console.log('Shared!'))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/vstirbu/InstagramPlugin",
+ "cordovaPlugin": {
+ "name": "cordova-instagram-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/intel-security",
+ "displayName": "Intel Security",
+ "description": "\nThe App Security API enables the use of security properties and capabilities on the platform, using a new set of API defined for application developers. You are not required to be a security expert to make good use of the API. Key elements, such as encryption of data and establishments of capabilities, is abstracted and done by the API implementation, for you.\n\nFor example:\n- Use the API to store (E.g. cache) data locally, using the device non-volatile storage. Data protection/encryption will be done for you by the API implementation\n- Establish a connection with remote server (E.g. XHR) using a protected channel. SSL/TLS establishment and usage will be done for you by the API implementation\n\nFor more information please visit the [API documentation](https://software.intel.com/en-us/app-security-api/api).\n",
+ "usage": "\n```typescript\nimport { IntelSecurity } from '@ionic-native/intel-security/ngx';\n...\nconstructor(private intelSecurity: IntelSecurity) { }\n...\n\nlet storageID = 'id';\n\nthis.intelSecurity.data.createFromData({ data: 'Sample Data' })\n .then((instanceID: Number) => this.intelSecurity.storage.write({ id: storageId, instanceID: instanceID }))\n .catch((error: any) => console.log(error));\n\nthis.intelSecurity.storage.read({id: storageID })\n .then((instanceID: number) => this.intelSecurity.data.getData(instanceID))\n .then((data: string) => console.log(data)) // Resolves to 'Sample Data'\n .catch((error: any) => console.log(error));\n\nthis.intelSecurity.storage.delete({ id: storageID })\n .then(() => console.log('Deleted Successfully'))\n .catch((error: any) => console.log(error));\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/AppSecurityApi/com-intel-security-cordova-plugin",
+ "cordovaPlugin": {
+ "name": "com-intel-security-cordova-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/intercom",
+ "displayName": "Intercom",
+ "description": "\nThis is a plugin that allows your Ionic app to use Intercom for iOS and/or Intercom for Android.\nFollow the offical documentation to setup this plugin correctly: https://developers.intercom.com/docs/cordova-phonegap-configuration\n",
+ "usage": "\n```typescript\nimport { Intercom } from '@ionic-native/intercom/ngx';\n\n\nconstructor(private intercom: Intercom) { }\n\n...\n\nthis.intercom.registerUnidentifiedUser();\n...\nthis.intercom.registerForPush();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/intercom/intercom-cordova",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-intercom"
+ }
+ },
+ {
+ "packageName": "@ionic-native/ionic-webview",
+ "displayName": "Ionic Webview",
+ "description": "\nAccess Web View utilities.\n\nRequires the Cordova plugin: `cordova-plugin-ionic-webview` > 2.0. For more info, please see the [Ionic Web View](https://github.com/ionic-team/cordova-plugin-ionic-webview) repository.\n",
+ "usage": "\n```typescript\nimport { WebView } from '@ionic-native/ionic-webview/ngx';\n\n\nconstructor(private webview: WebView) { }\n\n...\n\nimg = this.webview.convertFileSrc('file:///Users/dan/camera-image-12345.png')\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ionic-team/cordova-plugin-ionic-webview",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ionic-webview"
+ }
+ },
+ {
+ "packageName": "@ionic-native/is-debug",
+ "displayName": "Is Debug",
+ "description": "\nDetect if the app is running in debug mode or not.\nDebug mode is when the app is built and installed locally via xcode / eclipse / the cordova cli etc, compared to release mode when the app was downloaded from the app / play store via an end user.\n",
+ "usage": "\n```typescript\nimport { IsDebug } from '@ionic-native/is-debug/ngx';\n\nconstructor(private isDebug: IsDebug) { }\n\n...\n\nthis.isDebug.getIsDebug()\n .then(isDebug => console.log('Is debug:', isDebug))\n .catch(err => console.error(err));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/mattlewis92/cordova-plugin-is-debug",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-is-debug"
+ }
+ },
+ {
+ "packageName": "@ionic-native/janalytics",
+ "displayName": "jAnalytics",
+ "description": "\nThis plugin does something\n",
+ "usage": "\n```typescript\nimport { JAnalytics } from '@ionic-native/JAnalytics/ngx';\n\n\nconstructor(private jAnalytics: JAnalytics) { }\n\n...\n\n\nthis.jAnalytics.functionName('Hello', 123)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/jpush/cordova-plugin-janalytics",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-janalytics"
+ }
+ },
+ {
+ "packageName": "@ionic-native/jins-meme",
+ "displayName": "Jins Meme",
+ "description": "\nImplementation of the JINS MEME SDK\n",
+ "usage": "\n```typescript\nimport { JinsMeme } from '@ionic-native/jins-meme/ngx';\n\nconstructor(private jinsMeme: JinsMeme) { }\n\n...\n\nthis.jinsMeme.setAppClientID(appClientId: string, clientSecret: string).then(\n // Bluetooth should be enabled and the JINS MEME powered on (blinking blue light)\n this.jinsMeme.startScan().subscribe((meme_addr) => {\n this.jinsMeme.connect(meme_addr).subscribe((connectResult) => {\n this.memeService.startDataReport().subscribe((dataReport) => {\n console.log(dataReport);\n });\n });\n });\n.catch(console.log('jinsMeme.setAppClientID authentication error'));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/BlyncSync/cordova-plugin-jins-meme",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-jins-meme"
+ }
+ },
+ {
+ "packageName": "@ionic-native/keyboard",
+ "displayName": "Keyboard",
+ "description": "\nKeyboard plugin for Cordova.\n\nRequires Cordova plugin: `cordova-plugin-ionic-keyboard`. For more info, please see the [Keyboard plugin docs](https://github.com/ionic-team/cordova-plugin-ionic-keyboard).\n",
+ "usage": "\n```typescript\nimport { Keyboard } from '@ionic-native/keyboard/ngx';\n\nconstructor(private keyboard: Keyboard) { }\n\n...\n\nthis.keyboard.show();\n\nthis.keyboard.hide();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ionic-team/cordova-plugin-ionic-keyboard",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ionic-keyboard"
+ }
+ },
+ {
+ "packageName": "@ionic-native/keychain-touch-id",
+ "displayName": "Keychain Touch Id",
+ "description": "\nA cordova plugin adding the iOS TouchID / Android fingerprint to your\napp and allowing you to store a password securely in the device keychain.\n",
+ "usage": "\n```typescript\nimport { KeychainTouchId } from '@ionic-native/keychain-touch-id/ngx';\n\n\nconstructor(private keychainTouchId: KeychainTouchId) { }\n\n...\n\n\nthis.keychainTouchId.isAvailable()\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/sjhoeksma/cordova-plugin-keychain-touch-id",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-keychain-touch-id"
+ }
+ },
+ {
+ "packageName": "@ionic-native/keychain",
+ "displayName": "Keychain",
+ "description": "\nGet and set data in the iOS Keychain\n\nRequires Cordova plugin: `cordova-plugin-ios-keychain`. For more info, please see the [Keychain plugin docs](https://github.com/ionic-team/cordova-plugin-ios-keychain).\n\nSee also [Secure Storage](https://ionicframework.com/docs/native/secure-storage/) for more supported platforms.\n",
+ "usage": "\n```typescript\nimport { Keychain } from '@ionic-native/keychain/ngx';\n\nconstructor(private keychain: Keychain) { }\n\n...\n\nthis.keychain.set(key, value).then(() => {\n this.keychain.get(key)\n .then(value => console.log('Got value', value))\n .catch(err => console.error('Error getting', err));\n})\n.catch(err => console.error('Error setting', err));\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/ionic-team/cordova-plugin-ios-keychain",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ios-keychain"
+ }
+ },
+ {
+ "packageName": "@ionic-native/last-cam",
+ "displayName": "LastCam",
+ "description": "\nLast Cam is a Camera Preview plugin that allows you to take capture both Videos and images in a\ncustom html preview of your choice.\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/bengejd/cordova-plugin-last-cam",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-last-cam"
+ }
+ },
+ {
+ "packageName": "@ionic-native/launch-navigator",
+ "displayName": "Launch Navigator",
+ "description": "\nRequires Cordova plugin: uk.co.workingedge.phonegap.plugin.launchnavigator. For more info, please see the [LaunchNavigator plugin docs](https://github.com/dpa99c/phonegap-launch-navigator).\n",
+ "usage": "\nPlease refer to the plugin's repo for detailed usage. This docs page only explains the Native wrapper.\n\n```typescript\nimport { LaunchNavigator, LaunchNavigatorOptions } from '@ionic-native/launch-navigator/ngx';\n\nconstructor(private launchNavigator: LaunchNavigator) { }\n\n...\n\nlet options: LaunchNavigatorOptions = {\n start: 'London, ON',\n app: LaunchNavigator.APPS.UBER\n}\n\nthis.launchNavigator.navigate('Toronto, ON', options)\n .then(\n success => console.log('Launched navigator'),\n error => console.log('Error launching navigator', error)\n );\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/dpa99c/phonegap-launch-navigator",
+ "cordovaPlugin": {
+ "name": "uk.co.workingedge.phonegap.plugin.launchnavigator"
+ }
+ },
+ {
+ "packageName": "@ionic-native/launch-review",
+ "displayName": "Launch Review",
+ "description": "\n\nAssists in leaving user reviews/ratings in the App Stores.\n- Launches the platform's App Store page for the current app in order for the user to leave a review.\n- On iOS (10.3 and above) invokes the native in-app rating dialog which allows a user to rate your app without needing to open the App Store.\n",
+ "usage": "\n```typescript\nimport { LaunchReview } from '@ionic-native/launch-review/ngx';\n\nconstructor(private launchReview: LaunchReview) { }\n\n...\n\nthis.launchReview.launch()\n .then(() => console.log('Successfully launched store app');\n\nif(this.launchReview.isRatingSupported()){\n this.launchReview.rating()\n .then(() => console.log('Successfully launched rating dialog'));\n}\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/dpa99c/cordova-launch-review",
+ "cordovaPlugin": {
+ "name": "cordova-launch-review"
+ }
+ },
+ {
+ "packageName": "@ionic-native/line-login",
+ "displayName": "Line Login",
+ "description": "\nThe function login, logs out, acquires, verifies, and refreshes the access token. The version of LineSDK you are using is as follows.\n",
+ "usage": "\n```typescript\nimport { LineLogin } from '@ionic-native/line-login/ngx';\n\n\nconstructor(private lineLogin: LineLogin) { }\n\n...\n\n\nthis.lineLogin.initialize({ channel_id: \"xxxxxxxxxx\" })\n\nthis.lineLogin.login()\n .then(result => console.log(result))\n .catch(error => console.log(error))\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/nrikiji/cordova-line-login-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-line-login-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/local-notifications",
+ "displayName": "Local Notifications",
+ "description": "\nThis plugin allows you to display local notifications on the device\n",
+ "usage": "\n```typescript\nimport { LocalNotifications } from '@ionic-native/local-notifications/ngx';\n\n\nconstructor(private localNotifications: LocalNotifications) { }\n\n...\n\n\n// Schedule a single notification\nthis.localNotifications.schedule({\n id: 1,\n text: 'Single ILocalNotification',\n sound: isAndroid? 'file://sound.mp3': 'file://beep.caf',\n data: { secret: key }\n});\n\n\n// Schedule multiple notifications\nthis.localNotifications.schedule([{\n id: 1,\n text: 'Multi ILocalNotification 1',\n sound: isAndroid ? 'file://sound.mp3': 'file://beep.caf',\n data: { secret:key }\n },{\n id: 2,\n title: 'Local ILocalNotification Example',\n text: 'Multi ILocalNotification 2',\n icon: 'http://example.com/icon.png'\n}]);\n\n\n// Schedule delayed notification\nthis.localNotifications.schedule({\n text: 'Delayed ILocalNotification',\n trigger: {at: new Date(new Date().getTime() + 3600)},\n led: 'FF0000',\n sound: null\n});\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/katzer/cordova-plugin-local-notifications",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-local-notification"
+ }
+ },
+ {
+ "packageName": "@ionic-native/location-accuracy",
+ "displayName": "Location Accuracy",
+ "description": "\nThis Cordova/Phonegap plugin for Android and iOS to request enabling/changing of Location Services by triggering a native dialog from within the app, avoiding the need for the user to leave your app to change location settings manually.\n",
+ "usage": "\n```typescript\nimport { LocationAccuracy } from '@ionic-native/location-accuracy/ngx';\n\nconstructor(private locationAccuracy: LocationAccuracy) { }\n\n...\n\nthis.locationAccuracy.canRequest().then((canRequest: boolean) => {\n\n if(canRequest) {\n // the accuracy option will be ignored by iOS\n this.locationAccuracy.request(this.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY).then(\n () => console.log('Request successful'),\n error => console.log('Error requesting location permissions', error)\n );\n }\n\n});\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/dpa99c/cordova-plugin-request-location-accuracy",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-request-location-accuracy"
+ }
+ },
+ {
+ "packageName": "@ionic-native/lottie-splash-screen",
+ "displayName": "Lottie Splash Screen",
+ "description": "\nCordova plugin to show bodymovin/Lottie animations as the splash screen with Airbnb's Lottie wrapper\n",
+ "usage": "\n```typescript\nimport { LottieSplashScreen } from '@ionic-native/lottie-splash-screen/ngx';\n\n\nconstructor(private lottieSplashScreen: LottieSplashScreen) { }\n\n...\n\n\nthis.lottieSplashScreen.show('www/lottie/animation.json', false, 1024, 768)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/timbru31/cordova-plugin-lottie-splashscreen",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-lottie-splashscreen"
+ }
+ },
+ {
+ "packageName": "@ionic-native/luxand",
+ "displayName": "Luxand",
+ "description": "\nThis plugin let you integrat Luxand Face SDK into your ionic projects, so you can implements face authentication easily in your applications.\n",
+ "usage": "\n```typescript\nimport { Luxand } from '@ionic-native/luxand';\n\n\nconstructor(private luxand: Luxand) { }\n\n...\n\n//init Luxand Face SDK\n\nthis.luxand.init({\n licence: \"\",\n dbname: \"data.dat\",\n loginTryCount: 3\n})\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n// register a face\nthis.luxand.register({\n timeout: 20000//20 seconds\n})\n.then(r=>{\n console.log(\"Your FACE ID:\", r.id);\n console.log(\"Your AGE:\", r.extra.AGE);\n console.log(\"Your GENDER:\", r.extra.GENDER);\n console.log(\"SIMILING:\", r.extra.SMILE>35? \"YES\": \"NO\");\n console.log(\"EYE OPENED:\", r.extra.EYESOPENED>45? \"YES\": \"NO\");\n})\n.catch(err=>{\n if(err.messgae === \"Already registered\") {\n //extra data available\n console.log(\"Your AGE:\", r.extra.AGE);\n console.log(\"Your GENDER:\", r.extra.GENDER);\n console.log(\"SIMILING:\", r.extra.SMILE>35? \"YES\": \"NO\");\n console.log(\"EYE OPENED:\", r.extra.EYESOPENED>45? \"YES\": \"NO\");\n }\n})\n//to login using a face\nthis.luxand.login({\ntimeout: 20000\n}).then(r=>console.log(r))\n.catch(err=>console.log(err));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/molobala/cordova-plugin-luxand",
+ "cordovaPlugin": {
+ "name": "codova-plugin-luxand"
+ }
+ },
+ {
+ "packageName": "@ionic-native/magnetometer",
+ "displayName": "Device eMagnetometer",
+ "description": "\nRequires Cordova plugin: `cordova-plugin-magnetometer`. For more info, please see the [Device Orientation docs](https://github.com/sdesalas/cordova-plugin-magnetometer).\n",
+ "usage": "\n```typescript\n// DeviceOrientationCompassHeading is an interface for compass\nimport { Magnetometer, MagnetometerReading } from '@ionic-native/device-orientation/ngx';\n\nconstructor(private magnetometer: Magnetometer) { }\n\n...\n\n// Get the device current compass heading\nthis.deviceOrientation.getReading().then(\n (data: MagnetometerReading) => console.log(data),\n (error: any) => console.log(error)\n);\n\n// Watch the device compass heading change\nvar subscription = this.deviceOrientation.watchReadings().subscribe(\n (data: MagnetometerReading) => console.log(data)\n);\n\n// Stop watching heading change\nsubscription.unsubscribe();\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/sdesalas/cordova-plugin-magnetometer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-magnetometer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/market",
+ "displayName": "Market",
+ "description": "\nOpens an app's page in the market place (Google Play, App Store)\n",
+ "usage": "\n```typescript\nimport { Market } from '@ionic-native/market/ngx';\n\nconstructor(private market: Market) { }\n\n...\n\nthis.market.open('your.package.name');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/xmartlabs/cordova-plugin-market",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-market"
+ }
+ },
+ {
+ "packageName": "@ionic-native/media-capture",
+ "displayName": "Media Capture",
+ "description": "\nThis plugin provides access to the device's audio, image, and video capture capabilities.\n\nRequires Cordova plugin: `cordova-plugin-media-capture`. For more info, please see the [Media Capture plugin docs](https://github.com/apache/cordova-plugin-media-capture).\n",
+ "usage": "\n```typescript\nimport { MediaCapture, MediaFile, CaptureError, CaptureImageOptions } from '@ionic-native/media-capture/ngx';\n\n\nconstructor(private mediaCapture: MediaCapture) { }\n\n...\n\n\nlet options: CaptureImageOptions = { limit: 3 }\nthis.mediaCapture.captureImage(options)\n .then(\n (data: MediaFile[]) => console.log(data),\n (err: CaptureError) => console.error(err)\n );\n\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-media-capture",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-media-capture"
+ }
+ },
+ {
+ "packageName": "@ionic-native/media",
+ "displayName": "Media",
+ "description": "\nThis plugin provides the ability to record and play back audio files on a device.\n",
+ "usage": "\n```typescript\nimport { Media, MediaObject } from '@ionic-native/media/ngx';\n\n\nconstructor(private media: Media) { }\n\n\n...\n\n\n// Create a Media instance. Expects path to file or url as argument\n// We can optionally pass a second argument to track the status of the media\n\nconst file: MediaObject = this.media.create('file.mp3');\n\n// to listen to plugin events:\n\nfile.onStatusUpdate.subscribe(status => console.log(status)); // fires when file status changes\n\nfile.onSuccess.subscribe(() => console.log('Action is successful'));\n\nfile.onError.subscribe(error => console.log('Error!', error));\n\n// play the file\nfile.play();\n\n// pause the file\nfile.pause();\n\n// get current playback position\nfile.getCurrentPosition().then((position) => {\n console.log(position);\n});\n\n// get file duration\nlet duration = file.getDuration();\nconsole.log(duration);\n\n// skip to 10 seconds (expects int value in ms)\nfile.seekTo(10000);\n\n// stop playing the file\nfile.stop();\n\n// release the native audio resource\n// Platform Quirks:\n// iOS simply create a new instance and the old one will be overwritten\n// Android you must call release() to destroy instances of media when you are done\nfile.release();\n\n\n\n// Recording to a file\nconst file: MediaObject = this.media.create('path/to/file.mp3');\n\nfile.startRecord();\n\nfile.stopRecord();\n\n\n```\n\nSome hints if you are using iOS and recording doesn't work:\n1.) Try to use a absolute file path but remove beginning \"file://\".\nThen it looks like: `/var/mobile/Containers/Data/Application/AF438B8B-7724-4FBB-8E69-083463224FC4/tmp/my_file.m4a`\nExample: `this.media.create(this.file.tempDirectory.replace(/^file:\\/\\//, '') + 'my_file.m4a')`\n2.) If that's not working, too, create the file before using.\nExample:\n```typescript\nimport { Media, MediaObject } from '@ionic-native/media/ngx';\nimport { File } from '@ionic-native/file/ngx';\n\n...\n\nconstructor(private media: Media, private file: File) { }\n\n...\n\nthis.file.createFile(this.file.tempDirectory, 'my_file.m4a', true).then(() => {\n let file = this.media.create(this.file.tempDirectory.replace(/^file:\\/\\//, '') + 'my_file.m4a');\n file.startRecord();\n window.setTimeout(() => file.stopRecord(), 10000);\n});\n```\n\nYou can find the reasons here: https://github.com/ionic-team/ionic-native/issues/1452#issuecomment-299605906",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-media",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-media"
+ }
+ },
+ {
+ "packageName": "@ionic-native/mixpanel",
+ "displayName": "Mixpanel",
+ "description": "\nCordova Plugin that wraps Mixpanel SDK for Android and iOS\n",
+ "usage": "\n```typescript\nimport { Mixpanel } from '@ionic-native/mixpanel/ngx';\n\nconstructor(private mixpanel: Mixpanel, private mixpanelPeople: MixpanelPeople) { }\n\n...\n\nthis.mixpanel.init(token)\n .then(onSuccess)\n .catch(onError);\n\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS"
+ ],
+ "repo": "https://github.com/samzilverberg/cordova-mixpanel-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-mixpanel"
+ }
+ },
+ {
+ "packageName": "@ionic-native/mobile-accessibility",
+ "displayName": "Mobile Accessibility",
+ "description": "\nThis plugin exposes information on the status of various accessibility features of mobile operating systems, including, for example, whether a screen reader is running, invert colors is enabled, and the preferred scaling for text.\nIt also allows an application to send a string to be spoken by the screen reader, or a command to stop the screen reader from speaking.\n",
+ "usage": "\n```typescript\nimport { MobileAccessibility } from '@ionic-native/mobile-ccessibility/ngx';\n\n\nconstructor(private mobileAccessibility: MobileAccessibility) { }\n\n...\n\nif(this.mobileAccessibility.isScreenReaderRunningCallback();\n\n```\n",
+ "platforms": [
+ "Android Fire OS",
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/phonegap/phonegap-mobile-accessibility",
+ "cordovaPlugin": {
+ "name": "phonegap-plugin-mobile-accessibility"
+ }
+ },
+ {
+ "packageName": "@ionic-native/ms-adal",
+ "displayName": "MS ADAL",
+ "description": "\nActive Directory Authentication Library (ADAL) plugin.\nActive Directory Authentication Library ([ADAL](https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.clients.activedirectory?view=azure-dotnet))\nplugin provides easy to use authentication functionality for your Apache Cordova apps by taking advantage of\nWindows Server Active Directory and Windows Azure Active Directory. Here you can find the source code for the library.",
+ "usage": "\n```typescript\nimport { MSAdal, AuthenticationContext, AuthenticationResult } from '@ionic-native/ms-adal/ngx';\n\n\nconstructor(private msAdal: MSAdal) {}\n\n...\n\nlet authContext: AuthenticationContext = this.msAdal.createAuthenticationContext('https://login.windows.net/common');\n\nauthContext.acquireTokenAsync('https://graph.windows.net', 'a5d92493-ae5a-4a9f-bcbf-9f1d354067d3', 'http://MyDirectorySearcherApp')\n .then((authResponse: AuthenticationResult) => {\n console.log('Token is' , authResponse.accessToken);\n console.log('Token will expire on', authResponse.expiresOn);\n })\n .catch((e: any) => console.log('Authentication failed', e));\n\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/AzureAD/azure-activedirectory-library-for-cordova",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ms-adal"
+ }
+ },
+ {
+ "packageName": "@ionic-native/music-controls",
+ "displayName": "Music Controls",
+ "description": "\nMusic controls for Cordova applications.\nDisplay a 'media' notification with play/pause, previous, next buttons, allowing the user to control the play.\nHandle also headset event (plug, unplug, headset button).\n",
+ "usage": "\n```typescript\nimport { MusicControls } from '@ionic-native/music-controls/ngx';\n\nconstructor(private musicControls: MusicControls) { }\n\n...\n\nthis.musicControls.create({\n track : 'Time is Running Out', // optional, default : ''\n artist : 'Muse', // optional, default : ''\n cover : 'albums/absolution.jpg', // optional, default : nothing\n // cover can be a local path (use fullpath 'file:///storage/emulated/...', or only 'my_image.jpg' if my_image.jpg is in the www folder of your app)\n // or a remote url ('http://...', 'https://...', 'ftp://...')\n isPlaying : true, // optional, default : true\n dismissable : true, // optional, default : false\n\n // hide previous/next/close buttons:\n hasPrev : false, // show previous button, optional, default: true\n hasNext : false, // show next button, optional, default: true\n hasClose : true, // show close button, optional, default: false\n\n// iOS only, optional\n album : 'Absolution', // optional, default: ''\n duration : 60, // optional, default: 0\n elapsed : 10, // optional, default: 0\n hasSkipForward : true, // show skip forward button, optional, default: false\n hasSkipBackward : true, // show skip backward button, optional, default: false\n skipForwardInterval: 15, // display number for skip forward, optional, default: 0\n skipBackwardInterval: 15, // display number for skip backward, optional, default: 0\n hasScrubbing: false, // enable scrubbing from control center and lockscreen progress bar, optional\n\n // Android only, optional\n // text displayed in the status bar when the notification (and the ticker) are updated, optional\n ticker : 'Now playing \"Time is Running Out\"',\n // All icons default to their built-in android equivalents\n playIcon: 'media_play',\n pauseIcon: 'media_pause',\n prevIcon: 'media_prev',\n nextIcon: 'media_next',\n closeIcon: 'media_close',\n notificationIcon: 'notification'\n });\n\n this.musicControls.subscribe().subscribe(action => {\n\n function events(action) {\n const message = JSON.parse(action).message;\n \tswitch(message) {\n \t\tcase 'music-controls-next':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-previous':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-pause':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-play':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-destroy':\n \t\t\t// Do something\n \t\t\tbreak;\n\n // External controls (iOS only)\n case 'music-controls-toggle-play-pause' :\n \t\t\t// Do something\n \t\t\tbreak;\n case 'music-controls-seek-to':\n const seekToInSeconds = JSON.parse(action).position;\n this.musicControls.updateElapsed({\n elapsed: seekToInSeconds,\n isPlaying: true\n });\n // Do something\n break;\n case 'music-controls-skip-forward':\n // Do something\n break;\n case 'music-controls-skip-backward':\n // Do something\n break;\n\n \t\t// Headset events (Android only)\n \t\t// All media button events are listed below\n \t\tcase 'music-controls-media-button' :\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-headset-unplugged':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tcase 'music-controls-headset-plugged':\n \t\t\t// Do something\n \t\t\tbreak;\n \t\tdefault:\n \t\t\tbreak;\n \t}\n }\n\n this.musicControls.listen(); // activates the observable above\n\n this.musicControls.updateIsPlaying(true);\n\n\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/homerours/cordova-music-controls-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-music-controls"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-audio",
+ "displayName": "Native Audio",
+ "description": "Native Audio Playback",
+ "usage": "\n```typescript\nimport { NativeAudio } from '@ionic-native/native-audio/ngx';\n\nconstructor(private nativeAudio: NativeAudio) { }\n\n...\n\nthis.nativeAudio.preloadSimple('uniqueId1', 'path/to/file.mp3').then(onSuccess, onError);\nthis.nativeAudio.preloadComplex('uniqueId2', 'path/to/file2.mp3', 1, 1, 0).then(onSuccess, onError);\n\nthis.nativeAudio.play('uniqueId1').then(onSuccess, onError);\n\n// can optionally pass a callback to be called when the file is done playing\nthis.nativeAudio.play('uniqueId1', () => console.log('uniqueId1 is done playing'));\n\nthis.nativeAudio.loop('uniqueId2').then(onSuccess, onError);\n\nthis.nativeAudio.setVolumeForComplexAsset('uniqueId2', 0.6).then(onSuccess,onError);\n\nthis.nativeAudio.stop('uniqueId1').then(onSuccess,onError);\n\nthis.nativeAudio.unload('uniqueId1').then(onSuccess,onError);\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS"
+ ],
+ "repo": "https://github.com/floatinghotpot/cordova-plugin-nativeaudio",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-nativeaudio"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-geocoder",
+ "displayName": "Native Geocoder",
+ "description": "\nCordova plugin for native forward and reverse geocoding\n",
+ "usage": "\n```typescript\nimport { NativeGeocoder, NativeGeocoderResult, NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';\n\nconstructor(private nativeGeocoder: NativeGeocoder) { }\n\n...\n\nlet options: NativeGeocoderOptions = {\n useLocale: true,\n maxResults: 5\n};\n\nthis.nativeGeocoder.reverseGeocode(52.5072095, 13.1452818, options)\n .then((result: NativeGeocoderResult[]) => console.log(JSON.stringify(result[0])))\n .catch((error: any) => console.log(error));\n\nthis.nativeGeocoder.forwardGeocode('Berlin', options)\n .then((result: NativeGeocoderResult[]) => console.log('The coordinates are latitude=' + result[0].latitude + ' and longitude=' + result[0].longitude))\n .catch((error: any) => console.log(error));\n```",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/sebastianbaar/cordova-plugin-nativegeocoder",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-nativegeocoder"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-keyboard",
+ "displayName": "Native Keyboard",
+ "description": "\nA cross platform WhatsApp / Messenger / Slack -style keyboard even. For your Cordova app.\n\n",
+ "usage": "\n```\nimport { NativeKeyboard } from '@ionic-native/native-keyboard/ngx';\n\n\nconstructor(private nativeKeyboard: NativeKeyboard) { }\n\n...\n\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-native-keyboard",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-native-keyboard"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-page-transitions",
+ "displayName": "Native Page Transitions",
+ "description": "\nThe Native Page Transitions plugin uses native hardware acceleration to animate your transitions between views. You have complete control over the type of transition, the duration, and direction.\n",
+ "usage": "\n```typescript\nimport { NativePageTransitions, NativeTransitionOptions } from '@ionic-native/native-page-transitions/ngx';\n\nconstructor(private nativePageTransitions: NativePageTransitions) { }\n\n...\n\n\n// example of adding a transition when a page/modal closes\nionViewWillLeave() {\n\n let options: NativeTransitionOptions = {\n direction: 'up',\n duration: 500,\n slowdownfactor: 3,\n slidePixels: 20,\n iosdelay: 100,\n androiddelay: 150,\n fixedPixelsTop: 0,\n fixedPixelsBottom: 60\n }\n\n this.nativePageTransitions.slide(options)\n .then(onSuccess)\n .catch(onError);\n\n}\n\n\n// example of adding a transition when pushing a new page\nopenPage(page: any) {\n\n this.nativePageTransitions.slide(options);\n this.navCtrl.push(page);\n\n}\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/Telerik-Verified-Plugins/NativePageTransitions",
+ "cordovaPlugin": {
+ "name": "com.telerik.plugins.nativepagetransitions"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-ringtones",
+ "displayName": "Native Ringtones",
+ "description": "\nThe plugin helps get the native ringtones list on Android or IOS devices.\nAnd you can also use this plugin to play or stop the native ringtones and custom ringtones(added in the www folder).\n",
+ "usage": "\n```\nimport { NativeRingtones } from '@ionic-native/native-ringtones/ngx';\n\n\nconstructor(private ringtones: NativeRingtones) { }\n\n...\nthis.ringtones.getRingtone().then((ringtones) => { console.log(ringtones); });\n\nthis.ringtones.playRingtone('assets/ringtones/sound_1.caf');\n\nthis.ringtones.stopRingtone('assets/ringtones/sound_1.caf');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/TongZhangzt/cordova-plugin-native-ringtones",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-native-ringtones"
+ }
+ },
+ {
+ "packageName": "@ionic-native/native-storage",
+ "displayName": "Native Storage",
+ "description": "Native storage of variables in Android and iOS\n",
+ "usage": "\n```typescript\nimport { NativeStorage } from '@ionic-native/native-storage/ngx';\n\nconstructor(private nativeStorage: NativeStorage) { }\n\n...\n\nthis.nativeStorage.setItem('myitem', {property: 'value', anotherProperty: 'anotherValue'})\n .then(\n () => console.log('Stored item!'),\n error => console.error('Error storing item', error)\n );\n\nthis.nativeStorage.getItem('myitem')\n .then(\n data => console.log(data),\n error => console.error(error)\n );\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "macOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/TheCocoaProject/cordova-plugin-nativestorage",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-nativestorage"
+ }
+ },
+ {
+ "packageName": "@ionic-native/navigation-bar",
+ "displayName": "Navigation Bar",
+ "description": "\nThe NavigationBar plugin allows you to hide and auto hide the android navigation bar.\n",
+ "usage": "\n```typescript\nimport { NavigationBar } from '@ionic-native/navigation-bar/ngx';\n\nconstructor(private navigationBar: NavigationBar) { }\n\n...\n\nlet autoHide: boolean = true;\nthis.navigationBar.setUp(autoHide);\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/cranberrygame/cordova-plugin-navigationbar",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-navigationbar"
+ }
+ },
+ {
+ "packageName": "@ionic-native/network-interface",
+ "displayName": "Network Interface",
+ "description": "\nNetwork interface information plugin for Cordova/PhoneGap that supports Android, Blackberry 10, Browser, iOS, and Windows Phone 8.\n",
+ "usage": "\n```typescript\nimport { NetworkInterface } from '@ionic-native/network-interface/ngx';\n\nconstructor( private networkInterface: NetworkInterface ) {\n\n this.networkInterface.getWiFiIPAddress()\n .then(address => console.info(`IP: ${address.ip}, Subnet: ${address.subnet}`))\n .catch(error => console.error(`Unable to get IP: ${error}`));\n\n this.networkInterface.getCarrierIPAddress()\n .then(address => console.info(`IP: ${address.ip}, Subnet: ${address.subnet}`))\n .catch(error => console.error(`Unable to get IP: ${error}`));\n\n const url = 'www.github.com';\n this.networkInterface.getHttpProxyInformation(url)\n .then(proxy => console.info(`Type: ${proxy.type}, Host: ${proxy.host}, Port: ${proxy.port}`))\n .catch(error => console.error(`Unable to get proxy info: ${error}`));\n}\n```\n",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "iOS",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/salbahra/cordova-plugin-networkinterface",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-networkinterface"
+ }
+ },
+ {
+ "packageName": "@ionic-native/network",
+ "displayName": "Network",
+ "description": "\nRequires Cordova plugin: cordova-plugin-network-information. For more info, please see the [Network plugin docs](https://github.com/apache/cordova-plugin-network-information).\n",
+ "usage": "\n```typescript\nimport { Network } from '@ionic-native/network/ngx';\n\nconstructor(private network: Network) { }\n\n...\n\n// watch network for a disconnection\nlet disconnectSubscription = this.network.onDisconnect().subscribe(() => {\n console.log('network was disconnected :-(');\n});\n\n// stop disconnect watch\ndisconnectSubscription.unsubscribe();\n\n\n// watch network for a connection\nlet connectSubscription = this.network.onConnect().subscribe(() => {\n console.log('network connected!');\n // We just got a connection but we need to wait briefly\n // before we determine the connection type. Might need to wait.\n // prior to doing any api requests as well.\n setTimeout(() => {\n if (this.network.type === 'wifi') {\n console.log('we got a wifi connection, woohoo!');\n }\n }, 3000);\n});\n\n// stop connect watch\nconnectSubscription.unsubscribe();\n\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-network-information",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-network-information"
+ }
+ },
+ {
+ "packageName": "@ionic-native/nfc",
+ "displayName": "NFC",
+ "description": "\nThe NFC plugin allows you to read and write NFC tags. You can also beam to, and receive from, other NFC enabled devices.\n\nUse to\n- read data from NFC tags\n- write data to NFC tags\n- send data to other NFC enabled devices\n- receive data from NFC devices\n\nThis plugin uses NDEF (NFC Data Exchange Format) for maximum compatibilty between NFC devices, tag types, and operating systems.\n",
+ "usage": "\n```typescript\nimport { NFC, Ndef } from '@ionic-native/nfc/ngx';\n\nconstructor(private nfc: NFC, private ndef: Ndef) { }\n\n...\n\nthis.nfc.addNdefListener(() => {\n console.log('successfully attached ndef listener');\n}, (err) => {\n console.log('error attaching ndef listener', err);\n}).subscribe((event) => {\n console.log('received ndef message. the tag contains: ', event.tag);\n console.log('decoded tag id', this.nfc.bytesToHexString(event.tag.id));\n\n let message = this.ndef.textRecord('Hello world');\n this.nfc.share([message]).then(onSuccess).catch(onError);\n});\n\n```\n",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/chariotsolutions/phonegap-nfc",
+ "cordovaPlugin": {
+ "name": "phonegap-nfc"
+ }
+ },
+ {
+ "packageName": "@ionic-native/onesignal",
+ "displayName": "OneSignal",
+ "description": "\nThe OneSignal plugin is an client implementation for using the [OneSignal](https://onesignal.com/) Service.\nOneSignal is a simple implementation for delivering push notifications.\n\nPlease view the official [OneSignal Ionic SDK Installation](https://documentation.onesignal.com/docs/ionic-sdk-setup) guide\nfor more information.\n\n#### Icons\nIf you want to use generated icons with command `ionic cordova resources`:\n\n1. Add a file to your `hooks` directory called `copy_android_notification_icons.js`\n\n2. Configure the hook in your config.xml\n```\n \n \n \n```\n\n3. Put the following code in it:\n\n```\n#!/usr/bin/env node\n\nvar fs = require('fs');\nvar path = require('path');\n\nvar filestocopy = [{\n \"resources/android/icon/drawable-hdpi-icon.png\":\n \"platforms/android/app/src/main/res/drawable-hdpi/ic_stat_onesignal_default.png\"\n}, {\n \"resources/android/icon/drawable-mdpi-icon.png\":\n \"platforms/android/app/src/main/res/drawable-mdpi/ic_stat_onesignal_default.png\"\n}, {\n \"resources/android/icon/drawable-xhdpi-icon.png\":\n \"platforms/android/app/src/main/res/drawable-xhdpi/ic_stat_onesignal_default.png\"\n}, {\n \"resources/android/icon/drawable-xxhdpi-icon.png\":\n \"platforms/android/app/src/main/res/drawable-xxhdpi/ic_stat_onesignal_default.png\"\n}, {\n \"resources/android/icon/drawable-xxxhdpi-icon.png\":\n \"platforms/android/app/src/main/res/drawable-xxxhdpi/ic_stat_onesignal_default.png\"\n} ];\n\nmodule.exports = function(context) {\n\n // no need to configure below\n var rootdir = context.opts.projectRoot;\n\n filestocopy.forEach(function(obj) {\n Object.keys(obj).forEach(function(key) {\n var val = obj[key];\n var srcfile = path.join(rootdir, key);\n var destfile = path.join(rootdir, val);\n console.log(\"copying \"+srcfile+\" to \"+destfile);\n var destdir = path.dirname(destfile);\n if (fs.existsSync(srcfile) && fs.existsSync(destdir)) {\n fs.createReadStream(srcfile).pipe(\n fs.createWriteStream(destfile));\n }\n });\n });\n\n};\n```\n\n3. From the root of your project make the file executable:\n`$ chmod +x hooks/copy_android_notification_icons.js`\n\n",
+ "usage": "\n```typescript\nimport { OneSignal } from '@ionic-native/onesignal/ngx';\n\nconstructor(private oneSignal: OneSignal) { }\n\n...\n\nthis.oneSignal.startInit('b2f7f966-d8cc-11e4-bed1-df8f05be55ba', '703322744261');\n\nthis.oneSignal.inFocusDisplaying(this.oneSignal.OSInFocusDisplayOption.InAppAlert);\n\nthis.oneSignal.handleNotificationReceived().subscribe(() => {\n // do something when notification is received\n});\n\nthis.oneSignal.handleNotificationOpened().subscribe(() => {\n // do something when a notification is opened\n});\n\nthis.oneSignal.endInit();\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/OneSignal/OneSignal-Cordova-SDK",
+ "cordovaPlugin": {
+ "name": "onesignal-cordova-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/open-native-settings",
+ "displayName": "Open Native Settings",
+ "description": "\nPlugin to open native screens of iOS/android settings",
+ "usage": "\nYou can open any of these settings:\n```\n \"about\", // ios\n \"accessibility\", // ios, android\n \"account\", // ios, android\n \"airplane_mode\", // ios, android\n \"apn\", // android\n \"application_details\", // ios, android\n \"application_development\", // android\n \"application\", // android\n \"autolock\", // ios\n \"battery_optimization\", // android\n \"bluetooth\", // ios, android\n \"castle\", // ios\n \"captioning\", // android\n \"cast\", // android\n \"cellular_usage\", // ios\n \"configuration_list\", // ios\n \"data_roaming\", // android\n \"date\", // ios, android\n \"display\", // ios, android\n \"dream\", // android\n \"facetime\", // ios\n \"home\", // android\n \"keyboard\", // ios, android\n \"keyboard_subtype\", // android\n \"locale\", // ios, android\n\"location\", // ios, android\n\"locations\", // ios\n\"manage_all_applications\", // android\n\"manage_applications\", // android\n\"memory_card\", // android\n\"music\", // ios\n\"music_equalizer\", // ios\n\"music_volume\", // ios\n\"network\", // ios, android\n\"nike_ipod\", // ios\n\"nfcsharing\", // android\n\"nfc_payment\", // android\n\"nfc_settings\", // android\n\"notes\", // ios\n\"notification_id\", // ios\n\"passbook\", // ios\n\"phone\", // ios\n\"photos\", // ios\n\"print\", // android\n\"privacy\", // android\n\"quick_launch\", // android\n\"reset\", // ios\n\"ringtone\", // ios\n\"browser\", // ios\n\"search\", // ios, android\n\"security\", // android\n\"settings\", // ios, android\n\"show_regulatory_info\",\n\"sound\", // ios, android\n\"software_update\", // ios\n\"storage\", // ios, android\n\"store\", // ios, android\n\"sync\", // android\n\"tethering\", // ios\n\"twitter\", // ios\n\"touch\", // ios\n\"usage\", // ios, android\n\"user_dictionary\", // android\n\"video\", // ios\n\"voice_input\", // android\n\"vpn\", // ios\n\"wallpaper\", // ios\n\"wifi_ip\", // android\n\"wifi\", // ios, android\n\"wireless\" // android\n ```\n```typescript\nimport { OpenNativeSettings } from '@ionic-native/open-native-settings/ngx';\n\n\nconstructor(private openNativeSettings: OpenNativeSettings) { }\n\n...\n\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/guyromb/Cordova-open-native-settings",
+ "cordovaPlugin": {
+ "name": "cordova-open-native-settings"
+ }
+ },
+ {
+ "packageName": "@ionic-native/openalpr",
+ "displayName": "OpenALPR",
+ "description": "\nThis Cordova plugin adds support for the OpenALPR (Automatic License Plate Recognition) library, which provides support for retrieving the license plate from a picture.\n",
+ "usage": "\n```typescript\nimport { OpenALPR, OpenALPROptions, OpenALPRResult } from '@ionic-native/openalpr/ngx';\n\n\nconstructor(private openALPR: OpenALPR) { }\n\nconst scanOptions: OpenALPROptions = {\n country: this.openALPR.Country.EU,\n amount: 3\n}\n\n// To get imageData, you can use the @ionic-native/camera module for example. It works with DestinationType.FILE_URI and DATA_URL\n\nthis.openALPR.scan(imageData, scanOptions)\n .then((res: [OpenALPRResult]) => console.log(res))\n .catch((error: Error) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/iMicknl/cordova-plugin-openalpr",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-openalpr"
+ }
+ },
+ {
+ "packageName": "@ionic-native/paypal",
+ "displayName": "PayPal",
+ "description": "\nPayPal plugin for Cordova/Ionic Applications\n",
+ "usage": "\n```typescript\nimport { PayPal, PayPalPayment, PayPalConfiguration } from '@ionic-native/paypal/ngx';\n\nconstructor(private payPal: PayPal) { }\n\n...\n\n\nthis.payPal.init({\n PayPalEnvironmentProduction: 'YOUR_PRODUCTION_CLIENT_ID',\n PayPalEnvironmentSandbox: 'YOUR_SANDBOX_CLIENT_ID'\n}).then(() => {\n // Environments: PayPalEnvironmentNoNetwork, PayPalEnvironmentSandbox, PayPalEnvironmentProduction\n this.payPal.prepareToRender('PayPalEnvironmentSandbox', new PayPalConfiguration({\n // Only needed if you get an \"Internal Service Error\" after PayPal login!\n //payPalShippingAddressOption: 2 // PayPalShippingAddressOptionPayPal\n })).then(() => {\n let payment = new PayPalPayment('3.33', 'USD', 'Description', 'sale');\n this.payPal.renderSinglePaymentUI(payment).then(() => {\n // Successfully paid\n\n // Example sandbox response\n //\n // {\n // \"client\": {\n // \"environment\": \"sandbox\",\n // \"product_name\": \"PayPal iOS SDK\",\n // \"paypal_sdk_version\": \"2.16.0\",\n // \"platform\": \"iOS\"\n // },\n // \"response_type\": \"payment\",\n // \"response\": {\n // \"id\": \"PAY-1AB23456CD789012EF34GHIJ\",\n // \"state\": \"approved\",\n // \"create_time\": \"2016-10-03T13:33:33Z\",\n // \"intent\": \"sale\"\n // }\n // }\n }, () => {\n // Error or render dialog closed without being successful\n });\n }, () => {\n // Error in configuration\n });\n}, () => {\n // Error in initialization, maybe PayPal isn't supported or something else\n});\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/paypal/PayPal-Cordova-Plugin",
+ "cordovaPlugin": {
+ "name": "com.paypal.cordova.mobilesdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/pedometer",
+ "displayName": "Pedometer",
+ "description": "\nFetch pedestrian-related pedometer data,\nsuch as step counts and other information about the distance travelled.\n",
+ "usage": "\n```typescript\nimport { Pedometer } from '@ionic-native/pedometer/ngx';\n\nPedometer.isDistanceAvailable()\n .then((available: boolean) => console.log(available))\n .catch((error: any) => console.log(error));\n\nPedometer.startPedometerUpdates()\n .subscribe((data: IPedometerData) => {\n console.log(data);\n });\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/leecrossley/cordova-plugin-pedometer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-pedometer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/phonegap-local-notification",
+ "displayName": "Phonegap Local Notification",
+ "description": "\nThe Local Notification plugin gives developers the ability to post notifications from their app that show up in the device’s notification area.\nThe API for the local notification plugin follows the W3C Web Notifications specification: https://www.w3.org/TR/notifications/\n",
+ "usage": "\n```\nimport { PhonegapLocalNotification } from '@ionic-native/phonegap-local-notification/ngx';\n\n\nconstructor(private localNotification: PhonegapLocalNotification) { }\n\n...\n\nthis.localNotification.requestPermission().then(\n (permission) => {\n if (permission === 'granted') {\n\n // Create the notification\n this.localNotification.create('My Title', {\n tag: 'message1',\n body: 'My body',\n icon: 'assets/icon/favicon.ico'\n });\n\n }\n }\n);\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/phonegap/phonegap-plugin-local-notification",
+ "cordovaPlugin": {
+ "name": "phonegap-plugin-local-notification"
+ }
+ },
+ {
+ "packageName": "@ionic-native/photo-library",
+ "displayName": "Photo Library",
+ "description": "\nThe PhotoLibrary plugin allows access to photos from device by url. So you can use plain img tag to display photos and their thumbnails, and different 3rd party libraries as well.\nSaving photos and videos to the library is also supported.\ncdvphotolibrary urls should be trusted by Angular. See plugin homepage to learn how.\n",
+ "usage": "\n```typescript\nimport { PhotoLibrary } from '@ionic-native/photo-library/ngx';\n\nconstructor(private photoLibrary: PhotoLibrary) { }\n\nthis.photoLibrary.requestAuthorization().then(() => {\n this.photoLibrary.getLibrary().subscribe({\n next: library => {\n library.forEach(function(libraryItem) {\n console.log(libraryItem.id); // ID of the photo\n console.log(libraryItem.photoURL); // Cross-platform access to photo\n console.log(libraryItem.thumbnailURL);// Cross-platform access to thumbnail\n console.log(libraryItem.fileName);\n console.log(libraryItem.width);\n console.log(libraryItem.height);\n console.log(libraryItem.creationDate);\n console.log(libraryItem.latitude);\n console.log(libraryItem.longitude);\n console.log(libraryItem.albumIds); // array of ids of appropriate AlbumItem, only of includeAlbumsData was used\n });\n },\n error: err => { console.log('could not get photos'); },\n complete: () => { console.log('done getting photos'); }\n });\n})\n.catch(err => console.log('permissions weren\\'t granted'));\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS"
+ ],
+ "repo": "https://github.com/terikon/cordova-plugin-photo-library",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-photo-library"
+ }
+ },
+ {
+ "packageName": "@ionic-native/photo-viewer",
+ "displayName": "Photo Viewer",
+ "description": "This plugin can display your image in full screen with the ability to pan, zoom, and share the image.",
+ "usage": "\n```typescript\nimport { PhotoViewer } from '@ionic-native/photo-viewer/ngx';\n\nconstructor(private photoViewer: PhotoViewer) { }\n\n...\n\nthis.photoViewer.show('https://mysite.com/path/to/image.jpg');\n\nthis.photoViewer.show('https://mysite.com/path/to/image.jpg', 'My image title', {share: false});\n\nthis.photoViewer.show('https://mysecuresite.com/path/to/image.jpg', 'My image title', {share: false, headers: '{username:foo,password:bar}'});\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/sarriaroman/photoviewer",
+ "cordovaPlugin": {
+ "name": "com-sarriaroman-photoviewer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/pin-check",
+ "displayName": "Pin Check",
+ "description": "\nThis plugin is for use with Apache Cordova and allows your application to check whether pin/keyguard or passcode is setup on iOS and Android phones.\n\nRequires Cordova plugin: cordova-plugin-pincheck. For more info, please see the [PinCheck plugin docs](https://github.com/ohh2ahh/AppAvailability).\n",
+ "usage": "\n```typescript\nimport { PinCheck } from '@ionic-native/pin-check/ngx';\nimport { Platform } from 'ionic-angular';\n\nconstructor(private pinCheck: PinCheck, private platform: Platform) { }\n\n...\n\nthis.pinCheck.isPinSetup()\n .then(\n (success: string) => console.log(\"pin is setup.\");,\n (error: string) => console.log(\"pin not setup.\");\n );\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/shangyilim/cordova-plugin-pincheck",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-pincheck"
+ }
+ },
+ {
+ "packageName": "@ionic-native/pin-dialog",
+ "displayName": "Pin Dialog",
+ "description": "\nPhoneGap numeric password dialog plugin for Android and iOS.\n\nRequires Cordova plugin: `cordova-plugin-pin-dialog`. For more info, please see the [Pin Dialog plugin docs](https://github.com/Paldom/PinDialog).\n\n\n",
+ "usage": "\n```typescript\nimport { PinDialog } from '@ionic-native/pin-dialog/ngx';\n\n\nconstructor(private pinDialog: PinDialog) { }\n\n...\n\nthis.pinDialog.prompt('Enter your PIN', 'Verify PIN', ['OK', 'Cancel'])\n .then(\n (result: any) => {\n if (result.buttonIndex == 1) console.log('User clicked OK, value is: ', result.input1);\n else if(result.buttonIndex == 2) console.log('User cancelled');\n }\n );\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Paldom/PinDialog",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-pin-dialog"
+ }
+ },
+ {
+ "packageName": "@ionic-native/pinterest",
+ "displayName": "Pinterest",
+ "description": "\nCordova plugin for Pinterest\n",
+ "usage": "\n```typescript\nimport { Pinterest, PinterestUser, PinterestPin, PinterestBoard } from '@ionic-native/pinterest/ngx';\n\nconstructor(private pinterest: Pinterest) { }\n\n...\n\nconst scopes = [\n this.pinterest.SCOPES.READ_PUBLIC,\n this.pinterest.SCOPES.WRITE_PUBLIC,\n this.pinterest.SCOPES.READ_RELATIONSHIPS,\n this.pinterest.SCOPES.WRITE_RELATIONSHIPS\n];\n\nthis.pinterest.login(scopes)\n .then(res => console.log('Logged in!', res))\n .catch(err => console.error('Error loggin in', err));\n\nthis.pinterest.getMyPins()\n .then((pins: PinterestPin[]) => console.log(pins))\n .catch(err => console.error(err));\n\nthis.pinterest.getMe()\n .then((user: PinterestUser) => console.log(user));\n\nthis.pinterest.getMyBoards()\n .then((boards: PinterestBoard[]) => console.log(boards));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/zyramedia/cordova-plugin-pinterest",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-pinterest"
+ }
+ },
+ {
+ "packageName": "@ionic-native/power-management",
+ "displayName": "Power Management",
+ "description": "\nThe PowerManagement plugin offers access to the devices power-management functionality.\nIt should be used for applications which keep running for a long time without any user interaction.\n",
+ "usage": "\n```typescript\nimport { PowerManagement } from '@ionic-native/power-management/ngx';\n\nconstructor(private powerManagement: PowerManagement) { }\n\n...\n\nthis.powerManagement.acquire()\n .then(onSuccess)\n .catch(onError);\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/Viras-/cordova-plugin-powermanagement",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-powermanagement-orig"
+ }
+ },
+ {
+ "packageName": "@ionic-native/printer",
+ "displayName": "Printer",
+ "description": "Prints documents or HTML rendered content",
+ "usage": "\n```typescript\nimport { Printer, PrintOptions } from '@ionic-native/printer/ngx';\n\nconstructor(private printer: Printer) { }\n\n...\n\nthis.printer.isAvailable().then(onSuccess, onError);\n\nlet options: PrintOptions = {\n name: 'MyDocument',\n printerId: 'printer007',\n duplex: true,\n landscape: true,\n grayscale: true\n }\n\nthis.printer.print(content, options).then(onSuccess, onError);\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/katzer/cordova-plugin-printer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-printer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/pro",
+ "displayName": "Pro",
+ "description": "\nThis plugin enables Ionic Pro services like live updates and error monitoring\n",
+ "usage": "\n```typescript\nimport { Pro, AppInfo, DeployInfo } from '@ionic-native/pro/ngx';\n\n\nconstructor(private pro: Pro) { }\n\n// Get app info\nthis.pro.getAppInfo().then((res: AppInfo) => {\n console.log(res)\n})\n\n// Get live update info\nthis.pro.deploy.info().then((res: DeployInfo) => {\n console.log(res)\n})\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ionic-team/cordova-plugin-ionic",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-ionic"
+ }
+ },
+ {
+ "packageName": "@ionic-native/purchases",
+ "displayName": "Purchases",
+ "description": "\nPurchases is a cross platform solution for managing in-app subscriptions. A backend is also provided via [RevenueCat](https://www.revenuecat.com)\n\n## Features\n| | RevenueCat |\n| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| ✅ | Server-side receipt validation |\n| ➡️ | [Webhooks](https://docs.revenuecat.com/docs/webhooks) - enhanced server-to-server communication with events for purchases, renewals, cancellations, and more |\n| 🎯 | Subscription status tracking - know whether a user is subscribed whether they're on iOS, Android or web |\n| 📊 | Analytics - automatic calculation of metrics like conversion, mrr, and churn |\n| 📝 | [Online documentation](https://docs.revenuecat.com/docs) up to date |\n| 🔀 | [Integrations](https://www.revenuecat.com/integrations) - over a dozen integrations to easily send purchase data where you need it |\n| 💯 | Well maintained - [frequent releases](https://github.com/RevenueCat/purchases-ios/releases) |\n| 📮 | Great support - [Help Center](https://docs.revenuecat.com/discuss) |\n| 🤩 | Awesome [new features](https://trello.com/b/RZRnWRbI/revenuecat-product-roadmap) |\n\n## Getting Started\n\nFor more detailed information, you can view our complete documentation at [docs.revenuecat.com](https://docs.revenuecat.com/docs).\n",
+ "usage": "\n#### 1. Get a RevenueCat API key\n\nLog in to the [RevenueCat dashboard](https://app.revenuecat.com) and obtain a free API key for your application.\n\n#### 2. Initialize the SDK\n\nYou should only configure _Purchases_ once (usually on app launch) as soon as your app has a unique user id for your user. This can be when a user logs in if you have accounts or on launch if you can generate a random user identifier.\n\n```typescript\n import { Platform } from \"@ionic/angular\";\n import { Purchases } from \"@ionic-native/purchases/ngx\";\n\n constructor(public platform: Platform, private purchases: Purchases) {\n platform.ready().then(() => {\n this.purchases.setDebugLogsEnabled(true); // Enable to get debug logs\n this.purchases.setup(\"my_api_key\", \"my_app_user_id\");\n }\n }\n```\n#### 3. Displaying Available Products\n\n_Purchases_ will automatically fetch the latest _active_ entitlements and get the product information from Apple or Google. This means when users launch your purchase screen, products will already be loaded.\n\nBelow is an example of fetching entitlements and launching an upsell screen.\n\n```typescript\nthis.purchases.getEntitlements()\n .subscribe(entitlements => ,\n error => );\n```\n\n#### 4. Make a purchase\n\nWhen it comes time to make a purchase, _Purchases_ has a simple method, `makePurchase`. The code sample below shows the process of purchasing a product and confirming it unlocks the \"my_entitlement_identifier\" content.\n\n```typescript\nthis.purchases.makePurchase(\"product_id\")\n .subscribe(response => {\n if (response.purchaserInfo.activeEntitlements.includes(\"my_entitlement_identifier\")) {\n // Unlock content\n }\n },\n ({ error, userCancelled }) => // Error making purchase. You can check error.userCancelled to check if user cancelled the purchase\n );\n\n```\n\n`makePurchase` handles the underlying framework interaction and automatically validates purchases with Apple and Google through our secure servers. This helps reduce in-app purchase fraud and decreases the complexity of your app. Receipt tokens are stored remotely and always kept up-to-date.\n\n#### 5. Get Subscription Status\n\n_Purchases_ makes it easy to check what active subscriptions the current user has. This can\nbe done two ways within the `.purchaserInfo` method:\n\n1. Checking active Entitlements - this lets you see what entitlements ([from RevenueCat dashboard](https://app.revenuecat.com))\nare active for the user.\n2. Checking the active subscriptions - this lets you see what product ids (from iTunes Connect or Play Store) are active for the user.\n\n```typescript\n this.purchases.getPurchaserInfo()\n .subscribe(info => {\n // Option 1: Check if user has access to entitlement (from RevenueCat dashboard)\n const isPro =\n info.activeEntitlements !== \"undefined\" &&\n info.activeEntitlements.includes(\"pro\");\n // Option 2: Check if user has active subscription (from App Store Connect or Play Store)\n const isPro =\n info.activeSubscriptions !== \"undefined\" &&\n info.activeSubscriptions.includes(\"my_product_identifier\");\n },\n error => );\n```\n\n> Since the SDK updates and caches the latest PurchaserInfo when the app becomes active, the completion block in `.purchaserInfo` won't need to make a network request in most cases.\n\n### Restoring Purchases\n\nRestoring purchases is a mechanism by which your user can restore their in-app purchases, reactivating any content that had previously been purchased from the same store account (Apple or Google).\n\nIf two different App User IDs try to restore transactions from the same underlying store account (Apple or Google) RevenueCat will create an alias between the two App User IDs and count them as the same user going forward.\n\nThis is a common if your app does not have accounts and is relying on RevenueCat's random App User IDs.\n\n```typescript\nthis.purchases.restore()\n .subscribe(info => {\n //... check purchaserInfo to see if entitlement is now active\n },\n error => );\n```\n> If you've provided your own App User ID, calling restoreTransactions could alias the logged in user to another generated App User ID that has made a purchase on the same device.\n\n> By default, RevenueCat will not let you reuse an App or Play Store account that already has an active subscription. If you set allowSharingAppStoreAccount = True the SDK will be permissive in accepting shared accounts, creating aliases as needed.\n\n> By default allowSharingAppStoreAccount is True for RevenueCat random App User IDs but must be enabled manually if you want to allow permissive sharing for your own App User IDs.\n\n## Debugging\n\nYou can enabled detailed debug logs by setting `debugLogsEnabled = true`. You can set this **before** you configure Purchases.\n\n```typescript\nthis.purchases.setDebugLogsEnabled(true);\nthis.purchases.setup(\"my_api_key\", \"my_app_user_id\");\n```\n\n**OS_ACTIVITY_MODE**\n> On iOS, disabling `OS_ACTIVITY_MODE` in your XCode scheme will block debug logs from printing in the console. If you have debug logs enabled, but don't see any output, go to `Product -> Scheme -> Edit Scheme...` in Xcode and uncheck the `OS_ACTIVITY_MODE` environment variable.\n\nExample output:\n```\n[Purchases] - DEBUG: Debug logging enabled.\n[Purchases] - DEBUG: SDK Version - 2.0.0\n[Purchases] - DEBUG: Initial App User ID - (null)\n[Purchases] - DEBUG: GET /v1/subscribers/\n[Purchases] - DEBUG: GET /v1/subscribers//products\n[Purchases] - DEBUG: No cached entitlements, fetching\n[Purchases] - DEBUG: Vending purchaserInfo from cache\n[Purchases] - DEBUG: applicationDidBecomeActive\n[Purchases] - DEBUG: GET /v1/subscribers//products 200\n```\n## Entitlements\n\nAn entitlement represents features or content that a user is \"entitled\" to. With Entitlements, you can set up your available in-app products remotely and control their availability without the need to update your app. For more information on configuring entitlements, look at our [entitlements documetation](https://docs.revenuecat.com/docs/entitlements).\n\n## Sample App\n\nWe've added an [example](https://github.com/RevenueCat/purchases-ionic-example) showing a simple example using _Purchases_ with the RevenueCat backend. Note that the pre-registered in app purchases in the demo apps are for illustration purposes only and may not be valid in App Store Connect. [Set up your own purchases](https://docs.revenuecat.com/docs/entitlements) with RevenueCat when running the example.\n\n#### Additional iOS Setup\n\n##### Add Strip Frameworks Phase\nThe App Store, in it's infinite wisdom, still rejects fat frameworks, so we need to strip our framework before it is deployed. To do this, add the following script phase to your build.\n1. In Xcode, in project manager, select your app target.\n2. Open the `Build Phases` tab\n3. Add a new `Run Script`, name it `Strip Frameworks`\n4. Add the following command `\"${PROJECT_DIR}/../../node_modules/cordova-plugin-purchases/src/ios/strip-frameworks.sh\"` (quotes included)\n\n\n\n## Next Steps\n- Head over to our **[online documentation](https://docs.revenuecat.com/docs)** for complete setup guides\n- If you haven't already, make sure your products are configured correctly in the RevenueCat dashboard by checking out our [guide on entitlements](https://docs.revenuecat.com/docs/entitlements)\n- If you want to use your own user identifiers, read about [setting app user ids](https://docs.revenuecat.com/docs/user-ids)\n- If you're moving to RevenueCat from another system, see our guide on [migrating your existing subscriptions](https://docs.revenuecat.com/docs/migrating-existing-subscriptions)\n- Once you're ready to test your integration, you can follow our guides on [testing purchases](https://docs.revenuecat.com/docs/testing-purchases)\n\n## Reporting Issues\n\nYou can use Github Issues to report any bugs and issues with _Purchases_. Here is some advice for users that want to report an issue:\n\n1. Make sure that you are using the latest version of _Purchases_. The issue that you are about to report may be already fixed in the latest master branch version: https://github.com/revenuecat/cordova-plugin-purchases/tree/master.\n2. Providing reproducible steps for the issue will shorten the time it takes for it to be fixed - a Gist is always welcomed!\n3. Since some issues are Sandbox specific, specifying what environment you encountered the issue might help.\n\n## Technical Support or Questions\n\nIf you have questions or need help integrating _Purchases_ please [contact us](https://www.revenuecat.com/contact) or email _support@revenuecat.com_ instead of opening an issue.\n\n## Feature Requests\n\nIf there is something you'd like to see included or feel anything is missing you can add a feature to our [public roadmap](https://trello.com/b/RZRnWRbI/revenuecat-product-roadmap). If the feature already exists, or you see something else you'd like, upvote it.\n\n## Pricing\n\n_Purchases_ SDK is free to use but some features require a paid plan. You can find more about that on our website on the [pricing plan page](https://www.revenuecat.com/pricing).\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/RevenueCat/cordova-plugin-purchases",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-purchases"
+ }
+ },
+ {
+ "packageName": "@ionic-native/push",
+ "displayName": "Push",
+ "description": "\nRegister and receive push notifications.\n\nRequires Cordova plugin: `phonegap-plugin-push`. For more info, please see the [Push plugin docs](https://github.com/phonegap/phonegap-plugin-push).\n\nFor TypeScript users, see the [Push plugin docs about using TypeScript for custom notifications](https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/TYPESCRIPT.md).\n",
+ "usage": "\n```typescript\nimport { Push, PushObject, PushOptions } from '@ionic-native/push/ngx';\n\nconstructor(private push: Push) { }\n\n...\n\n\n// to check if we have permission\nthis.push.hasPermission()\n .then((res: any) => {\n\n if (res.isEnabled) {\n console.log('We have permission to send push notifications');\n } else {\n console.log('We do not have permission to send push notifications');\n }\n\n });\n\n// Create a channel (Android O and above). You'll need to provide the id, description and importance properties.\nthis.push.createChannel({\n id: \"testchannel1\",\n description: \"My first test channel\",\n // The importance property goes from 1 = Lowest, 2 = Low, 3 = Normal, 4 = High and 5 = Highest.\n importance: 3\n}).then(() => console.log('Channel created'));\n\n// Delete a channel (Android O and above)\nthis.push.deleteChannel('testchannel1').then(() => console.log('Channel deleted'));\n\n// Return a list of currently configured channels\nthis.push.listChannels().then((channels) => console.log('List of channels', channels))\n\n// to initialize push notifications\n\nconst options: PushOptions = {\n android: {},\n ios: {\n alert: 'true',\n badge: true,\n sound: 'false'\n },\n windows: {},\n browser: {\n pushServiceURL: 'http://push.api.phonegap.com/v1/push'\n }\n}\n\nconst pushObject: PushObject = this.push.init(options);\n\n\npushObject.on('notification').subscribe((notification: any) => console.log('Received a notification', notification));\n\npushObject.on('registration').subscribe((registration: any) => console.log('Device registered', registration));\n\npushObject.on('error').subscribe(error => console.error('Error with Push plugin', error));\n\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/phonegap/phonegap-plugin-push",
+ "cordovaPlugin": {
+ "name": "phonegap-plugin-push"
+ }
+ },
+ {
+ "packageName": "@ionic-native/qqsdk",
+ "displayName": "QQSDK",
+ "description": "\nThis Plugin is a wrapper around the Tencent QQ SDK for Android and iOS. Provides access to QQ ssoLogin, QQ Sharing, QQZone Sharing etc.\n\nRequires Cordova plugin: `cordova-plugin-qqsdk`. For more info, please see the [QQSDK plugin docs](https://github.com/iVanPan/Cordova_QQ).\n",
+ "usage": "\n```typescript\nimport { QQSDK, QQShareOptions } from '@ionic-native/qqsdk/ngx';\n\nconstructor(private qq: QQSDK) { }\n\n...\n\n\nconst options: QQShareOptions = {\n client: this.qq.ClientType.QQ,\n scene: this.qq.Scene.QQ,\n title: 'This is a title for cordova-plugin-qqsdk',\n url: 'https://cordova.apache.org/',\n image: 'https://cordova.apache.org/static/img/cordova_bot.png',\n description: 'This is Cordova QQ share description',\n flashUrl: 'http://stream20.qqmusic.qq.com/30577158.mp3',\n}\n\nconst clientOptions: QQShareOptions = {\n client: this.qq.ClientType.QQ,\n}\n\nconst shareTextOptions: QQShareOptions = {\n client: this.qq.ClientType.QQ,\n text: 'This is Share Text',\n scene: this.qq.Scene.QQ,\n}\n\nthis.qq.ssoLogin(clientOptions)\n .then(result => {\n // Success\n console.log('token is ' + result.access_token);\n console.log('userid is ' + result.userid);\n console.log('expires_time is ' + new Date(parseInt(result.expires_time)) + ' TimeStamp is ' + result.expires_time);\n })\n .catch(error => {\n console.log(error); // Failed\n });\n\nthis.qq.logout()\n .then(() => {\n console.log('logout success');\n })\n .catch(error => {\n console.log(error);\n });\n\nthis.qq.checkClientInstalled(clientOptions)\n .then(() => {\n console.log('Installed');\n })\n .catch(() => {\n console.log('Not Installed');\n });\n\nthis.qq.shareText(shareTextOptions)\n .then(() => {\n console.log('shareText success');\n })\n .catch(error => {\n console.log(error);\n });\n\nthis.qq.shareImage(options)\n .then(() => {\n console.log('shareImage success');\n })\n .catch(error => {\n console.log(error);\n });\n}\n\nthis.qq.shareNews(options)\n .then(() => {\n console.log('shareNews success');\n })\n .catch(error => {\n console.log(error);\n });\n}\n\nthis.qq.shareAudio(options)\n .then(() => {\n console.log('shareAudio success');\n })\n .catch(error => {\n console.log(error);\n });\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/iVanPan/Cordova_QQ",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-qqsdk"
+ }
+ },
+ {
+ "packageName": "@ionic-native/qr-scanner",
+ "displayName": "QR Scanner",
+ "description": "\nA fast, energy efficient, highly-configurable QR code scanner for Cordova apps.\n\nRequires Cordova plugin: `cordova-plugin-qrscanner`. For more info, please see the [QR Scanner plugin docs](https://github.com/bitpay/cordova-plugin-qrscanner).\n",
+ "usage": "\n```typescript\nimport { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner/ngx';\n\n\nconstructor(private qrScanner: QRScanner) { }\n\n...\n\n// Optionally request the permission early\nthis.qrScanner.prepare()\n .then((status: QRScannerStatus) => {\n if (status.authorized) {\n // camera permission was granted\n\n\n // start scanning\n let scanSub = this.qrScanner.scan().subscribe((text: string) => {\n console.log('Scanned something', text);\n\n this.qrScanner.hide(); // hide camera preview\n scanSub.unsubscribe(); // stop scanning\n });\n\n } else if (status.denied) {\n // camera permission was permanently denied\n // you must use QRScanner.openSettings() method to guide the user to the settings page\n // then they can grant the permission from there\n } else {\n // permission was denied, but not permanently. You can ask for permission again at a later time.\n }\n })\n .catch((e: any) => console.log('Error is', e));\n\n\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/bitpay/cordova-plugin-qrscanner",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-qrscanner"
+ }
+ },
+ {
+ "packageName": "@ionic-native/quikkly",
+ "displayName": "QuikklyPlugin",
+ "description": "ionic wrapper for cordova-plugin-quikkly\nUse the quikkly scanner in your ionic app\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/quikkly/cordova-plugin-quikkly.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-quikkly"
+ }
+ },
+ {
+ "packageName": "@ionic-native/regula-document-reader",
+ "displayName": "Regula Document Reader",
+ "description": "\nPlugin for reading and validation of identification documents.\n",
+ "usage": "\n```typescript\nimport { RegulaDocumentReader } from '@ionic-native/regula-document-reader/ngx';\n\nlet license; // read regula.license file\nRegulaDocumentReader.initReader(license); // initialize reader\nRegulaDocumentReader.scanDocument().then((result) => {\n\t\t// read result\n})\n```\n",
+ "platforms": [
+ "iOS",
+ "Android"
+ ],
+ "repo": "https://github.com/regulaforensics/cordova-plugin-documentreader.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-documentreader"
+ }
+ },
+ {
+ "packageName": "@ionic-native/rollbar",
+ "displayName": "Rollbar",
+ "description": "\nThis plugin adds [Rollbar](https://rollbar.com/) App monitoring to your application\n",
+ "usage": "\n```typescript\nimport { Rollbar } from '@ionic-native/rollbar/ngx';\n\nconstructor(private rollbar: Rollbar) { }\n\n...\n\nthis.rollbar.init();\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Resgrid/cordova-plugins-rollbar",
+ "cordovaPlugin": {
+ "name": "resgrid-cordova-plugins-rollbar"
+ }
+ },
+ {
+ "packageName": "@ionic-native/safari-view-controller",
+ "displayName": "Safari View Controller",
+ "description": "\nFor displaying read-only web content.\n\nRequires Cordova plugin: `cordova-plugin-safariviewcontroller`. For more info, please see the [Safari View Controller plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-safariviewcontroller).\n",
+ "usage": "\n```typescript\nimport { SafariViewController } from '@ionic-native/safari-view-controller/ngx';\n\nconstructor(private safariViewController: SafariViewController) { }\n\n...\n\nthis.safariViewController.isAvailable()\n .then((available: boolean) => {\n if (available) {\n\n this.safariViewController.show({\n url: 'http://ionic.io',\n hidden: false,\n animated: false,\n transition: 'curl',\n enterReaderModeIfAvailable: true,\n tintColor: '#ff0000'\n })\n .subscribe((result: any) => {\n if(result.event === 'opened') console.log('Opened');\n else if(result.event === 'loaded') console.log('Loaded');\n else if(result.event === 'closed') console.log('Closed');\n },\n (error: any) => console.error(error)\n );\n\n } else {\n // use fallback browser, example InAppBrowser\n }\n }\n );\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-safariviewcontroller",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-safariviewcontroller"
+ }
+ },
+ {
+ "packageName": "@ionic-native/screen-orientation",
+ "displayName": "Screen Orientation",
+ "description": "\nCordova plugin to set/lock the screen orientation in a common way.\n\nRequires Cordova plugin: `cordova-plugin-screen-orientation`. For more info, please see the [Screen Orientation plugin docs](https://github.com/apache/cordova-plugin-screen-orientation).\n",
+ "usage": "\n```typescript\nimport { ScreenOrientation } from '@ionic-native/screen-orientation/ngx';\n\nconstructor(private screenOrientation: ScreenOrientation) { }\n\n...\n\n\n// get current\nconsole.log(this.screenOrientation.type); // logs the current orientation, example: 'landscape'\n\n// set to landscape\nthis.screenOrientation.lock(this.screenOrientation.ORIENTATIONS.LANDSCAPE);\n\n// allow user rotate\nthis.screenOrientation.unlock();\n\n// detect orientation changes\nthis.screenOrientation.onChange().subscribe(\n () => {\n console.log(\"Orientation Changed\");\n }\n);\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-screen-orientation",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-screen-orientation"
+ }
+ },
+ {
+ "packageName": "@ionic-native/screenshot",
+ "displayName": "Screenshot",
+ "description": "Captures a screen shot",
+ "usage": "\n```typescript\nimport { Screenshot } from '@ionic-native/screenshot/ngx';\n\nconstructor(private screenshot: Screenshot) { }\n\n...\n\n// Take a screenshot and save to file\nthis.screenshot.save('jpg', 80, 'myscreenshot.jpg').then(onSuccess, onError);\n\n// Take a screenshot and get temporary file URI\nthis.screenshot.URI(80).then(onSuccess, onError);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "macOS"
+ ],
+ "repo": "https://github.com/gitawego/cordova-screenshot",
+ "cordovaPlugin": {
+ "name": "com.darktalker.cordova.screenshot"
+ }
+ },
+ {
+ "packageName": "@ionic-native/secure-storage",
+ "displayName": "Secure Storage",
+ "description": "\nThis plugin gets, sets and removes key,value pairs from a device's secure storage.\n\nRequires Cordova plugin: `cordova-plugin-secure-storage`. For more info, please see the [Cordova Secure Storage docs](https://github.com/Crypho/cordova-plugin-secure-storage).\n\nThe browser platform is supported as a mock only. Key/values are stored unencrypted in localStorage.\n",
+ "usage": "\n\n```typescript\nimport { SecureStorage, SecureStorageObject } from '@ionic-native/secure-storage/ngx';\n\nconstructor(private secureStorage: SecureStorage) { }\n\n...\n\nthis.secureStorage.create('my_store_name')\n .then((storage: SecureStorageObject) => {\n\n storage.get('key')\n .then(\n data => console.log(data),\n error => console.log(error)\n );\n\n storage.set('key', 'value')\n .then(\n data => console.log(data),\n error => console.log(error)\n );\n\n storage.remove('key')\n .then(\n data => console.log(data),\n error => console.log(error)\n );\n\n });\n\n\n```",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/Crypho/cordova-plugin-secure-storage",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-secure-storage"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sensors",
+ "displayName": "Sensors",
+ "description": "\nThis plugin enables sensors on Android devices\n",
+ "usage": "\n```typescript\nimport { Sensors, TYPE_SENSOR } from '@ionic-native/sensors/ngx';\n\n\nconstructor(private sensors: Sensors) { }\n\n...\n\n\nthis.sensors.enableSensor(TYPE_SENSOR.LIGHT);\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/fabiorogeriosj/cordova-plugin-sensors.git",
+ "cordovaPlugin": {
+ "name": "https://github.com/fabiorogeriosj/cordova-plugin-sensors.git"
+ }
+ },
+ {
+ "packageName": "@ionic-native/serial",
+ "displayName": "Serial",
+ "description": "\nThis plugin provides functions for working with Serial connections\n",
+ "usage": "\n```typescript\nimport { Serial } from '@ionic-native/serial/ngx';\n\nconstructor(private serial: Serial) { }\n\n...\n\nthis.serial.requestPermission().then(() => {\n this.serial.open({\n baudRate: 9800,\n dataBits: 4,\n stopBits: 1,\n parity: 0,\n dtr: true,\n rts: true,\n sleepOnPause: false\n }).then(() => {\n console.log('Serial connection opened');\n });\n}).catch((error: any) => console.log(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "Ubuntu"
+ ],
+ "repo": "https://github.com/xseignard/cordovarduino",
+ "cordovaPlugin": {
+ "name": "cordovarduino"
+ }
+ },
+ {
+ "packageName": "@ionic-native/shake",
+ "displayName": "Shake",
+ "description": "Handles shake gesture",
+ "usage": "\n```typescript\nimport { Shake } from '@ionic-native/shake/ngx';\n\nconstructor(private shake: Shake) { }\n\n...\n\nconst watch = this.shake.startWatch(60).subscribe(() => {\n // do something\n });\n\nwatch.unsubscribe();\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/leecrossley/cordova-plugin-shake",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-shake"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sim",
+ "displayName": "Sim",
+ "description": "\nGets info from the Sim card like the carrier name, mcc, mnc and country code and other system dependent info.\n\nRequires Cordova plugin: `cordova-plugin-sim`. For more info, please see the [Cordova Sim docs](https://github.com/pbakondy/cordova-plugin-sim).\n",
+ "usage": "\n```typescript\nimport { Sim } from '@ionic-native/sim/ngx';\n\n\nconstructor(private sim: Sim) { }\n\n...\n\nthis.sim.getSimInfo().then(\n (info) => console.log('Sim info: ', info),\n (err) => console.log('Unable to get sim info: ', err)\n);\n\nthis.sim.hasReadPermission().then(\n (info) => console.log('Has permission: ', info)\n);\n\nthis.sim.requestReadPermission().then(\n () => console.log('Permission granted'),\n () => console.log('Permission denied')\n);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/pbakondy/cordova-plugin-sim",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-sim"
+ }
+ },
+ {
+ "packageName": "@ionic-native/siri-shortcuts",
+ "displayName": "Siri Shortcuts",
+ "description": "\nThis plugin only works when your app is built with XCode 10. Shortcuts will only appear on iOS-versions >= 12.0\n\nThis plugin enables the use of Siri shortcuts in Cordova. Siri Shortcuts enable the user to perform certain actions by adding them to Siri.\nAfter you have donated a shortcut to Siri, it will appear in the settings menu, after which the user is able to add the action. You can check\nwhether the user launched your app through a shortcut by calling `getActivatedShortcut()` when the app is resumed. It will return `null`\nif it has not been launched by Siri, and if it did, it will return an object with `SiriShortcut` properties.\n",
+ "usage": "\n```typescript\nimport { SiriShortcuts } from '@ionic-native/siri-shortcuts/ngx';\n\n\nconstructor(private siriShortcuts: SiriShortcuts) { }\n\n...\n\n\nthis.siriShortcuts.donate({\n persistentIdentifier: 'open-my-app',\n title: 'Open my app',\n suggestedInvocationPhrase: 'Open my app',\n userInfo: { username: 'username' },\n isEligibleForSearch: true,\n isEligibleForPrediction: true,\n })\n .then(() => console.log('Shortcut donated.'))\n .catch((error: any) => console.error(error));\n\nthis.siriShortcuts.present({\n persistentIdentifier: 'open-my-app',\n title: 'Open my app',\n suggestedInvocationPhrase: 'Open my app',\n userInfo: { username: 'username' },\n })\n .then(() => console.log('Shortcut added.'))\n .catch((error: any) => console.error(error));\n\nthis.siriShortcuts.remove('open-my-app')\n .then(() => console.log('Shortcut removed.'))\n .catch((error: any) => console.error(error));\n\nthis.siriShortcuts.removeAll()\n .then(() => console.log('All shortcuts removed removed.'))\n .catch((error: any) => console.error(error));\n\nthis.siriShortcuts.getActivatedShortcut()\n .then((data: SiriShortcut|null) => console.log(data))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/bartwesselink/cordova-plugin-siri-shortcuts",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-siri-shortcuts"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sms",
+ "displayName": "SMS",
+ "description": "\n\nRequires Cordova plugin: cordova-sms-plugin. For more info, please see the [SMS plugin docs](https://github.com/cordova-sms/cordova-sms-plugin).\n",
+ "usage": "\n```typescript\nimport { SMS } from '@ionic-native/sms/ngx';\n\nconstructor(private sms: SMS) { }\n\n\n...\n\n\n// Send a text message using default options\nthis.sms.send('416123456', 'Hello world!');\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/cordova-sms/cordova-sms-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-sms-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/social-sharing",
+ "displayName": "Social Sharing",
+ "description": "\nShare text, files, images, and links via social networks, sms, and email.\n\nFor Browser usage check out the Web Share API docs: https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin#5-web-share-api\n",
+ "usage": "\n```typescript\nimport { SocialSharing } from '@ionic-native/social-sharing/ngx';\n\nconstructor(private socialSharing: SocialSharing) { }\n\n...\n\n// Check if sharing via email is supported\nthis.socialSharing.canShareViaEmail().then(() => {\n // Sharing via email is possible\n}).catch(() => {\n // Sharing via email is not possible\n});\n\n// Share via email\nthis.socialSharing.shareViaEmail('Body', 'Subject', ['recipient@example.org']).then(() => {\n // Success!\n}).catch(() => {\n // Error!\n});\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-x-socialsharing"
+ }
+ },
+ {
+ "packageName": "@ionic-native/speech-recognition",
+ "displayName": "Speech Recognition",
+ "description": "\nThis plugin does speech recognition using cloud services\n",
+ "usage": "\n```typescript\nimport { SpeechRecognition } from '@ionic-native/speech-recognition/ngx';\n\nconstructor(private speechRecognition: SpeechRecognition) { }\n\n...\n\n\n\n// Check feature available\nthis.speechRecognition.isRecognitionAvailable()\n .then((available: boolean) => console.log(available))\n\n// Start the recognition process\nthis.speechRecognition.startListening(options)\n .subscribe(\n (matches: string[]) => console.log(matches),\n (onerror) => console.log('error:', onerror)\n )\n\n// Stop the recognition process (iOS only)\nthis.speechRecognition.stopListening()\n\n// Get the list of supported languages\nthis.speechRecognition.getSupportedLanguages()\n .then(\n (languages: string[]) => console.log(languages),\n (error) => console.log(error)\n )\n\n// Check permission\nthis.speechRecognition.hasPermission()\n .then((hasPermission: boolean) => console.log(hasPermission))\n\n// Request permissions\nthis.speechRecognition.requestPermission()\n .then(\n () => console.log('Granted'),\n () => console.log('Denied')\n )\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/pbakondy/cordova-plugin-speechrecognition",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-speechrecognition"
+ }
+ },
+ {
+ "packageName": "@ionic-native/speechkit",
+ "displayName": "SpeechKit",
+ "description": "\nImplementation of Nuance SpeechKit SDK on Ionic\n",
+ "usage": "\n```typescript\nimport { SpeechKit } from '@ionic-native/speechkit/ngx';\n\nconstructor(private speechkit: SpeechKit) { }\n\n\n// find voice names that match language from: https://developer.nuance.com/public/index.php?task=supportedLanguages\nthis.speechkit.tts('Text to be read out loud', 'ENG-GBR', 'Serena').then(\n (msg) => { console.log(msg); },\n (err) => { console.log(err); }\n);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Shmarkus/cordova-plugin-nuance-speechkit",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-nuance-speechkit"
+ }
+ },
+ {
+ "packageName": "@ionic-native/spinner-dialog",
+ "displayName": "Spinner Dialog",
+ "description": "\nCordova plugin for showing a native spinner based on Paldom/SpinnerDialog.\n\nRequires Cordova plugin: `cordova-plugin-native-spinner`. For more info, please see the [Spinner Dialog plugin docs](https://github.com/greybax/cordova-plugin-native-spinner).\n",
+ "usage": "\n```typescript\nimport { SpinnerDialog } from '@ionic-native/spinner-dialog/ngx';\n\nconstructor(private spinnerDialog: SpinnerDialog) { }\n\n...\n\nthis.spinnerDialog.show();\n\nthis.spinnerDialog.hide();\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8",
+ "Windows"
+ ],
+ "repo": "https://github.com/greybax/cordova-plugin-native-spinner",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-native-spinner"
+ }
+ },
+ {
+ "packageName": "@ionic-native/splash-screen",
+ "displayName": "Splash Screen",
+ "description": "This plugin displays and hides a splash screen during application launch. The methods below allows showing and hiding the splashscreen after the app has loaded.",
+ "usage": "\n```typescript\nimport { SplashScreen } from '@ionic-native/splash-screen/ngx';\n\nconstructor(private splashScreen: SplashScreen) { }\n\n...\n\nthis.splashScreen.show();\n\nthis.splashScreen.hide();\n```\n",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-splashscreen",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-splashscreen"
+ }
+ },
+ {
+ "packageName": "@ionic-native/spotify-auth",
+ "displayName": "Spotify Auth",
+ "description": "\nCordova plugin for authenticating with Spotify\n> https://github.com/Festify/cordova-spotify-oauth\n",
+ "usage": "\n```typescript\nimport { SpotifyAuth } from '@ionic-native/spotify-auth';\n\n// [...]\n\nconstructor(private spotifyAuth: SpotifyAuth) { }\n\n// [...]\n\nconst config = {\n clientId: \"\",\n redirectUrl: \"\",\n scopes: [\"streaming\"], // see Spotify Dev console for all scopes\n tokenExchangeUrl: \"\",\n tokenRefreshUrl: \"\",\n};\n\n...\n\nthis.spotifyAuth.authorize(config)\n .then(({ accessToken, expiresAt }) => {\n console.log(`Got an access token, its ${accessToken}!`);\n console.log(`Its going to expire in ${expiresAt - Date.now()}ms.`);\n });\n\n// [...]\n\nthis.spotifyAuth.forget().then(() => console.log(\"We're logged out!\"));\n\n// [...]\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Festify/cordova-spotify-oauth",
+ "cordovaPlugin": {
+ "name": "cordova-spotify-oauth"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sqlite-db-copy",
+ "displayName": "Sqlite Db Copy",
+ "description": "\nThis plugin does something\n",
+ "usage": "\n```typescript\nimport { SqliteDbCopy } from '@ionic-native/sqlite-db-copy/ngx';\n\n\nconstructor(private sqliteDbCopy: SqliteDbCopy) { }\n\n...\n\n\nthis.sqliteDbCopy.copy('sample.db', 0)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/an-rahulpandey/cordova-plugin-dbcopy",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-dbcopy"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sqlite-porter",
+ "displayName": "SQLite Porter",
+ "description": "\nThis Cordova/Phonegap plugin can be used to import/export to/from a SQLite database using either SQL or JSON.\n",
+ "usage": "\n```typescript\nimport { SQLitePorter } from '@ionic-native/sqlite-porter/ngx';\n\n\nconstructor(private sqlitePorter: SQLitePorter) { }\n\n...\n\nlet db = window.openDatabase('Test', '1.0', 'TestDB', 1 * 1024);\n// or we can use SQLite plugin\n// we will assume that we injected SQLite into this component as sqlite\nthis.sqlite.create({\n name: 'data.db',\n location: 'default'\n})\n .then((db: any) => {\n let dbInstance = db._objectInstance;\n // we can pass db._objectInstance as the database option in all SQLitePorter methods\n });\n\n\nlet sql = 'CREATE TABLE Artist ([Id] PRIMARY KEY, [Title]);' +\n 'INSERT INTO Artist(Id,Title) VALUES (\"1\",\"Fred\");';\n\nthis.sqlitePorter.importSqlToDb(db, sql)\n .then(() => console.log('Imported'))\n .catch(e => console.error(e));\n\n\n```\n",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "BlackBerry 10",
+ "Browser",
+ "iOS",
+ "Tizen",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/dpa99c/cordova-sqlite-porter",
+ "cordovaPlugin": {
+ "name": "uk.co.workingedge.cordova.plugin.sqliteporter"
+ }
+ },
+ {
+ "packageName": "@ionic-native/sqlite",
+ "displayName": "SQLite\n",
+ "description": "\nAccess SQLite databases on the device.\n",
+ "usage": "\n\n```typescript\nimport { SQLite, SQLiteObject } from '@ionic-native/sqlite/ngx';\n\nconstructor(private sqlite: SQLite) { }\n\n...\n\nthis.sqlite.create({\n name: 'data.db',\n location: 'default'\n})\n .then((db: SQLiteObject) => {\n\n\n db.executeSql('create table danceMoves(name VARCHAR(32))', [])\n .then(() => console.log('Executed SQL'))\n .catch(e => console.log(e));\n\n\n })\n .catch(e => console.log(e));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "macOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/litehelpers/Cordova-sqlite-storage",
+ "cordovaPlugin": {
+ "name": "cordova-sqlite-storage"
+ }
+ },
+ {
+ "packageName": "@ionic-native/star-prnt",
+ "displayName": "StarPRNT",
+ "description": "\n* Ionic Native wrappers for the starprnt cordova plugin for Star Micronics Bluetooth/LAN printers\n",
+ "usage": "\n```typescript\nimport { StarPRNT } from '@ionic-native/star-prnt/ngx';\n\n\nconstructor(private starprnt: StarPRNT) { }\n\n...\n\n\nthis.starprnt.portDiscovery('all')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/auctifera-josed/starprnt",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-starprnt"
+ }
+ },
+ {
+ "packageName": "@ionic-native/status-bar",
+ "displayName": "Status Bar",
+ "description": "\nManage the appearance of the native status bar.\n\nRequires Cordova plugin: `cordova-plugin-statusbar`. For more info, please see the [StatusBar plugin docs](https://github.com/apache/cordova-plugin-statusbar).\n",
+ "usage": "\n```typescript\nimport { StatusBar } from '@ionic-native/status-bar/ngx';\n\nconstructor(private statusBar: StatusBar) { }\n\n...\n\n// let status bar overlay webview\nthis.statusBar.overlaysWebView(true);\n\n// set status bar to white\nthis.statusBar.backgroundColorByHexString('#ffffff');\n```\n\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-statusbar",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-statusbar"
+ }
+ },
+ {
+ "packageName": "@ionic-native/stepcounter",
+ "displayName": "Stepcounter",
+ "description": "\nCordova plugin for using device's stepcounter on Android (API > 19)\n\nUse to\n- start and stop stepcounter service\n- read device's stepcounter data\n",
+ "usage": "\n```typescript\nimport { Stepcounter } from '@ionic-native/stepcounter/ngx';\n\nconstructor(private stepcounter: Stepcounter) { }\n\n...\n\nlet startingOffset = 0;\nthis.stepcounter.start(startingOffset).then(onSuccess => console.log('stepcounter-start success', onSuccess), onFailure => console.log('stepcounter-start error', onFailure));\n\nthis.stepcounter.getHistory().then(historyObj => console.log('stepcounter-history success', historyObj), onFailure => console.log('stepcounter-history error', onFailure));\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/ihadeed/cordova-plugin-stepcounter",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-stepcounter"
+ }
+ },
+ {
+ "packageName": "@ionic-native/streaming-media",
+ "displayName": "Streaming Media",
+ "description": "\nThis plugin allows you to stream audio and video in a fullscreen, native player on iOS and Android.\n",
+ "usage": "\n```typescript\nimport { StreamingMedia, StreamingVideoOptions } from '@ionic-native/streaming-media/ngx';\n\nconstructor(private streamingMedia: StreamingMedia) { }\n\nlet options: StreamingVideoOptions = {\n successCallback: () => { console.log('Video played') },\n errorCallback: (e) => { console.log('Error streaming') },\n orientation: 'landscape',\n shouldAutoClose: true,\n controls: false\n};\n\nthis.streamingMedia.playVideo('https://path/to/video/stream', options);\n\n```",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/nchutchind/cordova-plugin-streaming-media",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-streaming-media"
+ }
+ },
+ {
+ "packageName": "@ionic-native/stripe",
+ "displayName": "Stripe",
+ "description": "\nA plugin that allows you to use Stripe's Native SDKs for Android and iOS.\n",
+ "usage": "\n```typescript\nimport { Stripe } from '@ionic-native/stripe/ngx';\n\nconstructor(private stripe: Stripe) { }\n\n...\n\nthis.stripe.setPublishableKey('my_publishable_key');\n\nlet card = {\n number: '4242424242424242',\n expMonth: 12,\n expYear: 2020,\n cvc: '220'\n}\n\nthis.stripe.createCardToken(card)\n .then(token => console.log(token.id))\n .catch(error => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "Browser",
+ "iOS"
+ ],
+ "repo": "https://github.com/zyramedia/cordova-plugin-stripe",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-stripe"
+ }
+ },
+ {
+ "packageName": "@ionic-native/taptic-engine",
+ "displayName": "Taptic Engine",
+ "description": "\nAn Ionic plugin to use Taptic Engine API on iPhone 7, 7 Plus or newer.\n",
+ "usage": "\n```typescript\nimport { TapticEngine } from '@ionic-native/taptic-engine/ngx';\n\n...\n\nconstructor(private taptic: TapticEngine) { }\n\n...\n\nthis.taptic.selection();\n\nthis.taptic.notification();\n\nthis.taptic.impact();\n\n```\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-taptic-engine",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-taptic-engine"
+ }
+ },
+ {
+ "packageName": "@ionic-native/tealium-adidentifier",
+ "displayName": "TealiumAdIdentifier",
+ "description": "\nThis module depends on the [Tealium Cordova Plugin](https://github.com/tealium/cordova-plugin). Without it, this module will not do anything.\nMakes the IDFA and Google Ad Identifier available in the Tealium data layer.\n",
+ "usage": "\n```\nimport { TealiumAdIdentifier } from '@ionic-native/tealium-adidentifier/ngx';\n\n\nconstructor(private adIdentifier: TealiumAdIdentifier) { }\n\n...\n\n\nthis.adIdentifier.setPersistent(\"main\");\nthis.adIdentifier.setVolatile(\"main\");\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Tealium/cordova-plugin",
+ "cordovaPlugin": {
+ "name": "tealium-cordova-adidentifier"
+ }
+ },
+ {
+ "packageName": "@ionic-native/tealium-installreferrer",
+ "displayName": "TealiumInstallReferrer",
+ "description": "\nThis module depends on the [Tealium Cordova Plugin](https://github.com/tealium/cordova-plugin). Without it, this module will not do anything.\nImplements a Broadcast Receiver for the INSTALL_REFERRER intent.\n",
+ "usage": "\n```\nimport { TealiumInstallReferrer } from '@ionic-native/tealium-installreferrer/ngx';\n\n\nconstructor(private installReferrer: TealiumInstallReferrer) { }\n\n\nthis.installReferrer.setPersistent(\"main\");\nthis.installReferrer.setVolatile(\"main\");\n\n\n\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/Tealium/cordova-plugin",
+ "cordovaPlugin": {
+ "name": "tealium-cordova-installreferrer"
+ }
+ },
+ {
+ "packageName": "@ionic-native/tealium",
+ "displayName": "Tealium",
+ "description": "\nThis plugin provides a TypeScript wrapper around the [Tealium](https://www.tealium.com) Cordova plugin for Ionic Native.\n\nFor full documentation, see [https://community.tealiumiq.com/t5/Mobile-Libraries/Tealium-for-Cordova/ta-p/17618](https://community.tealiumiq.com/t5/Mobile-Libraries/Tealium-for-Cordova/ta-p/17618)",
+ "usage": "\n```\nimport { Tealium, TealConfig } from '@ionic-native/tealium/ngx';\n\n\nconstructor(private tealium: Tealium) { }\n\n...\n\nlet tealConfig: TealConfig = {\n account: \"\",\n profile: \"\",\n environment: \"\", // usually \"dev\", \"qa\" or \"prod\"\n isLifecycleEnabled: \"true\", // pass \"false\" to disable lifecycle tracking\n isCrashReporterEnabled: \"false\", // pass \"true\" to enable crash reporter (Android only)\n instance: \"{\n this.tealium.trackView({\"screen_name\": \"homescreen\"});\n});\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/Tealium/cordova-plugin",
+ "cordovaPlugin": {
+ "name": "tealium-cordova-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/text-to-speech",
+ "displayName": "Text To Speech",
+ "description": "\nText to Speech plugin\n",
+ "usage": "\n```typescript\nimport { TextToSpeech } from '@ionic-native/text-to-speech/ngx';\n\nconstructor(private tts: TextToSpeech) { }\n\n...\n\nthis.tts.speak('Hello World')\n .then(() => console.log('Success'))\n .catch((reason: any) => console.log(reason));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/vilic/cordova-plugin-tts",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-tts"
+ }
+ },
+ {
+ "packageName": "@ionic-native/themeable-browser",
+ "displayName": "Themeable Browser",
+ "description": "\nIn-app browser that allows styling.\n",
+ "usage": "\n```typescript\nimport { ThemeableBrowser, ThemeableBrowserOptions, ThemeableBrowserObject } from '@ionic-native/themeable-browser/ngx';\n\nconstructor(private themeableBrowser: ThemeableBrowser) { }\n\n...\n\n// can add options from the original InAppBrowser in a JavaScript object form (not string)\n// This options object also takes additional parameters introduced by the ThemeableBrowser plugin\n// This example only shows the additional parameters for ThemeableBrowser\n// Note that that `image` and `imagePressed` values refer to resources that are stored in your app\nconst options: ThemeableBrowserOptions = {\n statusbar: {\n color: '#ffffffff'\n },\n toolbar: {\n height: 44,\n color: '#f0f0f0ff'\n },\n title: {\n color: '#003264ff',\n showPageTitle: true\n },\n backButton: {\n image: 'back',\n imagePressed: 'back_pressed',\n align: 'left',\n event: 'backPressed'\n },\n forwardButton: {\n image: 'forward',\n imagePressed: 'forward_pressed',\n align: 'left',\n event: 'forwardPressed'\n },\n closeButton: {\n image: 'close',\n imagePressed: 'close_pressed',\n align: 'left',\n event: 'closePressed'\n },\n customButtons: [\n {\n image: 'share',\n imagePressed: 'share_pressed',\n align: 'right',\n event: 'sharePressed'\n }\n ],\n menu: {\n image: 'menu',\n imagePressed: 'menu_pressed',\n title: 'Test',\n cancel: 'Cancel',\n align: 'right',\n items: [\n {\n event: 'helloPressed',\n label: 'Hello World!'\n },\n {\n event: 'testPressed',\n label: 'Test!'\n }\n ]\n },\n backButtonCanClose: true\n}\n\nconst browser: ThemeableBrowserObject = this.themeableBrowser.create('https://ionic.io', '_blank', options);\n\n```\nWe suggest that you refer to the plugin's repository for additional information on usage that may not be covered here.",
+ "platforms": [
+ "Amazon Fire OS",
+ "Android",
+ "Blackberry 10",
+ "Browser",
+ "FirefoxOS",
+ "iOS",
+ "Ubuntu",
+ "Windows",
+ "Windows Phone"
+ ],
+ "repo": "https://github.com/initialxy/cordova-plugin-themeablebrowser",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-themeablebrowser"
+ }
+ },
+ {
+ "packageName": "@ionic-native/three-dee-touch",
+ "displayName": "3D Touch",
+ "description": "\nThe 3D Touch plugin adds 3D Touch capabilities to your Cordova app.\n\nRequires Cordova plugin: `cordova-plugin-3dtouch`. For more info, please see the [3D Touch plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-3dtouch).\n",
+ "usage": "\nPlease do refer to the original plugin's repo for detailed usage. The usage example here might not be sufficient.\n```typescript\nimport { ThreeDeeTouch, ThreeDeeTouchQuickAction, ThreeDeeTouchForceTouch } from '@ionic-native/three-dee-touch/ngx';\n\nconstructor(private threeDeeTouch: ThreeDeeTouch) { }\n\n...\n\nthis.threeDeeTouch.isAvailable().then(isAvailable => console.log('3D Touch available? ' + isAvailable));\n\nthis.threeDeeTouch.watchForceTouches()\n .subscribe(\n (data: ThreeDeeTouchForceTouch) => {\n console.log('Force touch %' + data.force);\n console.log('Force touch timestamp: ' + data.timestamp);\n console.log('Force touch x: ' + data.x);\n console.log('Force touch y: ' + data.y);\n }\n );\n\n\nlet actions: ThreeDeeTouchQuickAction[] = [\n {\n type: 'checkin',\n title: 'Check in',\n subtitle: 'Quickly check in',\n iconType: 'Compose'\n },\n {\n type: 'share',\n title: 'Share',\n subtitle: 'Share like you care',\n iconType: 'Share'\n },\n {\n type: 'search',\n title: 'Search',\n iconType: 'Search'\n },\n {\n title: 'Show favorites',\n iconTemplate: 'HeartTemplate'\n }\n];\n\nthis.threeDeeTouch.configureQuickActions(actions);\n\nthis.threeDeeTouch.onHomeIconPressed().subscribe(\n (payload) => {\n // returns an object that is the button you presed\n console.log('Pressed the ${payload.title} button')\n console.log(payload.type)\n\n }\n)\n```",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-3dtouch",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-3dtouch"
+ }
+ },
+ {
+ "packageName": "@ionic-native/toast",
+ "displayName": "Toast",
+ "description": "\nThis plugin allows you to show a native Toast (a little text popup) on iOS, Android and WP8. It's great for showing a non intrusive native notification which is guaranteed always in the viewport of the browser.\n\nRequires Cordova plugin: `cordova-plugin-x-toast`. For more info, please see the [Toast plugin docs](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin).\n",
+ "usage": "\n```typescript\nimport { Toast } from '@ionic-native/toast/ngx';\n\nconstructor(private toast: Toast) { }\n\n...\n\nthis.toast.show(`I'm a toast`, '5000', 'center').subscribe(\n toast => {\n console.log(toast);\n }\n);\n```",
+ "platforms": [
+ "Android",
+ "BlackBerry 10",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-x-toast"
+ }
+ },
+ {
+ "packageName": "@ionic-native/touch-id",
+ "displayName": "Touch ID",
+ "description": "\nScan the fingerprint of a user with the TouchID sensor.\n\nRequires Cordova plugin: `cordova-plugin-touch-id`. For more info, please see the [TouchID plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-touch-id).\n",
+ "usage": "\n```typescript\nimport { TouchID } from '@ionic-native/touch-id/ngx';\n\nconstructor(private touchId: TouchID) { }\n\n...\n\nthis.touchId.isAvailable()\n .then(\n res => console.log('TouchID is available!'),\n err => console.error('TouchID is not available', err)\n );\n\nthis.touchId.verifyFingerprint('Scan your fingerprint please')\n .then(\n res => console.log('Ok', res),\n err => console.error('Error', err)\n );\n```\n\n### Error Codes\n\nThe plugin will reject for various reasons. Your app will most likely need to respond to the cases differently.\n\nHere is a list of some of the error codes:\n\n - `-1` - Fingerprint scan failed more than 3 times\n - `-2` or `-128` - User tapped the 'Cancel' button\n - `-3` - User tapped the 'Enter Passcode' or 'Enter Password' button\n - `-4` - The scan was cancelled by the system (Home button for example)\n - `-6` - TouchID is not Available\n - `-8` - TouchID is locked out from too many tries\n",
+ "platforms": [
+ "iOS"
+ ],
+ "repo": "https://github.com/EddyVerbruggen/cordova-plugin-touch-id",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-touch-id"
+ }
+ },
+ {
+ "packageName": "@ionic-native/twitter-connect",
+ "displayName": "Twitter Connect",
+ "description": "\nPlugin to use Twitter Single Sign On\nUses Twitter's Fabric SDK\n```typescript\nimport { TwitterConnect } from '@ionic-native/twitter-connect/ngx';\n\nconstructor(private twitter: TwitterConnect) { }\n\n...\n\nfunction onSuccess(response) {\n console.log(response);\n\n // Will console log something like:\n // {\n // userName: 'myuser',\n // userId: '12358102',\n // secret: 'tokenSecret'\n // token: 'accessTokenHere'\n // }\n}\n\nthis.twitter.login().then(onSuccess, onError);\n\nthis.twitter.logout().then(onLogoutSuccess, onLogoutError);\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/chroa/twitter-connect-plugin",
+ "cordovaPlugin": {
+ "name": "twitter-connect-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/uid",
+ "displayName": "Uid",
+ "description": "\nGet unique identifiers: UUID, IMEI, IMSI, ICCID and MAC.\n",
+ "usage": "\n```typescript\nimport { Uid } from '@ionic-native/uid/ngx';\nimport { AndroidPermissions } from '@ionic-native/android-permissions/ngx';\n\nconstructor(private uid: Uid, private androidPermissions: AndroidPermissions) { }\n\n\nasync getImei() {\n const { hasPermission } = await this.androidPermissions.checkPermission(\n this.androidPermissions.PERMISSION.READ_PHONE_STATE\n );\n\n if (!hasPermission) {\n const result = await this.androidPermissions.requestPermission(\n this.androidPermissions.PERMISSION.READ_PHONE_STATE\n );\n\n if (!result.hasPermission) {\n throw new Error('Permissions required');\n }\n\n // ok, a user gave us permission, we can get him identifiers after restart app\n return;\n }\n\n return this.uid.IMEI\n}\n```\n",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/lionelhe/cordova-plugin-uid",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-uid"
+ }
+ },
+ {
+ "packageName": "@ionic-native/unique-device-id",
+ "displayName": "Unique Device ID",
+ "description": "\nThis plugin produces a unique, cross-install, app-specific device id.\n",
+ "usage": "\n```typescript\nimport { UniqueDeviceID } from '@ionic-native/unique-device-id/ngx';\n\nconstructor(private uniqueDeviceID: UniqueDeviceID) { }\n\n...\n\nthis.uniqueDeviceID.get()\n .then((uuid: any) => console.log(uuid))\n .catch((error: any) => console.log(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/Paldom/UniqueDeviceID",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-uniquedeviceid"
+ }
+ },
+ {
+ "packageName": "@ionic-native/uptime",
+ "displayName": "Uptime",
+ "description": "\nThis plugin provides the time spent in milliseconds since boot (uptime).\n",
+ "usage": "\n```typescript\nimport { Uptime } from '@ionic-native/uptime/ngx';\n\nconstructor(private uptime: Uptime) { }\n\n...\n\nthis.uptime.getUptime(includeDeepSleep)\n .then(uptime => console.log(uptime))\n .catch(error => console.log(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/s1lviu/cordova-plugin-uptime",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-uptime"
+ }
+ },
+ {
+ "packageName": "@ionic-native/user-agent",
+ "displayName": "User Agent",
+ "description": "\nThe UserAgent plugin provides functions to set the HTTP user-agent header. For more info about User-Agents, please [see the HTTP User-Agent docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent).\n\nRequires Cordova plugin: `cordova-useragent`. For more info, please see the [User-Agent plugin docs](https://github.com/LouisT/cordova-useragent).\n",
+ "usage": "\n```typescript\nimport { UserAgent } from '@ionic-native/user-agent/ngx';\n\n\nconstructor(private userAgent: UserAgent) { }\n\n...\n\n\nthis.userAgent.set('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36')\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n* this.userAgent.get()\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n* this.userAgent.reset()\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/danielsogl/cordova-plugin-useragent",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-useragent"
+ }
+ },
+ {
+ "packageName": "@ionic-native/vibration",
+ "displayName": "Vibration",
+ "description": "Vibrates the device",
+ "usage": "\n```typescript\nimport { Vibration } from '@ionic-native/vibration/ngx';\n\nconstructor(private vibration: Vibration) { }\n\n...\n\n// Vibrate the device for a second\n// Duration is ignored on iOS.\nthis.vibration.vibrate(1000);\n\n// Vibrate 2 seconds\n// Pause for 1 second\n// Vibrate for 2 seconds\n// Patterns work on Android and Windows only\nthis.vibration.vibrate([2000,1000,2000]);\n\n// Stop any current vibrations immediately\n// Works on Android and Windows only\nthis.vibration.vibrate(0);\n```\n",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows"
+ ],
+ "repo": "https://github.com/apache/cordova-plugin-vibration",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-vibration"
+ }
+ },
+ {
+ "packageName": "@ionic-native/video-capture-plus",
+ "displayName": "Video Capture Plus",
+ "description": "\nThis plugin offers some useful extras on top of the default Media Capture Plugin capabilities:\n- HD recording.\n- Starting with the front camera.\n- A custom overlay (currently iOS only).\n",
+ "usage": "\n```typescript\nimport { VideoCapturePlus, VideoCapturePlusOptions, MediaFile } from '@ionic-native/video-capture-plus/ngx';\n\n\nconstructor(private videoCapturePlus: VideoCapturePlus) { }\n\n...\n\nconst options: VideoCapturePlusOptions = {\n limit: 1,\n highquality: true,\n portraitOverlay: 'assets/img/camera/overlay/portrait.png',\n landscapeOverlay: 'assets/img/camera/overlay/landscape.png'\n}\n\nthis.videoCapturePlus.captureVideo(options).then(mediafile: MediaFile[] => console.log(mediafile), error => console.log('Something went wrong'));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/danielsogl/cordova-plugin-video-capture-plus",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-video-capture-plus"
+ }
+ },
+ {
+ "packageName": "@ionic-native/video-editor",
+ "displayName": "Video Editor",
+ "description": "Edit videos using native device APIs\n",
+ "usage": "\n```typescript\nimport { VideoEditor } from '@ionic-native/video-editor/ngx';\n\nconstructor(private videoEditor: VideoEditor) { }\n\n...\n\nthis.videoEditor.transcodeVideo({\n fileUri: '/path/to/input.mov',\n outputFileName: 'output.mp4',\n outputFileType: VideoEditor.OutputFileType.MPEG4\n})\n.then((fileUri: string) => console.log('video transcode success', fileUri))\n.catch((error: any) => console.log('video transcode error', error));\n\n```",
+ "platforms": [
+ "Android",
+ "iOS",
+ "Windows",
+ "Windows Phone 8"
+ ],
+ "repo": "https://github.com/jbavari/cordova-plugin-video-editor",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-video-editor"
+ }
+ },
+ {
+ "packageName": "@ionic-native/video-player",
+ "displayName": "Video Player",
+ "description": "\nA Cordova plugin that simply allows you to immediately play a video in fullscreen mode.\n\nRequires Cordova plugin: `com.moust.cordova.videoplayer`. For more info, please see the [VideoPlayer plugin docs](https://github.com/moust/cordova-plugin-videoplayer).\n",
+ "usage": "\n```typescript\nimport { VideoPlayer } from '@ionic-native/video-player/ngx';\n\nconstructor(private videoPlayer: VideoPlayer) { }\n\n...\n\n// Playing a video.\nthis.videoPlayer.play('file:///android_asset/www/movie.mp4').then(() => {\n console.log('video completed');\n}).catch(err => {\n console.log(err);\n});\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/moust/cordova-plugin-videoplayer",
+ "cordovaPlugin": {
+ "name": "https://github.com/moust/cordova-plugin-videoplayer.git"
+ }
+ },
+ {
+ "packageName": "@ionic-native/web-intent",
+ "displayName": "Web Intent",
+ "description": "\nThis Plugin provides a general purpose shim layer for the Android intent mechanism, exposing various ways to handle sending and receiving intents.",
+ "usage": "\nFor usage information please refer to the plugin's Github repo.\n\n```typescript\nimport { WebIntent } from '@ionic-native/web-intent/ngx';\n\nconstructor(private webIntent: WebIntent) { }\n\n...\n\nconst options = {\n action: this.webIntent.ACTION_VIEW,\n url: 'path/to/file',\n type: 'application/vnd.android.package-archive'\n}\n\nthis.webIntent.startActivity(options).then(onSuccess, onError);\n\n```",
+ "platforms": [
+ "Android"
+ ],
+ "repo": "https://github.com/darryncampbell/darryncampbell-cordova-plugin-intent",
+ "cordovaPlugin": {
+ "name": "com-darryncampbell-cordova-plugin-intent"
+ }
+ },
+ {
+ "packageName": "@ionic-native/web-server",
+ "displayName": "Web Server",
+ "description": "\nThis plugin allows you to start a local dynamic content web server for android and iOS devices.\n",
+ "usage": "\n```typescript\nimport { WebServer } from '@ionic-native/web-server/ngx';\n\n\nconstructor(private webServer: WebServer) { }\n\n...\n\nthis.webServer.onRequest().subscribe(data => {\n console.log(data);\n const res: Response = {\n status: 200,\n body: '',\n headers: {\n 'Content-Type': 'text/html'\n }\n };\n\n this.webServer.sendResponse(data.requestId, res)\n .catch((error: any) => console.error(error));\n});\n\nthis.webServer.start(80)\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/bykof/cordova-plugin-webserver.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-webserver"
+ }
+ },
+ {
+ "packageName": "@ionic-native/webengage",
+ "displayName": "Webengage",
+ "description": "\nIonic-Native wrapper that wraps Webengage Cordova plugin for Android and iOS\n",
+ "usage": "\n```typescript\nimport { Webengage, WebengageUser, WebengagePush, WebengageNotification } from '@ionic-native/webengage/ngx';\n\n\nconstructor(private webengage: Webengage, private webengageUser: WebengageUser, private webengagePush: WebengagePush, private webengageNotification: WebengageNotification ) { }\n\n...\n\nthis.webengage.engage();\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/WebEngage/cordova-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-webengage"
+ }
+ },
+ {
+ "packageName": "@ionic-native/wechat",
+ "displayName": "Wechat",
+ "description": "\nA cordova plugin, a JS version of Wechat SDK\n",
+ "usage": "\n```typescript\nimport { Wechat } from '@ionic-native/wechat/ngx';\n\n\nconstructor(private wechat: Wechat) { }\n\n...\n\n\nthis.wechat.functionName('Hello', 123)\n .then((res: any) => console.log(res))\n .catch((error: any) => console.error(error));\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/xu-li/cordova-plugin-wechat.git",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-wechat"
+ }
+ },
+ {
+ "packageName": "@ionic-native/wheel-selector",
+ "displayName": "WheelSelector Plugin",
+ "description": "Native wheel selector for Cordova (Android/iOS).\n",
+ "usage": "\n```\nimport { WheelSelector } from '@ionic-native/wheel-selector/ngx';\n\n\nconstructor(private selector: WheelSelector) { }\n\n...\n\nconst jsonData = {\n numbers: [\n { description: \"1\" },\n { description: \"2\" },\n { description: \"3\" }\n ],\n fruits: [\n { description: \"Apple\" },\n { description: \"Banana\" },\n { description: \"Tangerine\" }\n ],\n firstNames: [\n { name: \"Fred\", id: '1' },\n { name: \"Jane\", id: '2' },\n { name: \"Bob\", id: '3' },\n { name: \"Earl\", id: '4' },\n { name: \"Eunice\", id: '5' }\n ],\n lastNames: [\n { name: \"Johnson\", id: '100' },\n { name: \"Doe\", id: '101' },\n { name: \"Kinishiwa\", id: '102' },\n { name: \"Gordon\", id: '103' },\n { name: \"Smith\", id: '104' }\n ]\n}\n\n...\n\n// basic number selection, index is always returned in the result\n selectANumber() {\n this.selector.show({\n title: \"How Many?\",\n items: [\n this.jsonData.numbers\n ],\n }).then(\n result => {\n console.log(result[0].description + ' at index: ' + result[0].index);\n },\n err => console.log('Error: ', err)\n );\n }\n\n ...\n\n // basic selection, setting initial displayed default values: '3' 'Banana'\n selectFruit() {\n this.selector.show({\n title: \"How Much?\",\n items: [\n this.jsonData.numbers, this.jsonData.fruits\n ],\n positiveButtonText: \"Ok\",\n negativeButtonText: \"Nope\",\n defaultItems: [\n \t {index:0, value: this.jsonData.numbers[2].description},\n \t {index: 1, value: this.jsonData.fruits[3].description}\n \t]\n }).then(\n result => {\n console.log(result[0].description + ' ' + result[1].description);\n },\n err => console.log('Error: ' + JSON.stringify(err))\n );\n }\n\n ...\n\n // more complex as overrides which key to display\n // then retrieve properties from original data\n selectNamesUsingDisplayKey() {\n this.selector.show({\n title: \"Who?\",\n items: [\n this.jsonData.firstNames, this.jsonData.lastNames\n ],\n displayKey: 'name',\n defaultItems: [\n \t {index:0, value: this.jsonData.firstNames[2].name},\n {index: 0, value: this.jsonData.lastNames[3].name}\n ]\n }).then(\n result => {\n console.log(result[0].name + ' (id= ' + this.jsonData.firstNames[result[0].index].id + '), ' +\n result[1].name + ' (id=' + this.jsonData.lastNames[result[1].index].id + ')');\n },\n err => console.log('Error: ' + JSON.stringify(err))\n );\n }\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/jasonmamy/cordova-wheel-selector-plugin",
+ "cordovaPlugin": {
+ "name": "cordova-wheel-selector-plugin"
+ }
+ },
+ {
+ "packageName": "@ionic-native/youtube-video-player",
+ "displayName": "Youtube Video Player",
+ "description": "\nPlays YouTube videos in Native YouTube App\n",
+ "usage": "\nFor Android 5.0+ you will need to add the following to config.xml\n```xml\n\n```\nFor more information: https://developers.google.com/youtube/v3/getting-started\n\n\n```typescript\nimport { YoutubeVideoPlayer } from '@ionic-native/youtube-video-player/ngx';\n\nconstructor(private youtube: YoutubeVideoPlayer) { }\n\n...\n\n\nthis.youtube.openVideo('myvideoid');\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/ihadeed/CordovaYoutubeVideoPlayer",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-youtube-video-player"
+ }
+ },
+ {
+ "packageName": "@ionic-native/zbar",
+ "displayName": "ZBar",
+ "description": "\nThe ZBar Scanner Plugin allows you to scan 2d barcodes.\n\nRequires Cordova plugin: `cordova-plugin-cszbar`. For more info, please see the [zBar plugin docs](https://github.com/tjwoon/csZBar).\n",
+ "usage": "\n```typescript\nimport { ZBar, ZBarOptions } from '@ionic-native/zbar/ngx';\n\nconstructor(private zbar: ZBar) { }\n\n...\n\nlet options: ZBarOptions = {\n flash: 'off',\n drawSight: false\n }\n\nthis.zbar.scan(options)\n .then(result => {\n console.log(result); // Scanned code\n })\n .catch(error => {\n console.log(error); // Error message\n });\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/tjwoon/csZBar",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-cszbar"
+ }
+ },
+ {
+ "packageName": "@ionic-native/zeroconf",
+ "displayName": "Zeroconf",
+ "description": "\nThis plugin allows you to browse and publish Zeroconf/Bonjour/mDNS services.",
+ "usage": "\n```typescript\nimport { Zeroconf } from '@ionic-native/zeroconf/ngx';\n\nconstructor(private zeroconf: Zeroconf) { }\n\n...\n\n// watch for services of a specified type\nthis.zeroconf.watch('_http._tcp.', 'local.').subscribe(result => {\n if (result.action == 'added') {\n console.log('service added', result.service);\n } else {\n console.log('service removed', result.service);\n }\n});\n\n// publish a zeroconf service of your own\nthis.zeroconf.register('_http._tcp.', 'local.', 'Becvert\\'s iPad', 80, {\n 'foo': 'bar'\n}).then(result => {\n console.log('Service registered', result.service);\n});\n\n\n// unregister your service\nthis.zeroconf.unregister('_http._tcp.', 'local.', 'Becvert\\'s iPad');\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/becvert/cordova-plugin-zeroconf",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-zeroconf"
+ }
+ },
+ {
+ "packageName": "@ionic-native/zip",
+ "displayName": "Zip",
+ "description": "\nA Cordova plugin to unzip files in Android and iOS.\n",
+ "usage": "\n```typescript\nimport { Zip } from '@ionic-native/zip/ngx';\n\nconstructor(private zip: Zip) { }\n\n...\n\nthis.zip.unzip('path/to/source.zip', 'path/to/dest', (progress) => console.log('Unzipping, ' + Math.round((progress.loaded / progress.total) * 100) + '%'))\n .then((result) => {\n if(result === 0) console.log('SUCCESS');\n if(result === -1) console.log('FAILED');\n });\n\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/MobileChromeApps/cordova-plugin-zip",
+ "cordovaPlugin": {
+ "name": "cordova-plugin-zip"
+ }
+ },
+ {
+ "packageName": "@ionic-native/zoom",
+ "displayName": "Zoom",
+ "description": "\nA Cordova plugin to use Zoom Video Conferencing services on Cordova applications.\n",
+ "usage": "\n```typescript\nimport { Zoom } from '@ionic-native/zoom';\n\n\nconstructor(private zoomService: Zoom) { }\n\n...\n\n// Initialize Zoom SDK, need to be called when app fired up.\nthis.zoomService.initialize(API_KEY, API_SECRET)\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Log user in with Zoom username and password.\nthis.zoomService.login(userName, password)\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Log user out.\nthis.zoomService.logout()\n .then((success: boolean) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Check whether user is logged in.\nthis.zoomService.isLoggedIn()\n .then((success: boolean) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// meeting options (Only available for Android)\nlet options = {\n\"no_driving_mode\":true,\n\"no_invite\":true,\n\"no_meeting_end_message\":true,\n\"no_titlebar\":false,\n\"no_bottom_toolbar\":false,\n\"no_dial_in_via_phone\":true,\n\"no_dial_out_to_phone\":true,\n\"no_disconnect_audio\":true,\n\"no_share\":true,\n\"no_audio\":true,\n\"no_video\":true,\n\"no_meeting_error_message\":true\n};\n\n// Join meeting.\nthis.zoomService.joinMeeting(meetingNumber, meetingPassword, displayName, options)\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Start an existing meeting for non-login user.\nthis.zoomService.startMeetingWithZAK(meetingNumber, displayName, zoomToken, zoomAccessToken, userId, options)\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Start an existing meeting for logged in user.\nthis.zoomService.startMeeting(meetingNumber, vanityId, options)\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Start an instant meeting for logged in user.\nthis.zoomService.startInstantMeeting()\n .then((success: anu) => console.log(success))\n .catch((error: any) => console.log(error));\n\n// Set language.\nthis.zoomService.setLanguage(\"en-US\")\n .then((success: any) => console.log(success))\n .catch((error: any) => console.log(error));\n```\n",
+ "platforms": [
+ "Android",
+ "iOS"
+ ],
+ "repo": "https://github.com/zoom/zoom-sdk-ionic",
+ "cordovaPlugin": {
+ "name": "cordova.plugin.zoom"
+ }
+ }
+]
diff --git a/src/pages/da/api.md b/src/pages/da/api.md
new file mode 100644
index 0000000000..09a4c674c9
--- /dev/null
+++ b/src/pages/da/api.md
@@ -0,0 +1,7 @@
+---
+template: api-index
+---
+
+# API Index
+
+Each Ionic [component](/docs/components) consists of one or more [custom elements](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements). Each custom element, in turn, may expose properties, methods, events, and CSS custom properties.
\ No newline at end of file
diff --git a/src/pages/da/appflow.md b/src/pages/da/appflow.md
new file mode 100644
index 0000000000..43b0b03599
--- /dev/null
+++ b/src/pages/da/appflow.md
@@ -0,0 +1,37 @@
+---
+title: Welcome to Appflow
+---
+
+Appflow is a continuous integration (CI) and continuous deployment (CD) platform for Ionic development teams. Appflow helps development teams continuously build and ship their iOS, Android, and web apps faster than ever.
+
+
+
+Get your app set up with multiple environments that automatically build new binaries for iOS and Android and provide real time updates for your users instantly every time your team commits new code.
+
+
+
+Provide live updates and hotfixes to user devices instantly without going through the app stores.
+
+
+
+Build native iOS and Android binaries in the cloud without the headache of maintaining your own build servers.
+
+
+
+Automate your Deploy and Package builds to help you team ship better updates faster.
+
+
+
+Learn about recent Appflow updates & announcements.
+
+
+
+Find answers to common questions about building native binaries.
+
+
+
+Find answers to common questions about live updates.
+
+
+
+Find answers to common billing questions.
\ No newline at end of file
diff --git a/src/pages/da/appflow/automation/create.md b/src/pages/da/appflow/automation/create.md
new file mode 100644
index 0000000000..581295934d
--- /dev/null
+++ b/src/pages/da/appflow/automation/create.md
@@ -0,0 +1,69 @@
+---
+previousText: 'Introduction'
+previousUrl: '/docs/appflow/automation/intro'
+nextText: 'Environments'
+nextUrl: '/docs/appflow/automation/environments'
+---
+
+# Using Automations
+
+## Managing Automations
+
+Creating and customizing automations is simple. To get started, navigate to the `Automate` tab within the desired app.
+
+To **create a new automation**, click the `New Automation` button on the top right of the `Automate` dashboard. When clicked, the automation customization form will appear, which has several fields available to customize the automation (Read more about these [below](#customizing-automations)).
+
+To **edit an automation**, click the three dots next to the one you'd like to modify.
+
+## Customizing Automations
+
+There are a number of customizations available to specify the specific behavior of a given automation. They are shown on the create/edit automation form below.
+
+### Basic Automation Info
+
+All automations need a name and git branch to trigger from. Whenever code is pushed to the selected branch, the automation will run.
+
+
+
+#### Fields
+
+* **Name:** A name to identify the automation task.
+* **Git Branch:** The branch which will trigger the automation. This will run a build any time a `git push` is made to the specified branch.
+* **Automation Type:** The type of job this automation will run.
+
+In addition to name and git branches, automations have a number of customizations available depending on the type of job selected.
+
+##### Note about Git Branch naming
+
+It is possible to specify one or multiple `*` wildcards character to match multiple branches within a single automation; for instance:
+
+* a branch simply set to `*` will match all the branches and will trigger the automation for any single git push
+* a branch set to `dev*` will match any branch with a name starting with `dev` including `dev` itself
+* a branch set to `dev*other` will match any branch with a name starting with `dev` and ending with `other` including `devother`
+
+### Package Automations
+
+Package automations create native builds which can be downloaded and run on devices. They have the following customizations:
+
+
+
+#### Fields
+
+* **Environment:** The [custom build environment](/docs/appflow/environments/#custom-environments) (if any) to use when this automations is triggered.
+* **Native Config:** The [native config](/docs/appflow/package/intro#native-configs) (if any) to use when this automations is triggered.
+* **Target Platform:** The platform being targeted, can be Android or iOS (for either Xcode 8 or 9)
+* **Build Type:** The type of build to create. Options depend on the selected platform.
+* **Security Profile:** Which security profile to use. Learn more about them [here](/docs/appflow/package/credentials).
+* **Webhook:** (optional) If specified, a POST with information about completed builds will be sent to the entered URL. Learn more about their content [here](/docs/appflow/automation/webhooks).
+
+### Web Automations
+
+Web automations build the javascript portion of an application and interface with the [Deploy](/docs/appflow/deploy/intro) service to enable live app updates.
+
+
+
+#### Fields
+
+* **Environment:** The [custom build environment](/docs/appflow/environments/#custom-environments) (if any) to use when this automations is triggered.
+* **Channel:** The [Deploy Channel](/docs/appflow/deploy/channels) where web builds from this automation will be assigned.
+* **Webhook:** (optional) If specified, a POST with information about completed builds will be sent to the entered URL. Learn more about their content [here](/docs/appflow/automation/webhooks).
\ No newline at end of file
diff --git a/src/pages/da/appflow/automation/environments.md b/src/pages/da/appflow/automation/environments.md
new file mode 100644
index 0000000000..ba00fba041
--- /dev/null
+++ b/src/pages/da/appflow/automation/environments.md
@@ -0,0 +1,108 @@
+---
+previousText: 'Create Automations'
+previousUrl: '/docs/appflow/automation/create'
+nextText: 'Webhooks'
+nextUrl: '/docs/appflow/automation/webhooks'
+---
+
+# Build Environments
+
+## Introduction
+
+Environments give you a way to customize the build process for your application in order to produce different versions of your applications for different environments from the same code base. All environment variables are accessible to any build scripts that run during the `npm run install` and `npm run build` portion of your builds.
+
+There are two types of Enviornment variables available to use:
+
+* [Predefined Environments](#predefined-environments) (Available on all Builds)
+* [Custom Environments](#custom-environments) (Available on select plans)
+
+## Predefined Environments
+
+Every time a Build occurs, it's done in a secure environment where we provide some predefined variables which are key/value pairs that are made available in the environment and are available by using [process.env.MY_VAR](https://nodejs.org/docs/latest-v8.x/api/process.html#process_process_env) syntax in NodeJS or via `$MY_VAR` syntax in a standard shell script. These variables can be leveraged to [customize the build and outputs](#usage).
+
+The following environment variables are provided in every build, which can be accessed in build scripts:
+
+* `CI_APP_ID` **(string):** Your Ionic app's unique ID.
+* `CI_APP_NAME` **(string):** Your Ionic app's name.
+* `CI_AUTOMATED_BUILD` **(int):** Whether this build occurred as a result of an automation (`0` for `false`, `1` for `true`).
+* `CI_AUTOMATION_ID` **(optional int):** The unique ID of the automation which created this build.
+* `CI_AUTOMATION_NAME` **(optional string):** The name of the automation which created this build.
+* `CI_GIT_COMMIT_SHA` **(string):** The SHA for the commit on which the build was run.
+* `CI_GIT_COMMIT_MSG` **(string):** The message for the commit on which the build was run.
+* `CI_GIT_REF` **(string):** The git ref from which the build was created (i.e. `master`).
+* `CI_GIT_REF_TYPE` **(string):** The git ref type (i.e. `branch`).
+
+## Custom Environments
+
+
+
Note:This feature is only available on our Growth plans and above.
+
+
+In addition to the [predefined environments](#predefined-environments), customers on the [plans with access to automations](/pricing) will have access to create custom environments. With custom environments it's easy to create and manage custom sets of key/value pairs to further customize builds on Ionic Appflow. Common use cases include customizing your build process in order to build staging & QA versions of your app that connect to different APIs or to build different white labeled versions of your application. To get started with custom environments, open the app you wish to work on and navigate in the sidebar to **Automate -> Environments**, then click **New Environment** on the top right. You should see a form like this:
+
+
+
+As can be noticed, there are 2 different sets of environment variables sections that can be utilized:
+
+* Secrets
+* Variables
+
+The only difference is that the secrets are hidden and never shown in the dashboard after they have been added, while the variables are always available to be read.
+
+The environments dashboard also lists available custom environments along with their configured key/value pairs and secrets keys.
+
+
+
+## Usage
+
+For example you could replace your `build` script in the `package.json` with a custom shell script that reads the branch and triggers a custom build.
+
+```json
+// customize the build script in the package.json
+{
+...
+ "scripts": {
+ "start": "ionic-app-scripts serve",
+ "clean": "ionic-app-scripts clean",
+ "build": "./mybuild.sh",
+ "lint": "ionic-app-scripts lint"
+ },
+...
+```
+
+ #!/bin/bash
+ if [ "$CI_GIT_REF" = "master" ]; then
+ npx ionic build --prod
+ else
+ npx ionic build
+ fi
+
+
+As of `@ionic/app-scripts@3.2.0` you can also use [environment variables directly in your source code](https://github.com/ionic-team/ionic-app-scripts#environments) and they will be replaced at build time so that you can customize your code based on the environment.
+
+For example:
+
+```typescript
+productionConfig = {
+ api: 'https://my.production.api.com',
+ analyticsKey: 'my-production-key'
+}
+stagingConfig = {
+ api: 'https://my.staging.api.com',
+ analyticsKey: 'my-staging-key'
+}
+
+localConfig = {
+ api: 'https://localhost:7000'
+ analyticsKey: 'my-local-key'
+}
+
+switch (process.env.CI_GIT_REF) {
+ case 'master':
+ return productionConfig;
+ case 'staging':
+ return stagingConfig;
+ default:
+ return localConfig;
+}
+```
\ No newline at end of file
diff --git a/src/pages/da/appflow/automation/intro.md b/src/pages/da/appflow/automation/intro.md
new file mode 100644
index 0000000000..967b727acb
--- /dev/null
+++ b/src/pages/da/appflow/automation/intro.md
@@ -0,0 +1,21 @@
+---
+title: 'Automations'
+previousText: 'Package'
+previousUrl: '/docs/appflow/package/cli'
+nextText: 'Create Automations'
+nextUrl: '/docs/appflow/automation/create'
+---
+
+
+
Note:This feature is only available on our Growth plans and above.
+
+
+Ionic Appflow's automation features let you generate builds whenever you need them. Webhooks with secure, signed download URL's and build information are also easily configurable and updatable, ensuring your app gets in the necessary hands quickly and automatically.
+
+Automations enable you and your team to utilize the full CI/CD powers of Appflow. You can create automations that trigger [package builds](/docs/appflow/package/builds) and [deploy builds](/docs/appflow/deploy/builds) every time your team checks in new code to a given branch and you can even configure the automations to use different [environments](/docs/appflow/automation/environments#custom-environments) and [native configurations](/docs/appflow/package/native-configs) so that you can build different versions of your app for development, staging, and production.
+
+##### Helpful links
+
+
+
+Create your first Android development binary automation using our quickstart guide!
\ No newline at end of file
diff --git a/src/pages/da/appflow/automation/webhooks.md b/src/pages/da/appflow/automation/webhooks.md
new file mode 100644
index 0000000000..9702a038b0
--- /dev/null
+++ b/src/pages/da/appflow/automation/webhooks.md
@@ -0,0 +1,200 @@
+---
+previousText: 'Environments'
+previousUrl: '/docs/appflow/automation/environments'
+nextText: 'Cookbook'
+nextUrl: '/docs/appflow/cookbook/intro'
+---
+
+# Understanding Webhooks
+
+When a webhook URL is specified for an automation, a POST is made every time a build completes. Information is included about the build, as well as the user who triggered it and the commit that it was built from.
+
+## Webhook Body
+
+Below are example webhook json payloads:
+
+### Package Automation Webhook
+
+```json
+{
+ "state": "success",
+ "automationId": 777,
+ "automation": {
+ "id": 777,
+ "buidType": "debug",
+ "environmentName": "staging",
+ "nativeConfigName": "staging",
+ "created": "2018-08-24T14:49:01.462549+00:00",
+ "creatorId": 10000023,
+ "name": "my-awesome-automation",
+ "creator": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "username": "ionic"
+ },
+ "platform": "android",
+ "profile": "debug"
+ },
+ "environmentName": "staging",
+ "id": "2216322b-35be-4af2-aaad-2b4e57354f88",
+ "type": "debug",
+ "created": "2018-08-24T14:49:01.462549+00:00",
+ "started": "2018-08-24T14:49:08.556804+00:00",
+ "finished": "2018-08-24T14:56:45.986317+00:00",
+ "downloadUrl": "https://www.ionicjs.com/one-awesome-app",
+ "profile": "debug",
+ "buildInfo": {
+ "id": 777,
+ "state": "success",
+ "job_type": "package-android"
+ },
+ "appId": "abcd1234",
+ "platform": "android",
+ "app": {
+ "slug": "awesomeapp",
+ "org": null,
+ "name": "Awesome App",
+ "owner": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "username": "ionic"
+ },
+ "id": "abcd1234",
+ "updated": "2018-03-22T02:12:21.183081+00:00",
+ "created": "2018-03-13T14:20:46.628090+00:00",
+ "icon": "https://www.ionicjs.com/picture"
+ },
+ "commit": {
+ "user": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "htmlUrl": "https://github.com/ionitron",
+ "profile": "https://github.com/ionitron",
+ "username": "ionitron"
+ },
+ "sha": "e900ae1863482df4f9c24ee759d15a9250de77a7",
+ "note": "github 🦊",
+ "beforeSha": "5161d6d939409f94d33c8cc549c4c89a861d0042",
+ "uuid": "74797ffe-8ee2-4ab7-9e1a-3a1e5969f7bb",
+ "userId": 1000000,
+ "refType": "branch",
+ "ref": "different-branch",
+ "appId": "abcd1234",
+ "repositoryId": 777,
+ "created": "2018-08-24T02:51:20.477835+00:00"
+ }
+}
+```
+
+### Web Automation Webhook
+
+```json
+{
+ "started": "2018-08-24T14:49:08.556804+00:00",
+ "state": "success",
+ "automationId": 777,
+ "automation": {
+ "id": 777,
+ "created": "2018-08-24T14:49:01.462549+00:00",
+ "creatorId": 10000023,
+ "environmentName": "staging",
+ "name": "my-awesome-automation",
+ "channel": {
+ "name": "threeve",
+ "updated": "2018-02-13T20:35:46.486541Z+00:00",
+ "id": "24464de6-6684-46f4-831b-f66c379db096",
+ "created": "2018-02-09T21:38:19.086808Z+00:00"
+ },
+ "creator": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "username": "ionic"
+ }
+ },
+ "environmentName": "staging",
+ "id": "2216322b-35be-4af2-aaad-2b4e57354f88",
+ "created": "2018-08-24T14:49:01.462549+00:00",
+ "finished": "2018-08-24T14:56:45.986317+00:00",
+ "buildInfo": {
+ "id": 101,
+ "state": "success",
+ "job_type": "snapshot"
+ },
+ "appId": "abcd1234",
+ "app": {
+ "slug": "awesomeapp",
+ "org": null,
+ "name": "Awesome App",
+ "owner": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "username": "ionic"
+ },
+ "id": "abcd1234",
+ "updated": "2018-03-22T02:12:21.183081+00:00",
+ "created": "2018-03-13T14:20:46.628090+00:00",
+ "icon": "https://www.ionicjs.com/picture"
+ },
+ "commit": {
+ "user": {
+ "name": "Ionitron",
+ "picture": "https://www.ionicjs.com/picture",
+ "avatars": {
+ "small": "https://www.ionicjs.com/picture-sm",
+ "medium": "https://www.ionicjs.com/picture-md",
+ "large": "https://www.ionicjs.com/picture-lg"
+ },
+ "htmlUrl": "https://github.com/ionitron",
+ "profile": "https://github.com/ionitron",
+ "username": "ionitron"
+ },
+ "sha": "e900ae1863482df4f9c24ee759d15a9250de77a7",
+ "note": "github 🦊",
+ "beforeSha": "5161d6d939409f94d33c8cc549c4c89a861d0042",
+ "uuid": "74797ffe-8ee2-4ab7-9e1a-3a1e5969f7bb",
+ "userId": 1000000,
+ "refType": "branch",
+ "ref": "different-branch",
+ "appId": "abcd1234",
+ "repositoryId": 777,
+ "created": "2018-08-24T02:51:20.477835+00:00"
+ }
+}
+```
+
+## Responding to Webhooks
+
+The server will automatically attempt a retry if the webhook request does not receive a status code of **200**.
+
+## Retries
+
+The server will retry the hook up to 5 times with an increasing delay between attempts (up to a delay of one hour) in the case where it does not receive a 200 response code.
+
+## Signed Download URLs (Package Automations Only)
+
+The `downloadUrl` field in the webhook allows only this specific build to be downloaded, and will be signed with a token that is valid for 24 hours. There is no limit on the number of downloads, but after the time limit the endpoint will no longer function.
\ No newline at end of file
diff --git a/src/pages/da/appflow/concurrency-limits.md b/src/pages/da/appflow/concurrency-limits.md
new file mode 100644
index 0000000000..72ab8ff4d8
--- /dev/null
+++ b/src/pages/da/appflow/concurrency-limits.md
@@ -0,0 +1,16 @@
+# Concurrency limits
+
+Each account plan has a defined maximum amount of concurrent builds allowed (see [Plans Details](/pricing)). This limit is enforced at the account level across different apps.
+
+When you trigger a build, in the Appflow Dashboard you will notice that a build can have different statuses before it is processed:
+
+* **Queued**: this means that your build is queued for the next available runner. Usually your build should not be in this state for more than few seconds.
+* **Pending**: this means that you have reached your concurrent build limit and your build will continue when your current builds are completed.
+
+After the build starts to be processed the statuses are:
+
+* **Running**: the build is currently being processed. You can read the logs in the build details.
+* **Successful**: the build terminated in a correct state.
+* **Failed**: the build terminated in an incorrect state.
+
+More concurrent builds can be added to your plan. If you have a Starter or Developer plan, you can get more builds by [upgrading plan](https://dashboard.ionicframework.com/settings/billing). If you have a Teams or Business plan, please [contact us](https://ionic.zendesk.com/hc/en-us/requests/new).
\ No newline at end of file
diff --git a/src/pages/da/appflow/cookbook/intro.md b/src/pages/da/appflow/cookbook/intro.md
new file mode 100644
index 0000000000..74d4e1aeaf
--- /dev/null
+++ b/src/pages/da/appflow/cookbook/intro.md
@@ -0,0 +1,17 @@
+---
+title: 'Cookbook'
+previousText: 'Webhooks'
+previousUrl: '/docs/appflow/automation/webhooks'
+nextText: 'Using Private Git Repos'
+nextUrl: '/docs/appflow/cookbook/private_git'
+---
+
+# Cookbook
+
+### [Using Private Git Repos](/docs/appflow/cookbook/private_git)
+
+Learn how to access private Git repos used in npm dependencies.
+
+### [Using Private NPM Modules](/docs/appflow/cookbook/private_npm)
+
+Learn how to access private NPM modules used in dependencies.
\ No newline at end of file
diff --git a/src/pages/da/appflow/cookbook/private_git.md b/src/pages/da/appflow/cookbook/private_git.md
new file mode 100644
index 0000000000..e383e2d6db
--- /dev/null
+++ b/src/pages/da/appflow/cookbook/private_git.md
@@ -0,0 +1,47 @@
+---
+previousText: 'Introduction'
+previousUrl: '/docs/appflow/cookbook/intro'
+nextText: 'Using private NPM modules'
+nextUrl: '/docs/appflow/cookbook/private_npm_modules'
+---
+
+# Using private GIT repositories
+
+During the build process, it might be necessary to access other private repositories containing, for instance, libraries.
+
+In case such repositories do not belong to the same user that can clone the main application codebase, it is possible to use git credentials codebase.
+
+### How to use GIT Credentials
+
+The first step is to generate a personal access token: see the [github](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/) or [bitbucket](https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html) documentation.
+
+Then build an url for the Git Credentials.
+
+The URL for github looks like:
+
+ https://:@github.com
+
+
+while for bitbucket looks like:
+
+ https://:@bitbucket.org
+
+
+where the `username` is the username of the account used to generate the token.
+
+Finally add a secret inside an [environment](/docs/appflow/environments/#custom-environments) with key called `GIT_CREDENTIALS` and for the value use the url created before.
+
+
+
+At this point, if you use this environment during a build, you can access your repository specifying the `https` clone url without any token. For instance, if your private repo contains an npm library, the `package.json` would reference it in this way:
+
+```json
+{
+ ...
+ "dependencies": {
+ "my_super_secret_library": "https://bitbucket.org/myorg/my_super_secret_library.git",
+ ...,
+ }
+ ...
+}
+```
\ No newline at end of file
diff --git a/src/pages/da/appflow/cookbook/private_npm_modules.md b/src/pages/da/appflow/cookbook/private_npm_modules.md
new file mode 100644
index 0000000000..fa9612665a
--- /dev/null
+++ b/src/pages/da/appflow/cookbook/private_npm_modules.md
@@ -0,0 +1,31 @@
+---
+previousText: 'Using private GIT repositories'
+previousUrl: '/docs/appflow/cookbook/private_git'
+nextText: 'DevApp: Local Development'
+nextUrl: '/docs/appflow/devapp'
+---
+
+# Using private NPM modules
+
+Get an authentication token using the npm CLI:
+
+ $ npm token create --read-only
+ npm password:
+ ┌────────────────┬──────────────────────────────────────┐
+ │ token │ 1a583a54-5515-4058-a3c4-047e5f699d27 │
+ ├────────────────┼──────────────────────────────────────┤
+ │ cidr_whitelist │ │
+ ├────────────────┼──────────────────────────────────────┤
+ │ readonly │ true │
+ ├────────────────┼──────────────────────────────────────┤
+ │ created │ 2019-01-08T20:53:17.461Z │
+ └────────────────┴──────────────────────────────────────┘
+
+
+Configure an `NPM_TOKEN` secret in your Appflow environment using the generated token as value:
+
+
+
+Check in a `.npmrc` file in the root of your project directory with the following line:
+
+ //registry.npmjs.org/:_authToken=${NPM_TOKEN}
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/api.md b/src/pages/da/appflow/deploy/api.md
new file mode 100644
index 0000000000..648cf953af
--- /dev/null
+++ b/src/pages/da/appflow/deploy/api.md
@@ -0,0 +1,478 @@
+---
+previousText: 'Channels'
+previousUrl: '/docs/appflow/deploy/channels'
+nextText: 'Tutorials and Videos'
+nextUrl: '/docs/appflow/deploy/tutorials'
+---
+
+# Using the Deploy API
+
+
+ Before you begin using the API you'll need to make sure you've already
+installed and configured the plugin.
+and you may want to use the Pro Client to make accessing the API easier.
+
+
+While the Appflow SDK can handle all of your updates and perform them for you, sometimes you may want to customize how this works. Some examples of things you may want to do are:
+
+* Allow users to subscribe to different Channels for Beta Features, etc.
+* Manage the update process yourself (ex. Download updates on login, Apply updates on logout or Check for updates every 30 minutes)
+* Display what Channel the user is connected to
+
+The Pro Client gives you access to everything you need to make these modifications, and it's recommended that you always use the Pro Client instead of the plugin API directly.
+
+
+
+
Note: Async Await vs. ".then()"
+
+
+ In all of the examples on this page you'll notice that we use Async/Await. This automatically resolves promises inline for you and waits to perform the next action. This is just an alternative to using `.then`. Async/Await just allows your code to be much more legible (especially when you'd normally be chaining multiple promises) as it's read like a syncronous piece of code. Here are two ways to write the same piece of code:
+
```typescript Pro.deploy.getCurrentVersion().then((versionInfo) => { console.log(versionInfo); }) // is the same as async getVersionInfo(){ const versionInfo = await Pro.deploy.getCurrentVersion(); console.log(versionInfo); } ```
+
+
+### Using the Ionic Pro Client
+
+The Ionic Pro Client gives you access to the Deploy API inside of your app.
+
+You simply need to install the latest version of the Pro Client:
+
+ npm install @ionic/pro@latest
+
+Then you can import it in order to use the Deploy API in your code:
+
+```typescript
+import { Pro } from '@ionic/pro';
+```
+
+### How To Upgrade from v4 to v5
+
+The following docs are for `v5.x.x` of the Appflow SDK. If you're upgrading from a previous version you can follow [this guide & tutorial video](/docs/appflow/deploy/tutorials/#upgrading-to-the-new-deploy-plugin).
+
+## Methods
+
+`Pro.deploy` contains many functions that can help you utilize Deploy inside of your app. Here's a rundown of each:
+
+* [configure](#configure)
+* [getConfiguration](#getconfiguration)
+* [sync](#sync)
+* [checkForUpdate](#checkforupdate)
+* [downloadUpdate](#downloadupdate)
+* [extractUpdate](#extract)
+* [reloadApp](#reloadapp)
+* [getCurrentVersion](#getcurrentversion)
+* [getAvailableVersions](#getavailableversions)
+* [deleteVersionById](#deleteversionbyid)
+
+* * *
+
+### configure
+
+▸ **configure**(config: [DeployConfig](#deployconfig)): `Promise`<`void`>
+
+***description***: Update the default configuration for the plugin on the current device. The new configuration will be persisted across app close and binary updates.
+
+***since***: v5.0.0
+
+**Parameters:**
+
+| Param | Type | Description |
+| ------ | ----------------------------- | ---------------------------------------------------- |
+| config | [DeployConfig](#deployconfig) | The new configuration for the plugin on this device. |
+
+**Returns:** `Promise`<`void`>
+
+```typescript
+async configureDeploy() {
+ const config = {
+ 'appId': 'YOUR_APP_ID',
+ 'channel': 'CHANNEL_NAME'
+ }
+ await Pro.deploy.configure(config);
+}
+```
+
+### getConfiguration
+
+▸ **getConfiguration**(): `Promise`<[ConfigurationInfo](#configurationinfo)>
+
+***description***: Get info about the current configuration on the device.
+
+***since***: v5.0.0
+
+**Returns:** `Promise`<[ConfigurationInfo](#configurationinfo)> - Info about the currently applied configuration details.
+
+```typescript
+const info = await Pro.deploy.getConfiguration()
+console.log(info)
+// {
+// 'appId': 'abcd1234',
+// 'channel': 'MY_CHANNEL_NAME',
+// 'binaryVersionName': 'X.X.X',
+// 'binaryVersionCode': 'X.X.X', (string on iOS number on Android)
+// 'disabled': false,
+// 'updateMethod': 'auto',
+// 'maxVersions': 3,
+// 'minBackgroundDuration': 30,
+// 'currentVersionId': 'xxxx-xxxx-xxxx-xxxx'
+// 'currentBuildId' : 'xxxxxxx'
+// }
+```
+
+* * *
+
+### sync
+
+▸ **sync**(options: [SyncOptions](#syncoptions)): `Promise`<[SnapshotInfo](#snapshotinfo) `| undefined`>
+
+***description***: This function performs an entire standard check, download, extract, and reload cycle rather than having to program it yourself. This should be used most of the time unless you need to customize the flow.
+
+***since***: v5.0.0
+
+**Parameters:**
+
+| Param | Type | Description |
+| ------- | --------------------------- | ---------------------------------------------------------------- |
+| options | [SyncOptions](#syncoptions) | Options to call sync with to override the default update method. |
+
+**Returns:** `Promise`<[SnapshotInfo](#snapshotinfo) `| undefined`> - The info of the currently applied update or undefined if there is no applied update.
+
+```typescript
+async performAutomaticUpdate() {
+ try {
+ const currentVersion = Pro.deploy.getCurrentVersion();
+ const resp = await Pro.deploy.sync({updateMethod: 'auto'});
+ if (currentVersion.versionId !== resp.versionId){
+ // We found an update, and are in process of redirecting you since you put auto!
+ }else{
+ // No update available
+ }
+ } catch (err) {
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+
+ // Pro.monitoring.exception(err);
+ }
+}
+```
+
+* * *
+
+### checkForUpdate
+
+▸ **checkForUpdate**(): `Promise`<[CheckForUpdateResponse](#checkforupdateresponse)>
+
+***description***: Check for available updates for the currently configured app id and channel.
+
+***since***: v5.0.0
+
+**Returns:** `Promise`<[CheckForUpdateResponse](#checkforupdateresponse)> - An object describing if an update is available.
+
+```typescript
+async performManualUpdate() {
+ const update = await Pro.deploy.checkForUpdate()
+ if (update.available){
+ // We have an update!
+ }
+}
+```
+
+* * *
+
+### downloadUpdate
+
+▸ **downloadUpdate**(progress?: [CallbackFunction](#callbackfunction)<`number`>): `Promise`<`boolean`>
+
+***description***: Download the new files from an available update found by the checkForUpdate method and prepare the update.
+
+***since***: v5.0.0
+
+**Parameters:**
+
+| Param | Type | Description |
+| ------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `Optional` progress | [CallbackFunction](#callbackfunction)<`number`> | A progress callback function which will be called with a number representing the percent of completion of the download and prepare. |
+
+**Returns:** `Promise`<`boolean`> - `true` if the available update was successfully downloaded.
+
+```typescript
+ async performManualUpdate() {
+ const update = await Pro.deploy.checkForUpdate()
+ if (update.available){
+ await Pro.deploy.downloadUpdate((progress) => {
+ console.log(progress);
+ })
+ }
+}
+```
+
+* * *
+
+### extractUpdate
+
+▸ **extractUpdate**(progress?: [CallbackFunction](#callbackfunction)<`number`>): `Promise`<`boolean`>
+
+***description***: Extract the files from an update downloaded with the downloadUpdate method to prepare for loading the app.
+
+***since***: v5.0.0
+
+**Parameters:**
+
+| Param | Type | Description |
+| ------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `Optional` progress | [CallbackFunction](#callbackfunction)<`number`> | A progress callback function which will be called with a number representing the percent of completion of the download and prepare. |
+
+**Returns:** `Promise`<`boolean`> - `true` if the available update was successfully extracted.
+
+```typescript
+async performManualUpdate() {
+ const update = await Pro.deploy.checkForUpdate()
+ if (update.available){
+ await Pro.deploy.downloadUpdate((progress) => {
+ console.log(progress);
+ })
+ await Pro.deploy.extractUpdate((progress) => {
+ console.log(progress);
+ })
+ }
+}
+```
+
+* * *
+
+### reloadApp
+
+▸ **reloadApp**(): `Promise`<`boolean`>
+
+***description***: Reload the app if a more recent version of the app is available.
+
+***since***: v5.0.0
+
+**Returns:** `Promise`<`boolean`> - `true` if the app was successfully reloaded.
+
+```typescript
+async performManualUpdate() {
+ const update = await Pro.deploy.checkForUpdate()
+ if (update.available){
+ await Pro.deploy.downloadUpdate((progress) => {
+ console.log(progress);
+ })
+ await Pro.deploy.extractUpdate((progress) => {
+ console.log(progress);
+ })
+ await Pro.deploy.reloadApp();
+ }
+}
+```
+
+* * *
+
+### getCurrentVersion
+
+▸ **getCurrentVersion**(): `Promise`<[SnapshotInfo](#snapshotinfo) `| undefined`>
+
+***description***: Get info about the currently deployed update.
+
+***since***: v5.0.0
+
+**Returns:** `Promise`<[SnapshotInfo](#snapshotinfo) `| undefined`> - Info about the currently applied update or `undefined` if there isn't one applied.
+
+```typescript
+const info = await Pro.deploy.getCurrentVersion()
+console.log(info)
+// {
+// 'versionId': 'UUID_OF_ACTIVE_CODE',
+// 'channel': 'CHANNEL_NAME',
+// 'binaryVersion': 'X.X.X'
+// }
+```
+
+* * *
+
+### getAvailableVersions
+
+▸ **getAvailableVersions**(): `Promise`<[SnapshotInfo](#snapshotinfo)[]>
+
+***description***: Get a list of the snapshots available on the device.
+
+***since***: v5.0.0
+
+**Returns:** `Promise`<[SnapshotInfo](#snapshotinfo)[]> - A list of updates stored locally on the device.
+
+```typescript
+async checkVersions() {
+ const versions = await Pro.deploy.getAvailableVersions();
+ console.log(versions);
+ // [
+ // {
+ // 'versionId': 'versionId1',
+ // 'channel': 'CHANNEL_NAME',
+ // 'binaryVersion': '1.0.1'
+ // },
+ // {
+ // 'versionId': 'versionId2',
+ // 'channel': 'CHANNEL_NAME',
+ // 'binaryVersion': '1.0.1'
+ // },
+ // ]
+}
+```
+
+* * *
+
+### deleteVersionById
+
+▸ **deleteVersionById**(versionId: *`string`*): `Promise`<`boolean`>
+
+***description***: Remove the files specific to a snapshot from the device.
+
+***since***: v5.0.0
+
+**Parameters:**
+
+| Param | Type |
+| --------- | -------- |
+| versionId | `string` |
+
+**Returns:** `Promise`<`boolean`> - `true` if the version was successfully deleted.
+
+```typescript
+async deleteVersion() {
+ const versions = await Pro.deploy.getAvailableVersions();
+ Pro.deploy.deleteVersion(versions[0].versionId);
+}
+```
+
+* * *
+
+## Interfaces
+
+* [DeployConfig](#deployconfig)
+* [CheckForUpdateResponse](#checkforupdateresponse)
+* [SnapshotInfo](#snapshotinfo)
+* [CallbackFunction](#callbackfunction)
+
+### DeployConfig
+
+#### Properties
+
+* **appId** (optional): `undefined` | `string` The [Ionic Appflow](https://ionicframework.com/docs/appflow/) app id.
+* **channel** (optional): `undefined` | `string` The [channel](/docs/appflow/deploy/channels) that the plugin should listen for updates on.
+* **maxVersions** (optional): `undefined` | `number` The number of previous updates to be cached on the device
+* **minBackgroundDuration** (optional): `undefined` | `number` The number of seconds the app should be in the background for before the plugin considers it closed and checks for an updated on resume of the app.
+* **updateMethod** (optional): `undefined` | `background | none | auto` The update method the app should use when checking for available updates
+
+* * *
+
+### CheckForUpdateResponse
+
+#### Properties
+
+* **available**: `boolean` Whether or not an update is available.
+* **incompatibleUpdateAvailable**: `boolean` Whether or not an update that is not compatible with this device is available.
+* **snapshot** (optional): `undefined` | `string` The id of the snapshot, if available.
+* **build** (optional): `undefined` | `string` The id of the build, if available.
+
+* * *
+
+### SyncOptions
+
+#### Properties
+
+* **updateMethod**: `'background' | 'auto'` The update method to use when applying an update if available. This will override the default method the plugin was configured with temporarily.
+
+* * *
+
+### ConfigurationInfo
+
+#### Properties
+
+* **binaryVersionName**: `string` The versionName on Android or CFBundleShortVersionString on iOS this is the end user readable version listed on the stores.
+* **binaryVersionCode**: `string (iOS) | number (Android)` The versionCode on Android or CFBundleVersion on iOS this should be changed every time you do a new build.
+* **channel**: `string` The channel name the device is currently configured to check for updates on.
+* **disabled**: `boolean` Whether the deploy updates are disabled or not.
+* **updateMethod**: `'none' | 'auto' | 'background'` The currently configured updateMethod for the plugin.
+* **maxVersions**: `number` The maximum number of updates to be stored locally on the device.
+* **minBackgroundDuration**: `number` The number of seconds the app needs to be in the background before the plugin considers it closed for the purposes of fetching and applying a new update.
+* **currentVersionId**: `string | undefined` The version id of the currently applied update or `undefined` if none is applied.
+* **currentBuildId**: `string | undefined` The build id of the currently applied update or `undefined` if none is applied.
+
+* * *
+
+### SnapshotInfo
+
+#### Properties
+
+* **binaryVersion**: `string` The binary version the snapshot was downloaded for.
+* **channel**: `string` The channel that the snapshot was downloaded for..
+* **versionId**: `string` The id for the snapshot.
+
+* * *
+
+### CallbackFunction
+
+#### Callable
+
+▸ **__call**(result?: *T*): `void`
+
+A callback function to handle the result.
+
+**Parameters:**
+
+| Param | Type |
+| ----------------- | ---- |
+| `Optional` result | T |
+
+**Returns:** `void`
+
+## Plugin Variables
+
+When installing the Appflow SDK (`cordova-plugin-ionic`) there are a number of variables you can install the plugin with to configure the behavior of the plugin and how updates are applied to your app by using the `--variable` flag.
+
+Example: # use the MIN_BACKGROUND_DURATION variablecordova plugin add cordova-plugin-ionic --variable MIN_BACKGROUND_DURATION=60 ...
+
+### APP_ID - Required
+
+The `APP_ID` variable sets app in the pro dashboard the plugin should check for updates. The App ID can be updated at runtime via the [configure method](/docs/appflow/deploy/api#configure).
+
+### CHANNEL_NAME - Required
+
+The `CHANNEL_NAME` variable sets which channel the plugin should check for updates. The Channel can be updated at runtime via the [configure method](/docs/pro/deploy/api/#configure) of the Deploy Pro Client.
+
+### UPDATE_METHOD
+
+`Default: background`
+
+The `UPDATE_METHOD` determines how updates are applied to your app. When you are installing the Ionic Pro plugin, you have the option to choose which update method to use. The three options are:
+
+`background` - mode will check for updates when a user first opens your app from a completely closed state (in the splashscreen) or after a user resumes the app from the background after the [minimum duration](#min_background_duration). It will download the update in the background while the user is using your app. The next time they close and open your app, we will apply the updated version. You can still perform updates yourself and override the update method using the [Deploy Pro Client](/docs/pro/deploy/api) as well.
+
+`auto` - mode will check for updates when a user first opens your app from a completely closed state (in the splashscreen) or after a user resumes the app from the background after the [minimum duration](#min_background_duration). It will then WAIT on the splashscreen until the new update is downloaded, and immediately show the user the new version of the code after the splashscreen. Using this method essentially forces users to always use the most up to date version when connected to the internet with the trade off that users may wait on the splashscreen longer before interacting with the app while waiting for an update. You can still perform updates yourself and override the update method using the [Deploy Pro Client](/docs/pro/deploy/api) as well.
+
+`none` - will not automatically apply or download updates for you. Instead you have to manage the entire update process yourself using the [Deploy Pro Client](/docs/pro/deploy/api). This isn't recommended as if you deploy an update that "breaks" your app and can no longer apply Deploy updates, you will have to release a native binary in order to fix the issue or the user will have to delete and reinstall your app. Using the background or auto methods protects you by applying updates in the native layer.
+
+### MAX_STORE
+
+`Default: 2`
+
+The `MAX_STORE` variable can be configured to tell the deploy plugin how many updates to keep around locally on the device. Keeping more versions around locally makes rolling back faster but takes up more room on the device.
+
+### MIN_BACKGROUND_DURATION
+
+`New in v5 RC`
+
+`Default: 30`
+
+The `MIN_BACKGROUND_DURATION` variable sets the minimum number of seconds the user needs to put the app in the background before the plugin considers the app closed and checks for an update on resume like it would on a fresh app open according to the specified [update method](#update_method).
+
+## Plugin Preferences
+
+### DisableDeploy
+
+`Default: false`
+
+Allows to disable deploy updates by adding this preference in the config.xml
+
+
+
+
+After adding be sure to run `cordova prepare [platform]` in order for changes to take effect.
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/builds.md b/src/pages/da/appflow/deploy/builds.md
new file mode 100644
index 0000000000..ad7b2ea08a
--- /dev/null
+++ b/src/pages/da/appflow/deploy/builds.md
@@ -0,0 +1,40 @@
+---
+previousText: 'Setup'
+previousUrl: '/docs/appflow/deploy/setup'
+nextText: 'Channels'
+nextUrl: '/docs/appflow/deploy/channels'
+---
+
+# Deploy Builds
+
+## Overview
+
+A deploy build is a build of your application that includes only the web assets (JavaScript, HTML, fonts, and images) which can be shipped out to customer via [Deploy](/docs/appflow/deploy/intro). Deploy builds can be created manually from the Ionic Dashboard, in the **Builds** section under **Deploy** in the sidebar. You will be able to pick from the list of available commits that Appflow knows about. If there are know available commits you will need to push a new commit to your Git remote in order for it to show up in Appflow.
+
+
+
+A deploy build will do the following:
+
+* `npm install` will run to install any dependencies you have.
+* `npm run build` will run if a `build` script is detected in the `scripts` section of your `package.json` in order to build the web assets for your application.
+* The `www` directory with your built application will be stored and made available for live updates via [Deploy](/docs/appflow/deploy/intro)
+* You can find the history and status of your deploy builds in the side menu under `Builds` in the `Deploy` tab.
+
+## Concurrency limits
+
+Each account plan has a defined maximum amount of concurrent builds allowed (see [Plans Details](/pricing)). This limit is enforced at the account level across different apps.
+
+When you trigger a build, in the Appflow Dashboard you will notice that a build can have different statuses before it is processed:
+
+* **Queued**: this means that your build is queued for the next available runner. Usually your build should not be in this state for more than few seconds.
+* **Pending**: this means that you have reached your concurrent build limit and your build will continue when your current builds are completed.
+
+After the build starts to be processed the statuses are:
+
+* **Running**: the build is currently being processed. You can read the logs in the build details.
+* **Successful**: the build terminated in a correct state.
+* **Failed**: the build terminated in an incorrect state.
+
+More concurrent builds can be added to your plan. If you have a Starter or Starter + Add-on plan, you can get more builds by [upgrading your plan](https://dashboard.ionicframework.com/settings/billing).
+
+If you have a Growth or Scale plan, please [contact us](https://ionic.zendesk.com/hc/en-us/requests/new).
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/channels.md b/src/pages/da/appflow/deploy/channels.md
new file mode 100644
index 0000000000..febc04b935
--- /dev/null
+++ b/src/pages/da/appflow/deploy/channels.md
@@ -0,0 +1,35 @@
+---
+title: 'Channels'
+previousText: 'Deploy Builds'
+previousUrl: '/docs/appflow/deploy/builds'
+nextText: 'Deploy API'
+nextUrl: '/docs/appflow/deploy/api'
+---
+
+A channel points to a specific deploy build of your app that will be shared with any devices configured to listen to that channel for updates. You can change the build a channel points to whenever you'd like, and can rollback changes as well.
+
+When you [install the Appflow SDK](/docs/appflow/quickstart/installation) in your app (by clicking Install Instructions on a channel), any native binary configured to that channel will check the channel for available updates whenever it is loaded.
+
+## Setting up a Channel
+
+Every app comes with two default channels: **Master**, and **Production**.
+
+Common use cases are using a **Production** Channel for your App Store binaries, and the **Master** channel to run a native binary on your phone during development that gets automatically updated.
+
+Once you've set up a Channel, just click **Set Up Deploy** next to that Channel and it will walk you through the options available and generate the Command Line command that you should run.
+
+To create new channels beyond these two, you must have a paid Ionic Appflow membership. To add new channels, simply view the channels list by going to Deploy -> Channels, and then click the New Channel button.
+
+## Assigning a Build to a Channel
+
+Once you have created a Channel, go back to the **Builds** section of your app. On the right side of each Build, you'll see a "Assign to Channel" icon.
+
+
+
+Click this to set the Build as active for a Channel.
+
+Once a Build is set as active for a Channel any native binaries that have been set up with Ionic Deploy for this Channel will receive the new update next time they check in.
+
+## Automating Deployment from a Git Branch
+
+If your interested in automating your deploys from git push all the way to deploying to a channel you can take advantage or our [Automation](/docs/appflow/automation/intro) features if your [plan](/pricing) includes them.
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/cli.md b/src/pages/da/appflow/deploy/cli.md
new file mode 100644
index 0000000000..b9b3ab31a4
--- /dev/null
+++ b/src/pages/da/appflow/deploy/cli.md
@@ -0,0 +1,105 @@
+---
+previousText: 'Tutorials and Videos'
+previousUrl: '/docs/appflow/deploy/tutorials'
+nextText: 'Package'
+nextUrl: '/docs/appflow/package/intro'
+---
+
+# Deploy builds on Appflow using the Ionic CLI
+
+
+
Note:This feature is only available on our Scale plan contact us to enable this feature.
+
+
+It is possible to trigger deploy builds on Appflow directly from the CLI. This is extremely useful if you need to integrate the deploy build step inside an existing external CI/CD process.
+
+### Prerequisites
+
+Upgrade the Ionic CLI to at least version `4.8.0`.
+
+To use environments, a proper subscription that allows the usage of Automations is needed.
+
+### Authentication
+
+The Ionic CLI has to be authenticated on Appflow to be able to trigger a deploy build.
+
+To login type
+
+```bash
+$ ionic login
+```
+
+this will prompt for the Appflow username/password.
+
+The CLI can be authenticated also via environment variable (for example if it is used during a CI/CD task).
+
+To set up the authentication via environment variable, first login with an user who has access to the app you want to trigger deploy builds for for
+
+```bash
+$ ionic login
+```
+
+then export the authentication token
+
+```bash
+$ ionic config get -g tokens.user
+```
+
+finally export the token in an environment variable of your shell or your CI/CD service.
+
+```bash
+$ export IONIC_TOKEN=
+```
+
+### Link the app
+
+Your app must be linked to the remote app on Appflow. If the app is not linked yet, just run
+
+```bash
+$ ionic link
+```
+
+and commit the changes to `ionic.config.json`.
+
+### Trigger a deploy build
+
+Currently deploy build can be triggered only from the app project directory.
+
+```bash
+$ cd /path/to/your/app
+```
+
+Assuming the CLI is authenticated, to trigger a deploy build run
+
+```bash
+$ ionic deploy build
+```
+
+Once the build is successfully triggered, the CLI will automatically start tailing the logs from Appflow.
+
+### Customize the deploy build with Options
+
+The Options available to customize the build:
+
+* `--environment=` to specify the group of environment variables to be exposed to the build (available only with Automation; more info about environments are available [here](/docs/appflow/environments/))
+* `--channel=` to specify the channel you want to auto deploy the build to. This can be repeated multiple times if multiple channels need to be specified; more infos about channels are available [here](/docs/appflow/deploy/channels/)
+
+### Customize the deploy build with Advanced Options
+
+The Advanced Options available to customize the build:
+
+* `--commit=` The commit defaults to HEAD; to use a different commit you can use this option with the full SHA1 of the commit
+
+### Note about referencing Options values by name
+
+Names are case sensitive and need to be specified including spaces, for instance
+
+```bash
+$ ionic deploy build --channel="My Custom Channel"
+```
+
+Apart from the `--commit` options, all the others require the full name setup within the Appflow Dashboard.
+
+For the Environments and Channels it is the Name
+
+ 
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/intro.md b/src/pages/da/appflow/deploy/intro.md
new file mode 100644
index 0000000000..0bd1cf8f12
--- /dev/null
+++ b/src/pages/da/appflow/deploy/intro.md
@@ -0,0 +1,23 @@
+---
+title: 'Deploy'
+previousText: 'Quickstart'
+previousUrl: '/docs/appflow/quickstart'
+nextText: 'Setup'
+nextUrl: '/docs/appflow/deploy/setup'
+---
+
+Ionic Appflow's Live Deploy feature let you update the UI and business logic of your app remotely, in real-time. Push HTML, JS, and CSS updates directly to your users without going through the app store to instantly fix bugs and ship new features.
+
+##### Helpful links
+
+
+
+Install and configure the Appflow SDK and quickly ship your first live update!
+
+
+
+Find answers to common questions about deploy.
+
+
+
+Find answers to common questions about deploy.
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/setup.md b/src/pages/da/appflow/deploy/setup.md
new file mode 100644
index 0000000000..8a3eb2d376
--- /dev/null
+++ b/src/pages/da/appflow/deploy/setup.md
@@ -0,0 +1,25 @@
+---
+previousText: 'Introduction'
+previousUrl: '/docs/appflow/deploy/intro'
+nextText: 'Deploy Builds'
+nextUrl: '/docs/appflow/deploy/builds'
+---
+
+# Using Ionic Deploy
+
+Ionic Appflow's Deploy feature makes it easy to deploy app updates in real time without going through a traditional app store submission process for the vast majority of business logic, UI, and style changes.
+
+The Deploy feature works with the Ionic Appflow and requires you app is [connected to a git repo](/docs/appflow/quickstart/connect/) in order for Appflow to access your source code and deploy new code updates..
+
+
+
+Note: The Deploy feature only works on binary compatible changes (HTML, CSS, JS), meaning if you rely on native code updates you must resubmit to the app store first before using Deploy.
+
+
+## Installation
+
+In order to use Ionic Appflow's Deploy feature you'll need to [install and configure the Appflow SDK](/docs/appflow/quickstart/installation).
+
+## Advanced Usage
+
+Want to do something sweet, like allow users to [subscribe to a special Beta Channel](/docs/appflow/deploy/tutorials/#setting-up-a-beta-channel) instead of the default Production one? Do some split testing? Customize the way updates are applied (like checking every 30 minutes, or on login/logout)? Check out our detailed [Deploy API Documentation](/docs/appflow/deploy/api)!
\ No newline at end of file
diff --git a/src/pages/da/appflow/deploy/tutorials.md b/src/pages/da/appflow/deploy/tutorials.md
new file mode 100644
index 0000000000..cc2e8b9177
--- /dev/null
+++ b/src/pages/da/appflow/deploy/tutorials.md
@@ -0,0 +1,269 @@
+---
+previousText: 'Deploy API'
+previousUrl: '/docs/appflow/deploy/api'
+nextText: 'Using Ionic CLI'
+nextUrl: '/docs/appflow/deploy/cli'
+---
+
+# Tutorials and Videos
+
+## Setup and Deploy on iOS
+
+
+
+Learn how to install, configure, and deploy your first live update.
+
+## Upgrading to the New Deploy Plugin
+
+Here are the steps in order to successfully upgrade to the new version of the Pro Client, Deploy Plugin, and Webview Plugin. You can follow the guide below or watch this video:
+
+
+
+### Deploy Upgrade Guide
+
+You'll need specific versions of each of the following libraries:
+
+* `cordova-plugin-ionic-webview >= 2.0.0`
+* `cordoava-plugin-ionic >= 5.0.0`
+* `@ionic/pro >= 2.0.0`
+
+The following commands inside the root of you Ionic app should remove the old versions and install the new ones for you:
+
+```bash
+// remove the old version of the webview plugin
+cordova plugin rm cordova-plugin-ionic-webview
+// add the the new webview plugin
+cordova plugin add cordova-plugin-ionic-webview@latest
+// remove the old deploy plugin
+cordova plugin rm cordova-plugin-ionic
+// install the new deploy plugin
+cordova plugin add cordova-plugin-ionic@latest --variable APP_ID=YOUR_APP_ID --variable CHANNEL_NAME=YOUR_CHANNEL_NAME
+// install the new Pro SDK
+npm install @ionic/pro@latest
+```
+
+That's it! You should be all configured to start taking advanatage of the new deploy features! The new plugin
+
+## Setting up a Beta Channel
+
+In the following video tutorial, and code snippets we use the Deploy API to set up a custom Beta Channel that users can subscribe to in order to get updates early!
+
+### Choose your Integration Type:
+
+Here's an example template/JS for a page where we allow users to toggle to pull from a Beta Channel instead of Production and apply updates immediately when they toggle:
+
+
+
+```html
+
+
+
+ Settings
+
+
+
+
+
Settings
+
+
I'm connected to the {{ deployChannel }}.
+
+
Download Progress {{ downloadProgress }} / 100
+
+
+ Opt in to Beta Features
+
+
+
+
+```
+
+```js
+// settings.ts
+import { Component } from '@angular/core';
+import { NavController } from 'ionic-angular';
+
+import { Pro } from '@ionic/pro';
+
+@Component({
+ selector: 'page-settings',
+ templateUrl: 'settings.html'
+})
+export class SettingsPage {
+
+ public deployChannel = "";
+ public isBeta = false;
+ public downloadProgress = 0;
+
+ constructor(public navCtrl: NavController) {
+ this.checkChannel();
+ }
+
+ async checkChannel() {
+ try {
+ const res = await Pro.deploy.getConfiguration();
+ this.deployChannel = res.channel;
+ this.isBeta = (this.deployChannel === 'Beta')
+ } catch (err) {
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+
+ // Pro.monitoring.exception(err);
+ }
+ }
+
+ async toggleBeta() {
+ const config = {
+ channel: (this.isBeta ? 'Beta' : 'Production')
+ }
+
+ try {
+ await Pro.deploy.configure(config);
+ await this.checkChannel();
+ await this.sync({updateMethod: 'auto'}); // Alternatively, to customize how this works, use performManualUpdate()
+ } catch (err) {
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+
+ // Pro.monitoring.exception(err);
+ }
+
+ }
+
+ async performManualUpdate() {
+
+ /*
+ Here we are going through each manual step of the update process:
+ Check, Download, Extract, and Redirect.
+
+ Ex: Check, Download, Extract when a user logs into your app,
+ but Redirect when they logout for an app that is always running
+ but used with multiple users (like at a doctors office).
+ */
+
+ try {
+ const update = await Pro.deploy.checkForUpdate();
+
+ if (update.available){
+ this.downloadProgress = 0;
+
+ await Pro.deploy.downloadUpdate((progress) => {
+ this.downloadProgress = progress;
+ })
+ await Pro.deploy.extractUpdate();
+ await Pro.deploy.reloadApp();
+ }
+ } catch (err) {
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+
+ // Pro.monitoring.exception(err);
+ }
+
+ }
+
+}
+```
+
+
+
+```html
+
+
+
+
Settings
+
I'm connected to the {{data.deployChannel}} channel.
+
Download Progress {{data.downloadProgress}} / 100
+
+
+ Opt in to Beta Features
+
+
+
+
+```
+
+```js
+// controllers.js
+.controller('SettingsCtrl', function($scope, $timeout, $ionicPlatform) {
+
+ $scope.data = {
+ 'deployChannel': '',
+ 'isBeta': false,
+ 'downloadProgress': 0
+ }
+
+ function checkChannel(){
+ Pro.deploy.getConfiguration().then(function(res){
+ $timeout(function(){
+ $scope.data.deployChannel = res.channel;
+ $scope.data.isBeta = ($scope.data.deployChannel === 'Beta');
+ })
+ })
+ }
+
+ $ionicPlatform.ready(function(){
+ checkChannel();
+ });
+
+
+ function performManualUpdate(){
+
+ /*
+ Here we are going through each manual step of the update process:
+ Check, Download, Extract, and Redirect.
+
+ Ex: Check, Download, Extract when a user logs into your app,
+ but Redirect when they logout for an app that is always running
+ but used with multiple users (like at a doctors office).
+ */
+
+ Pro.deploy.checkForUpdate().then(function(update){
+ if (update.available){
+ $scope.data.downloadProgress = 0;
+ Pro.deploy.downloadUpdate(function(progress){
+ $timeout(function(){
+ $scope.data.downloadProgress = progress;
+ })
+ }).then(function(res){
+ Pro.deploy.extractUpdate().then(function(res){
+ Pro.deploy.reloadApp();
+ }, function(err){
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+ Pro.monitoring.exception(err);
+ })
+ }, function(err){
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+ Pro.monitoring.exception(err);
+ })
+ }
+ }, function(err){
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+ Pro.monitoring.exception(err);
+ })
+
+ }
+
+ $scope.toggleBeta = function(){
+
+ var config = {
+ channel: ( $scope.data.isBeta ? 'Beta' : 'Production' )
+ }
+
+ Pro.deploy.configure(config).then(function(res){
+ checkChannel();
+ Pro.deploy.sync({updateMethod: 'auto'}); // Alternatively, to customize how this works, use performManualUpdate()
+ }, function(err){
+ // We encountered an error.
+ // Here's how we would log it to Ionic Pro Monitoring while also catching:
+ Pro.monitoring.exception(err);
+ });
+
+ }
+
+})
+```
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/devapp.md b/src/pages/da/appflow/devapp.md
new file mode 100644
index 0000000000..296ad74aec
--- /dev/null
+++ b/src/pages/da/appflow/devapp.md
@@ -0,0 +1,156 @@
+---
+previousText: 'Cookbook'
+previousUrl: '/docs/appflow/cookbook/private_npm_modules'
+---
+
+# Ionic DevApp
+
+The Ionic DevApp is a free app that makes it easy to run your Ionic app directly on your iOS or Android device.
+
+Skip dealing with frustrating Native SDK installation issues, just run `ionic serve -c`, open the DevApp, connect to the same network, and the app will automatically load and run your app.
+
+The DevApp comes with many native plugins built right in, so you don't need to worry about installing plugins.
+
+## Download the DevApp
+
+The DevApp is available on iOS and Android.
+
+Enter your phone number below to text yourself an install link, or find the app on your app store of choice:
+
+
+
+
+
+## Using DevApp
+
+The DevApp finds `ionic serve` instances running on the local network and requires the latest release of the Ionic CLI (at least version 3.13.2).
+
+First, ensure you are running the latest release of the Ionic CLI. Run `npm install -g ionic`. If that doesn't work, try uninstalling and re-installing using `npm uninstall -g ionic` then running the install command again.
+
+Once the latest CLI is installed, run `ionic serve -c` in the app of your choice on your computer and let it finish building. Next, open your iOS or Android device and connect to *the same network* as your computer (through wifi). Open the DevApp, and you should see your local app show up in the list.
+
+## Capturing console logs
+
+To make sure you receive console logs generated from the app, which will be displayed in the terminal window where `ionic serve` was run, add the `-c` flag to `ionic serve`:
+
+```bash
+ionic serve -c
+```
+
+## CORS
+
+If your web requests are failing, you may be running into issues with [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). Unfortunately, CORS errors only show in the console of your browser, so they won't appear as a runtime error modal or in the logs printed to your `ionic serve` instance.
+
+There are a few things you can do to resolve the issue.
+
+### Set the appropriate headers
+
+If you control the server responding to the failing requests, you can set the appropriate `Access-Control-Allow-Origin` header on the server. The Origin of your request is the IP that your app is served from, for example `192.168.1.1:8100`. You can also set the Origin as `*` (wildcard), but be aware that requests from any origin will be able to see responses from your server. Wildcard is a common setting for any API, or any other endpoint that is expected to be accessed from various origins.
+
+### Use a proxy
+
+The [Ionic CLI can proxy requests](/docs/cli/configuring.html#service-proxies) you make to it. Since CORS is enforced by the browser (in this case the Android or iOS web view), by having the Ionic CLI make the request for you, it won't care whether there is an `Access-Control-Allow-Origin` header in the server response and will simply pass the response back to your app.
+
+### Use a plugin
+
+Similarly to using the Ionic CLI proxy, you can use the [Advanced HTTP plugin](https://ionicframework.com/docs/native/http/) to make requests. The plugin receives responses natively and passes the response back to JavaScript.
+
+## Troubleshooting
+
+If you don't see your app in the list, try these things to resolve it:
+
+1. First, make sure your are on the same network as the app. Double check your wifi connection settings.
+2. Try force-quitting the DevApp and restarting it
+3. Try restarting `ionic serve -c` on your computer.
+
+If those things still didn't resolve the issue, make sure you don't have any custom network settings that could cause the app to fail to discover the serve instance.
+
+## Reporting issues and feedback
+
+If the above steps don't work, or you want to share feedback, please post in the [DevApp Feedback Megathread](https://forum.ionicframework.com/t/ionic-devapp-feedback-mega-thread/109842) on the Ionic forum. Please avoid contacting support for this first release of the DevApp as we'd like direct feedback and would like to aggregate it to help others.
+
+We cannot guarantee support on this post but we will monitor it and use it to make DevApp better.
+
+## Native Cordova Plugin Support
+
+Ionic DevApp currently supports the following plugins:
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/monitoring.md b/src/pages/da/appflow/monitoring.md
new file mode 100644
index 0000000000..4191bb3041
--- /dev/null
+++ b/src/pages/da/appflow/monitoring.md
@@ -0,0 +1,110 @@
+# Error Monitoring
+
+Ionic Appflow makes it easy to automatically track runtime errors in your Ionic app, and map it back to your original, non-transpiled source code (TypeScript, ES6, etc.).
+
+## Summary
+
+Tracking runtime errors and crashes in your app helps you respond to issues quickly to reduce customer frustration and major issues with production apps.
+
+Combined with Ionic's Deploy feature, new updates can be rolled out quickly to address problems in real-time.
+
+This lets you:
+
+
+
+
+ See exactly where errors happen in your original source code even through layers of transpiled code and minification
+
+
+ Detect runtime errors in real-time with alerts and notifications
+
+
+ Fix errors immediately even in live app store apps
+
+
+
+
+## Getting Started
+
+In order to use Ionic Monitoring you must set up the Pro Client inside of your app. Follow along with our [Pro Client Setup Guide](/docs/pro/basics/getting-started/#pro-client-setup). You should be on at least `1.0.19` of `@ionic/pro`.
+
+After the Pro Client is installed, you'll want to [Add a Source Map](#source-maps) You can also use the API below to manually capture errors and more.
+
+## Source Maps
+
+Source Maps enable the Error service to provide stacktraces that map back to your original TypeScript code, making it easy to pinpoint problems in your code, even through highly minified, production code.
+
+#### Automatically adding Source Maps
+
+New releases of Ionic CLI (3.9.0 and greater) come with a built-in command for syncing Source Maps with Ionic Appflow. This feature requires Ionic 2 or above using `@ionic/app-scripts` 3.1.0 or greater.
+
+To sync Source Maps, run
+
+```bash
+ionic monitoring syncmaps
+```
+
+The command will prompt for the version of your app these Source Maps correspond to, and then ask you if you'd like to perform a new build to ensure the Source Maps are up to date.
+
+See the note about versions below, as keeping your Source Maps in sync with your app version is crucial for accurate stack trace context.
+
+#### Manually adding Source Maps
+
+To add a Source Map manually, navigate to your app on the [https://dashboard.ionicframework.com/](Ionic Appflow Dashboard), click the "Monitoring" tab, then click "Source Maps" in the upper right.
+
+You can find your Source Maps after doing a dev or prod build in `YOUR_APP/.sourcemaps/`. Upload the `main.js.map` sourcemap for Angular/Ionic 2+, and any other sourcemaps that correspond to your code for other Ionic/Angular versions.
+
+See the note about versions below, as keeping your Source Maps in sync with your app version is crucial for accurate stack trace context.
+
+#### Ensuring Version Accuracy
+
+Keeping your Source Maps in sync with the version of your code running in your app is crucial for accurate stack trace context.
+
+Version numbers *must* follow [semver](http://semver.org/), which ensures that the error tracking service can accurately detect regressions by comparing errors that occur in one version of your app with future releases of that app.
+
+Before doing a release, ensure you've synced Source Maps and make sure to not send new Source Maps for that version in the future.
+
+Note: we are working on automating the process to make it even easier.
+
+## Manual Capture using the Monitoring API
+
+Ionic Appflow Monitoring supports manually capturing errors and also sending log messages.
+
+#### `Pro.monitoring.exception(errorObject)`
+
+Manually capture an error. For example
+
+```typescript
+Pro.monitoring.exception(new Error('error'))
+```
+
+#### `Pro.monitoring.log(msg, options)`
+
+Capture and send a log message. Options takes a `level` (such as 'error' or 'info').
+
+Example:
+
+```typescript
+Pro.monitoring.log('This happens sometimes', { level: 'error' })
+```
+
+#### `Pro.monitoring.call(fn)`
+
+Call a function and automatically capture any resulting errors. Example:
+
+```typescript
+Pro.monitoring.call(() => {
+ throw new Error('error');
+})
+```
+
+#### `Pro.monitoring.wrap(fn)`
+
+Return a function that will automatically track any errors. Example:
+
+```typescript
+const newFn = Pro.monitoring.wrap(() => {
+ throw new Error('error');
+})
+newFn();
+```
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/adding-credentials.md b/src/pages/da/appflow/package/adding-credentials.md
new file mode 100644
index 0000000000..5f3be1b399
--- /dev/null
+++ b/src/pages/da/appflow/package/adding-credentials.md
@@ -0,0 +1,28 @@
+---
+title: 'Adding Credentials'
+previousText: 'Generating Credentials'
+previousUrl: '/docs/appflow/package/credentials'
+nextText: 'Native Configurations'
+nextUrl: '/docs/appflow/package/native-configs'
+---
+
+After you have generated your Security Profile, you must upload it to Ionic Appflow.
+
+## Uploading Credentials
+
+Navigate to your App, then to the `Package > Certificates` tab on the left hand side.
+
+Click the `Add Profile` button to create a new Profile.Both iOS and Android certifications can be used with one Profile, so we recommend making things like "Real App Store Profile", etc.
+
+
+
+Note: Profiles are created as either `Production` of `Development` and can only house the the
+build types associated with the profile type.
+For example:App Store builds require an iOS production certificate & distribution provisioning profile and therefore must use a Production type profile.
+
+
+
+
+You'll need to choose the [certificate files you generated](/docs/appflow/package/credentials) and upload them as well as put in any passwords needed to access the credentials.
+
+Once that Profile has been created, can click the `Edit` button to remove and/or upload your iOS and Android certs.
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/build-types.md b/src/pages/da/appflow/package/build-types.md
new file mode 100644
index 0000000000..e029e01018
--- /dev/null
+++ b/src/pages/da/appflow/package/build-types.md
@@ -0,0 +1,55 @@
+---
+title: 'Package Build Types'
+previousText: 'Package Builds'
+previousUrl: '/docs/appflow/package/builds'
+nextText: 'Generating Credentials'
+nextUrl: '/docs/appflow/package/credentials'
+---
+
+There are a few different types of builds you can choose for each platform (iOS, Android) that have different characteristics and requirements.
+
+## Android Build Types
+
+### Debug
+
+Debug type Android builds do not require any signing certificates or security profiles and can be sideloaded directly onto Android devices.
+
+### Release
+
+Release type Android builds are required if you want to release the `apk` on the Google Play Store. They require creating [android signing credentials](/docs/appflow/package/credentials#android-credentials) and uploading them to a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials).
+
+## iOS Build Types
+
+### Development
+
+Code Signing with a development type builds allows your app to run on device through Xcode. Development type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
+
+* iOS development provisioning profile
+* iOS development signing certificate and should be stored in a `Development` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)
+
+### Ad Hoc
+
+Code Signing with a Ad Hoc type builds allows you to distribute your app to devices specified in the provisioning profile. And are also needed in order to test push notifications. Ad Hoc type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
+
+* iOS distribution provisioning profile
+* iOS production signing certificate and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)
+
+### App Store
+
+Code Signing with a App Store type builds allows you to distribute you app using Testflight and the App Store. App Store type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
+
+* iOS distribution provisioning profile
+* iOS production signing certificate and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)
+
+### Enterprise
+
+
+
+Code Signing with Enterprise type builds allows you to distribute your app to devices outside of the App Store if you are building apps for internal use and distribution. Enterprise type iOS builds require [generating signing credentials and a provisioning profile](/docs/appflow/package/credentials#android-credentials) using:
+
+* iOS distribution provisioning profile
+* iOS production signing certificate and should be stored in a `Production` type [security profile](/docs/appflow/package/adding-credentials#uploading-credentials)
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/builds.md b/src/pages/da/appflow/package/builds.md
new file mode 100644
index 0000000000..1ee0dda102
--- /dev/null
+++ b/src/pages/da/appflow/package/builds.md
@@ -0,0 +1,42 @@
+---
+previousText: 'Introduction'
+previousUrl: '/docs/appflow/package/intro'
+nextText: 'Package Build Types'
+nextUrl: '/docs/appflow/package/build-types'
+---
+
+# Package Builds
+
+## Overview
+
+A package build is a native build of your application that is platform specific and can run on a physical device. Package builds produce `apk` files for Android and `ipa` files for iOS. Currently package builds are only available to customers on one of the paid plans and must manually be triggered from the dashboard. The basic steps of the package build are as follows:
+
+* `npm install` will run to install any dependencies you have.
+* `npm run build` will run if a `build` script is detected in the `scripts` section of your `package.json` in order to build the web assets for your application.
+* `cordova platform add [ios|android]` will run with the platform you have configured `NOTE:` *DO NOT* commit your `platforms` directory as this will cause your build to fail.
+* `cordova build [ios|android]` will run with the platform and options you have configured and generate the `ipa` or `apk` file
+* The generated `ipa` or `apk` will be stored and available for you to download from the dashboard
+* You can find the history and status of your package builds as well as download successful builds in the side menu under `Builds` in the `Package` tab.
+
+## Performing a Build
+
+Click on the **Code** tab of your App, you should be at your **Builds** list. Click on the **Package** button for the Build you'd like to get a Native binary for.
+
+In the Package GUI you'll be able to choose the type of Build you want to perform, and the Cert you'd like to use. You'll then be taken to the History tab while the build completes. After the build completes, click Download and you'll get your native binary!
+
+## Concurrency limits
+
+Each account plan has a defined maximum amount of concurrent builds allowed (see [Plans Details](/pricing)). This limit is enforced at the account level across different apps.
+
+When you trigger a build, in the Appflow Dashboard you will notice that a build can have different statuses before it is processed:
+
+* **Queued**: this means that your build is queued for the next available runner. Usually your build should not be in this state for more than few seconds.
+* **Pending**: this means that you have reached your concurrent build limit and your build will continue when your current builds are completed.
+
+After the build starts to be processed the statuses are:
+
+* **Running**: the build is currently being processed. You can read the logs in the build details.
+* **Successful**: the build terminated in a correct state.
+* **Failed**: the build terminated in an incorrect state.
+
+More concurrent builds can be added to your plan. If you have a Starter or Developer plan, you can get more builds by [upgrading plan](https://dashboard.ionicframework.com/settings/billing). If you have a Teams or Business plan, please [contact us](https://ionic.zendesk.com/hc/en-us/requests/new).
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/cli.md b/src/pages/da/appflow/package/cli.md
new file mode 100644
index 0000000000..0e95b5922d
--- /dev/null
+++ b/src/pages/da/appflow/package/cli.md
@@ -0,0 +1,125 @@
+---
+previousText: 'Native Configurations'
+previousUrl: '/docs/appflow/package/native-configs'
+nextText: 'Automations'
+nextUrl: '/docs/appflow/automation/intro'
+---
+
+# Package builds on Appflow using the Ionic CLI
+
+
+
Note:This feature is only available on our Scale plan contact us to enable this feature.
+
+
+It is possible to trigger package builds on Appflow directly from the CLI. This is extremely useful if you need to integrate the package build step inside an existing external CI/CD process.
+
+### Prerequisites
+
+Upgrade the Ionic CLI to at least version `4.7.0`.
+
+To trigger package builds on Appflow from the Ionic CLI, a proper subscription to run package builds is needed.
+
+To use environments, a proper subscription that allows the usage of Automations is needed.
+
+### Authentication
+
+The Ionic CLI has to be authenticated on Appflow to be able to trigger a package build.
+
+To login type
+
+```bash
+$ ionic login
+```
+
+this will prompt for the Appflow username/password.
+
+The CLI can be authenticated also via environment variable (for example if it is used during a CI/CD task).
+
+To set up the authentication via environment variable, first login with an user who has access to the app you want to trigger package builds for for
+
+```bash
+$ ionic login
+```
+
+then export the authentication token
+
+```bash
+$ ionic config get -g tokens.user
+```
+
+finally export the token in an environment variable of your shell or your CI/CD service.
+
+```bash
+$ export IONIC_TOKEN=
+```
+
+### Link the app
+
+Your app must be linked to the remote app on Appflow. If the app is not linked yet, just run
+
+```bash
+$ ionic link
+```
+
+and commit the changes to `ionic.config.json`.
+
+### Trigger a package build
+
+Currently package build can be triggered only from the app project directory.
+
+```bash
+$ cd /path/to/your/app
+```
+
+Assuming the CLI is authenticated, to trigger a package build run
+
+```bash
+$ ionic package build
+```
+
+this will prompt for the desired platform (`ios`/`android`) and build type specific for the platform.
+
+For iOS or Android `release` builds, a valid security profile is required and can be specified using the `--security-profile=` option.
+
+To setup valid security profiles see [here](/docs/appflow/package/credentials).
+
+The previous command can be execute in one single step, for instance
+
+```bash
+$ ionic package build ios development --security-profile="My Security Profile"
+```
+
+Once the build is successfully triggered, the CLI will automatically start tailing the logs from Appflow and, if the build is successful, download the `apk`/`ipa` file in the current directory.
+
+### Customize the package build with Options
+
+The Options available to customize the build:
+
+* `--environment=` to specify the group of environment variables to be exposed to the build (available only with Automation; more info about environments are available [here](/docs/appflow/environments/))
+* `--native-config=` to specify the group of native config variables to be exposed to your build (more info about native configs are available [here](/docs/appflow/package/intro/#native-configs))
+
+### Customize the package build with Advanced Options
+
+The Advanced Options available to customize the build:
+
+* `--commit=` The commit defaults to HEAD; to use a different commit you can use this option with the full SHA1 of the commit
+* `--target-platform=` This option is mostly useful for iOS builds if for any reason a package build with a specific version of Xcode is needed. If this is omitted the preferred version is used.
+* `--build-file-name=` To override the downloaded file name use this option. This might be useful, for instance, in in a CI build to have a consistent name for the produced artifact.
+
+### Note about referencing Options values by name
+
+Names are case sensitive and need to be specified including spaces, for instance
+
+```bash
+$ ionic package build ios development --security-profile="iOS dev"
+```
+
+Apart from the `--commit` options, all the others require the full name setup within the Appflow Dashboard.
+
+For the Security Profiles, Environments and Native Configs it is the Name
+
+  
+
+For the Target Platform, it is one of the strings identifying the platform in the Applflow Package Build Form.
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/credentials.md b/src/pages/da/appflow/package/credentials.md
new file mode 100644
index 0000000000..45ab4b992c
--- /dev/null
+++ b/src/pages/da/appflow/package/credentials.md
@@ -0,0 +1,132 @@
+---
+previousText: 'Package Build Types'
+previousUrl: '/docs/appflow/package/build-types'
+nextText: 'Adding Credentials'
+nextUrl: '/docs/appflow/package/adding-credentials'
+---
+
+# Generating Credentials
+
+Security Profiles securely store your credentials so you can easily reference them when building your app in the cloud.
+
+## Overview
+
+You'll need two sets of Apple certificates when your app goes to production, which means you'll eventually need two Security Profiles: one for development and one for production.
+
+We'll guide you through creating a development profile with the credentials that you need for the desired platform below.
+
+## Android Credentials
+
+The [Android keystore](https://developer.android.com/training/articles/keystore.html), used for signing apps, can be generated using keytool, which is included in the [Java JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html). Change `MY-RELEASE-KEY` and `MY_ALIAS_NAME` to be relevant to your app. The tool will ask you to enter a keystore password and a key password.
+
+```bash
+$ keytool -genkey -v -keystore MY-RELEASE-KEY.keystore -alias MY_ALIAS_NAME -keyalg RSA -keysize 2048 -validity 10000
+```
+
+## iOS Credentials
+
+You'll need an Apple Developer account (Individual or Organization). See [comparing memberships](https://developer.apple.com/support/compare-memberships/).
+
+### Registering your App ID
+
+Every app must register an ID with Apple.
+
+* Navigate to [Certificates, Identifiers & Profiles › Identifiers › App IDs](https://developer.apple.com/account/ios/identifier/bundle) in the [Apple Developer Center](https://developer.apple.com/account) and register a new App ID.
+
+
+
+* Under Explicit App ID, set the Bundle ID to the ID you've specified in your app's `config.xml` file. iOS Bundle IDs are represented as a reversed address, such as `com.ionicframework.MyIonicApp`.
+
+### Device Registration
+
+Devices must be explicitly registered with Apple for sending push notifications during development.
+
+* Navigate to [Certificates, Identifiers & Profiles › Devices › All](https://developer.apple.com/account/ios/device/) in the [Apple Developer Center](https://developer.apple.com/account) and register a new Device.
+
+
+
+* Give your device a name and enter the device's UDID. [Find your UDID](/services/profiles/ios-udid.html).
+
+### Certificate Signing Request
+
+Before you can get a certificate from Apple, you'll need to generate a certificate signing request file. It can be created on Mac OSX by using Keychain Access and on other platforms by using OpenSSL.
+
+#### Using Keychain Access
+
+* Navigate to Keychain Access › Certificate Assistant › Request a Certificate From a Certificate Authority on your Mac.
+
+
+
+* Enter your name and email address. Leave the CA Email blank.
+* Select Saved to disk and hit continue. This will generate your `.certSigningRequest` file.
+
+#### Using OpenSSL
+
+* Generate a private RSA key file.
+
+```bash
+$ openssl genrsa -out keyname.key 2048
+```
+
+* Create the certificate signing request file by filling out the interactive form.
+
+```bash
+$ openssl req -new -key keyname.key -out CertificateSigningRequest.certSigningRequest
+```
+
+### iOS App Certificate & Provisioning Profile
+
+Before you can generate App Certificates & Provisioning Profiles, you'll need to [register your app and any devices, and obtain a `.certSigningRequest`](#ios-setup).
+
+App Certificates & Provisioning Profiles are for signing your app and giving it access to certain devices.
+
+#### Certificate
+
+There are two types of Apple certificates: development and production. We'll guide you through generating credentials with a development certificate.
+
+* Navigate to [Certificates, Identifiers & Profiles › Certificates › Development](https://developer.apple.com/account/ios/certificate/development) in the [Apple Developer Center](https://developer.apple.com/account) and create a new certificate. Under Development, select iOS App Development.
+
+
+
+* Step through the steps. Upload the `.certSigningRequest` you created to generate a certificate. Then, download your certificate. It should be a `.cer` file.
+
+Next, we'll need to convert the certificate from a `.cer` file to a `.p12` file. It can be converted on Mac OSX by using Keychain Access and on other platforms by using OpenSSL.
+
+#### Using Keychain Access
+
+* Drag your `.cer` file into your login keychain.
+* Right click on your imported certificate and click Export.
+
+
+
+* Select Personal Information Exchange (.p12) for File Format.
+* Save the certificate, giving it a strong password.
+
+#### Using OpenSSL
+
+* Download your iOS certificate to the same directory as your private RSA key.
+* Change the format of the iOS certificate to PEM.
+
+```bash
+$ openssl x509 -inform DER -outform PEM -in ios_development.cer -out ios_development.cer.pem
+```
+
+* Export the certificate as a `.p12` file, giving it a strong password.
+
+```bash
+$ openssl pkcs12 -export -inkey keyname.key -in ios_development.cer.pem -out Certificates.p12
+```
+
+### Provisioning Profile
+
+Provisioning profiles give your app access to be installed, or *provisioned*, on specific devices. For iOS App Development provisioning profiles, devices are selected manually.
+
+* Navigate to [Certificates, Identifiers & Profiles › Provisioning Profiles › Development](https://developer.apple.com/account/ios/profile/limited) in the [Apple Developer Center](https://developer.apple.com/account) and create a new provisioning profile.
+
+
+
+* Under **Development**, select **iOS App Development**.
+* Select the correct App ID (with the Bundle ID matching your app's `config.xml` file)
+* Select the certificate you generated.
+* Select any and all development devices.
+* Download the `.mobileprovision` file, which is your provisioning profile file.
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/intro.md b/src/pages/da/appflow/package/intro.md
new file mode 100644
index 0000000000..d34401ca98
--- /dev/null
+++ b/src/pages/da/appflow/package/intro.md
@@ -0,0 +1,26 @@
+---
+previousText: 'Deploy'
+previousUrl: '/docs/appflow/deploy/cli'
+nextText: 'Package Builds'
+nextUrl: '/docs/appflow/package/builds'
+---
+
+# Packaging Native Binaries
+
+Ionic Appflow's Package feature makes it easy to build native app binaries for iOS and Android in the cloud. Perfect for automating binary builds and for developers using Windows that want to build iOS apps.
+
+##### Helpful links
+
+
+
+Build your very first Android debug build by following our quickstart guide.
+
+
+
+Find answers to common questions about building native binaries
+
+
+
+Learn about how you can resolve build issues related to plugins using CocoaPods.
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/package/native-configs.md b/src/pages/da/appflow/package/native-configs.md
new file mode 100644
index 0000000000..79e1bcbeec
--- /dev/null
+++ b/src/pages/da/appflow/package/native-configs.md
@@ -0,0 +1,29 @@
+---
+previousText: 'Adding Credentials'
+previousUrl: '/docs/appflow/package/adding-credentials'
+nextText: 'Using Ionic CLI'
+nextUrl: '/docs/appflow/package/cli'
+---
+
+# Native Configurations
+
+
+
Note:This feature is only available on our Growth plans and above.
+
+
+Native configs allow you overwrite certain configurations without having to commit changes to version control on a per build/automation basis such as:
+
+* overwrite the unique bundle identifier or [id attribute](https://cordova.apache.org/docs/en/latest/config_ref/#widget) in the `config.xml`
+* overwrite the App Name as it will appear on the home screen
+* overwrite the [Appflow SDK or Deploy Plugin variables and preferences](/docs/appflow/deploy/api#plugin-variables)
+
+This makes it easy to build your app for multiple environments from the same version of the code. If using an [automation](/docs/appflow/automation/intro) you can trigger multiple automations from the same branch that will produce different builds.
+
+Common use cases are:
+
+* making Staging, QA, and Production versions of you app with different Bundle IDs, App names, and Deploy Channels so that you can install all the environments on a single device and easily tell the apart
+* leaving the [DisableDeploy](/docs/appflow/deploy/api#disabledeploy) `true` for development and automatically setting it back to `false` when building binaries for release
+
+To create one go to the `Package > Native Configs` tab in the sidebar and click `New native config`.
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart.md b/src/pages/da/appflow/quickstart.md
new file mode 100644
index 0000000000..9f98f6414f
--- /dev/null
+++ b/src/pages/da/appflow/quickstart.md
@@ -0,0 +1,25 @@
+---
+title: 'Quickstart'
+previousText: 'Welcome'
+previousUrl: '/docs/appflow'
+nextText: 'Connect Your Repo'
+nextUrl: '/docs/appflow/quickstart/connect'
+---
+
+The quickstart tutorial walks you through the process of setting up your application with Ionic Appflow, including how to connect your application to Appflow, how to set up the Appflow SDK (Deploy plugin) for live updates, and how to configure your first automated Android and iOS builds using native build environments. Simply follow the guide step-by-step, or navigate directly to the documentation for the component that interests you.
+
+
+
+Follow the quickstart tutorial and get up and running with Appflow in no time!
+
+
+
+Update your app remotely in real-time without app store delays.
+
+
+
+Build app binaries in the cloud for iOS and Android.
+
+
+
+Automate the building, testing, and distribution of Package & Deploy builds to ship better updates faster.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/automation.md b/src/pages/da/appflow/quickstart/automation.md
new file mode 100644
index 0000000000..2d106c63ff
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/automation.md
@@ -0,0 +1,40 @@
+---
+title: 'Create an Automation'
+previousText: 'Build a Native Binary'
+previousUrl: '/docs/appflow/quickstart/package'
+nextText: 'Create an Environment'
+nextUrl: '/docs/appflow/quickstart/environment'
+---
+
+
+
Note: This feature is only available on our Growth plans and above.
+
+
+[Automations](/docs/appflow/automation/intro) enable you and your team to utilize the full CI/CD powers of Appflow. You can create automations that trigger [Package builds](/docs/appflow/package/builds) and [Deploy builds](/docs/appflow/deploy/builds) every time your team commits new code to a given branch, and you can even configure the automations to use different [environments](/docs/appflow/automation/environments#custom-environments) and [native configurations](/docs/appflow/package/native-configs) for building different versions of your app for development, staging, QA and production.
+
+Note that we are only creating a single automation here, but you can create multiple automations for different branches or workflows and customize them to fit your needs.
+
+## Create an Automation for the Android Development branch
+
+Since we were able to [successfully build an Android binary using Package](/docs/appflow/quickstart/package), we can now create an automation that triggers an Android `Debug` build every time a developer pushes code to the `development` git branch. This way the entire team can easily see when the builds break and track down the exact commit for fast and efficient debugging.
+
+To get started, navigate to the `Automate` tab within the desired app and click the `New Automation` button in the top right.
+
+
+
+Next, fill in the configuration options:
+
+* **Name:** The name of the automation.
+* **Git Branch:** The branch you'd like to trigger the automation from. **Note: The asterisk (*) is a wildcard and will match anything.**
+* **Automation Type:** Decide whether you'd like to build a [Package build](/docs/appflow/package) (binary) or a [Deploy build](/docs/appflow/deploy) (live update).
+* Add any additional configuration details associated with the automation type
+
+
+
+## Test the Automation
+
+Now that the automation is created, any time a developer pushes to the `development` branch for that application, a new Android `Debug` type build will automatically start. Simply push a new commit to your `development` branch to try out the automation.
+
+You can view all the builds associated with a particular automation by navigating to the `Automations` page in the Appflow Dashboard and clicking the automation from the list. 🚀
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/bitbucket-server.md b/src/pages/da/appflow/quickstart/bitbucket-server.md
new file mode 100644
index 0000000000..55b868f3b5
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/bitbucket-server.md
@@ -0,0 +1,47 @@
+---
+title: 'Connect Using Bitbucket Server'
+previousText: 'Connect your Repo'
+previousUrl: '/docs/appflow/quickstart/connect'
+nextText: 'Install the Appflow SDK'
+nextUrl: '/docs/appflow/quickstart/installation'
+---
+
+
+
The Bitbucket Server integration is only available on our **Scale** plan.
+ Please contact us if you require this feature.
+
+
+
+If you are already using Bitbucket Server you can link your repository with Appflow to push code automatically.
+
+## Prerequisites
+
+In order to enable the integration with Appflow, you will need an existing repository on your Bitbucket Server instance.
+
+## Setting up the Integration
+
+Navigate to the `Git` section of the Settings tab in your app on the Appflow Dashboard and select the Bitbucket Server tab.
+
+If this is your first time connecting you'll need to:
+
+* Enter the URL for your Bitbucket Server instance
+* Enter the [personal access token](https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html) for you repo
+
+
+
+ Note: If the personal access token you use has read-only access,
+ you will need to
+ create the webhook yourself so that Appflow recieves push events.
+ A modal will pop up after you connect to your repo giving you the details you need to create the webhook.
+ If you use a personal access token with admin privileges, this will be done
+ automatically for you.
+
+
+
+* Click the `Connect to Bitbucket Server` button
+
+
+
+Then you can choose the repository to link from the list of available repos.
+
+When you link to the repository, a webhook will be created and your commits will be sent to Appflow.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/bitbucket.md b/src/pages/da/appflow/quickstart/bitbucket.md
new file mode 100644
index 0000000000..b50ce22946
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/bitbucket.md
@@ -0,0 +1,23 @@
+---
+title: 'Connect Using Bitbucket'
+previousText: 'Connect your Repo'
+previousUrl: '/docs/appflow/quickstart/connect'
+nextText: 'Install the Appflow SDK'
+nextUrl: '/docs/appflow/quickstart/installation'
+---
+
+If you are already using [Bitbucket Cloud](https://bitbucket.org/) you can link your repository with your Appflow app to push code automatically.
+
+## Prequisites
+
+In order to enable the integration with your Appflow app you will need an existing repository on Bitbucket.
+
+## Setting up the Integration
+
+Navigate to the `Git` section of the app settings tab in your app on the Appflow Dashboard choose the Bitbucket Cloud tab. If this is your first time connecting you'll need to click the `Connect` button. Then you can choose the repository to link from the list of available repos.
+
+
+
+When you link the repository a webhook will be created for the repository and events will be sent to Appflow so that we have access to any commits you push to your repository.
+
+Only new commits will be shown. Historical commits prior to establishing a connection with BitBucket will not be displayed.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/connect.md b/src/pages/da/appflow/quickstart/connect.md
new file mode 100644
index 0000000000..f444a35289
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/connect.md
@@ -0,0 +1,46 @@
+---
+title: 'Connect Your Repo'
+previousText: 'Quickstart Home'
+previousUrl: '/docs/appflow/quickstart'
+nextText: 'Connect Using GitHub'
+nextUrl: '/docs/appflow/quickstart/github'
+---
+
+Appflow works directly with Git version control and uses your code base as the source of truth for Deploy and Package builds. In order for Appflow to access your code, you can choose to integrate directly using a hosting service like GitHub or Bitbucket, or you can push your code directly to Appflow.
+
+## Prerequisites
+
+Before you can connect your application to Appflow, make sure you have done the following:
+
+* [Install the Ionic CLI locally](/docs/cli#installation)
+* Have an existing Ionic app or [start a new one](/docs/cli/commands/start/)
+
+## Create an App in the Appflow Dashboard
+
+You'll need to create an app in the [Appflow dashboard](https://dashboard.ionicframework.com) before you can connect it to your git repo. From the main page, you should see a `New App` button in the top right corner. If you don't have any apps yet, you'll see a button to create your first one in the middle of the screen. Simply enter a name for your application and click `Create`.
+
+
+
+## Choose your Git Integration
+
+Next, you'll need to decide how Appflow will access your source code. We suggest using [GitHub](https://github.com/), [Bitbucket](https://bitbucket.org/), or [Bitbucket Server](https://bitbucket.org/product/enterprise) if you're using them already. The integrations with these services are easy to configure and you'll get some additional benefits like being able view the commits your builds came from and the changes on your Git remote.
+
+If you're not using one of these providers, you can also choose to push directly to Ionic. Ionic git is *not* intended to be a Git host and we strongly suggest using GitHub, Bitbucket or another official git hosting service to backup your source code repository.
+
+
+
+Connect your app to a repo on GitHub.
+
+
+
+Connect your app to a repo on Bitbucket.
+
+
+
+Connect your app to a repo using an on-premise Bitbucket Server instance.
+
+**Note: This feature is only available on our Scale plan.**
+
+
+
+Connect your app directly to Ionic if you are not using one of the supported Git hosting services.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/deploy.md b/src/pages/da/appflow/quickstart/deploy.md
new file mode 100644
index 0000000000..6cc047f0db
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/deploy.md
@@ -0,0 +1,62 @@
+---
+title: 'Deploy a Live Update'
+previousText: 'Push a Commit'
+previousUrl: '/docs/appflow/quickstart/push'
+nextText: 'Build a Native Binary'
+nextUrl: '/docs/appflow/quickstart/package'
+---
+
+Now that we've [installed the Appflow SDK ](/docs/appflow/quickstart/installation) and [pushed a commit](/docs/appflow/quickstart/push) to the Dashboard, we'll walk through the process of deploying a live update to a device.
+
+## Overview
+
+The Ionic Deploy feature works by using the installed Appflow SDK in your native application to listen to a particular Deploy [Channel](/docs/appflow/deploy/channels).
+
+When a Deploy build is assigned to a Channel, that update will be deployed to user devices running binaries that are configured to listen to the specified Channel.
+
+
+Nomenclature note: The terms "Deploy build", "web build", "live deploy" and "live update" can be used interchangeably. They all refer to an update provided to your user's device by Appflow's Deploy feature.
+
+
+## Triggering a Deploy Build
+
+In order to deploy a live update, you will first need to create a [Deploy build](/docs/appflow/deploy/builds).
+
+There are two ways to do this:
+
+* Click the `Start web build` icon from the `Commits` tab 
+* Click the `New web build` button in the top right from the `Deploy > Builds` tab 
+
+You will need to make sure you've selected the correct commit to deploy. If your plan includes [custom environments](/docs/appflow/automation/environments#custom-environments) and you have configured at least one, you can select one from the provided dropdown list. Finally, you can also pick a [Channel](/docs/appflow/deploy/channels) to automatically assign the build to once it completes successfully. For the purposes of this tutorial, we will leave both options blank.
+
+Once the build begins you will be able to watch it's progress and look at the logs if you encounter errors.
+
+
+
+## Assign the Build to a Channel
+
+
+
+Note: If you have trouble getting a successful build in the previous step, you can find answers to common Deploy build errors in
+this section of our knowledge base.
+
+
+Once you have a successful Deploy build, you can assign it to the same Channel you configured the Appflow SDK to listen to when you installed it by clicking the `Assign to channel` button in the top right of the build detail page. You can also click the `Assign to channel` icon on the build in the `Deploy > Builds` tab and select the Channel from the dropdown.
+
+
+
+## Receiving a Live Update on a Device
+
+For your application to receive a live update from Deploy, you'll need to run the app on a device or an emulator. The easiest way to do this is simply to use the [ionic cordova run](/docs/cli/commands/cordova-run) command to launch your local app in an emulator or a device connected to your computer.
+
+ ionic cordova run \[ios | android\] \[options\]
+
+If the app is configured correctly to listen to the channel you deployed it to, the application should update immediately on startup if you're using the [auto update method](/docs/appflow/deploy/api#update_method).
+
+If you're using the [background update method](/docs/appflow/deploy/api#update_method), just stay in the app for 30 seconds or so while the update is downloaded in the background. Then, close the application, reopen it again and you should see your update applied 🎉.
+
+## Disabling Deploy for Development
+
+Generally speaking, if you are developing using an emulator and live reload you probably do not want Deploy to be active, as it can intefere with your local development.
+
+We recommend setting the [DisableDeploy](/docs/appflow/deploy/api#disabledeploy) preference to `true` in the `config.xml` file during local development. You can then set it back to `false` before building your binary for release by either manually setting it back or using the [native config feature](/docs/appflow/package/native-configs) if you're building your binaries with [Ionic Package](/docs/appflow/package/intro).
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/environment.md b/src/pages/da/appflow/quickstart/environment.md
new file mode 100644
index 0000000000..f4769e63e3
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/environment.md
@@ -0,0 +1,130 @@
+---
+title: 'Create an Environment'
+previousText: 'Create an Automation'
+previousUrl: '/docs/appflow/quickstart/automation'
+nextText: 'Create a Native Configuration'
+nextUrl: '/docs/appflow/quickstart/native-config'
+---
+
+
+
Note: This feature is only available on our Growth plans and above.
+
+
+[Environments](/docs/appflow/automation/environments) are a powerful way to customize your [Package builds](/docs/appflow/package/builds) and [Deploy builds](/docs/appflow/deploy/builds) in order create different configurations based on the environment variables passed in at build time. When combined with the [Automation](/docs/appflow/automation/intro) feature, development teams can easily configure development, staging, and production build configurations, allowing them to embrace DevOps best practices and ship better quality updates faster than ever.
+
+## Create an Environment
+
+To create an environment, simply go to the `Automate > Environments` tab in the sidebar of the Appflow Dashboard and click the `New Environment` button in the top right.
+
+
+
+You'll then see a form that allows you to create two types of environment variables:
+
+* **Secrets** - These values are encypted and only available at build time. Once you save a secret, *you will be unable to edit or see it again*.
+* **Variables** - These values are available at build time. Variables are visible and editable.
+
+Let's create a new Environment called "Development". For this environment, create a variable named `BUILD_ENV` with the value `development`. This variable will allow us to customize the way our builds are configured.
+
+
+
+## Add the Environment to an Automation
+
+To take full advantage of automating your development environment, you'll want to add the environment to the automation we created earlier.
+
+In your `Automations` tab, click `Edit` from the `Options` icon on the right of your automation, select the environment from the `Environment` dropdown and click `Save`.
+
+
+
+## Example: Customizing the Build Script
+
+Getting the variable into your builds is one thing, but using them to customize the way your build is configured is just as important.
+
+Here are examples of how you might customize your app using the `BUILD_ENV` variable we created above in order to connect to a different API url to fetch the data for your app when developing locally vs. in your `development` environment.
+
+ First, you can modify the `build` script in your `package.json` to either use the `BUILD_ENV` variable if it exists or to default it to `local` and then choose the configuration from the `angular.json` file that matches the value of `BUILD_ENV` (`development` in Appflow & `local` locally).
+
+```json
+...
+"scripts": {
+ ...
+ "build": "BUILD_ENV=${BUILD_ENV:-local} ng build --configuration=$BUILD_ENV"
+ ...
+}
+...
+```
+
+Here's what your `angular.json` configurations section might look like.
+
+```json
+...
+"configurations": {
+ ... // other environment configurations
+ "development": {
+ "fileReplacements": [ // replace default environment.ts file with the environment.development.ts file
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.development.ts"
+ }
+ ],
+ },
+ "local" {}, // leave this blank to use the default src/environments/environment.ts file
+ ...
+}
+
+```
+
+Here's what the `environment.ts` and `environment.development.ts` files might look like.
+
+```typescript
+// src/environments/environments.development.ts
+export const environment = {
+ apiUrl: 'https://api.development.com'
+};
+
+```
+
+```typescript
+// src/environments/environments.ts
+export const environment = {
+ apiUrl: 'http://localhost:8000'
+};
+
+```
+
+ First you can modify the `build` script in your `package.json` to either use the `BUILD_ENV` variable if it exists or default to `local`.
+
+```json
+...
+"scripts": {
+ ...
+ "build": "BUILD_ENV=${BUILD_ENV:-local} ionic-app-scripts build"
+ ...
+}
+...
+```
+
+Then you can use it directly in an `environments.ts` module to properly set the API url based on the value of `BUILD_ENV` (`development` in Appflow & `local` locally).
+
+```typescript
+let apiUrl: string;
+
+switch (process.env.BUILD_ENV) {
+ case 'development':
+ apiUrl = 'https://api.development.com';
+ break;
+ case 'local':
+ apiUrl = 'http://localhost:8000';
+ break;
+ default:
+ console.warn(`Unknown environment ${process.env.BUILD_ENV} specified.`)
+}
+
+export const environment = {
+ apiUrl: apiUrl
+};
+
+```
+
+
+
+Now your apps will automatically use a different API to fetch data locally vs in your development builds! 💪
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/github.md b/src/pages/da/appflow/quickstart/github.md
new file mode 100644
index 0000000000..567b730300
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/github.md
@@ -0,0 +1,21 @@
+---
+title: 'Connect Using GitHub'
+previousText: 'Connect Your Repo'
+previousUrl: '/docs/appflow/quickstart/connect'
+nextText: 'Install the Appflow SDK'
+nextUrl: '/docs/appflow/quickstart/installation'
+---
+
+If you are already using [GitHub](https://github.com/) you can link your repository with your Appflow app to push code automatically.
+
+## Prerequisites
+
+In order to enable the integration with your Appflow app you will need an existing repository on GitHub.
+
+## Setting up the Integration
+
+Navigate to the `Git` section of the app settings tab in your app on the Appflow Dashboard choose the GitHub tab. If this is your first time connecting you'll need to click the `Connect` button. Then you can choose the repository to link from the list of available repos.
+
+
+
+When you link the repository a webhook will be created for the repository and events will be sent to Appflow so that we have access to any commits you push to your repository.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/installation.md b/src/pages/da/appflow/quickstart/installation.md
new file mode 100644
index 0000000000..0805ce93c9
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/installation.md
@@ -0,0 +1,45 @@
+---
+title: 'Install the Appflow SDK'
+previousText: 'Connect your Repo'
+previousUrl: '/docs/appflow/quickstart/connect'
+nextText: 'Push a Commit'
+nextUrl: '/docs/appflow/quickstart/push'
+---
+
+In order to take advantage of some of the best Appflow features, like deploying live updates to your app and bypassing the app stores, you'll need to install the Appflow SDK (also known as the Ionic Deploy plugin). The Appflow SDK comes with Ionic Appflow's Deploy feature for detecting and syncing your app with updates that you've pushed to channels.
+
+## Installing the Appflow SDK from the Dashboard (Recommended)
+
+To install the Appflow SDK plugin from the Dashboard, follow the instructions provided by clicking "Install Instructions" on the Channels list in the Appflow Dashboard.
+
+
+
+## Installing the Appflow SDK Manually
+
+To install the plugin manually, run the following command in the root directory of your Ionic app, making sure to substitute the correct values for your app:
+
+```shell
+cordova plugin add cordova-plugin-ionic --save \
+ --variable APP_ID="YOUR_APP_ID" \
+ --variable CHANNEL_NAME="YOUR_CHANNEL_NAME" \
+ --variable UPDATE_METHOD="background|auto|none" \
+ --variable MAX_STORE="3"
+```
+
+**NOTE**: The plugin delays the cordova ready event until it finish checking for updates and add this preference to the app ``, which makes the Splash Screen to not go away automatically. All Ionic templates run `this.splashScreen.hide();` on cordova ready event, but if it was removed it should be added back. Alternatively the app can add `` to override the value added by the plugin, but that can lead to the Splash Screen going away before the download is complete.
+
+### Plugin Variables
+
+* `YOUR_APP_ID` is the ID of the app in Ionic Appflow.
+* `YOUR_CHANNEL_NAME` is the name of the [Channel](/docs/appflow/deploy/channels) you'd like the app to listen to for updates.
+ * Make sure to use the *exact* name of your Channel, including the exact casing!
+* [MAX_STORE](/docs/appflow/deploy/api/#max_store) tells us how many previous versions of code to keep inside your app. This enables you to revert to those versions quickly, or swap between versions if necessary. The default is recommended for most users.
+* [UPDATE_METHOD](/docs/appflow/deploy/api/#update_method) is one of `background | auto | none`. This determines how your application responds when a new live update is available for download.
+
+You can read more about the available [plugin variables in our API documentation](/docs/appflow/deploy/api/#plugin-variables).
+
+## Commit your changes
+
+After you've installed the plugin, be sure to commit the changes made to your `config.xml` and `package.json` files.
+
+git add . # stage any changesgit commit -m "added appflow sdk" # commit staged changes
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/ionic-remote.md b/src/pages/da/appflow/quickstart/ionic-remote.md
new file mode 100644
index 0000000000..c6d1312d73
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/ionic-remote.md
@@ -0,0 +1,30 @@
+---
+title: 'Connect Using Ionic Remote'
+previousText: 'Connect your Repo'
+previousUrl: '/docs/appflow/quickstart/connect'
+nextText: 'Install the Appflow SDK'
+nextUrl: '/docs/appflow/quickstart/installation'
+---
+
+If you are not using one of the supported git repo integrations, you can push your source code directly to Ionic Appflow using Git.
+
+
+ Ionic Appflow is not a replacement for a git hosting service.
+ It is recommended that you use a git hosting service to manage your primary app source code
+ (GitHub, Bitbucket, etc.)!
+ The ionic remote is used only for interacting with the Ionic Appflow services.
+
+
+## Link your Repository
+
+
+
+To link your local repo, simply run `ionic link` in the root directory of your existing project and choose `Ionic Appflow` as your git remote. This will allow you to select the Dashboard app you'd like to link to, create an `ionic` remote in your local git configuration, and create or use an existing SSH key pair for authentication when pushing changes to Ionic Appflow.
+
+You can learn more about git remotes [here](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes).
+
+## Configure your SSH keys
+
+Ionic remote authentication is done via public/private SSH key pairs for the most secure authentication possible. You'll need to upload a public key to Ionic Appflow to authenticate yourself. This can be automatically done during the `ionic link` process or manually.
+
+Once you've selected the correct app and the `Ionic Appflow` remote, you will be prompted to create an SSH key pair or use an existing one. If you're not familiar with SSH keys we suggest letting the CLI automatically create and add them for you. Otherwise, you can choose to use an existing key and provide the CLI with a path to the public key on your local machine. You can also upload an existing public key in the Appflow Dashboard in the personal Settings area, which you can find by clicking your profile icon on the lower left side of the Dashboard.
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/native-config.md b/src/pages/da/appflow/quickstart/native-config.md
new file mode 100644
index 0000000000..094b0a0457
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/native-config.md
@@ -0,0 +1,50 @@
+---
+title: 'Create a Native Configuration'
+previousText: 'Create an Environment'
+previousUrl: '/docs/appflow/quickstart/environment'
+nextText: 'Ionic Deploy'
+nextUrl: '/docs/appflow/deploy/intro'
+---
+
+
+
Note: This feature is only available on our Growth plans and above.
+
+
+[Native Configurations](/docs/appflow/package/native-configs) allow you to easily modify common configuration values that can change between different environments (development, production, staging, etc.) so you don't need to use extra logic or manually commit them to version control. Native configurations can be attached to any [Package build](/doc/appflow/package) or [Automation](/doc/appflow/automation).
+
+You can use native configs to:
+
+* Overwrite the unique bundle identifier or [id attribute](https://cordova.apache.org/docs/en/latest/config_ref/#widget) in `config.xml`
+* Overwrite the App Name as it will appear on the home screen of a device
+* Overwrite the [Appflow SDK (Deploy Plugin) variables and preferences](/docs/appflow/deploy/api#plugin-variables)
+
+In this part of the tutorial, we'll setup a native configuration for `Development` to:
+
+* Use a unique bundle id so that we can install both the development version of the app and the production version of the app on the same device
+* Change the App Name so we can tell the two installations apart once they're installed on the device
+* We'll also modify the [Deploy Channel](/docs/appflow/deploy/channels) that the development version of the app listens to so that we can assign updates to that channel first to make sure they work (before we assign them to the `production` Channel)
+
+## Create a Native Configuration
+
+To create a native config, go to the `Package > Native Configs` tab in the Appflow Dashboard sidebar and click `New native config` in the top right.
+
+Next:
+
+* Name the configuration `Development`
+* Overwrite the unique bundle id with `com.snapcats.demo.development`
+* Overwrite the app name with `Snapcats - Dev`
+* Overwrite the deploy channel to be `Development`
+
+
+
+## Add the Native Config to an Automation
+
+To take full advantage of automating your development environment, you'll want to add the native config to the automation we created earlier.
+
+In your `Automations` tab, click `Edit` from the `Options` icon on the right of your automation, select the configuration from the `Native Config` dropdown and click `Save`.
+
+
+
+Now your apps should automatically use a different `bundle id`, app name, and deploy channel between your development and production builds. This means you can install both your development and production applications on the same device and easily tell them apart! 🔥
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/package.md b/src/pages/da/appflow/quickstart/package.md
new file mode 100644
index 0000000000..619451d74f
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/package.md
@@ -0,0 +1,51 @@
+---
+title: 'Build a Native Binary'
+previousText: 'Deploy a Live Update'
+previousUrl: '/docs/appflow/quickstart/deploy'
+nextText: 'Create an Automation'
+nextUrl: '/docs/appflow/quickstart/automation'
+---
+
+
+Next we'll build an Android `Debug` binary using the [Ionic Package](/docs/appflow/package/intro) service.
+
+
+
+## Start a Package Build
+
+In order to download a binary of your application, you will first need to create a [Package build](/docs/appflow/package/builds).
+
+There are two ways to do this:
+
+* Click the `Start package build` icon from the `Commits` tab 
+* Click the `New package build` button in the top right from the `Package > Builds` tab 
+
+Select the proper commit for your build. There are several required and optional fields you can specify:
+
+* **Target Platform** - The platform for your build (iOS or Android)
+* **Xcode Version (iOS Only)** - The Xcode version used to build your iOS binary (use the recommended version if possible)
+* [Build Type](/docs/appflow/package/build-types) - The type of build for the given platform (See [iOS build types](/docs/appflow/package/build-types#ios-build-types) or [Android build types](/docs/appflow/package/build-types#android-build-types))
+* [Security Profile](/docs/appflow/package/credentials) - The signing credentials for the for the build (if required)
+* [Environment](/docs/appflow/automation/environments#custom-environments) - The environment to use to customize your build process
+* [Native Config](/docs/appflow/package/native-configs) - The Native Config to use to customize your app configuration
+
+For the quickstart tutorial, select the `Android` platfrom and the `Debug` type build which requires no other configuration. Once the build begins, you can view the progress and review the logs if you encounter errors.
+
+
+
+## Downloading the Build
+
+
+
+Note: If you have trouble getting a successful build in the previous step, you can find answers to common Package build errors in
+this section of our knowledge base.
+
+
+A successful Package build yields an iOS binary (`.ipa` or IPA) or an Android binary (`.apk` or APK) file. Once you have a successful build, you can download it so that you can install it on a device by clicking the `Download IPA/APK` button in the top right of the build detail page or clicking the `Download IPA/APK` icon on the build in the `Package > Builds` tab.
+
+
\ No newline at end of file
diff --git a/src/pages/da/appflow/quickstart/push.md b/src/pages/da/appflow/quickstart/push.md
new file mode 100644
index 0000000000..c6a5a5042d
--- /dev/null
+++ b/src/pages/da/appflow/quickstart/push.md
@@ -0,0 +1,27 @@
+---
+title: 'Push a Commit'
+previousText: 'Install the Appflow SDK'
+previousUrl: '/docs/appflow/quickstart/installation'
+nextText: 'Deploy a Live Update'
+nextUrl: '/docs/appflow/quickstart/deploy'
+---
+
+In order for Appflow to access your code base you'll need to push a commit so that it shows up in your Dashboard.
+
+## Committing to Appflow
+
+If you are using an integration with GitHub, Bitbucket or Bitbucket Server, a new commit will show up every time you push to your git host.
+
+If you are using Ionic as your git remote, you'll need to push to your commit to Appflow directly to see your commit in the Dashboard.
+
+
+
+git add . # stage any changesgit commit -m "added appflow sdk" # commit staged changesgit push origin master # push the changes from the master branch to your git host
+
+
+
+git add . # stage any changesgit commit -m "added appflow sdk" # commit staged changesgit push ionic master # push the changes from the master branch to the Ionic remote
+
+Once you've done a `git push`, you should see your commit available in the `Commits` tab of the Dashboard.
+
+
\ No newline at end of file
diff --git a/src/pages/da/building/android.md b/src/pages/da/building/android.md
new file mode 100644
index 0000000000..e8fb13edb1
--- /dev/null
+++ b/src/pages/da/building/android.md
@@ -0,0 +1,81 @@
+---
+previousText: 'Running on iOS'
+previousUrl: '/docs/building/ios'
+nextText: 'Testing'
+nextUrl: '/docs/building/testing'
+---
+
+# Android Development
+
+This guide covers how to deploy Ionic apps to Android simulators and devices using [Capacitor](/docs/faq/glossary#capacitor) or [Cordova](/docs/faq/glossary#cordova).
+
+> To deploy and debug apps on an Android device, you must follow these [environment setup](/docs/installation/android) steps.
+
+## Project Setup
+
+Before apps can be deployed to Android simulators and devices, the native project must be configured.
+
+1. **Generate the native project, if it does not already exist.**
+
+ For Capacitor, run the following:
+
+```shell
+ $ ionic capacitor add android
+```
+
+ For Cordova, run the following:
+
+
+```shell
+ $ ionic cordova prepare android
+```
+
+2. **Set the [Package ID](/docs/faq/glossary#package-id).**
+
+ For Capacitor, open the `capacitor.config.json` file and modify the `appId` property.
+
+ For Cordova, open the `config.xml` file and modify the `id` attribute of the root element, ``. See [the Cordova documentation](https://cordova.apache.org/docs/en/latest/config_ref/#widget) for more information.
+
+## Running with Capacitor
+
+Capacitor uses Android Studio to build and run apps to simulators and devices.
+
+1. **Develop the Ionic app and sync it to the native project.**
+
+ With each meaningful change, Ionic apps must be built into web assets before the change can appear on Android simulators and devices. The web assets then must be copied into the native project. Luckily, this process is made easy with a single Ionic CLI command.
+
+```shell
+ $ ionic capacitor copy android
+```
+
+2. **In Android Studio, click the Run button and then select the target simulator or device.**
+
+
+
+## Running with Cordova
+
+The Ionic CLI can build, copy, and deploy Ionic apps to Android simulators and devices with a single command. It can also spin up a development server, like the one used in `ionic serve`, to provide [live-reload](/docs/faq/glossary#livereload) functionality.
+
+Run the following to start a long-running CLI process that boots up a live-reload server:
+
+```shell
+$ ionic cordova run android -l
+```
+
+Now, when changes are made to the app's source files, web assets are rebuilt and the changes are reflected on the simulator or device without having to deploy again.
+
+## Using Chrome DevTools
+
+Chrome has web developer tool support for Android simulators and devices. Go to `chrome://inspect` in Chrome while the simulator is running or a device is connected to the computer and **Inspect** the app that needs to be debugged.
+
+> Make sure your application is running on the device or simulator, or it will not show up in the list.
+
+
+
+## Viewing Native Logs
+
+Native logs can be found in Android Studio in **Logcat**.
+
+> If the **Logcat** window is hidden, you can enable it in **View** » **Tool Windows** » **Logcat**.
+
+
\ No newline at end of file
diff --git a/src/pages/da/building/contributing.md b/src/pages/da/building/contributing.md
new file mode 100644
index 0000000000..ba64887016
--- /dev/null
+++ b/src/pages/da/building/contributing.md
@@ -0,0 +1,152 @@
+---
+previousText: 'Testing'
+previousUrl: '/docs/building/testing'
+nextText: 'Web View'
+nextUrl: '/docs/building/webview'
+contributors:
+ - brandyscarney
+---
+
+# Contributing to Ionic
+
+Thanks for the interest in contributing to Ionic Framework!
+
+## Contributing Etiquette
+
+Please see the [Contributor Code of Conduct](https://github.com/ionic-team/ionic/blob/master/CODE_OF_CONDUCT.md) for information on the rules of conduct.
+
+## Creating an Issue
+
+* If you have a question about using the framework, please ask on the [Ionic Forum](http://forum.ionicframework.com/) or in the [Ionic Worldwide Slack](http://ionicworldwide.herokuapp.com/) group.
+
+* It is required that you clearly describe the steps necessary to reproduce the issue you are running into. Although we would love to help our users as much as possible, diagnosing issues without clear reproduction steps is extremely time-consuming and simply not sustainable.
+
+* The issue list of the [Ionic](https://github.com/ionic-team/ionic) repository is exclusively for bug reports and feature requests. Non-conforming issues will be closed immediately.
+
+* Issues with no clear steps to reproduce will not be triaged. If an issue is labeled with "needs: reply" and receives no further replies from the author of the issue for more than 30 days, it will be closed.
+
+* If you think you have found a bug, or have a new feature idea, please start by making sure it hasn't already been [reported](https://github.com/ionic-team/ionic/issues?utf8=%E2%9C%93&q=is%3Aissue). You can search through existing issues to see if there is a similar one reported. Include closed issues as it may have been closed with a solution.
+
+* Next, [create a new issue](https://github.com/ionic-team/ionic/issues/new/choose) that thoroughly explains the problem. Please fill out the populated issue form before submitting the issue.
+
+## Creating a Pull Request
+
+* We appreciate you taking the time to contribute! Before submitting a pull request, we ask that you please [create an issue](#creating-an-issue) that explains the bug or feature request and let us know that you plan on creating a pull request for it. If an issue already exists, please comment on that issue letting us know you would like to submit a pull request for it. This helps us to keep track of the pull request and make sure there isn't duplicated effort.
+
+* Looking for an issue to fix? Make sure to look through our issues with the [help wanted](https://github.com/ionic-team/ionic/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) label!
+
+### Setup
+
+1. [Download the installer](https://nodejs.org/) for the LTS version of Node.js. This is the best way to also [install npm](https://blog.npmjs.org/post/85484771375/how-to-install-npm#_=_).
+2. Fork the [Ionic](https://github.com/ionic-team/ionic) repository.
+3. Clone your fork.
+4. Create a new branch from master for your change.
+5. Navigate into the directory of the package you wish to modify (core, angular, etc.).
+6. Run `npm install` to install dependencies for this package.
+7. Follow the steps for the specific package below.
+
+### Core
+
+#### Modifying Components
+
+1. Locate the component(s) to modify inside `/core/src/components/`.
+2. Take a look at the [Stencil Documentation](https://stenciljs.com/docs/introduction/) and other components to understand the implementation of these components.
+3. Make your changes to the component. If the change is overly complex or out of the ordinary, add comments so we can understand the changes.
+4. [Preview your changes](#preview-changes) locally.
+5. [Modify the documentation](#modifying-documentation) if needed.
+6. [Run lint](#lint-changes) on the directory and make sure there are no errors.
+7. [Build the project](#building-changes).
+8. After the build is finished, commit the changes. Please follow the [commit message format](#commit-message-format) for every commit.
+9. [Submit a Pull Request](#submit-pull-request) of your changes.
+
+#### Preview Changes
+
+1. Run `npm start` from within the `core` directory.
+2. A browser should open at `http://localhost:3333/`.
+3. From here, navigate to one of the component's tests to preview your changes.
+4. If a test showing your change doesn't exist, [add a new test or update an existing one](#modifying-tests).
+5. To test in RTL mode, once you are in the desired component's test, add `?rtl=true` at the end of the url; for example: `http://localhost:3333/src/components/alert/test/basic?rtl=true`.
+
+#### Lint Changes
+
+1. Run `npm run lint` to lint the TypeScript and Sass.
+2. If there are lint errors, run `npm run lint.fix` to automatically fix any errors. Repeat step 1 to ensure the errors have been fixed, and manually fix them if not.
+3. To lint and fix only TypeScript errors, run `npm run lint.ts` and `npm run lint.ts.fix`, respectively.
+4. To lint and fix only Sass errors, run `npm run lint.sass` and `npm run lint.sass.fix`, respectively.
+
+#### Modifying Documentation
+
+1. Locate the `readme.md` file in the component's directory.
+2. Modify the documentation **above** the line that says `` in this file.
+3. To update any of the auto generated documentation below that line, make the relevant changes in the following places:
+ * `Usage`: update the component's usage examples in the component's `usage/` directory
+ * `Properties`, `Events`, or `Methods`: update the component's TypeScript file (`*.tsx`)
+ * `CSS Custom Properties`: update the component's main Sass file (`*.scss`)
+
+#### Modifying Tests
+
+1. Locate the test to modify inside the `test/` folder in the component's directory.
+2. If a test exists, modify the test by adding an example to reproduce the problem fixed or feature added.
+3. If a new test is needed, the easiest way is to copy the `basic/` directory from the component's `test/` directory, rename it, and edit the content in both the `index.html` and `e2e.ts` file (see [Screenshot Tests](#screenshot-tests) for more information on this file).
+4. The `preview/` directory is used in the documentation as a demo. Only update this test if there is a bug in the test or if the API has a change that hasn't been updated in the test.
+
+##### Screenshot Tests
+
+1. If the test exists in screenshot, there will be a file named `e2e.ts` in the directory of the test.
+2. A screenshot test can be added by including this file and adding one or more `test()` calls that include a call to `page.compareScreenshot()`. See [Stencil end-to-end testing](https://stenciljs.com/docs/end-to-end-testing) and existing tests in `core/` for examples.
+3. **Important:** each `test()` should have only one screenshot (`page.compareScreenshot()`) call **or** it should check the expect at the end of each test. If there is a mismatch it will fail the test which will prevent the rest of the test from running, i.e. if the first screenshot fails the remaining screenshot calls would not be called *unless* they are in a separate test or all of the expects are called at the end.
+4. To run screenshot locally, use the following command: `npm run test.screenshot`.
+ * To run screenshot for a specific test, pass the path to the test or a string to search for.
+ * For example, running all `alert` tests: `npm run test.screenshot alert`.
+ * Or, running the basic `alert` tests: `npm run test.screenshot src/components/alert/test/basic/e2e.ts`.
+
+#### Building Changes
+
+1. Once all changes have been made and the documentation has been updated, run `npm run build` inside of the `core` directory. This will add your changes to any auto-generated files, if necessary.
+2. Review the changes and, if everything looks correct, [commit](#commit-message-format) the changes.
+3. Make sure the build has finished before committing. If you made changes to the documentation, properties, methods, or anything else that requires an update to a generate file, this needs to be committed.
+4. After the changes have been pushed, publish the branch and [create a pull request](#creating-a-pull-request).
+
+### Submit Pull Request
+
+1. [Create a new pull request](https://github.com/ionic-team/ionic/compare) with the `master` branch as the `base`. You may need to click on `compare across forks` to find your changes.
+2. See the [Creating a pull request from a fork](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) GitHub help article for more information.
+3. Please fill out the provided Pull Request template to the best of your ability and include any issues that are related.
+
+## Commit Message Format
+
+We have very precise rules over how our git commit messages should be formatted. This leads to readable messages that are easy to follow when looking through the project history. We also use the git commit messages to generate our [changelog](https://github.com/ionic-team/ionic/blob/master/CHANGELOG.md). (Ok you got us, it's basically Angular's commit message format).
+
+`type(scope): subject`
+
+#### Type
+
+Must be one of the following:
+
+* **feat**: A new feature
+* **fix**: A bug fix
+* **docs**: Documentation only changes
+* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
+* **refactor**: A code change that neither fixes a bug nor adds a feature
+* **perf**: A code change that improves performance
+* **test**: Adding missing tests
+* **chore**: Changes to the build process or auxiliary tools and libraries such as documentation generation
+
+#### Scope
+
+The scope can be anything specifying place of the commit change. For example `action-sheet`, `button`, `menu`, `nav`, etc. If you make multiple commits for the same component, please keep the naming of this component consistent. For example, if you make a change to navigation and the first commit is `fix(nav)`, you should continue to use `nav` for any more commits related to navigation.
+
+#### Subject
+
+The subject contains succinct description of the change:
+
+* use the imperative, present tense: "change" not "changed" nor "changes"
+* do not capitalize first letter
+* do not place a period `.` at the end
+* entire length of the commit message must not go over 50 characters
+* describe what the commit does, not what issue it relates to or fixes
+* **be brief, yet descriptive** - we should have a good understanding of what the commit does by reading the subject
+
+## License
+
+By contributing your code to the ionic-team/ionic GitHub Repository, you agree to license your contribution under the MIT license.
\ No newline at end of file
diff --git a/src/pages/da/building/cross-platform.md b/src/pages/da/building/cross-platform.md
new file mode 100644
index 0000000000..6b9849cf9a
--- /dev/null
+++ b/src/pages/da/building/cross-platform.md
@@ -0,0 +1,185 @@
+---
+previousText: 'Migration'
+previousUrl: '/docs/building/migration'
+nextText: 'Running Overview'
+nextUrl: '/docs/building/running'
+disableHtmlPreviews: true
+contributors:
+ - rtpHarry
+---
+
+# Cross Platform
+
+Ionic is built from the ground up to make development easy, no matter what platform you are building for. Ionic apps are truly cross-platform: able to run as an Android, iOS, Electron, and Progressive Web App (PWA), all from a single codebase. There are some points to keep in mind when optimizing an app to work across these platforms.
+
+## Hardware APIs
+
+In a native application, it's common to make API calls to communicate with the device, such as opening the camera or accessing geolocation. These API calls won’t work when called in a web environment because there’s no native bridge. There are a few ways Ionic handles this.
+
+### Ionic Native
+
+Ionic Native has its own internal logic to detect if it is inside of a native environment. Instead of throwing a runtime error, it will print a warning if it is not a native environment and there are no Cordova plugins available. The app won’t break and it will continue to work, although without the native functionality.
+
+### Platform Detection
+
+In an app’s logic, whenever it is needed to make a native API call, it is recommended to always check the status of the native environment first. For example:
+
+```typescript
+this.platform.ready().then(() => {
+ if (this.platform.is('cordova')) {
+ // make your native API calls
+ } else {
+ // fallback to browser APIs
+ }
+});
+```
+
+This bit of code can be incredibly helpful when targeting environments where access to the native APIs is uncertain.
+
+### Browser Fallbacks
+
+Many native APIs that people use (for example, the File API), are not available in the browser. The APIs are always improving and catching up to native, so it is recommended to research them. Taking the first two points into consideration, it's fairly easy to create a nice experience that will adapt for the platform the app is running on.
+
+## Desktop
+
+When planning to deploy an app to desktop, either using Electron or as a **Progressive Web App**, it is important to ensure the app works smoothly on larger devices.
+
+### Layout
+
+Many people rarely notice the layout of an app, but it can have a massive impact on experience and usability. Consider this common UI pattern:
+
+```html
+
+
+ Item 1
+
+
+ Item 2
+
+
+ Item 3
+
+
+ Item 4
+
+
+ Item 5
+
+
+```
+
+This will render 5 items with a width of 100% each. This may look great on a mobile device, as seen below, but viewing this on a desktop browser is a different story. The items become stretched to fill the entire screen because of the wide screen width, leaving screen space unused.
+
+
+
+To improve this experience, we can wrap the items in a [Grid](/docs/layout/grid) component. The view can be easily rewritten into something more usable on larger screens:
+
+```html
+
+
+
+
+ Item 1
+
+
+
+
+ Item 2
+
+
+
+
+ Item 3
+
+
+
+
+ Item 4
+
+
+
+
+ Item 5
+
+
+
+
+```
+
+By wrapping the items in an `ion-grid` element, the Ionic grid system is added to our layout. Wrapping each item in a column makes the items take up equal-width inside of the grid, along the same row.
+
+
+
+We can take this even further by adding the `fixed` attribute to the `` element. This tells the grid to have a fixed width based on the screen size. This is perfect for larger screens when items will begin to stretch again without a width on the grid.
+
+
+
+The grid can be further customized to change the sizes of columns with the addition of the `ion-col` properties.
+
+```html
+
+
+
+
+ Item 1
+
+
+
+
+ Item 2
+
+
+
+
+ Item 3
+
+
+
+
+ Item 4
+
+
+
+
+ Item 5
+
+
+
+
+```
+
+There’s a lot going on in the example above. These are the key points:
+
+- The `ion-col` gets its width from the `size` attribute added to it, where the value of size is the number of columns to take up out of the total available columns. The default number of available columns is 12.
+
+- The `size` attribute can have a breakpoint added to it, `size-{breakpoint}`. This value sets the size for the specified breakpoint and above.
+
+For more information on customizing with grid, see the [Grid](/docs/layout/grid) documentation.
+
+## Storage
+
+Most apps at some point will need to store some sort of data locally. Whether it’s storing some JSON from an XHR request, or saving an auth token, there are many different storage options available. On top of this, if the app is running in a native environment, it is possible to create a full SQLite database and store data there. All of these different storage mechanisms have their own advantages and disadvantages, but Ionic developers should not have to worry about that.
+
+### Ionic Storage
+
+In this case, Ionic’s Storage library is a perfect candidate for the multi-environment use case. Built on top of the well tested LocalForage library, Ionic’s storage class provides an adaptable storage mechanism that will pick the best storage solution for the current run time.
+
+Currently this means it will run through SQLite for native, IndexedDB (if available), WebSql, or Local Storage. By handling all of this, it allows writing to storage using a stable API.
+
+```typescript
+class MyClass {
+ constructor(public storage: Storage) {}
+
+ async setData(key, value) {
+ const res = await this.storage.set(key, value);
+ console.log(res);
+ }
+
+ async getData(key) {
+ const keyVal = await this.storage.get(key);
+ console.log('Key is', keyVal);
+ }
+}
+```
+
+There are other storage solutions out there as well, such as PouchDB, which provide a similar, adaptable storage mechanism.
\ No newline at end of file
diff --git a/src/pages/da/building/ios.md b/src/pages/da/building/ios.md
new file mode 100644
index 0000000000..9c4fa3dc32
--- /dev/null
+++ b/src/pages/da/building/ios.md
@@ -0,0 +1,109 @@
+---
+previousText: 'Running Overview'
+previousUrl: '/docs/building/running'
+nextText: 'Running on Android'
+nextUrl: '/docs/building/android'
+---
+
+# iOS Development
+
+This guide covers how to deploy Ionic apps to iOS simulators and devices using [Capacitor](/docs/faq/glossary#capacitor) or [Cordova](/docs/faq/glossary#cordova).
+
+> There are two workflows for running Ionic apps on iOS: [Running with Xcode](#running-with-xcode) and [Running with the Ionic CLI](#running-with-the-ionic-cli). The Xcode approach is generally more stable, but the Ionic CLI approach offers [live-reload](/docs/faq/glossary#livereload) functionality.
+
+## Project Setup
+
+Before apps can be deployed to iOS simulators and devices, the native project must be configured.
+
+1. **Generate the native project, if it does not already exist.**
+
+ For Capacitor, run the following:
+
+```shell
+ $ ionic capacitor add ios
+```
+
+ For Cordova, run the following:
+
+
+```shell
+ $ ionic cordova prepare ios
+```
+
+1. **Set the [Package ID](/docs/faq/glossary#package-id).**
+
+ For Capacitor, open the `capacitor.config.json` file and modify the `appId` property.
+
+ For Cordova, open the `config.xml` file and modify the `id` attribute of the root element, ``. See [the Cordova documentation](https://cordova.apache.org/docs/en/latest/config_ref/#widget) for more information.
+
+2. **Open the project in **Xcode**.**
+
+ For Capacitor, run the following to open the app in Xcode:
+
+```shell
+ $ ionic capacitor open ios
+```
+
+ For Cordova, open Xcode. Use **File** » **Open** and locate the app. Open the app's `platforms/ios` directory.
+
+
+1. **In **Project navigator**, select the project root to open the project editor. Under the **Identity** section, verify that the Package ID that was set matches the Bundle Identifier.**
+
+ 
+
+2. **In the same project editor, under the **Signing** section, ensure **Automatically manage signing** is enabled.** Then, select a Development Team. Given a Development Team, Xcode will attempt to automatically prepare provisioning and signing.
+
+ 
+
+## Running with Xcode
+
+In this workflow, Xcode can automatically fix common compilation and signing issues that can occur.
+
+1. **Develop the Ionic app and sync it to the native project.**
+
+ With each meaningful change, Ionic apps must be built into web assets before the change can appear on iOS simulators and devices. The web assets then must be copied into the native project. Luckily, this process is made easy with a single Ionic CLI command.
+
+ For Capacitor, run the following:
+
+```shell
+ $ ionic capacitor copy ios
+```
+
+ For Cordova, run the following:
+
+
+```shell
+ $ ionic cordova prepare ios
+```
+
+1. **In Xcode, select a target simulator or device and click the play button.**
+
+ 
+
+## Running with the Ionic CLI
+
+The Ionic CLI can build, copy, and deploy Ionic apps to iOS simulators and devices with a single command. It can also spin up a development server, like the one used in `ionic serve`, to provide [live-reload](/docs/faq/glossary#livereload) functionality.
+
+For Cordova, run the following to start a long-running CLI process that boots up a live-reload server:
+
+```shell
+$ ionic cordova run ios -l
+```
+
+Now, when changes are made to the app's source files, web assets are rebuilt and the changes are reflected on the simulator or device without having to deploy again.
+
+## Using Safari Web Inspector
+
+Safari has Web Inspector support for iOS simulators and devices. Open the **Develop** menu and select the simulator or device, then select the Ionic App to open Web Inspector.
+
+> If the **Develop** menu is hidden, enable it in **Safari** » **Preferences** » **Advanced** » **Show Develop menu in menu bar**.
+
+
+
+## Viewing Native Logs
+
+Native logs can be found in Xcode in the **Console**.
+
+> If the **Console** is hidden, enable it in **View** » **Debug Area** » **Activate Console**.
+
+
\ No newline at end of file
diff --git a/src/pages/da/building/migration.md b/src/pages/da/building/migration.md
new file mode 100644
index 0000000000..3d76781021
--- /dev/null
+++ b/src/pages/da/building/migration.md
@@ -0,0 +1,281 @@
+---
+previousText: 'Scaffolding'
+previousUrl: '/docs/building/scaffolding'
+nextText: 'Cross Platform'
+nextUrl: '/docs/building/cross-platform'
+contributors:
+ - mhartington
+ - kensodemann
+ - elylucas
+---
+
+# Migration Guide
+
+> For a **complete list of breaking changes** from Ionic 3 to Ionic 4, please refer to [the breaking changes document](https://github.com/ionic-team/ionic/blob/master/angular/BREAKING.md) in the Ionic core repo.
+
+## Migrating from Ionic 3.0 to Ionic 4.0 - Overview
+
+We suggest the following general process when migrating an existing application from Ionic 3 to 4:
+
+1. Generate a new project using the `blank` starter (see [Starting an App](/docs/building/starting))
+2. Copy any Angular services from `src/providers` to `src/app/services`
+ - Services should include `{ providedIn: 'root' }` in the `@Injectable()` decorator. For details, please see Angular [provider docs](https://angular.io/guide/providers).
+3. Copy the app's other root level items (pipes, components, etc) keeping in mind that the directory structure changes from `src/components` to `src/app/components`, etc.
+4. Copy global Sass styling from `src/app/app.scss` to `src/global.scss`
+5. Copy the rest of the application, page by page or feature by feature, keeping the following items in mind:
+ - Emulated Shadow DOM is turned on by default
+ - Page/component Sass should no longer be wrapped in the page/component tag and should use Angular's [`styleUrls`](https://angular.io/api/core/Component#styleUrls) option of the `@Component` decorator
+ - RxJS has been updated from v5 to v6 (see [RxJS Changes](#rxjs-changes))
+ - Certain lifecycle hooks should be replaced by Angular's hooks (see [Lifecycle Events](#lifecycle-events))
+ - Markup changes may be required (migration tool available, see [Markup Changes](#markup-changes))
+
+In many cases, using the Ionic CLI to generate a new object and then copying the code also works very well. For example: `ionic g service weather` will create a shell `Weather` service and test. The code can then be copied from the older project with minor modifications as needed. This helps to ensure proper structure is followed. This also generates shells for unit tests.
+
+## Changes in Package Name
+
+In Ionic 4, the package name is `@ionic/angular`. Uninstall Ionic 3 and install Ionic 4 using the new package name:
+
+```shell
+$ npm uninstall ionic-angular
+$ npm install @ionic/angular
+```
+
+While migrating an app, update the imports from `ionic-angular` to `@ionic/angular`.
+
+## Project structure
+
+One of the major changes between an Ionic 3 app and an Ionic 4 app is the overall project layout and structure. In v3, Ionic apps had a custom convention for how an app should be setup and what that folder structure should look like. In v4, this has been changed to follow the recommended setup of each supported framework.
+
+For example, if an app is using Angular, that project structure will be exactly what an Angular CLI app would be. This change, while not too difficult to accommodate, helps to keep common patterns and documentation consistent.
+
+
+
+The above comparison is an example of a v4 app's project structure. For developers with experience in a vanilla Angular project, this should feel really familiar.
+
+There is a `src/` directory that acts as the home for the app. This includes the `index.html`, any assets, environment configuration, and any app specific config files.
+
+While migrating an app to take advantage of this new layout, it is suggested that a new project "base" is made with the CLI. Then, with the new project layout, migrate the features of the app piece by piece. Pages/components/etc. should be moved into the `src/app/` folder.
+
+Ensure your Ionic configuration file has the appropriate `type`. The project type for v3 is `ionic-angular`. The project type for v4 is `angular`. If this value is incorrect, the CLI may invoke the incorrect build scripts.
+
+See the following `ionic.config.json` as an example:
+
+```json
+{
+ "name": "my-app",
+ "type": "angular"
+}
+```
+
+## RxJS Changes
+
+Between V3 and V4, RxJS was updated to version 6. This changes many of the import paths of operators and core RxJS functions. Please see the RxJS Migration Guide for details.
+
+## Lifecycle Events
+
+With V4, we're now able to utilize the typical events provided by [Angular](https://angular.io/guide/lifecycle-hooks). But for certain cases, you might want to have access to the events fired when a component has finished animating during it's route change. In this case, the `ionViewWillEnter`, `ionViewDidEnter`, `ionViewWillLeave`, and `ionViewDidLeave` have been ported over from V3. Use these events to coordinate actions with Ionic's own animations system.
+
+Older events like `ionViewDidLoad`, `ionViewCanLeave`, and `ionViewCanEnter` have been removed, and the proper Angular alternatives should be used.
+
+For more details, checkout the [router-outlet docs](/docs/api/router-outlet)
+
+## Overlay Components
+
+In prior versions of Ionic, overlay components such as Loading, Toast, or Alert were created synchronously. In Ionic v4, these components are all created asynchronously. As a result of this, the API is now promise-based.
+
+```typescript
+// v3
+showAlert() {
+ const alert = this.alertCtrl.create({
+ message: "Hello There",
+ subHeader: "I'm a subheader"
+ });
+
+ alert.present();
+}
+```
+
+In v4, promises are used:
+
+```typescript
+showAlert() {
+ this.alertCtrl.create({
+ message: "Hello There",
+ subHeader: "I'm a subheader"
+ }).then(alert => alert.present());
+}
+
+// Or using async/await
+
+async showAlert() {
+ const alert = await this.alertCtrl.create({
+ message: "Hello There",
+ subHeader: "I'm a subheader"
+ });
+
+ await alert.present();
+}
+```
+
+## Navigation
+
+In V4, navigation received the most changes. Now, instead of using Ionic's own `NavController`, we integrate with the official Angular Router. This not only provides a consistent routing experience across apps, but is much more dependable. The Angular team has an excellent guide on their docs site that covers the Router in great detail.
+
+To provide the platform specific animations that users are used to, we have created `ion-router-outlet` for Angular Apps. This behaves in a similar manner to Angular's `router-outlet` but provides a stack-based navigation (tabs) and animations.
+
+For a detailed explanation in navigation works in a V4 project, checkout the [Angular navigation guide](/docs/navigation/angular).
+
+## Lazy Loading
+
+Since Navigation has changed, the mechanism for lazy loading has also changed in V4.
+
+In v3, a typical lazy loading setup worked like this:
+
+```typescript
+// home.page.ts
+@IonicPage({
+ segment: 'home'
+})
+@Component({ ... })
+export class HomePage {}
+
+// home.module.ts
+@NgModule({
+ declarations: [HomePage],
+ imports: [IonicPageModule.forChild(HomePage)]
+})
+export class HomePageModule {}
+```
+
+However, in v4, lazy loading is done via the `loadChildren` method of the Angular router:
+
+```typescript
+// home.module.ts
+@NgModule({
+ imports: [
+ IonicModule,
+ RouterModule.forChild([{ path: '', component: HomePage }])
+ ],
+ declarations: [HomePage]
+})
+export class HomePageModule {}
+
+// app.module.ts
+@NgModule({
+ declarations: [AppComponent],
+ imports: [
+ BrowserModule,
+ IonicModule.forRoot(),
+ RouterModule.forRoot([
+ { path: 'home', loadChildren: './pages/home/home.module#HomePageModule' },
+ { path: '', redirectTo: 'home', pathMatch: 'full' }
+ ])
+ ],
+ bootstrap: [AppComponent]
+})
+export class AppModule {}
+```
+
+For a detailed explanation of lazy loading in V4 project, check out the [Angular navigation guide](docs/navigation/angular#lazy-loading-routes).
+
+## Markup Changes
+
+Since v4 moved to Custom Elements, there's been a significant change to the markup for each component. These changes have all been made to follow the Custom Elements spec, and have been documented in a dedicated file on GitHub.
+
+To help with these markup changes, we've released a TSLint-based Migration Tool, which detects issues and can even fix some of them automatically.
+
+## Migrating from Ionic 1.0 to Ionic 4.0 - Overview
+
+### Ionic 1.0 to Ionic 4.0: What’s Involved?
+
+Migrating from Ionic 1 to Ionic 4.0 involves moving from AngularJS (aka Angular 1) to Angular 7+. There are many architectural differences between these versions, so some of the app code will have to be rewritten. The amount of work involved depends on the complexity and size of your app.
+
+One upside is that for the most part, the Ionic UI components you know and love from V1 haven’t changed much.
+
+Here are some considerations to review before beginning the upgrade:
+
+- **App complexity**: Naturally, the larger and more complex the app is, the longer it will take to migrate.
+- **Framework support**: In 2019, Ionic will release full support for React and Vue. You can also use Ionic Framework components [without a framework](/docs/installation/cdn/). Since these are not production ready yet, we recommend sticking with Angular or waiting until the other framework support is available.
+- **Budget and team makeup**: The length of a migration project will vary based on the size of your team, the complexity of the app, and the amount of time allotted to make the transition.
+
+### Suggested Strategy
+
+Once your development team has identified a good time frame for beginning the migration, Ionic recommends feature-freezing the Ionic 1 application and getting the code in order: Fix any major bugs, eliminate tech debt, and reorganize as you see fit. Then, identify which features to migrate over and which to abandon.
+
+Once the Ionic 1 app is stable, create a new Ionic 4.0 project. The majority of the dev team’s attention should be given to the new project; only bugs should be fixed in the Ionic 1 app to ensure that the transition happens as quickly and smoothly as possible.
+
+Once the team is comfortable that the Ionic 4.0 app has become stable and has fulfilled a core set of features, you can then shut down the Ionic 1 app.
+
+### Moving From AngularJS to Angular
+
+Please reference official [Angular upgrade guide](https://angular.io/guide/upgrade) information.
+
+### Ionic Changes
+
+Our Ionic 3.0 to Ionic 4.0 migration sections above may prove to be a useful reference. Generate a new Ionic 4.0 project using the blank starter (see [Starting an App](/docs/building/starting). Spend time getting familiar with Ionic 4.0 components. Happy building!
+
+### Need Assistance?
+
+If your team would like assistance with the migration, please [reach out to us](https://ionicframework.com/enterprise-engine)! Ionic offers Advisory Services, which includes Ionic 4.0 training, architecture reviews, and migration assistance.
\ No newline at end of file
diff --git a/src/pages/da/building/running.md b/src/pages/da/building/running.md
new file mode 100644
index 0000000000..4d05becb7c
--- /dev/null
+++ b/src/pages/da/building/running.md
@@ -0,0 +1,64 @@
+---
+previousText: 'Cross Platform'
+previousUrl: '/docs/building/cross-platform'
+nextText: 'Running on iOS'
+nextUrl: '/docs/building/ios'
+---
+
+# Running An App
+
+There are many different options to test native functionality depending on your target platforms and needs.
+
+* Implement [Platform Detection](/docs/building/cross-platform) for the native functionality and test with `ionic serve`
+* [Deploy to iOS](/docs/building/ios)
+* [Deploy to Android](/docs/building/android)
+* Deploy to iOS & Android instantly using [Ionic DevApp](/docs/building/running#ionic-devapp)
+
+This article will focus on Ionic DevApp, as it includes the ability to test native functionality on a device.
+
+## Ionic DevApp
+
+Ionic DevApp extends the capabilities of Ionic Framework, making it easy to test apps directly on devices. DevApp offers a realtime view of changes as they're being made, with a rich library of pre-installed native plugins to test native features of the app.
+
+There's no need to install complicated Native SDKs - all it takes is one simple command, `ionic serve`, and apps running anywhere DevApp is installed will be immediately available to preview, with LiveReload to refresh changes as soon as they're made.
+
+### Getting started
+
+First, download the Ionic DevApp. It is available in the iOS App Store as well as Google Play
+
+
+
+
+
+
+
+
+With DevApp installed, sign up or login to an Ionic Account.
+
+> DevApp is a free service that comes with every Ionic Account.
+
+## Serving the App
+
+Make sure the device running DevApp and the computer are on the same network, then run `ionic serve` from the command line in the project's directory.
+
+ionic serve
+
+> ng run app:serve --host=0.0.0.0 --port=8100
+>
+> [INFO] Development server running!
+>
+> Local: http://localhost:8100
+> External: http://192.168.1.169:8100
+> DevApp: StarTrack-ng@8100 on ionic-home-router.network
+>
+> Use Ctrl+C to quit this process
+>
+> [INFO] Browser window opened to http://localhost:8100!
+
+With `ionic serve` running, open DevApp and select the app from the currently running app list.
+
+
+
+Now if the app calls any native functionality, DevApp can handle this and actually return the correct native implementation.
+
+DevApp has a select list of plugin it supports, so check out the [DevApp docs](https://ionicframework.com/docs/pro/devapp/) for a complete list.
\ No newline at end of file
diff --git a/src/pages/da/building/scaffolding.md b/src/pages/da/building/scaffolding.md
new file mode 100644
index 0000000000..3412f41c9a
--- /dev/null
+++ b/src/pages/da/building/scaffolding.md
@@ -0,0 +1,60 @@
+---
+previousText: 'Starting'
+previousUrl: '/docs/building/starting'
+nextText: 'Migration'
+nextUrl: '/docs/building/migration'
+contributors:
+ - mhartington
+ - brandyscarney
+---
+
+# Scaffolding out an App
+
+Once an app is created by the Ionic CLI, the next step is to start building out features and components. The majority of the app will be developed in the `src/app/` directory.
+
+## Project Structure
+
+
+
+The `src/` directory has items such as the `index.html` file, configuration files for tests, an asset folder for images, and the main `app/` directory for the app's code.
+
+
+
+The `src/app/` directory contains the root app component and module as well as additional directories that contain app features such as pages, components, services, etc.
+
+## Generating New Features
+
+The Ionic CLI can generate new app features with the [`ionic generate`](/docs/cli/commands/generate) command. By running `ionic generate` in the command line, a selection prompt is displayed which lists the available features that can be generated.
+
+ionic generate?What would you like to generate?
+❯ page
+ component
+ service
+ module
+ class
+ directive
+ guard
+
+After a selection is made, the Ionic CLI will prompt for a name. The name can be a path, allowing easy generation of features within an organized project structure.
+
+> Any level of nesting is allowed, such as `portfolio/intro`. You can easily scope components to pages by using `ionic g component "portfolio/intro/About Me"`, for example.
+
+ionic generate?What would you like to generate? page
+?Name/path of page: portfolio
+
+Alternatively, the `type` and `name` of the generated feature can be entered on the command line:
+
+ionic g page "User Detail" > ng generate page "User Detail"
+CREATE src/app/user-detail/user-detail.module.ts (564 bytes)
+CREATE src/app/user-detail/user-detail.page.scss (0 bytes)
+CREATE src/app/user-detail/user-detail.page.html (138 bytes)
+CREATE src/app/user-detail/user-detail.page.spec.ts (720 bytes)
+CREATE src/app/user-detail/user-detail.page.ts (280 bytes)
+UPDATE src/app/app-routing.module.ts (475 bytes)
+[OK] Generated page!
+
+The Ionic CLI uses the underlying framework tooling to stay close to best practices. For `@ionic/angular`, the Angular CLI is used under the hood.
+
+After creating the files and directories for the new page, the CLI will also update the router configuration to include the new page. This reduces the amount of manual work needed to keep the development lifecycle moving.
+
+For more details, run `ionic g --help` from the command line or see [the documentation](/docs/cli/commands/generate) for `ionic generate`.
\ No newline at end of file
diff --git a/src/pages/da/building/starting.md b/src/pages/da/building/starting.md
new file mode 100644
index 0000000000..762985b79a
--- /dev/null
+++ b/src/pages/da/building/starting.md
@@ -0,0 +1,40 @@
+---
+nextText: 'Scaffolding'
+nextUrl: '/docs/building/scaffolding'
+contributors:
+ - dwieeb
+---
+
+# Starting an App
+
+Starting a new Ionic app is incredibly simple. From the command line, run the `ionic start` command and the CLI will handle the rest.
+
+ionic start
+Every great app needs a name! 😍
+
+Please enter the full name of your app. You can change this at any time. To bypass this prompt next time, supply name, the first argument to ionic start.
+
+?Project name:
+
+
+The Ionic CLI will display prompts asking for the new project's name and which template to use. These details can be provided as command arguments:
+
+```shell
+$ ionic start myApp tabs
+```
+
+Here, `myApp` is the name of the project, `tabs` is the starter template, and the project type is `angular`.
+
+`tabs` is not the only project template available. Between all project types, there are three templates available:
+
+- `tabs`: A tabs based layout
+- `sidemenu`: A sidemenu based layout
+- `blank`: An empty project with a single page
+
+See all available templates with the following command:
+
+```shell
+$ ionic start --list
+```
+
+These templates provide a great starting point for any app and include all the best practices for making a code base scale.
\ No newline at end of file
diff --git a/src/pages/da/building/storage.md b/src/pages/da/building/storage.md
new file mode 100644
index 0000000000..a55f933424
--- /dev/null
+++ b/src/pages/da/building/storage.md
@@ -0,0 +1,198 @@
+---
+previousText: 'Web View'
+previousUrl: '/docs/building/webview'
+---
+
+# Storage
+
+Storage is an easy way to store key/value pairs and JSON objects. Storage uses a variety of storage engines underneath, picking the best one available depending on the platform.
+
+When running in a native app context, Storage will prioritize using SQLite, as it's one of the most stable and widely used file-based databases, and avoids some of the pitfalls of things like localstorage and IndexedDB, such as the OS deciding to clear out such data in low disk-space situations.
+
+When running in the web or as a Progressive Web App, Storage will attempt to use IndexedDB, WebSQL, and localstorage, in that order.
+
+## Usage
+
+First, if you'd like to use SQLite, install the cordova-sqlite-storage plugin:
+
+```bash
+ionic cordova plugin add cordova-sqlite-storage
+```
+
+Next, install the package (comes by default for Ionic apps > Ionic V1):
+
+```bash
+npm install --save @ionic/storage
+```
+
+Next, add it to the imports list in your `NgModule` declaration (for example, in `src/app/app.module.ts`):
+
+```typescript
+import { IonicStorageModule } from '@ionic/storage';
+
+@NgModule({
+ declarations: [
+ // ...
+ ],
+ imports: [
+ BrowserModule,
+ IonicModule.forRoot(MyApp),
+ IonicStorageModule.forRoot()
+ ],
+ bootstrap: [IonicApp],
+ entryComponents: [
+ // ...
+ ],
+ providers: [
+ // ...
+ ]
+})
+export class AppModule {}
+```
+
+Finally, inject it into any of your components or pages:
+
+```typescript
+import { Storage } from '@ionic/storage';
+
+export class MyApp {
+ constructor(private storage: Storage) { }
+
+ ...
+
+ // set a key/value
+ storage.set('name', 'Max');
+
+ // Or to get a key/value pair
+ storage.get('age').then((val) => {
+ console.log('Your age is', val);
+ });
+}
+```
+
+### Configuring Storage
+
+The Storage engine can be configured both with specific storage engine priorities, or custom configuration options to pass to localForage. See the localForage config docs for possible options: https://github.com/localForage/localForage#configuration
+
+Note: Any custom configurations will be merged with the default configuration
+
+```typescript
+import { IonicStorageModule } from '@ionic/storage';
+
+@NgModule({
+ declarations: [...],
+ imports: [
+ IonicStorageModule.forRoot({
+ name: '__mydb',
+driverOrder: ['indexeddb', 'sqlite', 'websql']
+ })
+ ],
+ bootstrap: [...],
+ entryComponents: [...],
+ providers: [...]
+})
+export class AppModule { }
+```
+
+## Instance Members
+
+### constructor
+
+Create a new Storage instance using the order of drivers and any additional config options to pass to LocalForage.
+
+Possible driver options are: ['sqlite', 'indexeddb', 'websql', 'localstorage'] and the default is that exact ordering.
+
+
+
+
+### driver
+
+Get the name of the driver being used.
+
+
+
+
+### clear()
+
+Clear the entire key value store. WARNING: HOT!
+
+**Returns:** Returns a promise that resolves when the store is cleared
+
+
+
+
+### forEach()
+
+Iterate through each key,value pair.
+
+**Returns:** Returns a promise that resolves when the iteration has finished.
+
+
Parameters
+
+
iteratorCallback
a callback of the form (value, key, iterationNumber)
+
+
+
+
+
+### get()
+
+Get the value associated with the given key.
+
+**Returns:** Returns a promise with the value of the given key
+
+
Parameters
+
+
key
Type:string
the key to identify this value
+
+
+
+
+
+### keys()
+
+**Returns:** Returns a promise that resolves with the keys in the store.
+
+
+
+
+### length()
+
+**Returns:** Returns a promise that resolves with the number of keys stored.
+
+
+
+
+### ready()
+
+Reflect the readiness of the store.
+
+**Returns:** Returns a promise that resolves when the store is ready
+
+
+
+
+### remove()
+
+Remove any value associated with this key.
+
+**Returns:** Returns a promise that resolves when the value is removed
+
+
Parameters
+
+
key
Type:string
the key to identify this value
+
+
+
+
+
+### set()
+
+Set the value for the given key.
+
+**Returns:** Returns a promise that resolves when the key and value are set
+
+
Parameters
+
+
key
Type:string
the key to identify this value
value
Type:any
the value for this key
+
diff --git a/src/pages/da/building/testing.md b/src/pages/da/building/testing.md
new file mode 100644
index 0000000000..edeee68480
--- /dev/null
+++ b/src/pages/da/building/testing.md
@@ -0,0 +1,618 @@
+---
+previousText: 'Running on Android'
+previousUrl: '/docs/building/android'
+nextText: 'Contributing'
+nextUrl: '/docs/building/contributing'
+contributors:
+ - kensodemann
+---
+
+# Testing
+
+When an `@ionic/angular` application is generated using the Ionic CLI, it is automatically set up for unit testing and end-to-end testing of the application. This is the same setup that is used by the Angular CLI. Refer to the Angular Testing Guide for detailed information on testing Angular applications.
+
+## Testing Principles
+
+When testing an application, it is best to keep in mind that testing can show if defects are present in a system. However, it is impossible to prove that any non-trivial system is completely free of defects. For this reason, the goal of testing is not to verify that the code is correct but to find problems within the code. This is a subtle but important distinction.
+
+If we set out to prove that the code is correct, we are more likely to stick to the happy path through the code. If we set out to find problems, we are more likely to more fully exercise the code and find the bugs that are lurking there.
+
+It is also best to begin testing an application from the very start. This allows defects to be found early in the process when they are easier to fix. This also allows code to be refactored with confidence as new features are added to the system.
+
+## Unit Testing
+
+Unit tests exercise a single unit of code (component, page, service, pipe, etc) in isolation from the rest of the system. Isolation is achieved through the injection of mock objects in place of the code's dependencies. The mock objects allow the test to have fine-grained control of the outputs of the dependencies. The mocks also allow the test to determine which dependencies have been called and what has been passed to them.
+
+Well-written unit tests are structured such that the unit of code and the features it contains are described via `describe()` callbacks. The requirements for the unit of code and its features are tested via `it()` callbacks. When the descriptions for the `describe()` and `it()` callbacks are read, they make sense as a phrase. When the descriptions for nested `describe()`s and a final `it()` are concatenated together, they form a sentence that fully describes the test case.
+
+Since unit tests exercise the code in isolation, they are fast, robust, and allow for a high degree of code coverage.
+
+### Using Mocks
+
+Unit tests exercise a code module in isolation. To facilitate this, we recommend using Jasmine (https://jasmine.github.io/). Jasmine creates mock objects (which Jasmine calls "spies") to take the place of dependencies while testing. When a mock object is used, the test can control the values returned by calls to that dependency, making the current test independent of changes made to the dependency. This also makes the test setup easier, allowing the test to only be concerned with the code within the module under test.
+
+Using mocks also allows the test to query the mock to determine if it was called and how it was called via the `toHaveBeenCalled*` set of functions. Tests should be as specific as possible with these functions, favoring calls to `toHaveBeenCalledTimes` over calls to `toHaveBeenCalled` when testing that a method has been called. That is `expect(mock.foo).toHaveBeenCalledTimes(1)` is better than `expect(mock.foo).toHaveBeenCalled()`. The opposite advice should be followed when testing that something has not been called (`expect(mock.foo).not.toHaveBeenCalled()`).
+
+There are two common ways to create mock objects in Jasmine. Mock objects can be constructed from scratch using `jasmine.createSpy` and `jasmine.createSpyObj` or spies can be installed onto existing objects using `spyOn()` and `spyOnProperty()`.
+
+#### Using `jasmine.createSpy` and `jasmine.createSpyObj`
+
+`jasmine.createSpyObj` creates a full mock object from scratch with a set of mock methods defined on creation. This is useful in that it is very simple. Nothing needs to be constructed or injected into the test. The disadvantage of using this function is that it allows the creation of objects that may not match the real objects.
+
+`jasmine.createSpy` is similar but it creates a stand-alone mock function.
+
+#### Using `spyOn()` and `spyOnProperty()`
+
+`spyOn()` installs the spy on an existing object. The advantage of using this technique is that if an attempt is made to spy on a method that does not exist on the object, an exception is raised. This prevents the test from mocking methods that do not exist. The disadvantage is that the test needs a fully formed object to begin with, which may increase the amount of test setup required.
+
+`spyOnProperty()` is similar with the difference being that it spies on a property and not a method.
+
+### General Testing Structure
+
+Unit tests are contained in `spec` files with one `spec` file per entity (component, page, service, pipe, etc.). The `spec` files live side-by-side with and are named after the source that they are testing. For example, if the project has a service called WeatherService, the code for it is in a file named `weather.service.ts` with the tests in a file named `weather.service.spec.ts`. Both of those files are in the same folder.
+
+The `spec` files themselves contain a single `describe` call that defines that overall test. Nested within it are other `describe` calls that define major areas of functionality. Each `describe` call can contain setup and teardown code (generally handled via `beforeEach` and `afterEach` calls), more `describe` calls forming a hierarchical breakdown of functionality, and `it` calls which define individual test cases.
+
+The `describe` and `it` calls also contain a descriptive text label. In well-formed tests, the `describe` and `it` calls combine with their labels to perform proper phrases and the full label for each test case, formed by combining the `describe` and `it` labels, creates a full sentence.
+
+For example:
+
+```TypeScript
+describe('Calculation', () => {
+ describe('divide', () => {
+ it('calculates 4 / 2 properly' () => {});
+ it('cowardly refuses to divide by zero' () => {});
+ ...
+ });
+
+ describe('multiply', () => {
+ ...
+ });
+});
+```
+
+The outer `describe` call states that the `Calculation` service is being tested, the inner `describe` calls state exactly what functionality is being tested, and the `it` calls state what the test cases are. When run the full label for each test case is a sentence that makes sense (Calculation divide cowardly refuses to divide by zero).
+
+### Pages and Components
+
+Pages are just Angular components. Thus, pages and components are both tested using [Angular's Component Testing](https://angular.io/guide/testing#component-test-basics) guidelines.
+
+Since pages and components contain both TypeScript code and HTML template markup it is possible to perform both component class testing and component DOM testing. When a page is created, the template test that is generated looks like this:
+
+```TypeScript
+import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { TabsPage } from './tabs.page';
+
+describe('TabsPage', () => {
+ let component: TabsPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ TestBed.configureTestingModule({
+ declarations: [TabsPage],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ }).compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TabsPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
+```
+
+When doing component class testing, the component object is accessed using the component object defined via `component = fixture.componentInstance;`. This is an instance of the component class. When doing DOM testing, the `fixture.nativeElement` property is used. This is the actual `HTMLElement` for the component, which allows the test to use standard HTML API methods such as `HTMLElement.querySelector` in order to examine the DOM.
+
+## Services
+
+Services often fall into one of two broad categories: utility services that perform calculations and other operations, and data services that perform primarily HTTP operations and data manipulation.
+
+### Basic Service Testing
+
+The suggested way to test most services is to instantiate the service and manually inject mocks for any dependency the service has. This way, the code can be tested in isolation.
+
+Let's say that there is a service with a method that takes an array of timecards and calculates net pay. Let's also assume that the tax calculations are handled via another service that the current service depends on. This payroll service could be tested as such:
+
+```TypeScript
+import { PayrollService } from './payroll.service';
+
+describe('PayrollService', () => {
+ let service: PayrollService;
+ let taxServiceSpy;
+
+ beforeEach(() => {
+ taxServiceSpy = jasmine.createSpyObj('TaxService', {
+ federalIncomeTax: 0,
+ stateIncomeTax: 0,
+ socialSecurity: 0,
+ medicare: 0
+ });
+ service = new PayrollService(taxServiceSpy);
+ });
+
+ describe('net pay calculations', () => {
+ ...
+ });
+});
+```
+
+This allows the test to control the values returned by the various tax calculations via mock setup such as `taxServiceSpy.federalIncomeTax.and.returnValue(73.24)`. This allows the "net pay" tests to be independent of the tax calculation logic. When the tax codes change, only the tax service related code and tests need to change. The tests for the net pay can continue to operate as they are since these tests do not care how the tax is calculated, just that the value is applied properly.
+
+The scaffolding that is used when a service is generated via `ionic g service name` uses Angular's testing utilities and sets up a testing module. Doing so is not strictly necessary. That code may be left in, however, allowing the service to be built manually or injected as such:
+
+```TypeScript
+import { TestBed, inject } from '@angular/core/testing';
+
+import { PayrollService } from './payroll.service';
+import { TaxService } from './tax.service';
+
+describe('PayrolService', () => {
+ let taxServiceSpy;
+
+ beforeEach(() => {
+ taxServiceSpy = jasmine.createSpyObj('TaxService', {
+ federalIncomeTax: 0,
+ stateIncomeTax: 0,
+ socialSecurity: 0,
+ medicare: 0
+ });
+ TestBed.configureTestingModule({
+ providers: [
+ PayrollService,
+ { provide: TaxService, useValue: taxServiceSpy }
+ ]
+ });
+ });
+
+ it('does some test where it is injected',
+ inject([PayrollService], (service: PayrollService) => {
+ expect(service).toBeTruthy();
+ })
+ );
+
+ it('does some test where it is manually built', () => {
+ const service = new PayrollService(taxServiceSpy);
+ expect(service).toBeTruthy();
+ });
+});
+```
+
+#### Testing HTTP Data Services
+
+Most services that perform HTTP operations will use Angular's HttpClient service in order to perform those operations. For such tests, it is suggested to use Angular's `HttpClientTestingModule`. For detailed documentation of this module, please see Angular's Angular's Testing HTTP requests guide.
+
+This basic setup for such a test looks like this:
+
+```TypeScript
+import {
+ HttpBackend,
+ HttpClient
+} from '@angular/common/http';
+import {
+ HttpTestingController,
+ HttpClientTestingModule
+} from '@angular/common/http/testing';
+import { TestBed, inject } from '@angular/core/testing';
+
+import { IssTrackingDataService } from './iss-tracking-data.service';
+
+describe('IssTrackingDataService', () => {
+ let httpClient: HttpClient;
+ let httpTestingController: HttpTestingController;
+ let issTrackingDataService: IssTrackingDataService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [HttpClientTestingModule],
+ providers: [
+ IssTrackingDataService
+ ]
+ });
+
+ httpClient = TestBed.get(HttpClient);
+ httpTestingController = TestBed.get(HttpTestingController);
+ issTrackingDataService = new IssTrackingDataService(httpClient);
+ });
+
+ it('exists', inject([IssTrackingDataService], (service: IssTrackingDataService) => {
+ expect(service).toBeTruthy();
+ }));
+
+ describe('location', () => {
+ it('gets the location of the ISS now', () => {
+ issTrackingDataService.location().subscribe(x => {
+ expect(x).toEqual({ longitude: -138.1719, latitude: 44.4423 });
+ });
+ const req = httpTestingController.expectOne(
+ 'http://api.open-notify.org/iss-now.json'
+ );
+ expect(req.request.method).toEqual('GET');
+ req.flush({
+ iss_position: { longitude: '-138.1719', latitude: '44.4423' },
+ timestamp: 1525950644,
+ message: 'success'
+ });
+ httpTestingController.verify();
+ });
+ });
+});
+```
+
+### Pipes
+
+A pipe is like a service with a specifically defined interface. It is a class that contains one public method, `transform`, which manipulates the input value (and other optional arguments) in order to create the output that is rendered on the page. To test a pipe: instantiate the pipe, call the transform method, and verify the results.
+
+As a simple example, let's look at a pipe that takes a `Person` object and formats the name. For the sake of simplicity, let's say a `Person` consists of an `id`, `firstName`, `lastName`, and `middleInitial`. The requirements for the pipe are to print the name as "Last, First M." handling situations where a first name, last name, or middle initial do not exist. Such a test might look like this:
+
+```TypeScript
+import { NamePipe } from './name.pipe';
+
+import { Person } from '../../models/person';
+
+describe('NamePipe', () => {
+ let pipe: NamePipe;
+ let testPerson: Person;
+
+ beforeEach(() => {
+ pipe = new NamePipe();
+ testPerson = {
+ id: 42,
+ firstName: 'Douglas',
+ lastName: 'Adams',
+ middleInitial: 'N'
+ };
+ });
+
+ it('exists', () => {
+ expect(pipe).toBeTruthy();
+ });
+
+ it('formats a full name properly', () => {
+ expect(pipe.transform(testPerson)).toBeEqual('Adams, Douglas N.');
+ });
+
+ it('handles having no middle initial', () => {
+ delete testPerson.middleInitial;
+ expect(pipe.transform(testPerson)).toBeEqual('Adams, Douglas');
+ });
+
+ it('handles having no first name', () => {
+ delete testPerson.firstName;
+ expect(pipe.transform(testPerson)).toBeEqual('Adams N.');
+ });
+
+ it('handles having no last name', () => {
+ delete testPerson.lastName;
+ expect(pipe.transform(testPerson)).toBeEqual('Douglas N.');
+ });
+});
+```
+
+It is also beneficial to exercise the pipe via DOM testing in the components and pages that utilize the pipe.
+
+## End-to-end Testing
+
+End-to-end testing is used to verify that an application works as a whole and often includes a connection to live data. Whereas unit tests focus on code units in isolation and thus allow for low-level testing of the application logic, end-to-end tests focus on various user stories or usage scenarios, providing high-level testing of the overall flow of data through the application. Whereas unit tests try to uncover problems with an application's logic, end-to-end tests try to uncover problems that occur when those individual units are used together. End-to-end tests uncover problems with the overall architecture of the application.
+
+Since end-to-end tests exercise user stories and cover the application as a whole rather than individual code modules, end-to-end tests exist in their own application in the project apart from the code for the main application itself. Most end-to-end tests operate by automating common user interactions with the application and examining the DOM to determine the results of those interactions.
+
+### Test Structure
+
+When an `@ionic/angular` application is generated, a default end-to-end test application is generated in the `e2e` folder. This application uses [Protractor]() to control the browser and [Jasmine]() to structure and execute the tests. The application initially consists of four files:
+
+- `protractor.conf.js` - the Protractor configuration file
+- `tsconfig.e2e.json` - specific TypeScript configuration for the testing application
+- `src/app.po.ts` - a page object containing methods that navigate the application, query elements in the DOM, and maninpulate elements on the page
+- `src/app.e2e-spec.ts` - a testing script
+
+#### Page Objects
+
+End-to-end tests operate by automating common user interactions with the application, waiting for the application to respond, and examining the DOM to determine the results of the interaction. This involves a lot of DOM manipulation and examination. If this were all done manually, the tests would be very brittle and difficult to read and maintain.
+
+Page objects encapsulate the HTML for a single page in a TypeScript class, providing an API that the test scripts use to interact with the application. The encapsulation of the DOM manipulation logic in page objects makes the tests more readable and far easier to reason about, lowering the maintenance costs of the test. Creating well-crafted page objects is the key to creating high quality and maintainable end-to-end tests.
+
+##### Base Page Object
+
+A lot of tests rely on actions such as waiting for a page to be visible, entering text into an input, and clicking a button. The methods used to do this remain consistent with only the CSS selectors used to get the appropriate DOM element changing. Therefore it makes sense to abstract this logic into a base class that can be used by the other page objects.
+
+Here is an example that implements a few basic methods that all page objects will need to support.
+
+```TypeScript
+import { browser, by, element, ExpectedConditions } from 'protractor';
+
+export class PageObjectBase {
+ private path: string;
+ protected tag: string;
+
+ constructor(tag: string, path: string) {
+ this.tag = tag;
+ this.path = path;
+ }
+
+ load() {
+ return browser.get(this.path);
+ }
+
+ rootElement() {
+ return element(by.css(this.tag));
+ }
+
+ waitUntilInvisible() {
+ browser.wait(ExpectedConditions.invisibilityOf(this.rootElement()), 3000);
+ }
+
+ waitUntilPresent() {
+ browser.wait(ExpectedConditions.presenceOf(this.rootElement()), 3000);
+ }
+
+ waitUntilNotPresent() {
+ browser.wait(
+ ExpectedConditions.not(ExpectedConditions.presenceOf(this.rootElement())),
+ 3000
+ );
+ }
+
+ waitUntilVisible() {
+ browser.wait(ExpectedConditions.visibilityOf(this.rootElement()), 3000);
+ }
+
+ getTitle() {
+ return element(by.css(`${this.tag} ion-title`)).getText();
+ }
+
+ protected enterInputText(sel: string, text: string) {
+ const el = element(by.css(`${this.tag} ${sel}`));
+ const inp = el.element(by.css('input'));
+ inp.sendKeys(text);
+ }
+
+ protected enterTextareaText(sel: string, text: string) {
+ const el = element(by.css(`${this.tag} ${sel}`));
+ const inp = el.element(by.css('textarea'));
+ inp.sendKeys(text);
+ }
+
+ protected clickButton(sel: string) {
+ const el = element(by.css(`${this.tag} ${sel}`));
+ browser.wait(ExpectedConditions.elementToBeClickable(el));
+ el.click();
+ }
+}
+```
+
+##### Per-Page Abstractions
+
+Each page in the application will have its own page object class that abstracts the elements on that page. If a base page object class is used, creating the page object involves mostly creating custom methods for elements that are specific to that page. Often, these custom elements take advantage of methods in the base class in order to perform the work that is required.
+
+Here is an example page object for a simple but typical login page. Notice that many of the methods, such as `enterEMail()`, call methods in the base class that perform the bulk of the work.
+
+```TypeScript
+import { browser, by, element, ExpectedConditions } from 'protractor';
+import { PageObjectBase } from './base.po';
+
+export class LoginPage extends PageObjectBase {
+ constructor() {
+ super('app-login', '/login');
+ }
+
+ waitForError() {
+ browser.wait(
+ ExpectedConditions.presenceOf(element(by.css('.error'))),
+ 3000
+ );
+ }
+
+ getErrorMessage() {
+ return element(by.css('.error')).getText();
+ }
+
+ enterEMail(email: string) {
+ this.enterInputText('#email-input', email);
+ }
+
+ enterPassword(password: string) {
+ this.enterInputText('#password-input', password);
+ }
+
+ clickSignIn() {
+ this.clickButton('#signin-button');
+ }
+}
+```
+
+#### Testing Scripts
+
+Similar to unit tests, end-to-end test scripts consist of nested `describe()` and `it()` functions. In the case of end-to-end tests, the `describe()` functions generally denote specific scenarios with the `it()` functions denoting specific behaviors that should be exhibited by the application as actions are performed within that scenario.
+
+Also similar to unit tests, the labels used in the `describe()` and `it()` functions should make sense both with the "describe" or "it" and when concatenated together to form the complete test case.
+
+Here is a sample end-to-end test script that exercises some typical login scenarios.
+
+```TypeScript
+import { AppPage } from '../page-objects/pages/app.po';
+import { AboutPage } from '../page-objects/pages/about.po';
+import { CustomersPage } from '../page-objects/pages/customers.po';
+import { LoginPage } from '../page-objects/pages/login.po';
+import { MenuPage } from '../page-objects/pages/menu.po';
+import { TasksPage } from '../page-objects/pages/tasks.po';
+
+describe('Login', () => {
+ const about = new AboutPage();
+ const app = new AppPage();
+ const customers = new CustomersPage();
+ const login = new LoginPage();
+ const menu = new MenuPage();
+ const tasks = new TasksPage();
+
+ beforeEach(() => {
+ app.load();
+ });
+
+ describe('before logged in', () => {
+ it('displays the login screen', () => {
+ expect(login.rootElement().isDisplayed()).toEqual(true);
+ });
+
+ it('allows in-app navigation to about', () => {
+ menu.clickAbout();
+ about.waitUntilVisible();
+ login.waitUntilInvisible();
+ });
+
+ it('does not allow in-app navigation to tasks', () => {
+ menu.clickTasks();
+ app.waitForPageNavigation();
+ expect(login.rootElement().isDisplayed()).toEqual(true);
+ });
+
+ it('does not allow in-app navigation to customers', () => {
+ menu.clickCustomers();
+ app.waitForPageNavigation();
+ expect(login.rootElement().isDisplayed()).toEqual(true);
+ });
+
+ it('displays an error message if the login fails', () => {
+ login.enterEMail('test@test.com');
+ login.enterPassword('bogus');
+ login.clickSignIn();
+ login.waitForError();
+ expect(login.getErrorMessage()).toEqual(
+ 'The password is invalid or the user does not have a password.'
+ );
+ });
+
+ it('navigates to the tasks page if the login succeeds', () => {
+ login.enterEMail('test@test.com');
+ login.enterPassword('testtest');
+ login.clickSignIn();
+ tasks.waitUntilVisible();
+ });
+ });
+
+ describe('once logged in', () => {
+ beforeEach(() => {
+ tasks.waitUntilVisible();
+ });
+
+ it('allows navigation to the customers page', () => {
+ menu.clickCustomers();
+ customers.waitUntilVisible();
+ tasks.waitUntilInvisible();
+ });
+
+ it('allows navigation to the about page', () => {
+ menu.clickAbout();
+ about.waitUntilVisible();
+ tasks.waitUntilInvisible();
+ });
+
+ it('allows navigation back to the tasks page', () => {
+ menu.clickAbout();
+ tasks.waitUntilInvisible();
+ menu.clickTasks();
+ tasks.waitUntilVisible();
+ });
+ });
+});
+```
+
+### Configuration
+
+The default configuration uses the same `environment.ts` file that is used for development. In order to provide better control over the data used by the end-to-end tests, it is often useful to create a specific environment for testing and use that environment for the tests. This section shows one possible way to create this configuration.
+
+#### Testing Environment
+
+Setting up a testing environment involves creating a new environment file that uses a dedicated testing backend, updating the `angular.json` file to use that environment, and modifying the `e2e` script in the `package.json` to specify the `test` environment.
+
+##### Create the `environment.e2e.ts` File
+
+The Angular `environment.ts` and `environment.prod.ts` files are often used to store information such as the base URL for the application's backend data services. Create an `environment.e2e.ts` that provides the same information, only connecting to backend services that are dedicated to testing rather than the development or production backend services. Here is an example:
+
+```TypeScript
+export const environment = {
+ production: false,
+ databaseURL: 'https://e2e-test-api.my-great-app.com',
+ projectId: 'my-great-app-e2e'
+};
+
+```
+
+##### Modify the `angular.json` File
+
+The `angular.json` file needs to be modified to use this file. This is a layered process. Follow the XPaths listed below to add the configuration that is required.
+
+Add a configuration at `/projects/app/architect/build/configurations` called `test` that does the file replacement:
+
+```JSON
+ "test": {
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.e2e.ts"
+ }
+ ]
+ }
+```
+
+Add a configuration at `/projects/app/architect/serve/configurations` called `test` that points the browser target at the `test` build configuration that was defined above.
+
+```JSON
+ "test": {
+ "browserTarget": "app:build:test"
+ }
+```
+
+Add a configuration at `/projects/app-e2e/architect/e2e/configurations` called `test` that does points the dev server target at the `test` serve configuration defined above.
+
+```JSON
+ "test": {
+ "devServerTarget": "app:serve:test"
+ }
+```
+
+##### Modify the `package.json` File
+
+Modify the `package.json` file so that `npm run e2e` uses the `test` configuration.
+
+```JSON
+ "scripts": {
+ "e2e": "ng e2e --configuration=test",
+ "lint": "ng lint",
+ "ng": "ng",
+ "start": "ng serve",
+ "test": "ng test",
+ "test:dev": "ng test --browsers=ChromeHeadlessCI",
+ "test:ci": "ng test --no-watch --browsers=ChromeHeadlessCI"
+ },
+```
+
+#### Test Cleanup
+
+If the end-to-end tests modify data in any way it is helpful to reset the data to a known state once the test completes. One way to do that is to:
+
+1. Create an endpoint that performs the cleanup.
+2. Add a `onCleanUp()` function to the `config` object exported by the `protractor.conf.js` file.
+
+Here is an example:
+
+```JavaScript
+ onCleanUp() {
+ const axios = require('axios');
+ return axios
+ .post(
+ 'https://e2e-test-api.my-great-app.com/purgeDatabase',
+ {}
+ )
+ .then(res => {
+ console.log(res.data);
+ })
+ .catch(err => console.log(err));
+ }
+```
\ No newline at end of file
diff --git a/src/pages/da/building/webview.md b/src/pages/da/building/webview.md
new file mode 100644
index 0000000000..f42f77f5f3
--- /dev/null
+++ b/src/pages/da/building/webview.md
@@ -0,0 +1,49 @@
+---
+previousText: 'Contributing'
+previousUrl: '/docs/building/contributing'
+nextText: 'Ionic Storage'
+nextUrl: '/docs/building/storage'
+---
+
+
+# Web View
+
+The Web View powers web apps in native devices. Ionic maintains a Web View plugin for apps integrated with [Cordova](/docs/faq/glossary#cordova). The plugin is provided by default when using the Ionic CLI. For apps integrated with [Capacitor](/docs/faq/glossary#capacitor), the Web View is automatically provided.
+
+## What is a Web View?
+
+Ionic apps are built using [web technologies](/docs/faq/glossary#web-standards) and are rendered using Web Views, which are a full screen and full-powered web browser.
+
+Modern Web Views offer many built-in HTML5 APIs for hardware functionality such as cameras, sensors, GPS, speakers, and Bluetooth, but sometimes it may also be necessary to access platform-specific hardware APIs. In Ionic apps, hardware APIs can be accessed through a bridge layer, typically by using native plugins which expose JavaScript APIs.
+
+
+
+The Ionic Web View plugin is specialized for modern JavaScript apps. For both iOS and Android, app files are always hosted using the `http://` protocol with an optimized HTTP server that runs on the local device.
+
+### CORS
+
+Web Views enforce [CORS](/docs/faq/glossary#cors), so it's important that external services properly handle cross-origin requests. See enable-cors.org and MDN for more details.
+
+If CORS is not implemented on the server, there is [a native plugin](/docs/native/http/) that performs HTTP requests in the native layer which bypasses CORS.
+
+#### Server Checklist
+
+Many web frameworks may have support for CORS built in or as official add-ons, such as the cors package for Express. If this is not an option, the following must be implemented for CORS:
+
+1. Allow `http://localhost:8080` as an origin (see Access-Control-Allow-Origin)
+2. Allow any necessary HTTP methods (see Access-Control-Allow-Methods)
+3. Allow any necessary HTTP headers (see Access-Control-Allow-Headers)
+4. Ensure the server can handle preflight requests
+
+### File Protocol
+
+Cordova and Capacitor apps are hosted on a local HTTP server and are served with the `http://` protocol. Some plugins, however, attempt to access device files via the `file://` protocol. To avoid difficulties between `http://` and `file://`, paths to device files must be rewritten to use the local HTTP server. For example, `file:///path/to/device/file` must be rewritten as `http://://path/to/device/file` before being rendered in the app.
+
+For Cordova apps, the [Ionic Web View plugin](https://github.com/ionic-team/cordova-plugin-ionic-webview) provides a utility function for converting File URIs: `window.Ionic.WebView.convertFileSrc()`. There is also a corresponding Ionic Native plugin: [`@ionic-native/ionic-webview`](/docs/native/ionic-webview/).
+
+For Capacitor apps, the File URIs are converted automatically.
+
+### Implementations
+
+* **iOS**: WKWebView
+* **Android**: Web View for Android
\ No newline at end of file
diff --git a/src/pages/da/cli.md b/src/pages/da/cli.md
new file mode 100644
index 0000000000..06ac959d8b
--- /dev/null
+++ b/src/pages/da/cli.md
@@ -0,0 +1,38 @@
+---
+---
+
+# Ionic CLI
+
+The Ionic command-line interface ([CLI](/docs/faq/glossary#cli)) is your go-to tool for developing Ionic apps.
+
+## Installation
+
+The Ionic CLI can be installed globally with npm:
+
+```shell
+$ npm install -g ionic
+```
+
+## Help
+
+The Ionic CLI ships with command documentation that is accessible with the `--help` flag.
+
+```shell
+$ ionic --help
+```
+
+
+
+## Architecture
+
+The Ionic CLI is built with [TypeScript](/docs/faq/glossary#typescript) and [Node.js](/docs/faq/glossary#node). It supports Node 6+, but the latest Node LTS is always recommended. Follow development on the open source GitHub repository.
+
+## Troubleshooting
+
+To troubleshoot issues with the Ionic CLI, the following may be useful:
+
+- Make sure the latest version of the Ionic CLI is installed. Update with `npm install -g ionic@latest`.
+- Make sure the latest Node LTS is installed. See [Node & npm](/docs/installation/environment#node-npm) environment setup.
+- The `--verbose` flag prints debugging messages, which may narrow down the issue.
+- Connection issues may be due to improperly configured proxy settings. See [Using a Proxy](/docs/cli/configuring#using-a-proxy) to configure request proxying.
+- The global Ionic CLI configuration directory is `~/.ionic` on all platforms. It can safely be deleted and the Ionic CLI will repopulate it, but all configuration (including user sessions) will be lost. Configure this directory with [CLI environment variables](/docs/cli/configuration#environment-variables).
\ No newline at end of file
diff --git a/src/pages/da/cli/configuration.md b/src/pages/da/cli/configuration.md
new file mode 100644
index 0000000000..66943708cc
--- /dev/null
+++ b/src/pages/da/cli/configuration.md
@@ -0,0 +1,189 @@
+---
+---
+
+# Configuration
+
+## Files
+
+Configuration values are stored in JSON files. The Ionic CLI maintains a global configuration file, usually located at `~/.ionic/config.json`, and project configuration files, usually at the project's root directory as `ionic.config.json`.
+
+The CLI provides commands for setting and printing config values from project config files and the global CLI config file. See `ionic config --help` or see the documentation for usage of [`ionic config get`](/docs/cli/commands/config-get) and [`ionic config set`](/docs/cli/commands/config-set).
+
+### Project Configuration File
+
+Each Ionic project has a project configuration file, usually at the project's root directory. The following is an annotated `ionic.config.json` file.
+
+```json
+{
+ // The human-readable name of the app.
+ "name": "My App",
+
+ // The project type of the app. The CLI uses this value to determine which
+ // commands and command options are available, what to output for help
+ // documentation, and what to use for web asset builds and the dev server.
+ "type": "angular",
+
+ // The App ID for Ionic Appflow.
+ "id": "abc123",
+
+ // Configuration object for integrations such as Cordova and Capacitor.
+ "integrations": {
+ "cordova": {
+ ...
+ }
+ },
+
+ // Hook configuration--see the Hooks section below for details.
+ "hooks": {
+ ...
+ }
+}
+```
+
+## Environment Variables
+
+The CLI will look for the following environment variables:
+
+* `IONIC_CONFIG_DIRECTORY`: The directory of the global CLI config. Defaults to `~/.ionic`.
+* `IONIC_HTTP_PROXY`: Set a URL for proxying all CLI requests through. See [Using a Proxy](./using-a-proxy).
+* `IONIC_TOKEN`: Automatically authenticates with [Ionic Appflow](https://ionicframework.com/appflow).
+
+## Flags
+
+CLI flags are global options that alter the behavior of a CLI command.
+
+* `--help`: Instead of running the command, view its help page.
+* `--verbose`: Show all log messages for debugging purposes.
+* `--quiet`: Only show `WARN` and `ERROR` log messages.
+* `--no-interactive`: Turn off interactive prompts and fancy outputs. If CI or a non-TTY terminal is detected, the CLI is automatically non-interactive.
+* `--confirm`: Turn on auto-confirmation of confirmation prompts. Careful: the CLI prompts before doing something potentially harmful. Auto-confirming may have unintended results.
+
+## Hooks
+
+The CLI can run scripts during certain events, such as before and after builds. To hook into the CLI, the following [npm scripts](https://docs.npmjs.com/misc/scripts) can be used in `package.json`:
+
+* `ionic:serve:before`: executed before the dev server starts
+* `ionic:serve:after`: executed after the dev server is terminated
+* `ionic:build:before`: executed before a web asset build begins
+* `ionic:build:after`: executed after a web asset build finishes
+
+Hooks can also be defined in `ionic.config.json`. Define a `hooks` object within the project, where each key is the name of the hook (without the `ionic:` prefix), and the value is a path to a JavaScript file or an array of paths.
+
+In the following example, the file is imported and run during the `ionic:build:before` hook.
+
+```json
+"hooks": {
+ "build:before": "./scripts/build-before.js"
+},
+```
+
+JavaScript hook files should export a single function, which is passed a single argument (`ctx`) whenever the hook executes.
+
+The argument is the context given to the hook file, which differs from hook to hook and with different invocations.
+
+`./scripts/build-before.js`:
+
+```javascript
+module.exports = function(ctx) {
+ console.log(ctx);
+};
+```
+
+## Multi-app Projects
+
+_Available in CLI 4.3.0+_
+
+The Ionic CLI supports a multi-app configuration setup, which involves multiple Ionic apps and shared code within a single repository, or [monorepo](/docs/faq/glossary#monorepo).
+
+### Setup Steps
+
+Multi-app projects are a new feature in the Ionic CLI. The setup is still partly manual.
+
+1. Create a directory and initialize a monorepo (see [Project Structure](#project-structure) for full details).
+2. Create an `ionic.config.json` file at the root of the repository with the following contents (see [Config File](#config-file) for full details):
+
+```json
+ {
+ "projects": {}
+ }
+```
+
+1. Use `ionic start` within the monorepo to create Ionic apps in a multi-app project (see [Adding an App](#adding-an-app) for full details).
+
+### Project Structure
+
+In a multi-app project, project structure is flexible. The only requirement is a multi-app `ionic.config.json` file at the root of the repository.
+
+Below is an example setup, where apps in the `apps/` directory are separated from the shared code in the `lib/` directory. Notice the root `ionic.config.json` file and the monorepo's `package.json` file.
+
+
+
+### Config File
+
+In a multi-app project, apps share a single `ionic.config.json` file at the root of the repository instead of each app having their own. The multi-app config file contains the configuration for each app by nesting configuration objects in a `projects` object. A default app can be specified using `defaultProject`.
+
+Below is an example file, which corresponds to the file structure above.
+
+```json
+{
+ "defaultProject": "myApp",
+ "projects": {
+ "myApp": {
+ "name": "My App",
+ "integrations": {},
+ "type": "angular",
+ "root": "apps/myApp"
+ },
+ "myOtherApp": {
+ "name": "My Other App",
+ "integrations": {},
+ "type": "angular",
+ "root": "apps/myOtherApp"
+ }
+ }
+}
+```
+
+When a multi-app project is detected, the Ionic CLI will operate under the context of an app configured in the root `ionic.config.json`. Project selection criteria is as follows:
+
+1. If the global CLI option `--project` is specified, the project is looked up by key in the `projects` object. For example, `--project=myApp` will select the `myApp` project.
+2. If the CLI detects it is being run within a project path, configured with the `root` key, it will select the matched project. For example, using the CLI within the `apps/myOtherApp/src` directory will select the `myOtherApp` project.
+3. If a `defaultProject` is specified in `ionic.config.json`, it will select the specified project when the above criteria is not met.
+
+### Adding an App
+
+If a multi-app project is detected during `ionic start`, the CLI will add the app configuration to the root `ionic.config.json` file instead of creating a project-specific one.
+
+Dependency installation can be skipped using `--no-deps` if dependencies are hoisted to the root of the monorepo.
+
+```shell
+$ cd apps/
+$ ionic start "My New App" --no-deps
+```
+
+## Advanced Configuration
+
+### Overriding the Build
+
+Normally, the CLI runs a hard-coded set of commands based on the project type. For example, the standard web asset build for Angular projects is `ng run app:build`. The web asset build can be overridden and `ionic build` can continue to be used by utilizing the `ionic:build` [npm script](https://docs.npmjs.com/misc/scripts). Similarly, the dev server can be overridden by using the `ionic:serve` npm script.
+
+Pay close attention to the flags supplied to the script by the Ionic CLI. Irregularities may occur if options are not respected, especially for livereload on devices.
+
+### Command Options
+
+Command options can be expressed with environment variables. They are normally set with `--opt=value` syntax. The naming of these environment variables follows a pattern: start with `IONIC_CMDOPTS_`, add the command name (replacing any spaces with underscores), add the option name (replacing any hyphens with underscores), and then uppercase everything. Boolean flags (command-line options that don't take a value) can be set to `1` or `0`. Strip the `--no-` prefix in boolean flags, if it exists (`--no-open` in ionic serve can be expressed with `IONIC_CMDOPTS_SERVE_OPEN=0`, for example).
+
+For example, the command options in `ionic cordova run ios -lc --livereload-port=1234 --address=localhost` can also be expressed with this series of environment variables:
+
+```shell
+$ export IONIC_CMDOPTS_CORDOVA_RUN_LIVERELOAD=1
+$ export IONIC_CMDOPTS_CORDOVA_RUN_CONSOLELOGS=1
+$ export IONIC_CMDOPTS_CORDOVA_RUN_LIVERELOAD_PORT=1234
+$ export IONIC_CMDOPTS_CORDOVA_RUN_ADDRESS=localhost
+```
+
+If these variables are set in the environment, `ionic cordova build ios` will use new defaults for its options.
+
+### Telemetry
+
+The CLI sends usage data to Ionic to create a better experience. To disable this functionality, run `ionic config set -g telemetry false`.
\ No newline at end of file
diff --git a/src/pages/da/cli/using-a-proxy.md b/src/pages/da/cli/using-a-proxy.md
new file mode 100644
index 0000000000..32457aa1e1
--- /dev/null
+++ b/src/pages/da/cli/using-a-proxy.md
@@ -0,0 +1,48 @@
+---
+---
+
+# Using a Proxy
+
+Proxy support is built-in to the Ionic CLI. Proxy settings can be configured via the config file or an environment variable.
+
+To configure proxy settings via the config file, run the following with the URL of the proxy server:
+
+```shell
+$ ionic config set -g proxy http://proxy.example.com:8888
+```
+
+To configure proxy settings via an environment variable, use one of the following:
+
+```shell
+$ export HTTP_PROXY="http://proxy.example.com:8888" # also used by npm
+$ export HTTPS_PROXY="https://proxy.example.com:8888" # also used by npm
+$ export IONIC_HTTP_PROXY="http://proxy.example.com:8888"
+```
+
+### Other CLIs
+
+Each CLI that you use must be configured separately to proxy network requests.
+
+#### npm
+
+```shell
+$ npm config set proxy http://proxy.company.com:8888
+```
+
+#### git
+
+```shell
+$ git config --global http.proxy http://proxy.example.com:8888
+```
+
+### SSL Configuration
+
+The Ionic CLI can be configured to use various SSL settings for HTTP requests.
+
+```shell
+$ ionic config set -g ssl.cafile /path/to/cafile # file path to your CA root certificate
+$ ionic config set -g ssl.certfile /path/to/certfile # file path to a client certificate
+$ ionic config set -g ssl.keyfile /path/to/keyfile # file path to a client key file
+```
+
+The `cafile`, `certfile`, and `keyfile` entries can be manually edited as arrays of strings in `~/.ionic/config.json` to include multiple files.
\ No newline at end of file
diff --git a/src/pages/da/components.md b/src/pages/da/components.md
new file mode 100644
index 0000000000..d165ead2a0
--- /dev/null
+++ b/src/pages/da/components.md
@@ -0,0 +1,135 @@
+# UI Components
+
+Ionic apps are made of high-level building blocks called Components, which allow you to quickly construct the UI for your app. Ionic comes stock with a number of components, including cards, lists, and tabs. Once you’re familiar with the basics, refer to the [API Index](/docs/api) for a complete list of each component and sub-component.
+
+
+
+Action Sheets display a set of options with the ability to confirm or cancel an action.
+
+
+
+Alerts are a great way to offer the user the ability to choose a specific action or list of actions.
+
+
+
+Badges are a small component that typically communicate a numerical value to the user.
+
+
+
+Buttons let your users take action. They're an essential way to interact with and navigate through an app.
+
+
+
+Cards are a great way to display an important piece of content, and can contain images, buttons, text, and more.
+
+
+
+Checkboxes can be used to let the user know they need to make a binary decision.
+
+
+
+Chips are a compact way to display data or actions.
+
+
+
+Content is the quintessential way to interact with and navigate through an app.
+
+
+
+Date & time pickers are used to present an interface that makes it easy for users to select dates and times.
+
+
+
+Floating action buttons are circular buttons that perform a primary action on a screen.
+
+
+
+Beautifully designed icons for use in web, iOS, Android, and desktop apps.
+
+
+
+The grid is a powerful mobile-first system for building custom layouts.
+
+
+
+Infinite scroll allows you to load new data as the user scrolls through your app.
+
+
+
+Inputs provides a way for users to enter data in your app.
+
+
+
+Items are an all-purpose UI container that can be used as part of a list.
+
+
+
+Lists can display rows of information, such as a contact list, playlist, or menu.
+
+
+
+Navigation is how users move between different pages in your app.
+
+
+
+Menus are a common navigation pattern. They can be permanently on-screen, or revealed when needed.
+
+
+
+Modals slide in and off screen to display a temporary UI and are often used for login or sign-up pages.
+
+
+
+Popover provides an easy way to present information or options without changing contexts.
+
+
+
+Progress indicators visualize the progression of an operation or activity.
+
+
+
+Radio inputs allow you to present a set of exclusive options.
+
+
+
+Refresher provides pull-to-refresh functionality on a content component.
+
+
+
+Searchbar is used to search or filter items, usually from a toolbar.
+
+
+
+Reorder lets users drag and drop to reorder a list of items.
+
+
+
+Routing allows navigation based on the current path.
+
+
+
+Segments provide a set of exclusive buttons that can be used as a filter or view switcher.
+
+
+
+Select is similar to the native HTML select, with a few improvements to sorting and selecting.
+
+
+
+Slides make it easy to create complex UI such as galleries, tutorials, and page-based layouts.
+
+
+
+Tabs enable tabbed navigation, a standard navigation pattern in modern apps.
+
+
+
+Toast is used to show a notification over the top of an app's content. It can be temporary or dismissable.
+
+
+
+Toggles are an input for binary options, often used for options and switches.
+
+
+
+Toolbars are used to house information and actions relating to your app.
\ No newline at end of file
diff --git a/src/pages/da/components/action-sheet.md b/src/pages/da/components/action-sheet.md
new file mode 100644
index 0000000000..069e0c7d03
--- /dev/null
+++ b/src/pages/da/components/action-sheet.md
@@ -0,0 +1,100 @@
+# Action Sheet
+
+An Action Sheet is a dialog that displays a set of options. It appears on top of the app's content, and must be manually dismissed by the user before they can resume interaction with the app. There are multiple ways to dismiss the action sheet, including tapping the backdrop or hitting the escape key on desktop. Action Sheets should not be used for navigation.
+
+## Basic Usage
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+```typescript
+async function presentActionSheet() {
+ const actionSheetController = document.querySelector('ion-action-sheet-controller');
+ await actionSheetController.componentOnReady();
+
+ const actionSheet = await actionSheetController.create({
+ header: "Albums",
+ buttons: [{
+ text: 'Delete',
+ role: 'destructive',
+ icon: 'trash',
+ handler: () => {
+ console.log('Delete clicked');
+ }
+ }, {
+ text: 'Share',
+ icon: 'share',
+ handler: () => {
+ console.log('Share clicked');
+ }
+ }, {
+ text: 'Play (open modal)',
+ icon: 'arrow-dropright-circle',
+ handler: () => {
+ console.log('Play clicked');
+ }
+ }, {
+ text: 'Favorite',
+ icon: 'heart',
+ handler: () => {
+ console.log('Favorite clicked');
+ }
+ }, {
+ text: 'Cancel',
+ icon: 'close',
+ role: 'cancel',
+ handler: () => {
+ console.log('Cancel clicked');
+ }
+ }]
+ });
+ await actionSheet.present();
+}
+```
+
+### Cancel Button
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## Destructive
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## Headers
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+### Adding Subheaders
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## Scrollable
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## Translucent
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## Icons
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sed lacus eu purus viverra egestas. Nunc porta, elit ut finibus gravida, dui orci feugiat leo, tincidunt fermentum urna eros vel elit. Phasellus convallis, tellus eu volutpat facilisis, ipsum mauris luctus diam, sodales tincidunt quam turpis at leo.
+
+* * *
+
+## API
+
+
+
+Display a set of options with the ability to confirm or cancel an action.
+
+Used to manage the creation, dismissal, and destruction of action sheets.
\ No newline at end of file
diff --git a/src/pages/da/components/alert.md b/src/pages/da/components/alert.md
new file mode 100644
index 0000000000..26fc444aeb
--- /dev/null
+++ b/src/pages/da/components/alert.md
@@ -0,0 +1,528 @@
+# Alert
+
+Alerts are a great way to offer the user the ability to choose a specific action or list of actions. Alerts can include contain text, inputs and buttons. They can provide the user with important information, or require them to make a decision (or multiple decisions). Alerts should only be used for quick actions like password verification, small app notifications, or quick options.
+
+## Creating
+
+Alerts can be created using a [Alert Controller](../../alert-controller/AlertController). They can be customized by passing alert options in the alert controller's create method.
+
+## Buttons
+
+In the array of `buttons`, each button includes properties for its `text`, and optionally a `handler`. If a handler returns `false` then the alert will not automatically be dismissed when the button is clicked. All buttons will show up in the order they have been added to the `buttons` array from left to right. Note: The right most button (the last one in the array) is the main button.
+
+Optionally, a `role` property can be added to a button, such as `cancel`. If a `cancel` role is on one of the buttons, then if the alert is dismissed by tapping the backdrop, then it will fire the handler from the button with a cancel role.
+
+## Inputs
+
+Alerts can also include several different inputs whose data can be passed back to the app. Inputs can be used as a simple way to prompt users for information. Radios, checkboxes and text inputs are all accepted, but they cannot be mixed. For example, an alert could have all radio button inputs, or all checkbox inputs, but the same alert cannot mix radio and checkbox inputs. Do note however, different types of "text" inputs can be mixed, such as `url`, `email`, `text`, etc. If you require a complex form UI which doesn't fit within the guidelines of an alert then we recommend building the form within a modal instead.
+
+
+
+## Usage
+
+### Angular
+
+```typescript
+import { Component } from '@angular/core';
+import { AlertController } from '@ionic/angular';
+
+@Component({
+ selector: 'alert-example',
+ templateUrl: 'alert-example.html',
+ styleUrls: ['./alert-example.css'],
+})
+export class AlertExample {
+
+ constructor(public alertController: AlertController) {}
+
+ async presentAlert() {
+ const alert = await this.alertController.create({
+ header: 'Alert',
+ subHeader: 'Subtitle',
+ message: 'This is an alert message.',
+ buttons: ['OK']
+ });
+
+ await alert.present();
+ }
+
+ async presentAlertMultipleButtons() {
+ const alert = await this.alertController.create({
+ header: 'Alert',
+ subHeader: 'Subtitle',
+ message: 'This is an alert message.',
+ buttons: ['Cancel', 'Open Modal', 'Delete']
+ });
+
+ await alert.present();
+ }
+
+ async presentAlertConfirm() {
+ const alert = await this.alertController.create({
+ header: 'Confirm!',
+ message: 'Message text!!!',
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: (blah) => {
+ console.log('Confirm Cancel: blah');
+ }
+ }, {
+ text: 'Okay',
+ handler: () => {
+ console.log('Confirm Okay');
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+ async presentAlertPrompt() {
+ const alert = await this.alertController.create({
+ header: 'Prompt!',
+ inputs: [
+ {
+ name: 'name1',
+ type: 'text',
+ placeholder: 'Placeholder 1'
+ },
+ {
+ name: 'name2',
+ type: 'text',
+ id: 'name2-id',
+ value: 'hello',
+ placeholder: 'Placeholder 2'
+ },
+ {
+ name: 'name3',
+ value: 'http://ionicframework.com',
+ type: 'url',
+ placeholder: 'Favorite site ever'
+ },
+ // input date with min & max
+ {
+ name: 'name4',
+ type: 'date',
+ min: '2017-03-01',
+ max: '2018-01-12'
+ },
+ // input date without min nor max
+ {
+ name: 'name5',
+ type: 'date'
+ },
+ {
+ name: 'name6',
+ type: 'number',
+ min: -5,
+ max: 10
+ },
+ {
+ name: 'name7',
+ type: 'number'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel');
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok');
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+ async presentAlertRadio() {
+ const alert = await this.alertController.create({
+ header: 'Radio',
+ inputs: [
+ {
+ name: 'radio1',
+ type: 'radio',
+ label: 'Radio 1',
+ value: 'value1',
+ checked: true
+ },
+ {
+ name: 'radio2',
+ type: 'radio',
+ label: 'Radio 2',
+ value: 'value2'
+ },
+ {
+ name: 'radio3',
+ type: 'radio',
+ label: 'Radio 3',
+ value: 'value3'
+ },
+ {
+ name: 'radio4',
+ type: 'radio',
+ label: 'Radio 4',
+ value: 'value4'
+ },
+ {
+ name: 'radio5',
+ type: 'radio',
+ label: 'Radio 5',
+ value: 'value5'
+ },
+ {
+ name: 'radio6',
+ type: 'radio',
+ label: 'Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 ',
+ value: 'value6'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel');
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok');
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+ async presentAlertCheckbox() {
+ const alert = await this.alertController.create({
+ header: 'Checkbox',
+ inputs: [
+ {
+ name: 'checkbox1',
+ type: 'checkbox',
+ label: 'Checkbox 1',
+ value: 'value1',
+ checked: true
+ },
+
+ {
+ name: 'checkbox2',
+ type: 'checkbox',
+ label: 'Checkbox 2',
+ value: 'value2'
+ },
+
+ {
+ name: 'checkbox3',
+ type: 'checkbox',
+ label: 'Checkbox 3',
+ value: 'value3'
+ },
+
+ {
+ name: 'checkbox4',
+ type: 'checkbox',
+ label: 'Checkbox 4',
+ value: 'value4'
+ },
+
+ {
+ name: 'checkbox5',
+ type: 'checkbox',
+ label: 'Checkbox 5',
+ value: 'value5'
+ },
+
+ {
+ name: 'checkbox6',
+ type: 'checkbox',
+ label: 'Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6',
+ value: 'value6'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel');
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok');
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+}
+```
+
+### Javascript
+
+```javascript
+async function presentAlert() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Alert',
+ subHeader: 'Subtitle',
+ message: 'This is an alert message.',
+ buttons: ['OK']
+ });
+ return await alert.present();
+}
+
+async function presentAlertMultipleButtons() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Alert',
+ subHeader: 'Subtitle',
+ message: 'This is an alert message.',
+ buttons: ['Cancel', 'Open Modal', 'Delete']
+ });
+ return await alert.present();
+}
+
+async function presentAlertConfirm() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Confirm!',
+ message: 'Message text!!!',
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: (blah) => {
+ console.log('Confirm Cancel: blah');
+ }
+ }, {
+ text: 'Okay',
+ handler: () => {
+ console.log('Confirm Okay')
+ }
+ }
+ ]
+ });
+ return await alert.present();
+}
+
+async function presentAlertPrompt() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Prompt!',
+ inputs: [
+ {
+ placeholder: 'Placeholder 1'
+ },
+ {
+ name: 'name2',
+ id: 'name2-id',
+ value: 'hello',
+ placeholder: 'Placeholder 2'
+ },
+ {
+ name: 'name3',
+ value: 'http://ionicframework.com',
+ type: 'url',
+ placeholder: 'Favorite site ever'
+ },
+ // input date with min & max
+ {
+ name: 'name4',
+ type: 'date',
+ min: '2017-03-01',
+ max: '2018-01-12'
+ },
+ // input date without min nor max
+ {
+ name: 'name5',
+ type: 'date'
+ },
+ {
+ name: 'name6',
+ type: 'number',
+ min: -5,
+ max: 10
+ },
+ {
+ name: 'name7',
+ type: 'number'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel')
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok')
+ }
+ }
+ ]
+ });
+ return await alert.present();
+}
+
+async function presentAlertRadio() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Radio',
+ inputs: [
+ {
+ type: 'radio',
+ label: 'Radio 1',
+ value: 'value1',
+ checked: true
+ },
+ {
+ type: 'radio',
+ label: 'Radio 2',
+ value: 'value2'
+ },
+ {
+ type: 'radio',
+ label: 'Radio 3',
+ value: 'value3'
+ },
+ {
+ type: 'radio',
+ label: 'Radio 4',
+ value: 'value4'
+ },
+ {
+ type: 'radio',
+ label: 'Radio 5',
+ value: 'value5'
+ },
+ {
+ type: 'radio',
+ label: 'Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 Radio 6 ',
+ value: 'value6'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel')
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok')
+ }
+ }
+ ]
+ });
+ return await alert.present();
+}
+
+async function presentAlertCheckbox() {
+ const alertController = document.querySelector('ion-alert-controller');
+ await alertController.componentOnReady();
+
+ const alert = await alertController.create({
+ header: 'Checkbox',
+ inputs: [
+ {
+ type: 'checkbox',
+ label: 'Checkbox 1',
+ value: 'value1',
+ checked: true
+ },
+
+ {
+ type: 'checkbox',
+ label: 'Checkbox 2',
+ value: 'value2'
+ },
+
+ {
+ type: 'checkbox',
+ label: 'Checkbox 3',
+ value: 'value3'
+ },
+
+ {
+ type: 'checkbox',
+ label: 'Checkbox 4',
+ value: 'value4'
+ },
+
+ {
+ type: 'checkbox',
+ label: 'Checkbox 5',
+ value: 'value5'
+ },
+
+ {
+ type: 'checkbox',
+ label: 'Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6 Checkbox 6',
+ value: 'value6'
+ }
+ ],
+ buttons: [
+ {
+ text: 'Cancel',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => {
+ console.log('Confirm Cancel')
+ }
+ }, {
+ text: 'Ok',
+ handler: () => {
+ console.log('Confirm Ok')
+ }
+ }
+ ]
+ });
+ return await alert.present();
+}
+```
+
+## API
+
+
+
+Display a dialog to present or collect information from a user.
+
+Used to manage the creation, dismissal, and destruction of alerts.
\ No newline at end of file
diff --git a/src/pages/da/developer-resources/books.md b/src/pages/da/developer-resources/books.md
new file mode 100644
index 0000000000..2de1bd4b9d
--- /dev/null
+++ b/src/pages/da/developer-resources/books.md
@@ -0,0 +1,40 @@
+---
+previousText: 'Developer Tips'
+previousUrl: '/docs/faq/tips'
+nextText: 'Courses'
+nextUrl: '/docs/developer-resources/courses'
+---
+
+# Books
+
+### [Mobile App Development with Ionic: Cross-Platform Apps with Ionic 2, Angular 2, and Cordova](https://www.amazon.com/Mobile-App-Development-Ionic-Cross-Platform/dp/1491937785/ref=sr_1_2?ie=UTF8&qid=1464183332&sr=8-2&keywords=ionic+2)
+
+by Chris Griffith
+
+### [Building Mobile Apps with Ionic & Angular](https://www.joshmorony.com/building-mobile-apps-with-ionic-2/)
+
+by Joshua Morony
+
+Building Mobile Apps with Ionic & Angular is an all-in-one resource for learning the latest and greatest version of Ionic. It is targeted at beginners and works its way through the basics of Ionic, to example applications of varying complexity, and then to the steps required to build and publish your application (on the app stores or as a PWA). It has been updated for every major release, so you can rest easy knowing that you're not learning outdated tech.
+
+### [Ionic 2 From Zero to App Store](https://devdactic.com/zero-to-app)
+
+by Simon Reimler
+
+### [Ionic Framework By Example](https://www.packtpub.com/application-development/ionic-framework-example)
+
+by Sani Yusuf
+
+### [Building Firestore Powered Ionic Apps](https://javebratt.com/ionic-firebase-book/)
+
+by Jorge Vergara
+
+This book will help you go from not knowing what Firebase is to be able to use the different APIs for your Ionic Applications. It will take you from “*What’s Firebase?*” to building scalable, production-ready apps and it’s always up-to-date with latest Ionic and Firebase versions.
+
+### [Ionic 2 Cookbook - Second Edition](https://www.amazon.com/Ionic-Cookbook-Second-Hoc-Phan-ebook/dp/B01C4D9VWS?ie=UTF8&keywords=ionic%202&qid=1464183332&ref_=sr_1_3&sr=8-3)
+
+by Hoc Phan
+
+### [Mastering Ionic 2](https://www.leanpub.com/masteringionic2)
+
+by James Griffiths
\ No newline at end of file
diff --git a/src/pages/da/developer-resources/courses.md b/src/pages/da/developer-resources/courses.md
new file mode 100644
index 0000000000..90d23ceb7e
--- /dev/null
+++ b/src/pages/da/developer-resources/courses.md
@@ -0,0 +1,60 @@
+---
+previousText: 'Books'
+previousUrl: '/docs/developer-resources/books'
+nextText: 'Guides'
+nextUrl: '/docs/developer-resources/guides'
+contributors:
+ - walkingriver
+---
+
+# Courses
+
+### [Elite Ionic](https://www.joshmorony.com/elite/)
+
+by Josh Morony
+
+Elite Ionic is an online course for Ionic developers who want to move past the basics, and build complex, well tested, high performing, beautiful, and useable mobile applications. It is recommended that you already have a reasonably solid understanding of the basics of Ionic before starting this course.
+
+### [Ionic Academy](https://ionicacademy.com/)
+
+by Simon Grimm
+
+Learn Ionic with step-by-step video courses & quick wins from one of the Ionic community leaders. Covers beginner, intermediate and advanced topics. Get access to a community of developers just like you.
+
+### [Introducing Ionic 2](http://shop.oreilly.com/product/0636920050353.do)
+
+by Mathieu Chauvinc
+
+### [Building Progressive Web Apps with Ionic](https://www.pluralsight.com/courses/progressive-web-apps-ionic)
+
+by Michael Callaghan at Pluralsight
+
+Everything changed when Google created the concept of Progressive Web Applications or PWA. A PWA is a pure web application that you can install on devices, that can function with limited network functionality, through its use of intelligent caching.
+
+### [Ionic CLI](https://app.pluralsight.com/library/courses/ionic-cli/)
+
+by Michael Callaghan at Pluralsight
+
+This course will start at the top and explore the Ionic CLI. First, you'll see how to create projects and components. Next, you will learn how to build and serve apps. Finally, you'll discover how to share projects with others, and even integrate with other build tools. Whether you’re just starting to explore Ionic, or have been using it since its pre-beta days, there is something here for you. By the end of the course, you’ll have the confidence to use the Ionic CLI as part of your everyday Ionic development.
+
+### [Creating Cross-platform Apps with Ionic and Electron](https://app.pluralsight.com/library/courses/ionic-electron-building-cross-platform-apps)
+
+by Michael Callaghan at Pluralsight
+
+In this course, you'll learn how to create cross-platform apps with Ionic and Electron. Electron is the technology behind Visual Studio Code, Slack, GitKraken, and countless others. This course will provide a better understanding of how to create cross-platform apps with Iconic and Electron. Whether you aspire to create the next iTunes, or just want to port your mobile app to run on Windows, this is the technology you need in your toolbox.
+
+### [Building Mobile Apps with Ionic 2, Angular 2, and TypeScript](https://app.pluralsight.com/library/courses/ionic2-angular2-typescript-mobile-apps/table-of-contents)
+
+by Pluralsight
+
+### [Ionic 2 Master Course](https://www.udemy.com/ionic-2-tutorial/)
+
+by Udemy
+
+### [Introducing Ionic 2](https://www.udemy.com/introducing-ionic-2/)
+
+by Udemy
+
+### [Ionic 2 Solutions](https://www.packtpub.com/web-development/ionic-2-solutions-video)
+
+by Hoc Phan
\ No newline at end of file
diff --git a/src/pages/da/developer-resources/guides.md b/src/pages/da/developer-resources/guides.md
new file mode 100644
index 0000000000..b3b10ce0bb
--- /dev/null
+++ b/src/pages/da/developer-resources/guides.md
@@ -0,0 +1,16 @@
+---
+previousText: 'Courses'
+previousUrl: '/docs/developer-resources/courses'
+nextText: 'Posts'
+nextUrl: '/docs/developer-resources/posts'
+---
+
+# Guides
+
+### [Your First Ionic App - v3](/docs/developer-resources/guides/first-app-v3/intro)
+
+Follow along as we create a working Photo Gallery app using Ionic Framework v3 and Ionic Pro.
+
+### [Your First Ionic App - v4](/docs/developer-resources/guides/first-app-v4/intro)
+
+Follow along as we create a working Photo Gallery app using Ionic Framework v4.
\ No newline at end of file
diff --git a/src/pages/da/developer-resources/guides/first-app-v3/creating-photo-gallery-device-storage.md b/src/pages/da/developer-resources/guides/first-app-v3/creating-photo-gallery-device-storage.md
new file mode 100644
index 0000000000..275f313f7b
--- /dev/null
+++ b/src/pages/da/developer-resources/guides/first-app-v3/creating-photo-gallery-device-storage.md
@@ -0,0 +1,202 @@
+---
+previousText: 'Android, iOS, and the Camera - Oh My!'
+previousUrl: '/docs/developer-resources/guides/first-app-v3/ios-android-camera'
+nextText: 'Theming'
+nextUrl: '/docs/developer-resources/guides/first-app-v3/theming'
+---
+
+# Creating a Photo Gallery with Device Storage
+
+Last time, we successfully added the Camera plugin to the About page of our Tabs app. Currently, the photo is replaced each time a new one is taken. What if we wanted to display multiple photos together? Let’s create a photo gallery. You can follow along with the complete code for this in [the part 2 folder](https://github.com/ionic-team/photo-gallery-tutorial-ionic3/tree/master/part2) on GitHub.
+
+## Creating a Dedicated Photo Service
+
+From a terminal window, navigate to your Ionic project and run:
+
+```shell
+$ ionic g provider PhotoProvider
+```
+
+This creates a PhotoProvider class in a dedicated providers/photo folder:
+
+```Javascript
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+
+/*
+ Generated class for the PhotoProvider provider.
+
+ See https://angular.io/guide/dependency-injection for more info on providers
+ and Angular DI.
+*/
+@Injectable()
+export class PhotoProvider {
+
+ constructor(public http: HttpClient) {
+ console.log('Hello PhotoProvider Provider');
+ }
+}
+```
+
+Within this class, add a Photo class. The “data” property represents the base64 image data of a captured photo:
+
+```Javascript
+class Photo {
+ data: any;
+}
+```
+
+Then, create a Photos array to represent our photo gallery:
+
+```Javascript
+export class PhotoProvider {
+
+ public photos: Photo[] = [];
+
+ constructor() { }
+}
+```
+
+Back in `about.ts`, import PhotoProvider:
+
+```Javascript
+import { PhotoProvider } from '../../providers/photo/photo';
+```
+
+Add it to the Constructor:
+
+```Javascript
+constructor(private camera: Camera, public photoService: PhotoProvider) { }
+```
+
+Next, move all code pertaining to the Camera plugin to the PhotoService class. This includes the takePicture method, the Camera import, and the About page constructor. Also, remove references to HttpClient - we won’t be making any HTTP calls.
+
+Continuing on, we need to convert currentImage variable references to the new photos array. Start by adding the captured photo data into the photos array:
+
+```Javascript
+this.camera.getPicture(options).then((imageData) => {
+ // Add new photo to gallery
+ this.photos.unshift({
+ data: 'data:image/jpeg;base64,' + imageData
+ }); }, (err) => {
+ // Handle error
+ console.log("Camera issue: " + err);
+});
+```
+
+In `about.page.ts`, remove the currentImage variable and the reference to Camera in the constructor, leaving only PhotoService:
+
+```Javascript
+export class AboutPage {
+ constructor(public navCtrl: NavController, public photoService: PhotoProvider) { }
+}
+```
+
+Next, in `about.page.html`, remove the currentImage img tag. In its place, use an ion-grid component, which provides a great way to arrange elements on a page. In this case, we’ll use it to display 2 photos per row.
+
+```html
+
+
+
+
+
+
+
+```
+
+Here, we loop through each photo in the PhotoServices photos array, adding a new column for each. Since an ion-row consists of 12 “blocks” of space, and we’re setting the size to 6 (“col-6”), only 2 photos are displayed per row.
+
+Last, update the Fab button to call the PhotoProvider’s `takePicture` method:
+
+```Html
+
+
+
+
+
+### Creating an Android Virtual Device
+
+Android Virtual Devices (AVDs) are blueprints that the Android emulator uses to run the Android OS. The following documentation is a quick way to get the Android emulator set up. For more detailed instructions and information, see <a href="https://developer.android.com/studio/run/managing-avds" target="_blank">the Android documentation</a>.
+
+AVDs are managed with the AVD Manager. In the Android Studio welcome screen, click **Configure** » **AVD Manager**. The AVD Manager can also be opened inside Android projects in the **Tools** » **AVD Manager** menu.
+
+
+
+Click **Create Virtual Device** and select a suitable device definition. If unsure, choose **Pixel 2**. Then, select a suitable system image. If unsure, choose **Pie** (API 28) with Google Play services. See <a href="https://en.wikipedia.org/wiki/Android_version_history" target="_blank">Android version history</a> for information on Android versions.
+
+Once the AVD is created, launch the AVD into the Android emulator. Keeping the emulator running is the best way to ensure detection while developing Ionic apps for Android.
+
+
+
+
+
+
+
+
+
+### Set up an Android Device
+
+Actual Android hardware can also be used for Ionic app development. But first, the device must be set up for development. The following documentation is a quick way to set up Android devices for development. For more detailed instructions and information, see <a href="https://developer.android.com/studio/run/device" target="_blank">the Android documentation</a>.
+
+1. Enable USB debugging on the device. Open **Settings**, navigate to **Developer options**, and enable **USB debugging**. The **Developer options** menu may need to be enabled first. See <a href="https://developer.android.com/studio/debug/dev-options" target="_blank">the Android documentation</a> for instructions.
+1. Ensure the device has permission to connect to the computer. For macOS, no additional setup is required. For Windows, <a href="https://developer.android.com/studio/run/oem-usb" target="_blank">install the OEM USB drivers</a>.
+
+Verify the connection works by connecting the device to the computer with a USB cable and using the following command:
+
+```shell
+$ adb devices
+
+
+The device should be listed. See the full adb documentation for troubleshooting and detailed information.
\ No newline at end of file
diff --git a/src/pages/da/installation/cdn.md b/src/pages/da/installation/cdn.md
new file mode 100644
index 0000000000..8cfd031994
--- /dev/null
+++ b/src/pages/da/installation/cdn.md
@@ -0,0 +1,124 @@
+---
+previousText: 'Ionic CLI'
+previousUrl: '/docs/installation/cli'
+nextText: 'Environment Setup'
+nextUrl: '/docs/installation/environment'
+contributors:
+ - brandyscarney
+ - rtpHarry
+---
+
+# Ionic Packages
+
+Ionic provides different packages that can be used to quickly get started using Ionic Framework or Ionicons in a test environment, Angular, any other framework, or none at all.
+
+## Ionic Framework CDN
+
+Ionic Framework can be included from a CDN for quick testing in a [Plunker](https://plnkr.co/), [Codepen](https://codepen.io), or any other online code editor!
+
+It's recommended to use [unpkg](https://unpkg.com) to access the Framework from a CDN. To get the latest version, add the following inside the `` element in an HTML file, or where external assets are included in the online code editor:
+
+```html
+
+
+```
+
+With this it's possible to use all of the Ionic Framework core components without having to install a framework. The CSS bundle will include all of the Ionic [Global Stylesheets](../layout/global-stylesheets).
+
+> This does not install Angular or any other frameworks. This allows use of the Ionic Framework core components without a framework.
+
+## Angular + Ionic Framework
+
+When using Ionic Framework in an Angular project, install the latest `@ionic/angular` package from [npm](/docs/faq/glossary#npm). This comes with all of the Ionic Framework components and Angular specific services and features.
+
+```shell
+$ npm install @ionic/angular@latest --save
+```
+
+Each time there is a new Ionic Framework release, this [version](/docs/intro/versioning) will need to be updated to get the latest features and fixes. The version can be [updated using npm](/docs/faq/tips#updating-dependencies), as well.
+
+### CSS
+
+Create a global stylesheet file and add it to the `styles` object in the [Angular workspace config](https://angular.io/guide/workspace-config). Add the following imports to that file:
+
+```css
+/* Core CSS required for Ionic components to work properly */
+@import "~@ionic/angular/css/core.css";
+
+/* Basic CSS for apps built with Ionic */
+@import "~@ionic/angular/css/normalize.css";
+@import "~@ionic/angular/css/structure.css";
+@import "~@ionic/angular/css/typography.css";
+
+/* Optional CSS utils that can be commented out */
+@import "~@ionic/angular/css/padding.css";
+@import "~@ionic/angular/css/float-elements.css";
+@import "~@ionic/angular/css/text-alignment.css";
+@import "~@ionic/angular/css/text-transformation.css";
+@import "~@ionic/angular/css/flex-utils.css";
+@import "~@ionic/angular/css/display.css";
+```
+
+See [Global Stylesheets](../layout/global-stylesheets) for the styles that each of these files contain.
+
+## Stencil + Ionic Framework
+
+When using Ionic Framework in a Stencil project, install the latest `@ionic/core` package from [npm](/docs/faq/glossary#npm). This comes with all of the Ionic Framework components.
+
+```shell
+$ npm install @ionic/core@latest --save
+```
+
+### JS
+
+Include an import of `@ionic/core` in the root app file:
+
+```typescript
+import '@ionic/core';
+```
+
+### CSS
+
+Create a global stylesheet file and add it to the `config` object in the [Stencil Config](https://stenciljs.com/docs/config).
+
+```javascript
+exports.config = {
+ // ...
+
+ globalStyle: 'src/global.css'
+
+ // ...
+};
+```
+
+Add the following imports to that file:
+
+```css
+/* Core CSS required for Ionic components to work properly */
+@import "~@ionic/core/css/core.css";
+
+/* Basic CSS for apps built with Ionic */
+@import "~@ionic/core/css/normalize.css";
+@import "~@ionic/core/css/structure.css";
+@import "~@ionic/core/css/typography.css";
+
+/* Optional CSS utils that can be commented out */
+@import "~@ionic/core/css/padding.css";
+@import "~@ionic/core/css/float-elements.css";
+@import "~@ionic/core/css/text-alignment.css";
+@import "~@ionic/core/css/text-transformation.css";
+@import "~@ionic/core/css/flex-utils.css";
+@import "~@ionic/core/css/display.css";
+```
+
+See [Global Stylesheets](../layout/global-stylesheets) for the styles that each of these files contain.
+
+## Ionicons CDN
+
+Ionicons is packaged by default with the Ionic Framework, so no installation is necessary if you're using Ionic. To use Ionicons without Ionic Framework, place the following `
+```
+
+> See [Ionicons usage](https://ionicons.com/usage) for more information on using Ionicons.
\ No newline at end of file
diff --git a/src/pages/da/installation/cli.md b/src/pages/da/installation/cli.md
new file mode 100644
index 0000000000..4656a5e7d6
--- /dev/null
+++ b/src/pages/da/installation/cli.md
@@ -0,0 +1,48 @@
+---
+previousText: 'What is Ionic Framework'
+previousUrl: '/docs/intro'
+nextText: 'Packages & CDN'
+nextUrl: '/docs/installation/cdn'
+contributors:
+ - rtpHarry
+ - dwieeb
+---
+
+# Installing Ionic
+
+Ionic apps are created and developed primarily through the Ionic [command-line](/docs/faq/glossary#cli) utility. The Ionic CLI is the preferred method of installation, as it offers a wide range of dev tools and help options along the way. It is also the main tool through which to run the app and connect it to other services, such as Ionic Appflow.
+
+## Install the Ionic CLI
+
+Before proceeding, make sure the latest version of [Node.js](/docs/faq/glossary#node) and [npm](/docs/faq/glossary#npm) are installed. See [Environment Setup](/docs/installation/environment) for details. Install the Ionic CLI globally with npm:
+
+```shell
+$ npm install -g ionic
+```
+
+
+
The -g means it is a global install. For Window’s it's recommended to open an Admin command prompt. For Mac/Linux, run the command with sudo.
+
+
+## Start an App
+
+Create an Ionic app using one of the pre-made app templates, or a blank one to start fresh. The three most common starters are the `blank` starter, `tabs` starter, and `sidemenu` starter. Get started with the `ionic start` command:
+
+```shell
+$ ionic start myApp tabs
+```
+
+
+
+To learn more about starting Ionic apps, see the [Starting Guide](/docs/building/starting).
+
+## Run the App
+
+The majority of Ionic app development can be spent right in the browser using the `ionic serve` command:
+
+```shell
+$ cd myApp
+$ ionic serve
+```
+
+There are a number of other ways to run an app, it's recommended to start with this workflow. To develop and test apps on devices and emulators, see the [Running an App Guide](/docs/building/running).
\ No newline at end of file
diff --git a/src/pages/da/installation/environment.md b/src/pages/da/installation/environment.md
new file mode 100644
index 0000000000..bc7e7833c0
--- /dev/null
+++ b/src/pages/da/installation/environment.md
@@ -0,0 +1,37 @@
+---
+previousText: 'Packages & CDN'
+previousUrl: '/docs/installation/cdn'
+nextText: 'iOS Setup'
+nextUrl: '/docs/installation/ios'
+contributors:
+ - rtpHarry
+---
+
+# Environment Setup
+
+To get started with Ionic Framework, the only requirement is a [Node & npm](#node-amp-npm) environment.
+
+Of course, you will also need an editor. We recommend [VS Code](https://code.visualstudio.com/), a free, batteries-included text editor made by Microsoft.
+
+## Node & npm
+
+Almost all tooling for modern JavaScript projects is based in [Node.js](/docs/faq/glossary#node). The [download page](https://nodejs.org/en/download/) has prebuilt installation packages for all platforms. We recommend selecting the LTS version to ensure best compatibility.
+
+Node is bundled with [npm](/docs/faq/glossary#npm), the package manager for JavaScript.
+
+To verify the installation, open a new terminal window and run:
+
+```shell
+$ node --version
+$ npm --version
+```
+
+## Git
+
+Although not required, the version control system [Git](/docs/faq/glossary#git) is highly recommended. First, install the command-line utility from the [download page](https://git-scm.com/downloads). For a GUI client, we recommend [GitHub Desktop](https://desktop.github.com/).
+
+To verify the installation, open a new terminal window and run:
+
+```shell
+$ git --version
+```
\ No newline at end of file
diff --git a/src/pages/da/installation/ios.md b/src/pages/da/installation/ios.md
new file mode 100644
index 0000000000..51fc7906a8
--- /dev/null
+++ b/src/pages/da/installation/ios.md
@@ -0,0 +1,39 @@
+---
+previousText: 'Environment Setup'
+previousUrl: '/docs/installation/environment'
+nextText: 'Android Setup'
+nextUrl: '/docs/installation/android'
+---
+
+# iOS Setup
+
+To target iOS, some additional environment setup is required. Unfortunately, iOS apps can only be created on macOS.
+
+## Xcode
+
+Xcode is the IDE for creating native iOS apps. It includes the iOS SDK and Xcode command-line tools. Xcode can be downloaded for free with an Apple account. It can also be installed through the App Store.
+
+### Setting up a Development Team
+
+All iOS apps must be code signed, even for development. Luckily, Xcode makes this easy with automatic code signing. The only prerequisite is an Apple ID.
+
+Open Xcode and navigate to **Xcode** » **Preferences** » **Accounts**. Add an Apple ID if none are listed. Once logged in, a Personal Team will appear in the team list of the Apple ID.
+
+
+
+### Creating an iOS Simulator
+
+The iOS simulator emulates iOS devices on Macs. The following documentation is a quick way to get the iOS simulator set up. For more information, see Apple's documentation.
+
+Open Xcode and navigate to **Window** » **Devices and Simulators**. Create an **iPhone X** simulator if one does not already exist.
+
+
+
+## ios-sim & ios-deploy
+
+The ios-sim and ios-deploy are utilities that deploy apps to the iOS simulator and iOS devices during development. They can be installed globally with [npm](/docs/faq/glossary#npm).
+
+```shell
+$ npm install -g ios-sim
+$ npm install -g ios-deploy
+```
\ No newline at end of file
diff --git a/src/pages/da/intro.md b/src/pages/da/intro.md
new file mode 100644
index 0000000000..382abe3719
--- /dev/null
+++ b/src/pages/da/intro.md
@@ -0,0 +1,86 @@
+---
+nextText: 'Core concepts'
+nextUrl: '/docs/intro/concepts'
+---
+
+# What is Ionic Framework?
+
+
+
+Ionic Framework is an open source UI toolkit for building performant, high-quality mobile and desktop apps using web technologies (HTML, CSS, and JavaScript).
+
+Ionic Framework is focused on the frontend user experience, or UI interaction of an app (controls, interactions, gestures, animations). It’s easy to learn, and integrates nicely with other libraries or frameworks, such as Angular, or can be used standalone without a frontend framework using a simple script include.
+
+Currently, Ionic Framework has official integration with Angular, but support for **Vue** and **React** are in development. If you’d like to learn more about Ionic Framework before diving in, we created a video to walk you through the basics.
+
+## Goals
+
+### Cross-platform
+
+Build and deploy apps that work across multiple platforms, such as native iOS, Android, desktop, and the web as a Progressive Web App - all with one code base. Write once, run anywhere.
+
+### Web Standards-based
+
+Ionic Framework is built on top of reliable, [standardized web technologies](/docs/faq/glossary#web-standards): HTML, CSS, and JavaScript, using modern Web APIs such as Custom Elements and Shadow DOM. Because of this, Ionic components have a stable API, and aren't at the whim of a single platform vendor.
+
+### Beautiful Design
+
+Clean, simple, and functional. Ionic Framework is designed to work and display beautifully out-of-the-box across all platforms. Start with pre-designed components, typography, interactive paradigms, and a gorgeous (yet extensible) base theme.
+
+### Simplicity
+
+Ionic Framework is built with simplicity in mind, so that creating Ionic apps is enjoyable, easy to learn, and accessible to just about anyone with web development skills.
+
+## License
+
+Ionic Framework is a free and open source project, released under the permissable MIT license. This means it can be used in personal or commercial projects for free. MIT is the same license used by such popular projects as jQuery and Ruby on Rails.
+
+This documentation content (found in the ionic-docs repo) is licensed under the Apache 2 license.
+
+## Ionic CLI
+
+The official [Ionic CLI](/docs/cli), or Command Line Interface, is a tool that quickly scaffolds Ionic apps and provides a number of helpful commands to Ionic developers. In addition to installing and updating Ionic, the CLI comes with a built-in development server, build and debugging tools, and much more. If you are an [Ionic Appflow](#ionic-appflow) member, the CLI can be used to perform cloud builds and deployments, and administer your account.
+
+## Framework Compatibility
+
+While past releases of Ionic were tightly coupled to Angular, V4 of the framework was re-engineered to work as a standalone Web Component library, with integrations for the latest JavaScript frameworks, like Angular. Ionic can be used in most frontend frameworks with success, including React and Vue, though some frameworks need a shim for full Web Component support.
+
+### JavaScript
+
+One of the main goals with Ionic 4 was to remove any hard requirement on a single framework to host the components. This means the core components can work standalone with just a script tag in a web page. While working with frameworks can be great for larger teams and larger apps, it is now possible to use Ionic as a standalone library in a single page even in a context like WordPress.
+
+### Angular
+
+Angular has always been at the center of what makes Ionic great. While the core components have been written to work as a standalone Web Component library, the `@ionic/angular` package makes integration with the Angular ecosystem a breeze. `@ionic/angular` includes all the functionality that Angular developers would expect coming from Ionic 2/3, and integrates with core Angular libraries, like the Angular router.
+
+### Future Support
+
+Support for other frameworks are expected in future release. Currently official bindings for Vue and React are being developed, though some components Just Work out of the box in those frameworks.
+
+## Ionic Framework V4+
+
+Ionic Framework V4 is a major advance in the underlying technology and capabilities of the project, with a focus on performance, compatibility, and overall extensibility. Although V4 still integrates deeply with Angular through the `@ionic/angular` package, it is now also framework-agnostic, meaning it can work with any other JavaScript framework (Vue, React, Preact, etc), or with no framework at all.
+
+By moving to web standards, V4 allows the core of Ionic to rely on the standard component model supported in modern browsers, rather than a framework-specific model. This can mean faster load time, better performance, and less overall code.
+
+## Ionic Appflow
+
+To help manage Ionic apps throughout their lifecycle, we also offer a commercial app platform for production apps called Ionic Appflow, which is **separate from the open source Framework.**
+
+Ionic Appflow helps developers and teams compile native app builds and deploy live code updates to Ionic apps from a centralized dashboard. Optional paid upgrades are available for more advanced capabilities like workflow automation, single sign-on (SSO) and access to connected services and integrations.
+
+Appflow requires an Ionic Account and comes with a free “Starter” plan for those interested in playing around with some of its features.
+
+## Ecosystem
+
+Ionic Framework is actively developed and maintained full-time by a core team, and its ecosystem is guided by an international community of developers and contributors fueling its growth and adoption. Developers and companies small and large use Ionic to build and ship amazing apps that run everywhere.
+
+### Join the Community
+
+There are millions of Ionic developers in over 200 countries worldwide. Here are some ways to join:
+
+* Forum: A great place for asking questions and sharing ideas.
+* Slack: A lively place for devs to meet and chat in real time.
+* Twitter: Where we post updates and share content from the Ionic community.
+* GitHub: For reporting bugs or requesting new features, create an issue here. PRs welcome!
+* Content authoring: Write a technical blog or share your story with the Ionic community.
\ No newline at end of file
diff --git a/src/pages/da/intro/browser-support.md b/src/pages/da/intro/browser-support.md
new file mode 100644
index 0000000000..20975f1a13
--- /dev/null
+++ b/src/pages/da/intro/browser-support.md
@@ -0,0 +1,35 @@
+---
+previousText: 'Core concepts'
+previousUrl: '/docs/intro/concepts'
+nextText: 'Versioning'
+nextUrl: '/docs/intro/versioning'
+---
+
+# Browser Support
+
+Ionic's earliest goal was to make it easy to develop mobile apps using web technologies like HTML, CSS, and JavaScript. Because of this foundation in web technologies, Ionic can run anywhere the web runs — iOS, Android, browsers, Electron, PWAs, and more.
+
+## Mobile
+
+In pursuit of [platform continuity](/docs/intro/concepts#platform-continuity), Ionic fully supports and is well tested on the mobile platforms listed below:
+
+| Platform | Supported Versions |
+| ----------- | ------------------ |
+| **Android** | 4.4+ |
+| **iOS** | 10+ |
+
+> Check the [latest Android stats](https://developer.android.com/about/dashboards/) and the [latest iOS stats](https://developer.apple.com/support/app-store/) for up-to-date platform information.
+
+## Desktop
+
+Because Ionic is based on web technologies, it works just as well on desktop browsers as it does on mobile devices. For more information on desktop layouts, see [Cross Platform](/docs/building/cross-platform#desktop).
+
+| Browser | Supported |
+| ----------- | --------- |
+| **Chrome** | ✔ |
+| **Safari** | ✔ |
+| **Edge** | ✔ |
+| **Firefox** | ✔ |
+| **IE** | 11+ |
+
+> Because Ionic is built with Stencil, see [Stencil's browser support](https://stenciljs.com/docs/browser-support) for a more detailed breakdown of support.
\ No newline at end of file
diff --git a/src/pages/da/intro/concepts.md b/src/pages/da/intro/concepts.md
new file mode 100644
index 0000000000..8764e4d3a8
--- /dev/null
+++ b/src/pages/da/intro/concepts.md
@@ -0,0 +1,42 @@
+---
+previousText: 'What is Ionic Framework'
+previousUrl: '/docs/intro'
+nextText: 'Build Your First App'
+nextUrl: '/docs/developer-resources/guides/first-app-v4/intro'
+---
+
+# Core Concepts
+
+For those completely new to Ionic app development, it can be helpful to get a high-level understanding of the core philosophy, concepts, and tools behind the project. Before diving into complex topics, we'll cover the basics of what Ionic Framework is, and how it works.
+
+## UI Components
+
+Ionic Framework is a library of UI Components, which are reusable elements that serve as the building blocks for an application. Ionic Components are built with [web standards](/docs/faq/glossary#web-standards) using HTML, CSS, and JavaScript. Though the components are pre-built, they're designed from the ground up to be highly customizable so apps can make each component their own, allowing each app to have its own look and feel. More specifically, Ionic components can be easily themed to globally change appearance across an entire app. For more information about customizing the look, please see [Theming](/docs/theming/basics).
+
+## Platform Continuity
+
+Platform Continuity is a built-in feature of Ionic Framework which allows app developers to use the same code base for multiple platforms. Every Ionic component adapts its look to the platform on which the app is running on. For example, Apple devices, such as the iPhone and iPad, use Apple's own iOS design language. Similarly, Android devices use Google's design language called Material Design.
+
+By making subtle design changes between the platforms, users are provided with a familiar app experience. An Ionic app downloaded from Apple's App Store will get the iOS theme, while an Ionic app downloaded from Android's Play Store will get the Material Design theme. For the apps that are viewed as a Progressive Web App (PWA) from a browser, Ionic will default to using the Material Design theme. Additionally, deciding which platform to use in certain scenarios is entirely configurable. More information about platform continuity can be found in [Theming](/docs/theming/basics).
+
+## Navigation
+
+Traditional web apps use a linear history, meaning that the user navigates forward to a page and can hit the back button to navigate back. An example of this is clicking around Wikipedia where the user is going forward and backward on the browser's linear history stack.
+
+In contrast, mobile apps often utilize parallel, "non-linear" navigation. For example, a tabbed interface can have separate navigation stacks for each tab, making sure the user never loses their place as they navigate and switch between tabs.
+
+Ionic apps embrace this mobile navigation approach, supporting parallel navigation histories that can also be nested, all while maintaining the familiar browser-style navigation concepts web developers are familiar with.
+
+For apps that are built with Angular and `@ionic/angular`, we recommend using the Angular Router which comes out of the box for every new Ionic 4 Angular app. Previous versions of Ionic shipped with our own custom router, but in order to provide the best tooling and developer experience we have since moved to using the framework's recommended router.
+
+## Native Access
+
+An amazing feature of apps built with web technologies (such as Ionic apps!) is that it can run on virtually any platform: desktop computers, phones, tablets, cars, refrigerators, and more! The same code base for Ionic apps can work on many platforms because it is based on web standards and common APIs that are shared across these platforms.
+
+One of the most common use cases for Ionic is to build an app which can be downloaded from both the App Store and Play Store. Both iOS and Android software development kits (SDKs) provide "[web views](/docs/building/webview)" which render any Ionic app, while still allowing for *full* Native SDK access.
+
+Projects such as Capacitor and Cordova are commonly used to give Ionic apps this access to Native SDKs. This means developers can quickly build out an app using common web development tools, and still have access to native features such as the device's accelerometer, camera, GPS, and more.
+
+## Theming
+
+At the core, Ionic Framework is built using CSS which allows us to take advantage of the flexibility that CSS properties (variables) provide. This makes it incredibly easy to design an app that looks great while following the web standard. We provide a set of colors so developers can have some great defaults, but we encourage overriding them to create designs that match a brand, company or a desired color palette. Everything from the background color of an application to the text color is fully customizable. More information on app theming can be found in [Theming](/docs/theming/basics).
\ No newline at end of file
diff --git a/src/pages/da/intro/support.md b/src/pages/da/intro/support.md
new file mode 100644
index 0000000000..673bb16d20
--- /dev/null
+++ b/src/pages/da/intro/support.md
@@ -0,0 +1,31 @@
+---
+previousText: 'Versioning'
+previousUrl: '/docs/intro/versioning'
+nextText: 'Installing Ionic'
+nextUrl: '/docs/installation/cli'
+contributors:
+ - dotNetkow
+---
+
+# Ionic Framework Support Policy
+
+## Community Maintenance
+
+The Ionic Framework CE (Community Edition) has been 100% open source (MIT) since the very beginning, and always will be. Developers can ensure Ionic is the right choice for their cross-platform apps through Ionic’s community maintenance strategy. The Ionic team regularly ships new releases, bug fixes, and is very welcoming to community pull requests.
+
+Given the reality of time and resource restraints as well as the desire to keep innovating in the frontend development space, over time it becomes necessary for the Ionic team to shift focus to newer versions of the Framework. However, Ionic will do everything it can to make the transition to newer versions as smooth as possible, including but not limited to publishing migration guides such as [this one for Ionic 4](/docs/building/migration). The open source community is always welcome to submit new features and bug fixes as well.
+
+The current status of each Ionic Framework version is:
+
+* **Ionic 4 [Active]** (Angular, React, Vue, and more): Latest version in active development.
+* **Ionic 3** (Angular 2+): No new feature development, but actively shipping major bug fixes.
+* **Ionic 2** (Angular 2+): No new feature development.
+* **Ionic 1** (Angular 1 aka AngularJS): No new feature development.
+
+For teams and organizations that require additional support for any Framework version, Ionic has options available.
+
+## Long Term Support (Premium)
+
+Long Term Support (LTS) provides developers and organizations with additional stability and reliability in the apps they’re developing, including guaranteed support level agreements (SLAs) and advisory services. Take the preparation time you need before upgrading to the latest version of the Ionic Framework or remain confident in your app’s long-term success by staying on whichever version you’re most comfortable with.
+
+LTS is available as part of Ionic Enterprise Edition and extends to Ionic 1 implementations and higher. For more information, visit the [Ionic Enterprise Edition](https://ionicframework.com/enterprise-edition) page or schedule a [Strategy Session](https://ionicframework.com/strategysession) with one of our Solutions Engineers.
\ No newline at end of file
diff --git a/src/pages/da/intro/versioning.md b/src/pages/da/intro/versioning.md
new file mode 100644
index 0000000000..4a6192c1f9
--- /dev/null
+++ b/src/pages/da/intro/versioning.md
@@ -0,0 +1,30 @@
+---
+previousText: 'Browser Support'
+previousUrl: '/docs/intro/browser-support'
+nextText: 'Release Notes'
+nextUrl: '/docs/release-notes'
+---
+
+# Versioning
+
+
+
+Ionic Framework follows the Semantic Versioning (SemVer) convention: `major.minor.patch.` Incompatible API changes increment the `major` version, adding backwards-compatible functionality increments the `minor` version, and backwards-compatible bug fixes increment the `patch` version.
+
+## Release Schedule
+
+### Major Release
+
+A major release will be published when there is a breaking change introduced in the API. Major releases will occur roughly every **6 months** and may contain breaking changes. Several release candidates will be published prior to a major release in order to get feedback before the final release. An outline of what is changing and why will be included with the release candidates.
+
+### Minor Release
+
+A minor release will be published when a new feature is added or API changes that are non-breaking are introduced. We will heavily test any changes so that we are confident with the release, but with new code comes the potential for new issues. We are scheduled to release a minor version **every month**, if any features or API changes were made.
+
+### Patch Release
+
+A patch release will be published when bug fixes were included, but the API has not changed and no breaking changes were introduced. We are scheduled to release a new patch version **every other week**, but there may be times where we need to release sooner or later than scheduled. To ensure patch releases can fix existing code without introducing new issues from the new features, patch releases will always be published prior to a minor release.
+
+## Changelog
+
+To see a list of all notable changes to Ionic please refer to the changelog. This contains an ordered list of all bug fixes and new features under each release.
\ No newline at end of file
diff --git a/src/pages/da/layout/css-utilities.md b/src/pages/da/layout/css-utilities.md
new file mode 100644
index 0000000000..3078fe0651
--- /dev/null
+++ b/src/pages/da/layout/css-utilities.md
@@ -0,0 +1,646 @@
+---
+initialTab: 'preview'
+inlineHtmlPreviews: true
+previousText: 'Global Stylesheets'
+previousUrl: '/docs/layout/global-stylesheets'
+nextText: 'Theming'
+nextUrl: '/docs/theming/basics'
+contributors:
+ - brandyscarney
+---
+
+
+
+
+
+
+
+
+
+
+
+
+# CSS Utilities
+
+Ionic Framework provides a set of CSS utility classes that can be used on any element in order to modify the text, element placement or adjust the padding and margin.
+
+
+
+ If your app was not started using an available Ionic Framework starter, the stylesheets listed in the optional section of the global stylesheets will need to be included in order for these styles to work.
+
+
+
+## Text Modification
+
+### Text Alignment
+
+```html
+
+
+
+
+
text-start
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-end
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-center
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
+
+
text-justify
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-wrap
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-nowrap
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `.ion-text-left` | `text-align: left` | The inline contents are aligned to the left edge of the line box. |
+| `.ion-text-right` | `text-align: right` | The inline contents are aligned to the right edge of the line box. |
+| `.ion-text-start` | `text-align: start` | The same as `text-left` if direction is left-to-right and `text-right` if direction is right-to-left. |
+| `.ion-text-end` | `text-align: end` | The same as `text-right` if direction is left-to-right and `text-left` if direction is right-to-left. |
+| `.ion-text-center` | `text-align: center` | The inline contents are centered within the line box. |
+| `.ion-text-justify` | `text-align: justify` | The inline contents are justified. Text should be spaced to line up its left and right edges to the left and right edges of the line box, except for the last line. |
+| `.ion-text-wrap` | `white-space: normal` | Sequences of whitespace are collapsed. Newline characters in the source are handled as other whitespace. Breaks lines as necessary to fill line boxes. |
+| `.ion-text-nowrap` | `white-space: nowrap` | Collapses whitespace as for `normal`, but suppresses line breaks (text wrapping) within text. |
+
+### Text Transformation
+
+```html
+
+
+
+
+
text-uppercase
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-lowercase
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
text-capitalize
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ---------------------- | ---------------------------- | ------------------------------------------------------------------ |
+| `.ion-text-uppercase` | `text-transform: uppercase` | Forces all characters to be converted to uppercase. |
+| `.ion-text-lowercase` | `text-transform: lowercase` | Forces all characters to be converted to lowercase. |
+| `.ion-text-capitalize` | `text-transform: capitalize` | Forces the first letter of each word to be converted to uppercase. |
+
+### Responsive Text Classes
+
+All of the text classes listed above have additional classes to modify the text based on the screen size. Instead of `text-` in each class, use `text-{breakpoint}-` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints).
+
+The table below shows the default behavior, where `{modifier}` is any of the following: `left`, `right`, `start`, `end`, `center`, `justify`, `wrap`, `nowrap`, `uppercase`, `lowercase`, or `capitalize`, as they are described above.
+
+| Class | Description |
+| ------------------------- | ------------------------------------------------------------- |
+| `.ion-text-{modifier}` | Applies the modifier to the element on all screen sizes. |
+| `.ion-text-sm-{modifier}` | Applies the modifier to the element when `min-width: 576px`. |
+| `.ion-text-md-{modifier}` | Applies the modifier to the element when `min-width: 768px`. |
+| `.ion-text-lg-{modifier}` | Applies the modifier to the element when `min-width: 992px`. |
+| `.ion-text-xl-{modifier}` | Applies the modifier to the element when `min-width: 1200px`. |
+
+## Element Placement
+
+### Float Elements
+
+The float CSS property specifies that an element should be placed along the left or right side of its container, where text and inline elements will wrap around it. This way, the element is taken from the normal flow of the web page, though still remaining a part of the flow, contrary to absolute positioning.
+
+```html
+
+
+
+
+
float-left
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+
float-right
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac vehicula lorem.
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------- |
+| `.ion-float-left` | `float: left` | The element will float on the left side of its containing block. |
+| `.ion-float-right` | `float: right` | The element will float on the right side of its containing block. |
+| `.ion-float-start` | `float: left` / `float: right` | The same as `float-left` if direction is left-to-right and `float-right` if direction is right-to-left. |
+| `.ion-float-end` | `float: left` / `float: right` | The same as `float-right` if direction is left-to-right and `float-left` if direction is right-to-left. |
+
+### Responsive Float Classes
+
+All of the float classes listed above have additional classes to modify the float based on the screen size. Instead of `float-` in each class, use `float-{breakpoint}-` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints).
+
+The table below shows the default behavior, where `{modifier}` is any of the following: `left`, `right`, `start`, or `end`, as they are described above.
+
+| Class | Description |
+| -------------------------- | ------------------------------------------------------------- |
+| `.ion-float-{modifier}` | Applies the modifier to the element on all screen sizes. |
+| `.ion-float-sm-{modifier}` | Applies the modifier to the element when `min-width: 576px`. |
+| `.ion-float-md-{modifier}` | Applies the modifier to the element when `min-width: 768px`. |
+| `.ion-float-lg-{modifier}` | Applies the modifier to the element when `min-width: 992px`. |
+| `.ion-float-xl-{modifier}` | Applies the modifier to the element when `min-width: 1200px`. |
+
+## Element Display
+
+The display CSS property determines if an element should be visible or not. The element will still be in the DOM, but not rendered, if it is hidden.
+
+```html
+
+
+
+
+
hidden
+ You can't see me.
+
+
+
+
+
not-hidden
+ You can see me!
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ----------- | --------------- | --------------------------- |
+| `.ion-hide` | `display: none` | The element will be hidden. |
+
+### Responsive Display Attributes
+
+There are also additional classes to modify the visibility based on the screen size. Instead of just `.ion-hide` for all screen sizes, use `.ion-hide-{breakpoint}-{dir}` to only use the class on specific screen sizes, where `{breakpoint}` is one of the breakpoint names listed in [Ionic Breakpoints](#ionic-breakpoints), and `{dir}` is whether the element should be hidden on all screen sizes above (`up`) or below (`down`) the specified breakpoint.
+
+| Class | Description |
+| -------------------- | ---------------------------------------------------------------------------------------------------- |
+| `.ion-hide-sm-{dir}` | Applies the modifier to the element when `min-width: 576px` (`up`) or `max-width: 576px` (`down`). |
+| `.ion-hide-md-{dir}` | Applies the modifier to the element when `min-width: 768px` (`up`) or `max-width: 768px` (`down`). |
+| `.ion-hide-lg-{dir}` | Applies the modifier to the element when `min-width: 992px` (`up`) or `max-width: 992px` (`down`). |
+| `.ion-hide-xl-{dir}` | Applies the modifier to the element when `min-width: 1200px` (`up`) or `max-width: 1200px` (`down`). |
+
+## Content Space
+
+### Element Padding
+
+The padding class sets the padding area of an element. The padding area is the space between the content of the element and its border.
+
+The default amount of `padding` to be applied is `16px` and is set by the `--ion-padding` variable. See the [CSS Variables](/docs/theming/css-variables) section for more information on how to change these values.
+
+```html
+
+
+
+
+ padding
+
+
+
+
+ padding-top
+
+
+
+
+ padding-start
+
+
+
+
+ padding-end
+
+
+
+
+
+
+ padding-bottom
+
+
+
+
+ padding-vertical
+
+
+
+
+ padding-horizontal
+
+
+
+
+ no-padding
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ------------------------- | ---------------------- | -------------------------------------- |
+| `.ion-padding` | `padding: 16px` | Applies padding to all sides. |
+| `.ion-padding-top` | `padding-top: 16px` | Applies padding to the top. |
+| `.ion-padding-start` | `padding-start: 16px` | Applies padding to the start. |
+| `.ion-padding-end` | `padding-end: 16px` | Applies padding to the end. |
+| `.ion-padding-bottom` | `padding-bottom: 16px` | Applies padding to the bottom. |
+| `.ion-padding-vertical` | `padding: 16px 0` | Applies padding to the top and bottom. |
+| `.ion-padding-horizontal` | `padding: 0 16px` | Applies padding to the left and right. |
+| `.ion-no-padding` | `padding: 0` | Applies no padding to all sides. |
+
+### Element Margin
+
+The margin area extends the border area with an empty area used to separate the element from its neighbors.
+
+The default amount of `margin` to be applied is `16px` and is set by the `--ion-margin` variable. See the [CSS Variables](/docs/theming/css-variables) section for more information on how to change these values.
+
+```html
+
+
+
+
+ margin
+
+
+
+
+ margin-top
+
+
+
+
+ margin-start
+
+
+
+
+ margin-end
+
+
+
+
+
+
+ margin-bottom
+
+
+
+
+ margin-vertical
+
+
+
+
+ margin-horizontal
+
+
+
+
+ no-margin
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ------------------------ | --------------------- | ------------------------------------- |
+| `.ion-margin` | `margin: 16px` | Applies margin to all sides. |
+| `.ion-margin-top` | `margin-top: 16px` | Applies margin to the top. |
+| `.ion-margin-start` | `margin-start: 16px` | Applies margin to the left. |
+| `.ion-margin-end` | `margin-end: 16px` | Applies margin to the right. |
+| `.ion-margin-bottom` | `margin-bottom: 16px` | Applies margin to the bottom. |
+| `.ion-margin-vertical` | `margin: 16px 0` | Applies margin to the top and bottom. |
+| `.ion-margin-horizontal` | `margin: 0 16px` | Applies margin to the left and right. |
+| `.ion-no-margin` | `margin: 0` | Applies no margin to all sides. |
+
+## Flex Properties
+
+
+
+### Flex Container Properties
+
+```html
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| ------------------------------ | -------------------------------- | --------------------------------------------------------------------------- |
+| `.ion-justify-content-start` | `justify-content: flex-start` | Items are packed toward the start on the main axis. |
+| `.ion-justify-content-end` | `justify-content: flex-end` | Items are packed toward the end on the main axis. |
+| `.ion-justify-content-center` | `justify-content: center` | Items are centered along the main axis. |
+| `.ion-justify-content-around` | `justify-content: space-around` | Items are evenly distributed on the main axis with equal space around them. |
+| `.ion-justify-content-between` | `justify-content: space-between` | Items are evenly distributed on the main axis. |
+| `.ion-justify-content-evenly` | `justify-content: space-evenly` | Items are distributed so that the spacing between any two items is equal. |
+| `.ion-align-items-start` | `align-items: flex-start` | Items are packed toward the start on the cross axis. |
+| `.ion-align-items-end` | `align-items: flex-end` | Items are packed toward the end on the cross axis. |
+| `.ion-align-items-center` | `align-items: center` | Items are centered along the cross axis. |
+| `.ion-align-items-baseline` | `align-items: baseline` | Items are aligned so that their baselines align. |
+| `.ion-align-items-stretch` | `align-items: stretch` | Items are stretched to fill the container. |
+| `.ion-nowrap` | `flex-wrap: nowrap` | Items will all be on one line. |
+| `.ion-wrap` | `flex-wrap: wrap` | Items will wrap onto multiple lines, from top to bottom. |
+| `.ion-wrap-reverse` | `flex-wrap: wrap-reverse` | Items will wrap onto multiple lines, from bottom to top. |
+
+### Flex Item Properties
+
+```html
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+```
+
+| Class | Style Rule | Description |
+| -------------------------- | ------------------------ | ---------------------------------------------------------------------- |
+| `.ion-align-self-start` | `align-self: flex-start` | Item is packed toward the start on the cross axis. |
+| `.ion-align-self-end` | `align-self: flex-end` | Item is packed toward the end on the cross axis. |
+| `.ion-align-self-center` | `align-self: center` | Item is centered along the cross axis. |
+| `.ion-align-self-baseline` | `align-self: baseline` | Item is aligned so that its baseline aligns with other item baselines. |
+| `.ion-align-self-stretch` | `align-self: stretch` | Item is stretched to fill the container. |
+| `.ion-align-self-auto` | `align-self: auto` | Item is positioned according to the parent's `align-items` value. |
+
+## Ionic Breakpoints
+
+Ionic uses breakpoints in media queries in order to style an application differently based on the screen size. The following breakpoint names are used in the utility classes listed above, where the class will apply when the width is met.
+
+| Breakpoint Name | Width |
+| --------------- | -------- |
+| `xs` | `0` |
+| `sm` | `576px` |
+| `md` | `768px` |
+| `lg` | `992px` |
+| `xl` | `1200px` |
\ No newline at end of file
diff --git a/src/pages/da/layout/global-stylesheets.md b/src/pages/da/layout/global-stylesheets.md
new file mode 100644
index 0000000000..20c26de891
--- /dev/null
+++ b/src/pages/da/layout/global-stylesheets.md
@@ -0,0 +1,72 @@
+---
+initialTab: 'preview'
+inlineHtmlPreviews: true
+previousText: 'Responsive Grid'
+previousUrl: '/docs/layout/grid'
+nextText: 'CSS Utilities'
+nextUrl: '/docs/layout/css-utilities'
+contributors:
+ - brandyscarney
+---
+
+# Global Stylesheets
+
+While Ionic Framework component styles are self-contained, there are several global stylesheets that should be included in order to use all of Ionic's features. Some of the stylesheets are required in order for an Ionic Framework app to look and behave properly, and others include optional utilities to quickly style your app.
+
+## Available
+
+### Required
+
+The following CSS file must be included in order for Ionic Framework to work properly.
+
+#### core.css
+
+This file is the only stylesheet that is required in order for Ionic components to work properly. It includes app specific styles, and allows the `color` property to work across components. If this file is not included the colors will not show up and some elements may not appear properly.
+
+### Recommended
+
+The following CSS files are recommended to be included in an Ionic Framework app. If they are not included, some elements may have undesired styles. If Ionic Framework components are being used outside of an app, these files may not be necessary.
+
+#### structure.css
+
+Applies styles to `` and defaults `box-sizing` to `border-box`. It ensures scrolling behaves like native in mobile devices.
+
+#### typography.css
+
+Typography changes the font-family of the entire document and modifies the font styles for heading elements. It also applies positioning styles to some native text elements.
+
+#### normalize.css
+
+Makes browsers render all elements more consistently and in line with modern standards. It is based on [Normalize.css](https://necolas.github.io/normalize.css/).
+
+### Optional
+
+The following set of CSS files are optional and can safely be commented out or removed if the application is not using any of the features.
+
+#### padding.css
+
+Adds utility classes to modify the padding or margin on any element, see [CSS Utilities](./css-utilities#content-space) for usage information.
+
+#### float-elements.css
+
+Adds utility classes to float an element based on the breakpoint and side, see [CSS Utilities](./css-utilities#element-placement) for usage information.
+
+#### text-alignment.css
+
+Adds utility classes to align the text of an element or adjust the white space based on the breakpoint, see [CSS Utilities](./css-utilities#text-alignment) for usage information.
+
+#### text-transformation.css
+
+Adds utility classes to transform the text of an element to `uppercase`, `lowercase` or `capitalize` based on the breakpoint, see [CSS Utilities](./css-utilities#text-transformation) for usage information.
+
+#### flex-utils.css
+
+Adds utility classes to align flex containers and items, see [CSS Utilities](./css-utilities#flex-properties) for usage information.
+
+#### display.css
+
+Adds utility classes to hide any element based on the breakpoint, see [CSS Utilities](./css-utilities#element-display) for usage information.
+
+## Usage
+
+Refer to [Ionic Packages](../installation/cdn) for how to include the global stylesheets based on the framework and [CSS Utilities](./css-utilities) for how to use the optional utilities.
\ No newline at end of file
diff --git a/src/pages/da/layout/grid.md b/src/pages/da/layout/grid.md
new file mode 100644
index 0000000000..2cc9fc4f65
--- /dev/null
+++ b/src/pages/da/layout/grid.md
@@ -0,0 +1,625 @@
+---
+initialTab: 'preview'
+inlineHtmlPreviews: true
+previousText: 'Structure'
+previousUrl: '/docs/layout/structure'
+nextText: 'Global Stylesheets'
+nextUrl: '/docs/layout/global-stylesheets'
+contributors:
+ - brandyscarney
+---
+
+
+
+
+
+
+
+
+
+
+
+
+# Responsive Grid
+
+The grid is a powerful mobile-first flexbox system for building custom layouts. It is composed of three units — a [grid](/docs/api/grid), [row(s)](/docs/api/row) and [column(s)](/docs/api/col). Columns will expand to fill their row, and will resize to fit additional columns. It is based on a 12 column layout with different breakpoints based on the screen size. The number of columns can be customized using CSS.
+
+## How it works
+
+```html
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3
+
+
+
+
+ 3 of 3
+
+
+
+
+```
+
+- Grids act as a container for all rows and columns. Grids take up the full width of their container, but adding the `fixed` attribute will specify the width per screen size, see [grid size](#grid-size) below.
+- Rows are horizontal groups of columns that line the columns up properly.
+- Content should be placed within columns, and only columns may be immediate children of rows.
+- The `size-{breakpoint}` attributes indicate the number of columns to use out of the default 12 per row. So, `size="4"` can be added to a column in order to take up 1/3 of the grid, or 4 of the 12 columns.
+- Columns without a value for size will automatically have equal widths. For example, four instances of `size-sm` will each automatically be 25% wide for the small breakpoint and up.
+- Column widths are set as a percentage, so they’re always fluid and sized relative to their parent element.
+- Columns have padding between individual columns, however, the padding can be removed from the grid and columns by adding `no-padding` on the grid.
+- There are five grid tiers, one for each responsive breakpoint: all breakpoints (extra small), small, medium, large, and extra large.
+- Grid tiers are based on minimum widths, meaning they apply to their tier and all those larger than them (e.g., `size-sm="4"` applies to small, medium, large, and extra large devices).
+- Grids can easily be customized via CSS variables. See [customizing the grid](#customizing-the-grid).
+
+## Grid size
+
+By default, the grid will take up 100% width. To set a specific width based on the screen size, add the `fixed` attribute. The width of the grid for each breakpoint is defined in the `--ion-grid-width-{breakpoint}` CSS variables. For more information, see [customizing the grid](#customizing-the-grid).
+
+| Name | Value | Description |
+| ---- | ------ | ------------------------------------------------- |
+| xs | 100% | Don't set the grid width for xs screens |
+| sm | 540px | Set grid width to 540px when (min-width: 576px) |
+| md | 720px | Set grid width to 720px when (min-width: 768px) |
+| lg | 960px | Set grid width to 960px when (min-width: 992px) |
+| xl | 1140px | Set grid width to 1140px when (min-width: 1200px) |
+
+## Grid attributes
+
+The grid takes up full width and has padding added to it based on the screen size. There are two attributes that can be used to adjust this behavior.
+
+| Property | Description |
+| ---------- | ------------------------------------------------------------- |
+| no-padding | Removes padding from the grid and immediate children columns. |
+| fixed | Set a max width based on the screen size. |
+
+## Default breakpoints
+
+The default breakpoints are defined in the table below. Breakpoints can not be customized at this time. For more information on why they can't be customized, see [Variables in Media Queries](/docs/theming/advanced#variables-in-media-queries).
+
+| Name | Value | Width Prefix | Offset Prefix | Push Prefix | Pull Prefix | Description |
+| ---- | ------ | ------------ | ------------- | ----------- | ----------- | ------------------------------------ |
+| xs | 0 | `size-` | `offset-` | `push-` | `pull-` | Set columns when (min-width: 0) |
+| sm | 576px | `size-sm-` | `offset-sm-` | `push-sm-` | `pull-sm-` | Set columns when (min-width: 576px) |
+| md | 768px | `size-md-` | `offset-md-` | `push-md-` | `pull-md-` | Set columns when (min-width: 768px) |
+| lg | 992px | `size-lg-` | `offset-lg-` | `push-lg-` | `pull-lg-` | Set columns when (min-width: 992px) |
+| xl | 1200px | `size-xl-` | `offset-xl-` | `push-xl-` | `pull-xl-` | Set columns when (min-width: 1200px) |
+
+## Auto-layout columns
+
+### Equal-width
+
+By default, columns will take up equal width inside of a row for all devices and screen sizes.
+
+```html
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3
+
+
+
+
+ 3 of 3
+
+
+
+
+```
+
+### Setting one column width
+
+Set the width of one column and the others will automatically resize around it. This can be done using our predefined grid attributes. In the example below, the other columns will resize no matter the width of the center column.
+
+```html
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3 (wider)
+
+
+
+
+ 3 of 3
+
+
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3 (wider)
+
+
+
+
+ 3 of 3
+
+
+
+
+```
+
+### Variable-width
+
+By setting the `size-{breakpoint}` properties to `"auto"` the column can size itself based on the natural width of its content. This is extremely useful for setting a column width using pixels. The columns next to the variable-width column will resize to fill the row.
+
+```html
+
+
+
+
+ 1 of 3
+
+
+
+
+ Variable width content
+
+
+
+
+ 3 of 3
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+
+
+
+
+
+ 4 of 4
+
+
+
+
+```
+
+## Responsive attributes
+
+### All breakpoints
+
+To customize a column's width for all devices and screens, set the `size` property. The value of this property determines how many columns this column should take up out of the total available columns.
+
+```html
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+
+
+
+
+```
+
+### Stacked to horizontal
+
+Use a combination of width and breakpoint attributes to create a grid that starts out stacked on extra small screens before becoming horizontal on small screens.
+
+```html
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+
+
+
+
+```
+
+## Reordering
+
+### Offsetting columns
+
+Move columns to the right by adding the `offset` property. This property increases the margin left of the column by the number of specified columns. For example, in the following grid the last column will be offset by 3 columns and take up 3 columns:
+
+```html
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+```
+
+Offsets can also be added based on screen breakpoints. Here's an example of a grid where the last column will be offset by 3 columns for `md` screens and up:
+
+```html
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3
+
+
+
+
+ 3 of 3
+
+
+
+
+```
+
+### Push and pull
+
+Reorder the columns by adding the `push` and `pull` properties. These properties adjust the `left` and `right` of the columns by the specified number of columns making it easy to reorder columns. For example, in the following grid the column with the `1 of 2` description will actually be the last column and the `2 of 2` will be the first column.
+
+```html
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+```
+
+Push and pull can also be added based on screen breakpoints. In the following example, the column with the `3 of 3` column description will actually be the first column for `md` screens and up:
+
+```html
+
+
+
+
+ 1 of 3
+
+
+
+
+ 2 of 3
+
+
+
+
+ 3 of 3
+
+
+
+
+```
+
+## Alignment
+
+### Vertical alignment
+
+All columns can be vertically aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/docs/layout/css-utilities#flex-container-properties).
+
+```html
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+```
+
+Columns can also align themselves differently than other columns by adding the alignment class directly to the column. For a list of available classes, see [css utilities](/docs/layout/css-utilities#flex-item-properties).
+
+```html
+
+
+
+
+ 1 of 4
+
+
+
+
+ 2 of 4
+
+
+
+
+ 3 of 4
+
+
+
+
+ 4 of 4
+ #
+ #
+ #
+
+
+
+
+```
+
+### Horizontal alignment
+
+All columns can be horizontally aligned inside of a row by adding different classes to the row. For a list of available classes, see [css utilities](/docs/layout/css-utilities#flex-container-properties).
+
+```html
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+
+
+
+ 1 of 2
+
+
+
+
+ 2 of 2
+
+
+
+
+```
+
+## Customizing the grid
+
+Using our built-in CSS variables, it’s possible to customize the predefined grid attributes. Change the values of the padding, the number of columns, and more.
+
+### Number of columns
+
+The number of grid columns can be modified with the `--ion-grid-columns` CSS variable. By default there are 12 grid columns, but this can be changed to any positive integer and be used to calculate the width of each individual column.
+
+```css
+--ion-grid-columns: 12;
+```
+
+### Grid Padding
+
+The padding on the grid container can be set for all breakpoints with the `--ion-grid-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-padding-{breakpoint}` CSS variables.
+
+```css
+--ion-grid-padding: 5px;
+
+--ion-grid-padding-xs: 5px;
+--ion-grid-padding-sm: 5px;
+--ion-grid-padding-md: 5px;
+--ion-grid-padding-lg: 5px;
+--ion-grid-padding-xl: 5px;
+```
+
+### Grid width
+
+To customize the width values of the fixed grid based on the screen size, override the values of `--ion-grid-width-{breakpoint}` for each breakpoint.
+
+```css
+--ion-grid-width-xs: 100%;
+--ion-grid-width-sm: 540px;
+--ion-grid-width-md: 720px;
+--ion-grid-width-lg: 960px;
+--ion-grid-width-xl: 1140px;
+```
+
+### Column Padding
+
+The padding on the columns can be set for all breakpoints with the `--ion-grid-column-padding` CSS variable. To override individual breakpoints, use the `--ion-grid-column-padding-{breakpoint}` CSS variables.
+
+```css
+--ion-grid-column-padding: 5px;
+
+--ion-grid-column-padding-xs: 5px;
+--ion-grid-column-padding-sm: 5px;
+--ion-grid-column-padding-md: 5px;
+--ion-grid-column-padding-lg: 5px;
+--ion-grid-column-padding-xl: 5px;
+```
\ No newline at end of file
diff --git a/src/pages/da/layout/rtl.md b/src/pages/da/layout/rtl.md
new file mode 100644
index 0000000000..2fe7ef89f8
--- /dev/null
+++ b/src/pages/da/layout/rtl.md
@@ -0,0 +1,10 @@
+---
+previousText: 'CSS Utilities'
+previousUrl: '/docs/layout/css-utilities'
+nextText: 'Theming'
+nextUrl: '/docs/theming/basics'
+---
+
+# RTL Support
+
+TODO: add stuff here
\ No newline at end of file
diff --git a/src/pages/da/layout/structure.md b/src/pages/da/layout/structure.md
new file mode 100644
index 0000000000..58a375729b
--- /dev/null
+++ b/src/pages/da/layout/structure.md
@@ -0,0 +1,211 @@
+---
+nextText: 'Responsive Grid'
+nextUrl: '/docs/layout/grid'
+initialTab: 'preview'
+contributors:
+ - brandyscarney
+---
+
+# Structure
+
+Ionic Framework provides several different layouts that can be used to structure an app. From single page layouts, to split pane views and modals.
+
+## Header and Footer Layout
+
+### Header
+
+The most simple layout available consists of a [header](/docs/api/header) and [content](/docs/api/content). Most pages in an app generally have both of these, but a header is not required in order to use content.
+
+```html
+
+
+
+ Header
+
+
+
+
+
Main Content
+
+
+```
+
+### Footer
+
+As you can see, a toolbar in a header appears above the content. Sometimes an app needs to have a toolbar below the content, which is when a footer is used.
+
+```html
+
+
+
Main Content
+
+
+
+
+ Footer
+
+
+
+```
+
+### Header and Footer
+
+These can also be combined on one page to have a toolbar above *and* below the content.
+
+```html
+
+
+
+ Header
+
+
+
+
+
Main Content
+
+
+
+
+ Footer
+
+
+
+```
+
+## Tabs Layout
+
+A layout consisting of horizontal [tabs](/docs/api/tabs) can be used to let the user quickly change between content views. Each tab can contain static content or a navigation stack by using an `ion-router-outlet` or `ion-nav`.
+
+```html
+
+
+
+
Home Content
+
+
+
Settings Content
+
+
+
+
+ Home
+
+
+
+ Settings
+
+
+
+
+
+```
+
+## Menu Layout
+
+A standard layout among mobile apps includes the ability to toggle a side [menu](/docs/api/menu) by clicking a button or swiping it open from the side. Side menus are generally used for navigation, but they can contain any content.
+
+```html
+
+
+
+
+ Menu
+
+
+
+
+
+
+ Navigate
+
+
+
+
+
+ Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Header
+
+
+
+
Main Content
+
Click the icon in the top left to toggle the menu.
+
+
+
+
+
+```
+
+## Split Pane Layout
+
+A [split pane](/docs/api/split-pane) layout has a more complex structure because it can combine the previous layouts. It allows for multiple views to be displayed when the viewport is above a specified breakpoint. If the device's screen size is below a certain size, the split pane view will be hidden.
+
+By default, the split pane view will show when the screen is larger than `768px`, or the `md` breakpoint, but this can be customized to use different breakpoints by setting the `when` property. Below is an example where the split pane contains a menu that is visible for `sm` screens and up, or when the viewport is larger than `576px`. By resizing the browser horizontally so that the app is smaller than this, the split pane view will disappear.
+
+```html
+
+
+
+
+
+ Menu
+
+
+
+
+
+
+ Navigate
+
+
+
+
+
+ Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Header
+
+
+
+
Main Content
+
+
+
+
+
+```
+
+It's important to note that the element with the `main` attribute will be the main content that is always visible. This can be any element, including an [ion-nav](/docs/api/nav), [ion-router-outlet](/docs/api/router-outlet), or an [ion-tabs](/docs/api/tabs).
\ No newline at end of file
diff --git a/src/pages/da/lifecycle/angular.md b/src/pages/da/lifecycle/angular.md
new file mode 100644
index 0000000000..664fa5bcd0
--- /dev/null
+++ b/src/pages/da/lifecycle/angular.md
@@ -0,0 +1,95 @@
+---
+previousText: ''
+previousUrl: ''
+nextText: ''
+nextUrl: ''
+contributors:
+ - elylucas
+---
+
+# Ionic Page Life Cycle
+
+This guide covers how the page life cycle works in an app built with Ionic and Angular.
+
+
+
+## Angular Life Cycle Events
+
+Ionic embraces the life cycle events provided by Angular. The two Angular events you will find using the most are:
+
+| Event Name | Description |
+| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ngOnInit` | Fired once during component initialization. This event can be used to initialize local members and make calls into services that only need to be done once. |
+| `ngOnDestroy` | Fired right before Angular destroys the view. Useful for cleanup like unsubscribing from observables. |
+
+For more info on the Angular Component Life Cycle events, visit their [component lifecycle docs](https://angular.io/guide/lifecycle-hooks).
+
+## Ionic Page Events
+
+In addition to the Angular life cycle events, Ionic Angular provides a few additional events that you can use:
+
+| Event Name | Description |
+| ------------------ | ------------------------------------------------------------------ |
+| `ionViewWillEnter` | Fired when the component routing to is about to animate into view. |
+| `ionViewDidEnter` | Fired when the component routing to has finished animating. |
+| `ionViewWillLeave` | Fired when the component routing from is about to animate. |
+| `ionViewDidLeave` | Fired when the component routing to has finished animating. |
+
+The difference between `ionViewWillEnter` and `ionViewDidEnter` is when they fire. The former fires right after `ngOnInit` but before the page transition begins, and the latter directly after the transition ends.
+
+For `ionViewWillLeave` and `ionViewDidLeave`, `ionViewWillLeave` gets called directly before the transition away from the current page begins, and `ionViewDidLeave` does not get called until after the new page gets successfully transitioned into (after the new pages `ionViewDidEnter` fires).
+
+
+
+## How Ionic Handles the Life of a Page
+
+Ionic has its router outlet, called ``. This outlet extends Angular's `` with some additional functionality to enable better experiences for mobile devices.
+
+When an app is wrapped in ``, Ionic treats navigation a bit differently. When you navigate to a new page, Ionic will keep the old page in the existing DOM, but hide it from your view and transition the new page. The reason we do this is two-fold:
+
+1) We can maintain the state of the old page (data on the screen, scroll position, etc..)
+2) We can provide a smoother transition back to the page since it is already there and doesn't need to be recreated.
+
+Pages are only removed from the DOM when they are "popped", for instance, by pressing the back button in the UI or the browsers back button.
+
+Because of this special handling, the `ngOnInit` and `ngOnDestroy` methods might not fire when you would usually think they should.
+
+`ngOnInit` will only fire each time the page is freshly created, but not when navigated back to the page. For instance, navigating between each page in a tabs interface will only call each page's `ngOnInit` method once, but not on subsequent visits. `ngOnDestroy` will only fire when a page "popped".
+
+## Route Guards
+
+In Ionic 3, there were a couple of additional life cycle methods that were useful to control when a page could be entered (`ionViewCanEnter`) and left (`ionViewCanLeave`). These could be used to protect pages from unauthorized users and to keep a user on a page when you don't want them to leave (like during a form fill).
+
+These methods were removed in Ionic 4 in favor of using Angular's Route Guards.
+
+A route guard helps determine if a particular action can be taken against a route. They are classes that implement a certain interface. The `CanActivate` and `CanDeactivate` interfaces can be used to implement the same type of logic that the removed events `ionViewCanEnter` and `ionViewCanLeave` did.
+
+```typescript
+@Injectable()
+export class AuthGuard implements CanActivate {
+ constructor(private authService: AuthService) {}
+
+ canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
+ return this.authService.isAuthenticated();
+ }
+}
+```
+
+To use this guard, add it to the appropriate param in the route definition:
+
+```typescript
+{ path: 'settings', canActivate: [AuthGuard], loadChildren: '...', }
+```
+
+For more info on how to use route guards, go to Angular's [router documentation](https://angular.io/guide/router).
+
+## Guidance for Each Life Cycle Method
+
+Below are some tips on uses cases for each of the life cycle events.
+
+- `ngOnInit` - Initialize your component and load data from services that don't need refreshing on each subsequent visit.
+- `ionViewWillEnter` - Since `ionViewWillEnter` is called every time the view is navigated to (regardless if initialized or not), it's a good method to load data from services. However, if your data comes back during the animation, it can start lots of DOM manipulation, which can cause some janky animations.
+- `ionViewDidEnter` - If you see performance problems from using `ionViewWillEnter` when loading data, you can do your data calls in `ionViewDidEnter` instead. This event won't fire until after the page is visible by the user, however, so you might want to use either a loading indicator or a skeleton screen, so content doesn't flash in un-naturally after the transition is complete.
+- `ionViewWillLeave` - Can be used for cleanup, like unsubscribing from observables. Since `ngOnDestroy` might not fire when you navigate from the current page, put your cleanup code here if you don't want it active while the screen is not in view.
+- `ionViewDidLeave` - When this event fires, you know the new page has fully transitioned in, so any logic you might not normally do when the view is visible can go here.
+- `ngOnDestroy` - Cleanup logic for your pages that you don't want to clean up in `ionViewWillLeave`.
\ No newline at end of file
diff --git a/src/pages/da/native.md b/src/pages/da/native.md
new file mode 100644
index 0000000000..048ffed1a3
--- /dev/null
+++ b/src/pages/da/native.md
@@ -0,0 +1,15 @@
+---
+title: Ionic Native
+---
+
+
Ionic Native is a library of Cordova plugins and integrations that make it easy to add native functionality to any Ionic app, Cordova project, or WebView. Ionic Native is available in two editions: Community and Enterprise.
+
+
+
+A collection of free Cordova plugins, built and maintained by the OSS community, with TypeScript wrappers and a consistent API and naming convention for easier development.
+
+
+
+For teams building mission-critical apps, Ionic Native EE is a curated collection of plugins and integrations that are built and supported by Ionic, with stability assurances and guaranteed to work on all major platforms and versions.
+
+> These docs are for apps built with Ionic Framework 4.0.0 and greater. For older Ionic v3 projects, please [see here](/docs/v3/native).
\ No newline at end of file
diff --git a/src/pages/da/native/overview.md b/src/pages/da/native/overview.md
new file mode 100644
index 0000000000..7841163398
--- /dev/null
+++ b/src/pages/da/native/overview.md
@@ -0,0 +1,82 @@
+---
+title: Ionic Native Community Edition
+---
+
+Ionic Native Community Edition (CE) is a collection of open source Cordova plugins that make it easy to add native functionality to any Ionic app.
+
+The plugins in Ionic Native CE are submitted and maintained by the Ionic community. While community members are generally quick to find and fix issues, certain plugins may not function properly. For teams that require dedicated native plugin support, please explore Ionic Native Enterprise Edition and request a free trial.
+
+Note: These docs are for apps built with Ionic Framework 4.0.0 and greater. For older Ionic v3 projects, please see here.
+
+## Usage
+
+All plugins have two components - the native code (Cordova) and the JavaScript code. Cordova plugins are also wrapped in a `Promise` or `Observable` in order to provide a common plugin interface. Below are various framework options using the Camera plugin as an example.
+
+## Angular
+
+Import the plugin in a `@NgModule` and add it to the list of Providers. For Angular, the import path should end with `/ngx`. Angular's change detection is automatically handled.
+
+```typescript
+// app.module.ts
+import { Camera } from '@ionic-native/camera/ngx';
+
+...
+
+@NgModule({
+ ...
+
+ providers: [
+ ...
+ Camera
+ ...
+ ]
+ ...
+})
+export class AppModule { }
+```
+
+After the plugin has been declared, it can be imported and injected like any other service:
+
+```typescript
+// camera.service.ts
+import { Injectable } from '@angular/core';
+import { Camera, CameraOptions } from '@ionic-native/camera/ngx';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class PhotoService {
+ constructor(private camera: Camera) { }
+
+ takePicture() {
+ const options: CameraOptions = {
+ quality: 100,
+ destinationType: this.camera.DestinationType.DATA_URL,
+ encodingType: this.camera.EncodingType.JPEG,
+ mediaType: this.camera.MediaType.PICTURE
+ }
+
+ this.camera.getPicture(options).then((imageData) => {
+ // Do something with the new photo
+
+ }, (err) => {
+ // Handle error
+ console.log("Camera issue: " + err);
+ });
+ }
+}
+```
+
+## Vanilla JavaScript
+
+Ionic Native can also be used in a vanilla JavaScript app targeting ES2015+ and/or TypeScript. To use any plugin, import the class from the appropriate package and use its static methods:
+
+```js
+import { Camera } from '@ionic-native/camera';
+
+document.addEventListener('deviceready', () => {
+ Camera.getPicture()
+ .then(data => console.log('Took a picture!', data))
+ .catch(e => console.log('Error occurred while taking a picture', e));
+});
+```
\ No newline at end of file
diff --git a/src/pages/da/navigation/angular.md b/src/pages/da/navigation/angular.md
new file mode 100644
index 0000000000..26432346a5
--- /dev/null
+++ b/src/pages/da/navigation/angular.md
@@ -0,0 +1,209 @@
+---
+previousText: ''
+previousUrl: ''
+nextText: ''
+nextUrl: ''
+contributors:
+ - mhartington
+---
+
+# Angular Navigation
+
+This guide covers how routing works in an app built with Ionic and Angular.
+
+The Angular Router is one of the most important libraries in an Angular application. Without it, apps would be single view/single context apps or would not be able to maintain their navigation state on browser reloads. With Angular Router, we can create rich apps that are linkable and have rich animations (when paired with Ionic of course). Let's look at the basics of the Angular Router and how we can configure it for Ionic apps.
+
+## A simple Route
+
+For most apps, having some sort of route is often required. The most basic configuration looks a bit like this:
+
+```typescript
+ import { RouterModule } from '@angular/router';
+
+@NgModule({
+ imports: [
+ ...
+ RouterModule.forRoot([
+ { path: '', component: LoginComponent },
+ { path: 'detail', component: DetailComponent },
+ ])
+ ],
+})
+```
+
+The simplest breakdown for what we have here is a path/component lookup. When our app loads, the router kicks things off by reading the URL the user is trying to load. In our sample, our route looks for `''`, which is essentially our index route. So for this, we load the `LoginComponent`. Fairly straight forward. This pattern of matching paths with a component continues for every entry we have in the router config. But what if we wanted to load a different path on our initial load?
+
+## Handling Redirects
+
+For this we can use router redirects. Redirects work the same way that a typical route object does, but just includes a few different keys.
+
+```typescript
+[
+ { path: '', redirectTo: 'login', pathMatch: 'full' },
+ { path: 'login', component: LoginComponent },
+ { path: 'detail', component: DetailComponent }
+];
+```
+
+In our redirect, we look for the index path of our app. Then if we load that, we redirect to the `login` route. The last key of `pathMatch` is required to tell the router how it should look up the path.
+
+Since we use `full`, we're telling the router that we should compare the full path, even if ends up being something like `/route1/route2/route3`. Meaning that if we have:
+
+```typescript
+{ path: '/route1/route2/route3', redirectTo: 'login', pathMatch: 'full' },
+{ path: 'login', component: LoginComponent },
+```
+
+And load `/route1/route2/route3` we'll redirect. But if we loaded `/route1/route2/route4`, we won't redirect, as the paths don't match fully.
+
+Alternatively, if we used:
+
+```typescript
+{ path: '/route1/route2', redirectTo: 'login', pathMatch: 'prefix' },
+{ path: 'login', component: LoginComponent },
+```
+
+Then load both `/route1/route2/route3` and `/route1/route2/route4`, we'll be redirected for both routes. This is because `pathMatch: 'prefix'` will match only part of the path.
+
+## Navigating to different routes
+
+Talking about routes is good and all, but how does one actually navigate to said routes? For this, we can use the `routerLink` directive. Let's go back and take our simple router setup from earlier:
+
+```ts
+RouterModule.forRoot([
+ { path: '', component: LoginComponent },
+ { path: 'detail', component: DetailComponent }
+]);
+```
+
+Now from the `LoginComponent`, we can use the following HTML to navigate to the detail route.
+
+```html
+
+
+ Login
+
+
+
+
+ Go to detail
+
+```
+
+The important part here is the `ion-button` and `routerLink` directive. RouterLink works on a similar idea as typical `href`s, but instead of building out the URL as a string, it can be built as an array, which can provide more complicated paths.
+
+We also can programmatically navigate in our app by using the router API.
+
+```typescript
+import { Component } from '@angular/core';
+import { Router } from '@angular/router';
+
+@Component({
+ ...
+})
+export class LoginComponent {
+
+ constructor(private router: Router){}
+
+ navigate(){
+ this.router.navigate(['/detail'])
+ }
+}
+```
+
+Both options provide the same navigation mechanism, just fitting different use cases.
+
+> A note on navigation with relative URLs: Currently, to support multiple navigation stacks, relative URLs are something not supported
+
+## Lazy loading routes
+
+Now the current way our routes are setup makes it so they are included in the same chunk as the root app.module, which is not ideal. Instead, the router has a setup that allows the components to be isolated to their own chunks.
+
+```typescript
+ import { RouterModule } from '@angular/router';
+
+@NgModule({
+ imports: [
+ ...
+ RouterModule.forRoot([
+ { path: '', redirectTo: 'login', pathMatch: 'full' },
+ { path: 'login', loadChildren: './login/login.module#LoginModule' },
+ { path: 'detail', loadChildren: './detail/detail.module#DetailModule' }
+ ])
+ ],
+})
+```
+
+While similar, the `loadChildren` property is a way to reference a module by string instead of a component directly. In order to do this though, we need to create a module for each of the components.
+
+```typescript
+...
+import { RouterModule } from '@angular/router';
+import { LoginComponent } from './login.component';
+
+@NgModule({
+ imports: [
+ ...
+ RouterModule.forChild([
+ { path: '', component: LoginComponent },
+ ])
+ ],
+})
+```
+
+> We're excluding some additional content and only including the necessary parts.
+
+Here, we have a typical Angular Module setup, along with a RouterModule import, but we're now using `forChild` and declaring the component in that setup. With this setup, when we run our build, we will produce separate chunks for both the app component, the login component, and the detail component.
+
+## Working with Tabs
+
+With Tabs, the Angular Router provides Ionic the mechanism to know what components should be loaded, but the heavy lifting is actually done by the tabs component. Let's look at a simple example.
+
+```ts
+const routes: Routes = [
+ {
+ path: 'tabs',
+ component: TabsPage,
+ children: [
+ {
+ path: 'tab1',
+ children: [
+ {
+ path: '',
+ loadChildren: '../tab1/tab1.module#Tab1PageModule'
+ }
+ ]
+ },
+ {
+ path: '',
+ redirectTo: '/tabs/tab1',
+ pathMatch: 'full'
+ }
+ ]
+ },
+ {
+ path: '',
+ redirectTo: '/tabs/tab1',
+ pathMatch: 'full'
+ }
+];
+```
+
+Here we have a "tabs" path that we load. In this example we call the path “tabs”, but the name of the paths are open to be changed. They can be called whatever fits your app. In that route object, we can define a child route as well. In this example, the top level child route "tab1" acts as our "outlet", and can load additional child routes. For this example, we have a single sub-child-route, which just loads a new component. The markup for the tab is as followed:
+
+```html
+ <ion-tabs>
+
+ <ion-tab-bar slot="bottom">
+
+ <ion-tab-button tab="tab1">
+ <ion-icon name="flash"></ion-icon>
+ <ion-label>Tab One</ion-label>
+ </ion-tab-button>
+
+ </ion-tab-bar>
+
+</ion-tabs>
+```
+
+If you've built apps with Ionic before, this should feel familiar. We create a `ion-tabs` component, and provide a `ion-tab-bar`. The `ion-tab-bar` provides a `ion-tab-button` with a `tab` property that is associated with the tab "outlet" in the router config. Note that the latest version of `@ionic/angular` no longer requires ``, but instead allows developers to fully customize the tab bar, and the single source of truth lives within the router configuration.
\ No newline at end of file
diff --git a/src/pages/da/publishing/app-store.md b/src/pages/da/publishing/app-store.md
new file mode 100644
index 0000000000..d3e8154164
--- /dev/null
+++ b/src/pages/da/publishing/app-store.md
@@ -0,0 +1,67 @@
+---
+previousText: 'Progressive Web App'
+previousUrl: 'docs/publishing/progressive-web-app'
+nextText: 'Android Play Store'
+nextUrl: '/docs/publishing/play-store'
+contributors:
+ - zaarheed
+---
+
+# Publishing to app store
+
+## Requirements
+
+Submitting an App to the iOS App store requires a few things:
+
+* XCode
+* A Paid Apple Developers account
+* A valid provisioning profile
+* App Development and Distribution certificates
+
+To enroll in the Apple Developer Program, follow the instructions [listed here](https://developer.apple.com/programs/)
+
+## Generating a release build
+
+If the iOS platform is not already added, be sure to add it:
+
+```shell
+$ ionic cordova platform add ios
+```
+
+With the platform added, run the build command with the `--prod` flag:
+
+```shell
+$ ionic cordova build ios --prod
+```
+
+This will generate the minified code for the web portion of an app and copy it over the iOS code base.
+
+From here, open the `.xcworkspace` file in `./platforms/ios/` to start XCode.
+
+## Generating Signing Certs
+
+Generating certificates for iOS is a bit of an involved process, so be sure to check [Apple's official documentation](https://help.apple.com/xcode/mac/current/#/dev3a05256b8) on what certificates are and how to generate them.
+
+To create the certificates and profiles needed, visit [Apple's member center](https://developer.apple.com/membercenter) and follow the links described in Apple's documentation.
+
+There are two types of certificates that matter here, Development, and Distribution. Development Certificates are just that, meant for development time. They are meant to sign an app and deploy it to devices that the certificate has access to.
+
+Distribution certs are meant for distributing an app to the store. When an app is signed with a Distribution cert, it can be installed on any device.
+
+## Signing the App in XCode.
+
+After generating to correct certificates, there are options to either have XCode automatically manage certificates or manually mange them. It's suggested to let XCode automatically manage certificates. This will make sure that the correct Development and Distribution certs are used, based on the build type selected.
+
+With this option selected, select `Archive` from the `Product > Archive` menu. This will build a version of the app that is ready for distribution in the app stores. After archive has been created, Xcode Organizer is opened.
+
+Xcode Organizer displays a list with builds of the current app. Pick the last build and click 'Upload to App Store'. There should be a place to select the team followed by some more information on the app and a "Upload" button to click.
+
+If the upload successfully, the app should be listed on [Itunes Connect](https://itunesconnect.apple.com) and listed in 'Activities'. From there, TestFlight can be enabled for beta testing, or the App can be sent for approval from Apple.
+
+## Updating an app
+
+As an app grows, it will need to be updated with new features and fixes. An app can be updated by either submitting a new version to Apple, or by using a live update service like Ionic Deploy.
+
+With **Ionic Deploy**, app changes can be pushed in realtime directly to users from the Ionic Pro dashboard, without waiting for App Store approvals.
+
+> In order for the iOS App Store to accept the updated build, the config.xml file will need to be edited to increment the version value, then rebuild the app for release following the same instructions above.
\ No newline at end of file
diff --git a/src/pages/da/publishing/desktop-app.md b/src/pages/da/publishing/desktop-app.md
new file mode 100644
index 0000000000..7a29ea8529
--- /dev/null
+++ b/src/pages/da/publishing/desktop-app.md
@@ -0,0 +1,44 @@
+---
+previousText: 'Android Play Store'
+previousUrl: 'docs/publishing/play-store'
+contributors:
+ - mhartington
+---
+
+# Desktop App
+
+Building a desktop app with Ionic allows developers to reuse 100% of their code and ship a traditional desktop app while still having access to all the native device features, like push notifications. This guide assumes familiarity with Electron, and does not go into "how" to build an electron app. For that, check out the official Electron guide.
+
+## macOS App
+
+### Requirements
+
+There are two hard requirements for publishing an app on the macOS app store
+
+* Latest version of [Xcode](https://itunes.apple.com/us/app/xcode/id497799835?mt=12)
+* An active developer account ($100 through Apple's developer portal)
+
+### Publishing
+
+The Electron team has a detailed guide on how to publish an app for macOS. Please review [the docs here.](https://electronjs.org/docs/tutorial/mac-app-store-submission-guide)
+
+## Windows App
+
+### Requirements
+
+There are two hard requirements for publishing an app on the Windows app store
+
+* Windows 10 with Anniversary Update (released August 2nd, 2016)
+* The Windows 10 SDK, [download here](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)
+* Node
+* electron-windows-store CLI
+
+`electron-windows-store` can be installed via npm:
+
+```shell
+$ npm install -g electron-windows-store
+```
+
+### Publishing
+
+Like macOS, Electron has a detailed guide on how to publish an app for Windows. Please review [the docs here](https://electronjs.org/docs/tutorial/windows-store-guide)
\ No newline at end of file
diff --git a/src/pages/da/publishing/play-store.md b/src/pages/da/publishing/play-store.md
new file mode 100644
index 0000000000..1370dd0619
--- /dev/null
+++ b/src/pages/da/publishing/play-store.md
@@ -0,0 +1,64 @@
+---
+previousText: 'App Store'
+previousUrl: 'docs/publishing/app-store'
+nextText: 'Desktop Electron App'
+nextUrl: '/docs/publishing/desktop-app'
+---
+
+# Android Play Store
+
+## Generating a release build of an app
+
+To generate a release build for Android, run the following cli command:
+
+```shell
+$ ionic cordova build android --prod --release
+```
+
+This will generate a release build based on the settings in the `config.xml` in the `platforms/android/build/outputs/apk` directory of an app. An Ionic app will have preset default values in this file but this can be changed to customize builds.
+
+## Signing an APK
+
+First, the unsigned APK must be signed. If a signing key has already been generated, skip these steps and use that one instead. Generate a private key using the keytool command that comes with the the Android SDK:
+
+```shell
+$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
+```
+
+Once that command has been ran and its prompts have been answered a file called `my-release-key.keystore` will be created in the current directory.
+
+> WARNING: Save this file and keep it somewhere safe. If it is lost the Google Play Store will not accept updates for this app!
+
+To sign the unsigned APK, run the jarsigner tool which is also included in the Android SDK:
+
+```shell
+$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore HelloWorld-release-unsigned.apk alias_name
+```
+
+Finally, the zip align tool must be ran to optimize the APK. The `zipalign` tool can be found in `/path/to/Android/sdk/build-tools/VERSION/zipalign`. For example, on macOS with Android Studio installed, `zipalign` is in `~/Library/Android/sdk/build-tools/VERSION/zipalign`:
+
+```shell
+$ zipalign -v 4 HelloWorld-release-unsigned.apk HelloWorld.apk
+```
+
+This generates a final release binary called HelloWorld.apk that can be accepted into the Google Play Store.
+
+## Submitting an app to the Google Play Store
+
+Now that a release APK has been generated, a Play Store listing can be written and the APK can be uploaded.
+
+To start, visit the [Google Play Store Developer Console](https://play.google.com/apps/publish) and create a new developer account.
+
+> Making a developer account with Google Play costs $25 USD.
+
+Once a developer account has been created, go ahead and click the `Create an Application`
+
+
+
+Be sure to fill out the description for the app along with providing screenshots and additional info. When ready, upload the signed release APK that was generated and publish the app.
+
+## Updating an app
+
+As an app evolves, it will need to be updated with new features and fixes. An app can be updated by either submitting a new version to the Google Play Store, or by using a live update service like Ionic Deploy. Using Ionic Deploy, changes can be pushed directly to users from the Ionic Pro dashboard, without submitting changes to the Play Store. Learn more about Ionic Deploy here.
+
+> In order for the Google Play Store to accept updated APKs, the config.xml file will need to be edited to increment the version value, then rebuild the app for release following the instructions above.
\ No newline at end of file
diff --git a/src/pages/da/publishing/progressive-web-app.md b/src/pages/da/publishing/progressive-web-app.md
new file mode 100644
index 0000000000..ae4245ef26
--- /dev/null
+++ b/src/pages/da/publishing/progressive-web-app.md
@@ -0,0 +1,84 @@
+---
+nextText: 'Publishing to the iOS App Store'
+nextUrl: '/docs/publishing/app-store'
+contributors:
+ - MustaRohman
+ - mhartington
+---
+
+# Publishing a Progressive Web App
+
+Because Ionic Apps are built with web technologies, they can run just as well as a Progressive Web App as they can a native app. Not sure what PWAs are? Check out Ionic's PWA Overview for more info.
+
+## Making an App a PWA
+
+The two main requirements of a PWA are a Service Worker and a Web Manifest. While it's possible to add both of these to an app manually, the Angular team has an `@angular/pwa` package that can be used to automate this.
+
+The `@angular/pwa` package will automatically add a service worker and a app manifest to the app. To add this package to the app run:
+
+```shell
+$ ng add @angular/pwa
+```
+
+Once this package has been added run `ionic build --prod` and the `www` directory will be ready to deploy as a PWA.
+
+> By default, the `@angular/pwa` package comes with Angular logo for the app icons. Be sure to update the manifest to use the correct app name and also replace the icons.
+
+If an app is being deployed to other channels such as Cordova or Electron, you can remove the `"serviceWorker": true` flag from the `angular.json` file. The service worker can be generated though by running:
+
+```shell
+$ ionic build --prod --service-worker
+```
+
+> Note: Features like Service Workers and many JavaScript APIs (such as geolocation) require the app be hosted in a secure context. When deploying an app through a hosting service, be aware they HTTPS will be required to take full advantage of Service Workers.
+
+## Deploying
+
+### Firebase
+
+Firebase hosting provides many benefits for Progressive Web Apps, including fast response times thanks to CDN's, HTTPS enabled by default, and support for [HTTP2 push](https://firebase.googleblog.com/2016/09/http2-comes-to-firebase-hosting.html).
+
+First, install the Firebase CLI:
+
+```shell
+$ npm install -g firebase-tools
+```
+
+With the Firebase CLI installed run `firebase init` in the project. This will generate a `firebase.json` config file and configure the app for deployment.
+
+> `firebase init` will present a few question, including one about redirecting URLs to `/index.html`. Make sure to choose **yes** for this option, but **no** to overwriting your index.html. This will ensure that routing, hard reload, and deep linking work in the app.
+
+The last thing needed is to make sure caching headers are being set correctly. To do this, add the following snippet to the `firebase.json` file to the hosting property:
+
+```json
+"headers": [
+ {
+ "source": "/build/app/**",
+ "headers": [
+ {
+ "key": "Cache-Control",
+ "value": "public, max-age=31536000"
+ }
+ ]
+ },
+ {
+ "source": "ngsw-worker.js",
+ "headers": [
+ {
+ "key": "Cache-Control",
+ "value": "no-cache"
+ }
+ ]
+ }
+]
+```
+
+For more information about the `firebase.json` properties, see the [Firebase documentation](https://firebase.google.com/docs/hosting/full-config#section-firebase-json).
+
+The app can now be deployed by running
+
+```shell
+$ firebase deploy
+```
+
+After this completes the app will be live.
\ No newline at end of file
diff --git a/src/pages/da/release-notes.md b/src/pages/da/release-notes.md
new file mode 100644
index 0000000000..87f83a99c9
--- /dev/null
+++ b/src/pages/da/release-notes.md
@@ -0,0 +1,9 @@
+---
+template: release-notes
+previousText: 'Versioning'
+previousUrl: '/docs/intro/versioning'
+nextText: 'Support'
+nextUrl: '/docs/intro/support'
+---
+
+# Release Notes
\ No newline at end of file
diff --git a/src/pages/da/theming/advanced.md b/src/pages/da/theming/advanced.md
new file mode 100644
index 0000000000..794d6b63de
--- /dev/null
+++ b/src/pages/da/theming/advanced.md
@@ -0,0 +1,290 @@
+---
+initialTab: 'preview'
+inlineHtmlPreviews: true
+previousText: 'Color Generator'
+previousUrl: '/docs/theming/color-generator'
+nextText: 'Publishing an app'
+nextUrl: '/docs/publishing/app-store'
+contributors:
+ - brandyscarney
+ - marcjulian
+---
+
+# Advanced Theming
+
+CSS-based theming enables apps to customize the colors quickly by loading a CSS file or changing a few CSS property values.
+
+## Colors
+
+Ionic has nine default colors that can be used to change the color of many components. Each color is actually a collection of multiple properties, including a `shade` and `tint`, used throughout Ionic.
+
+A color can be applied to an Ionic component in order to change the default colors using the `color` attribute. Notice in the buttons below that the text and background changes based on the `color` set. When there is no `color` set on the button it uses the `primary` color by default.
+
+```html
+Default
+Primary
+Secondary
+Tertiary
+Success
+Warning
+Danger
+Light
+Medium
+Dark
+```
+
+### Layered Colors
+
+Each color consists of the following properties: a `base`, `contrast`, `shade`, and `tint`. The `base` and `contrast` colors also require a `rgb` property which is the same color, just in rgb format. See [The Alpha Problem](#the-alpha-problem) for an explanation of why the `rgb` property is also needed. Select from the dropdown below to see all of the default colors Ionic provides and their variations.
+
+
+
+### Modifying Colors
+
+To change the default values of a color, all of the listed variations for that color should be set. For example, to change the secondary color to </code-color>, set the following CSS properties:</p>
+
+<pre><code class="css">:root {
+ --ion-color-secondary: #006600;
+ --ion-color-secondary-rgb: 0,102,0;
+ --ion-color-secondary-contrast: #ffffff;
+ --ion-color-secondary-contrast-rgb: 255,255,255;
+ --ion-color-secondary-shade: #005a00;
+ --ion-color-secondary-tint: #1a751a;
+}
+
+
+When `secondary` is applied to a button, not only is the base color </code-color> used, but the contrast color <code-color mode="md" value="#ffffff"></code-color> is used for the text, along with shade <code-color mode="md" value="#005a00"></code-color> and tint <code-color mode="md" value="#1a751a"></code-color> colors for the different states of the button.</p>
+
+<blockquote>
+ <p>Not sure how to get the variation colors from the base color? Try out our <a href="/docs/theming/color-generator">Color Generator</a> that calculates all of the variations and provides code to copy/paste into an app!</p>
+</blockquote>
+
+<p>See the <a href="/docs/theming/css-variables">CSS Variables documentation</a> for more information on CSS variables.</p>
+
+<h3>Adding Colors</h3>
+
+<p>To add a new color, create a class that defines all of the variations using CSS variables for that color. The class should be written in the format <code>.ion-color-{COLOR} where `{COLOR}` is the name of the color to add. For example, to add a color called `favorite`, the following class could be added:
+
+```css
+.ion-color-favorite {
+ --ion-color-base: #69bb7b;
+ --ion-color-base-rgb: 105,187,123;
+ --ion-color-contrast: #ffffff;
+ --ion-color-contrast-rgb: 255,255,255;
+ --ion-color-shade: #5ca56c;
+ --ion-color-tint: #78c288;
+}
+```
+
+Once the class is added, the color can be used on any Ionic component that supports the `color` property. An example of using the `favorite` color on an Ionic button is below.
+
+```html
+Favorite
+```
+
+It's important to note that adding the class above does not automatically create the Ionic CSS variables for use in an application's stylesheets. This means that the variations beginning with `--ion-color-favorite` **do not exist** by adding the `.ion-color-favorite` class. These should be declared separately for use in an application:
+
+```css
+:root {
+ --ion-color-favorite: #69bb7b;
+ --ion-color-favorite-rgb: 105,187,123;
+ --ion-color-favorite-contrast: #ffffff;
+ --ion-color-favorite-contrast-rgb: 255,255,255;
+ --ion-color-favorite-shade: #5ca56c;
+ --ion-color-favorite-tint: #78c288;
+}
+```
+
+Now the `favorite` color can be used in CSS like below to set the `background` and `color` on a `div`.
+
+```css
+div {
+ background: var(--ion-color-favorite);
+ color: var(--ion-color-favorite-contrast);
+}
+```
+
+See the [CSS Variables documentation](/docs/theming/css-variables) for more information on CSS variables.
+
+## Themes
+
+Ionic provides several global variables that are used throughout components to change the default theme of an entire application. The following sections separate the different theme variables by usage: [Application Colors](#application-colors), [Stepped Colors](#stepped-colors).
+
+### Application Colors
+
+The application colors are used in multiple places in Ionic. These are useful for easily creating dark themes or themes that match a brand.
+
+It is important to note that the background and text color variables also require a rgb variable to be set in rgb format. See [The Alpha Problem](#the-alpha-problem) for an explanation of why the `rgb` property is also needed.
+
+| Name | Description |
+| ---------------------------------- | ------------------------------------------------ |
+| `--ion-background-color` | Background color of entire app |
+| `--ion-background-color-rgb` | Background color of entire app, rgb format |
+| `--ion-text-color` | Text color of entire app |
+| `--ion-text-color-rgb` | Text color of entire app, rgb format |
+| `--ion-backdrop-color` | Color of the Backdrop component |
+| `--ion-overlay-background-color` | Background color of the overlays |
+| `--ion-border-color` | Border color |
+| `--ion-box-shadow-color` | Box shadow color |
+| `--ion-tab-bar-background` | Background of the Tab bar |
+| `--ion-tab-bar-background-focused` | Background of the focused Tab bar |
+| `--ion-tab-bar-border-color` | Border color of the Tab bar |
+| `--ion-tab-bar-color` | Color of the Tab bar |
+| `--ion-tab-bar-color-activated` | Color of the activated Tab |
+| `--ion-toolbar-background` | Background of the Toolbar |
+| `--ion-toolbar-border-color` | Border color of the Toolbar |
+| `--ion-toolbar-color` | Color of the components in the Toolbar |
+| `--ion-toolbar-color-activated` | Color of the activated components in the Toolbar |
+| `--ion-toolbar-color-unchecked` | Color of the unchecked components in the Toolbar |
+| `--ion-toolbar-color-checked` | Color of the checked components in the Toolbar |
+| `--ion-item-background` | Background of the Item |
+| `--ion-item-background-activated` | Background of the activated Item |
+| `--ion-item-border-color` | Border color of the Item |
+| `--ion-item-color` | Color of the components in the Item |
+| `--ion-placeholder-color` | Color of the placeholder in inputs |
+
+### Stepped Colors
+
+After exploring different ways to customize the Ionic theme, we found that we couldn't use just one background or text color. In order to imply importance and depth throughout the design, we need to use different shades of the background and text colors. To accommodate this pattern, we created stepped colors.
+
+While updating the background (`--ion-background-color`) and text (`--ion-text-color`) variables will change the look of the app for most components, there are certain Ionic components where it may look off, or broken. This will be more apparent when applying a darker theme.
+
+In some components we use a shade darker than the background or lighter than the text. For example, an item heading text may need to be </code-color>, which is a few shades lighter than our default text color. Meanwhile, the loading component background is a shade darker than white, using <code-color mode="md" value="#f2f2f2"></code-color>. We use stepped colors in order to define these slight variations. It is important to update the stepped colors when updating the background or text color of an application.</p>
+
+<p>By default, the Ionic stepped colors start at the default background color value <code-color mode="md" value="#ffffff"></code-color> and mix with the text color value <code-color mode="md" value="#000000"></code-color> using an increasing percentage. The full list of stepped colors is shown in the generator below.</p>
+
+<h3>Generate Stepped Color Variables</h3>
+
+<p>Create a custom background and text color theme for your app. Update the background or text color’s hex values below, then copy and paste the generated code directly into your Ionic project.</p>
+
+<p><stepped-color-generator mode="md" no-prerender></stepped-color-generator></p>
+
+<h2>Globals</h2>
+
+<p>While the previously mentioned variables are useful for changing the colors of an application, often times there is a need for variables used in multiple components. The following variables are shared across components to change global padding settings and more.</p>
+
+<h3>Application Variables</h3>
+
+<table>
+<thead>
+<tr>
+ <th>Name</th>
+ <th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td><code>--ion-font-family
+
+
+
+
+
+### Grid Variables
+
+| Name | Description |
+| ------------------------------ | ---------------------------------------------- |
+| `--ion-grid-columns` | Number of columns in the grid |
+| `--ion-grid-padding-xs` | Padding of the grid for xs breakpoints |
+| `--ion-grid-padding-sm` | Padding of the grid for sm breakpoints |
+| `--ion-grid-padding-md` | Padding of the grid for md breakpoints |
+| `--ion-grid-padding-lg` | Padding of the grid for lg breakpoints |
+| `--ion-grid-padding-xl` | Padding of the grid for xl breakpoints |
+| `--ion-grid-column-padding-xs` | Padding of the grid columns for xs breakpoints |
+| `--ion-grid-column-padding-sm` | Padding of the grid columns for sm breakpoints |
+| `--ion-grid-column-padding-md` | Padding of the grid columns for md breakpoints |
+| `--ion-grid-column-padding-lg` | Padding of the grid columns for lg breakpoints |
+| `--ion-grid-column-padding-xl` | Padding of the grid columns for xl breakpoints |
+
+## Known Limitations
+
+### The Alpha Problem
+
+There is not yet full browser support for alpha use of a hex color. The rgba() function only accepts a value in `R, G, B, A` (Red, Green, Blue, Alpha) format. The following code shows examples of correct and incorrect values passed to `rgba()`.
+
+```css
+/* These examples use the same color: blueviolet. */
+.broken {
+ --violet: #8a2be2;
+
+ /* rgba(#8a2be2, .5) */
+ color: rgba(var(--violet), .5) /* ERROR! Doesn't support hex. */
+}
+
+.working {
+ --violet-rgb: 138, 43, 226;
+
+ /* rgba(138, 43, 226, .5) */
+ color: rgba(var(--violet-rgb), .5) /* WORKS! */
+}
+```
+
+> See the [CSS Variables](/docs/theming/css-variables) section for more information on how to get and set CSS variables.
+
+Ionic uses colors with an opacity (alpha) in several components. In order for this to work, those properties must be provided in RGB format. When changing any of the properties that have a variation ending in `-rgb`, it is important they are also provided in a comma separated format **without parentheses**. Below are some examples for changing text and background color.
+
+```css
+:root {
+ /* These examples use the same color: sienna. */
+ --ion-text-color: #a0522d;
+ --ion-text-color-rgb: 160, 82, 45;
+
+ /* These examples use the same color: lightsteelblue. */
+ --ion-background-color: #b0c4de;
+ --ion-background-color-rgb: 176, 196, 222;
+}
+```
+
+Note that the RGB formatted colors are the exact same color as the hex properties, but can now be used with `rgba()`. For example, `--ion-text-color-rgb` can now be used in the following way
+
+```css
+body {
+ color: rgba(var(--ion-text-color-rgb), 0.25);
+}
+```
+
+### Variables in Media Queries
+
+CSS variables in [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries) are not currently supported, but there are open drafts to add [custom media queries](https://drafts.csswg.org/mediaqueries-5/#custom-mq) and [custom environment variables](https://drafts.csswg.org/css-env-1/) that would solve this problem! However, with the current state of support, the following will **not** work:
+
+```css
+:root {
+ --breakpoint: 600px;
+}
+
+@media (min-width: var(--breakpoint)) {
+ /* Doesn't work :( */
+}
+```
+
+### Modifying CSS Color Variables
+
+While it is possible to easily alter a color in Sass using its built-in functions, it is currently not as easy to modify colors set in CSS Variables. This can be accomplished in CSS by splitting the [RGB](https://developer.mozilla.org/en-US/docs/Glossary/RGB) or [HSL](https://en.wikipedia.org/wiki/HSL_and_HSV) channels and modifying each value, but it is complex and has missing functionality.
+
+What exactly does this mean? Basically, using a CSS preprocessor, such as Sass, allows us to use functions to manipulate a single color. For example, we can create the following colors in Sass:
+
+```scss
+// Background color, shade, and tint
+$background: #3880ff;
+$background-shade: mix(#000, $background, 12%);
+$background-tint: mix(#fff, $background, 10%);
+
+// Text color, darker and lighter
+$text: #444;
+$text-darker: darken($text, 15);
+$text-lighter: lighten($text, 15);
+```
+
+After running through the Sass compiler, the colors will have the following values:
+
+
+
+
+
+
+
However, because CSS variables can be set at runtime and are more dynamic, it is not currently possible to manipulate them using a simple function.
+
+
This is normally not a problem, but when an application needs to have dynamic theming it presents issues. In Ionic, this is the reason that there are variations to each color, and it is also why stepped colors are necessary for theming.
+
\ No newline at end of file
diff --git a/src/pages/da/theming/basics.md b/src/pages/da/theming/basics.md
new file mode 100644
index 0000000000..a51e4fe70c
--- /dev/null
+++ b/src/pages/da/theming/basics.md
@@ -0,0 +1,34 @@
+---
+previousText: 'Layout'
+previousUrl: '/docs/layout/structure'
+nextText: 'Platform Styles'
+nextUrl: '/docs/theming/platform-styles'
+contributors:
+ - brandyscarney
+---
+
+# Theming Basics
+
+Ionic Framework is built to be a blank slate that can easily be customized and modified to fit a brand, while still following the standards of the different platforms. Theming Ionic apps is now easier than ever. Because the framework is built with CSS, it comes with pre-baked default styles which are extremely easy to change and modify.
+
+## Colors
+
+Ionic has nine default colors that can be used to change the color of many components. Each color is actually a collection of multiple properties, including a `shade` and `tint`, used throughout Ionic.
+
+When changing a color, it is important to set all of the related properties. This can be done easily with the [Color Generator](/docs/theming/color-generator) tool, but these can also be manually written if desired. For more information on Ionic colors, see [Advanced Colors](/docs/theming/advanced#colors).
+
+
+
+## Platform Standards
+
+Ionic components adapt their look and behavior based on the platform the app is running on. We call this **Platform Continuity**. This allows developers to build apps that use the same codebase for multiple platforms, while still looking "native" to those particular platforms.
+
+Ionic has two **modes** that are used to customize the look of components based on the **platform**: `ios` and `md`. Each platform has a default mode, but this can easily be configured. For more information on customizing an application based on the platform, see [Platform Styles](/docs/theming/platform-styles).
+
+## CSS Variables
+
+All of the Ionic components are themed using CSS properties (variables). CSS variables add dynamic values to an otherwise static language. This is something that has traditionally required a CSS preprocessor like Sass. The look of an application can easily be changed by changing the value of any of the [Ionic Variables](/docs/theming/css-variables#ionic-variables).
+
+## Branding
+
+Ionic provides application colors that can be used to theme an application to match a brand or color scheme. The default theme uses a light background, but everything from the background color to the text color is fully customizable. For more information on branding, see [Advanced Theming](/docs/theming/advanced).
\ No newline at end of file
diff --git a/src/pages/da/theming/color-generator.md b/src/pages/da/theming/color-generator.md
new file mode 100644
index 0000000000..4a9e84dec0
--- /dev/null
+++ b/src/pages/da/theming/color-generator.md
@@ -0,0 +1,17 @@
+---
+hideTOC: true
+demoUrl: '/docs/pages/theming/color-generator/index.html'
+previousText: 'CSS Variables'
+previousUrl: '/docs/theming/css-variables'
+nextText: 'Advanced Theming'
+nextUrl: '/docs/theming/advanced'
+contributors:
+ - brandyscarney
+ - kevinports
+---
+
+# Color Generator
+
+Create custom color palettes for your app’s UI. Update a color’s hex values, check the demo app on the right to confirm, then copy and paste the generated code directly into your Ionic project.
+
+
\ No newline at end of file
diff --git a/src/pages/da/theming/css-variables.md b/src/pages/da/theming/css-variables.md
new file mode 100644
index 0000000000..c06f222004
--- /dev/null
+++ b/src/pages/da/theming/css-variables.md
@@ -0,0 +1,98 @@
+---
+previousText: 'Platform Styles'
+previousUrl: '/docs/theming/platform-styles'
+nextText: 'Color Generator'
+nextUrl: '/docs/theming/color-generator'
+contributors:
+ - brandyscarney
+ - iget-master
+---
+
+# CSS Variables
+
+Ionic components are built with CSS Variables for easy customization of an application. CSS variables allow a value to be stored in one place, then referenced in multiple other places. They also make it possible to change CSS dynamically at runtime (which previously required a CSS preprocessor). CSS variables make it easier than ever to override Ionic components to match a brand or theme.
+
+## Setting Values
+
+### Global Variables
+
+CSS variables can be set globally in an application in the `:root` selector. They can also be applied only for a specific mode. See [Ionic Variables](#ionic-variables) for more information on the global variables Ionic provides.
+
+When using the Ionic CLI to start an Angular project, the `src/theme/variables.scss` file is created where you can override the default Ionic Variables.
+
+```css
+/* Set variables for all modes */
+:root {
+ /* Set the background of the entire app */
+ --ion-background-color: #ff3700;
+
+ /* Set the font family of the entire app */
+ --ion-font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif;
+}
+
+/* Set text color of the entire app for iOS only */
+.ios {
+ --ion-text-color: #000;
+}
+
+/* Set text color of the entire app for Material Design only */
+.md {
+ --ion-text-color: #222;
+}
+```
+
+### Component Variables
+
+To set a CSS variable for a specific component, add the variable inside of its selector. See [Ionic Variables](#ionic-variables) for more information on the component-level variables Ionic provides.
+
+```css
+/* Set the color on all ion-button elements */
+ion-button {
+ --color: #222;
+}
+
+/* Set the background on an ion-button with the .fancy-button class */
+.fancy-button {
+ --background: #00ff00;
+}
+```
+
+### Variables set via JavaScript
+
+CSS variables can also be changed via JavaScript using [setProperty()](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/setProperty):
+
+```js
+const el = document.querySelector('.fancy-button');
+el.style.setProperty('--background', '#36454f');
+```
+
+## Getting Values
+
+### Using CSS
+
+The [var() CSS function](https://developer.mozilla.org/en-US/docs/Web/CSS/var) can be used to get the value of a CSS variable, along with any number of fallback values, if desired. In the below example, the `--background` property will be set to the value of the `--charcoal` variable, if defined, and if not it will use `#36454f`.
+
+```css
+.fancy-button {
+ --background: var(--charcoal, #36454f);
+}
+```
+
+### Using JavaScript
+
+The value of a CSS variable can be read in JavaScript using [getPropertyValue()](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/getPropertyValue):
+
+```js
+const el = document.querySelector('.fancy-button');
+const color = el.style.getPropertyValue('--charcoal');
+```
+
+## Ionic Variables
+
+### Component Variables
+
+Ionic provides variables that exist at the component level, such as `--background` and `--color`. For a list of the custom properties a component accepts, view the `Custom Properties` section of its [API reference](/docs/api/). For example, see the [Button Custom Properties](/docs/api/button#css-custom-properties).
+
+### Global Variables
+
+There are several global variables that Ionic provides in order to make theming an entire application easier. For more information, including a list of all of the global variables, see [Advanced Theming](/docs/theming/advanced).
\ No newline at end of file
diff --git a/src/pages/da/theming/platform-styles.md b/src/pages/da/theming/platform-styles.md
new file mode 100644
index 0000000000..4052cc55c2
--- /dev/null
+++ b/src/pages/da/theming/platform-styles.md
@@ -0,0 +1,51 @@
+---
+disableHtmlPreviews: true
+previousText: 'Theming Basics'
+previousUrl: '/docs/theming/basics'
+nextText: 'CSS Variables'
+nextUrl: '/docs/theming/css-variables'
+contributors:
+ - brandyscarney
+---
+
+# Platform Styles
+
+Ionic provides platform specific styles based on the device the application is running on. Styling the components to match the device guidelines allows the application to be written once but look and feel native to the user depending on where it is accessed.
+
+## Ionic Modes
+
+Ionic uses **modes** to customize the look of components. Each **platform** has a default **mode**, but this can be overridden through the global [config](../utilities/config). The following chart displays the default **mode** that is added to each **platform**:
+
+| Platform | Mode | Description |
+| --------- | ----- | -------------------------------------------------------------------------------------------------------------------------------- |
+| `ios` | `ios` | Viewing on an iPhone, iPad, or iPod will use the [iOS styles](https://www.apple.com/ios). |
+| `android` | `md` | Viewing on any Android device will use the [Material Design styles](https://material.io/guidelines/). |
+| `core` | `md` | Any platform that doesn't fit any of the above platforms will use the [Material Design styles](https://material.io/guidelines/). |
+
+For example, an app being viewed on an Android platform will use the `md` (Material Design) mode by default. The `` element will have `class="md"` added to it and all of the components will use Material Design styles:
+
+```html
+
+```
+
+*Note: The **platform** and the **mode** are not the same. The platform can be set to use any mode in the [config](../utilities/config) of an app.*
+
+## Overriding Mode Styles
+
+Each Ionic component can be styled based on the mode. The `html` element has both a `class` and `mode` attribute with a value equal to the current mode. These can be used to override styles for any component. For example, to style an `ion-badge` to have `uppercase` text only in `ios` mode:
+
+```css
+.ios ion-badge {
+ text-transform: uppercase;
+}
+```
+
+There are also many global CSS variables that can be used to override the styles. To style the background color for an `ios` app, the following can be written:
+
+```css
+.ios {
+ --ion-background-color: #222;
+}
+```
+
+For a list of all global CSS variables to override, see [Advanced Theming](/docs/theming/advanced).
\ No newline at end of file
diff --git a/src/pages/da/utilities/config.md b/src/pages/da/utilities/config.md
new file mode 100644
index 0000000000..4edeb69ffc
--- /dev/null
+++ b/src/pages/da/utilities/config.md
@@ -0,0 +1,147 @@
+---
+previousText: ''
+previousUrl: ''
+nextText: 'Platform'
+nextUrl: '/docs/utilities/platform'
+contributors:
+ - liamdebeasi
+ - mhartington
+---
+
+# Config
+
+The Config service provides a way to change the properties of components globally across an app. It can set the app mode, tab button layout, animations, and more.
+
+## Usage
+
+### Global
+
+#### Basic example
+
+```typescript
+import { IonicModule } from '@ionic/angular';
+
+@NgModule({
+ ...
+ imports: [
+ BrowserModule,
+ IonicModule.forRoot({
+ rippleEffect: false,
+ mode: 'md'
+ }),
+ AppRoutingModule
+ ],
+ ...
+})
+```
+
+In the above example, we are disabling the Material Design ripple effect across the app, as well as forcing the mode to be Material Design.
+
+#### Customizing Animations
+
+```typescript
+import { IonicModule } from '@ionic/angular';
+
+@NgModule({
+ ...
+ imports: [
+ BrowserModule,
+ IonicModule.forRoot({
+ toastEnter: (AnimationC: Animation, baseEl: ShadowRoot, position: string): Promise => {
+ const baseAnimation = new AnimationC();
+
+ const wrapperAnimation = new AnimationC();
+
+ const hostEl = (baseEl.host || baseEl) as HTMLElement;
+ const wrapperEl = baseEl.querySelector('.toast-wrapper') as HTMLElement;
+
+ wrapperAnimation.addElement(wrapperEl);
+
+ const bottom = `calc(8px + var(--ion-safe-area-bottom, 0px))`;
+ const top = `calc(8px + var(--ion-safe-area-top, 0px))`;
+
+ switch (position) {
+ case 'top':
+ wrapperEl.style.top = top;
+ wrapperEl.style.opacity = 1;
+ wrapperAnimation.fromTo('transform', `translateY(-${hostEl.clientHeight}px)`, 'translateY(10px)')
+ break;
+ case 'middle':
+ const topPosition = Math.floor(
+ hostEl.clientHeight / 2 - wrapperEl.clientHeight / 2
+ );
+ wrapperEl.style.top = `${topPosition}px`;
+ wrapperAnimation.fromTo('opacity', 0.01, 1);
+ break;
+ default:
+ wrapperEl.style.bottom = bottom;
+ wrapperAnimation.fromTo('opacity', 0.01, 1);
+ break;
+ }
+ return Promise.resolve(baseAnimation
+ .addElement(hostEl)
+ .easing('cubic-bezier(.36,.66,.04,1)')
+ .duration(400)
+ .add(wrapperAnimation));
+ },
+ }),
+ AppRoutingModule
+ ],
+ ...
+})
+```
+
+In the above example, we are customizing the "enter" animation for the `ion-toast` component. When an `ion-toast` component is presented from the top, it will slide down instead of fading in.
+
+### By Component
+
+#### Basic Example
+
+```typescript
+import { Component } from '@angular/core';
+import { Config } from '@ionic/angular';
+@Component({...})
+export class HomePage {
+ constructor(private config: Config) {
+ const text = this.config.get('backButtonText');
+ this.config.set('backButtonIcon', 'home');
+ }
+}
+```
+
+## Config Options
+
+Below is a list of config options that Ionic uses.
+
+| Config | Type | Description |
+| ------------------------ | ------------------ | -------------------------------------------------------------------------------------------------------- |
+| `actionSheetEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-action-sheet`, overriding the default "animation". |
+| `actionSheetLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-action-sheet`, overriding the default "animation". |
+| `alertEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-alert`, overriding the default "animation". |
+| `alertLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-alert`, overriding the default "animation". |
+| `animated` | `boolean` | If `true`, Ionic will enable all animations and transitions across the app. |
+| `backButtonIcon` | `string` | Overrides the default icon in all `` components. |
+| `backButtonText` | `string` | Overrides the default text in all `` components. |
+| `hardwareBackButton` | `boolean` | If `true`, Ionic will respond to the hardware back button in an Android device. |
+| `infiniteLoadingSpinner` | `SpinnerTypes` | Overrides the default spinner type in all `` components. |
+| `loadingEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-loading`, overriding the default "animation". |
+| `loadingLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-loading`, overriding the default "animation". |
+| `loadingSpinner` | `SpinnerTypes` | Overrides the default spinner for all `ion-loading` overlays. |
+| `menuIcon` | `string` | Overrides the default icon in all `` components. |
+| `menuType` | `string` | Overrides the default menu type for all `` components. |
+| `modalEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-modal`, overriding the default "animation". |
+| `modalLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-modal`, overriding the default "animation". |
+| `mode` | `Mode` | The mode determines which platform styles to use for the whole application. |
+| `navAnimation` | `AnimationBuilder` | Overrides the default "animation" of all `ion-nav` and `ion-router-outlet` across the whole application. |
+| `pickerEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-picker`, overriding the default "animation". |
+| `pickerLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-picker`, overriding the default "animation". |
+| `popoverEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-popover`, overriding the default "animation". |
+| `popoverLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-popover`, overriding the default "animation". |
+| `refreshingIcon` | `string` | Overrides the default icon in all `` components. |
+| `refreshingSpinner` | `SpinnerTypes` | Overrides the default spinner type in all `` components. |
+| `spinner` | `SpinnerTypes` | Overrides the default spinner in all `` components. |
+| `statusTap` | `boolean` | If `true`, clicking or tapping the status bar will cause the content to scroll to the top. |
+| `swipeBackEnabled` | `boolean` | If `true`, Ionic will enable the "swipe-to-go-back" gesture across the application. |
+| `tabButtonLayout` | `TabButtonLayout` | Overrides the default "layout" of all `ion-bar-button` across the whole application. |
+| `toastEnter` | `AnimationBuilder` | Provides a custom enter animation for all `ion-toast`, overriding the default "animation". |
+| `toastLeave` | `AnimationBuilder` | Provides a custom leave animation for all `ion-toast`, overriding the default "animation". |
\ No newline at end of file
diff --git a/src/pages/da/utilities/platform.md b/src/pages/da/utilities/platform.md
new file mode 100644
index 0000000000..4cabcea5d3
--- /dev/null
+++ b/src/pages/da/utilities/platform.md
@@ -0,0 +1,101 @@
+---
+previousText: 'Config'
+previousUrl: '/docs/utilities/config'
+nextText: ''
+nextUrl: ''
+contributors:
+ - liamdebeasi
+---
+
+# Platform
+
+The Platform service can be used to get information about your current device. You can get all of the platforms associated with the device using the `platforms` method, including whether the app is being viewed from a tablet, if it's on a mobile device or browser, and the exact platform (iOS, Android, etc). You can also get the orientation of the device, if it uses right-to-left language direction, and much much more. With this information you can completely customize your app to fit any device.
+
+## Usage
+
+```typescript
+import { Platform } from '@ionic/angular';
+
+@Component({...})
+export MyPage {
+ constructor(public plt: Platform) {
+
+ }
+}
+```
+
+## Methods
+
+### `is(platformName: Platforms) => boolean`
+
+Depending on the platform the user is on, `is(platformName)` will return true or false. Note that the same app can return true for more than one platform name. For example, an app running from an iPad would return true for the platform names: `mobile`, `ios`, `ipad`, and `tablet`. Additionally, if the app was running from Cordova then `cordova` would be true.
+
+#### Parameters
+
+| Name | Type | Description |
+| -------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `platformName` | `Platforms` | Name of the platform. Available options are android, capacitor, cordova, desktop, electron, hybrid, ios, ipad, iphone, mobile, phablet, pwa, tablet |
+
+#### Platforms
+
+Below is a table listing all the possible `Platforms` values along with corresponding descriptions.
+
+| Platform Name | Description |
+| ------------- | ------------------------------------- |
+| android | a device running Android |
+| capacitor | a device running Capacitor |
+| cordova | a device running Cordova |
+| desktop | a desktop device |
+| electron | a desktop device running Electron |
+| hybrid | a device running Capacitor or Cordova |
+| ios | a device running iOS |
+| ipad | an iPad device |
+| iphone | an iPhone device |
+| mobile | a mobile device |
+| phablet | a phablet device |
+| pwa | a PWA app |
+| tablet | a tablet device |
+
+### `platforms() => string[]`
+
+Depending on what device you are on, `platforms` can return multiple values. Each possible value is a hierarchy of platforms. For example, on an iPhone, it would return `mobile`, `ios`, and `iphone`.
+
+### `ready() => Promise`
+
+Returns a promise when the platform is ready and native functionality can be called. If the app is running from within a web browser, then the promise will resolve when the DOM is ready. When the app is running from an application engine such as Cordova, then the promise will resolve when Cordova triggers the `deviceready` event. The resolved value is the `readySource`, which states the platform that was used.
+
+For example, when Cordova is ready, the resolved ready source is `cordova`. The default ready source value will be `dom`. The `readySource` is useful if different logic should run depending on the platform the app is running from. For example, only Capacitor and Cordova can execute the status bar plugin, so the web should not run status bar plugin logic.
+
+### `isRTL() => boolean`
+
+Returns if this app is using right-to-left language direction or not. We recommend the app's `index.html` file already has the correct `dir` attribute value set, such as `` or ``. [W3C: Structural markup and right-to-left text in HTML](http://www.w3.org/International/questions/qa-html-dir)
+
+### `isLandscape() => boolean`
+
+Returns `true` if the app is in landscape mode.
+
+### `isPortrait() => boolean`
+
+Returns `true` if the app is in portrait mode.
+
+### `width() => number`
+
+Gets the width of the platform's viewport using `window.innerWidth`.
+
+### `height() => number`
+
+Gets the height of the platform's viewport using `window.innerHeight`.
+
+### `url() => string`
+
+Get the current url.
+
+### `testUserAgent(expression: string) => boolean`
+
+Returns `true` if the expression is included in the user agent string.
+
+### Parameters
+
+| Name | Type | Description |
+| ---------- | ------ | ------------------------------------- |
+| expression | string | The string to check in the user agent |
\ No newline at end of file