144
+			productRefGroup = 504EC3051FED79650016851F /* Products */;
145
+			projectDirPath = "";
146
+			projectRoot = "";
147
+			targets = (
148
+				504EC3031FED79650016851F /* App */,
149
+			);
150
+		};
151
+/* End PBXProject section */
152
+
153
+/* Begin PBXResourcesBuildPhase section */
154
+		504EC3021FED79650016851F /* Resources */ = {
155
+			isa = PBXResourcesBuildPhase;
156
+			buildActionMask = 2147483647;
157
+			files = (
158
+				504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */,
159
+				50B271D11FEDC1A000F3C39B /* public in Resources */,
160
+				504EC30F1FED79650016851F /* Assets.xcassets in Resources */,
161
+				50379B232058CBB4000EE86E /* capacitor.config.json in Resources */,
162
+				504EC30D1FED79650016851F /* Main.storyboard in Resources */,
163
+				2FAD9763203C412B000D30F8 /* config.xml in Resources */,
164
+			);
165
+			runOnlyForDeploymentPostprocessing = 0;
166
+		};
167
+/* End PBXResourcesBuildPhase section */
168
+
169
+/* Begin PBXShellScriptBuildPhase section */
170
+		6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
171
+			isa = PBXShellScriptBuildPhase;
172
+			buildActionMask = 2147483647;
173
+			files = (
174
+			);
175
+			inputPaths = (
176
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
177
+				"${PODS_ROOT}/Manifest.lock",
178
+			);
179
+			name = "[CP] Check Pods Manifest.lock";
180
+			outputPaths = (
181
+				"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
182
+			);
183
+			runOnlyForDeploymentPostprocessing = 0;
184
+			shellPath = /bin/sh;
185
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
186
+			showEnvVarsInLog = 0;
187
+		};
188
+		9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
189
+			isa = PBXShellScriptBuildPhase;
190
+			buildActionMask = 2147483647;
191
+			files = (
192
+			);
193
+			inputPaths = (
194
+			);
195
+			name = "[CP] Embed Pods Frameworks";
196
+			outputPaths = (
197
+			);
198
+			runOnlyForDeploymentPostprocessing = 0;
199
+			shellPath = /bin/sh;
200
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
201
+			showEnvVarsInLog = 0;
202
+		};
203
+/* End PBXShellScriptBuildPhase section */
204
+
205
+/* Begin PBXSourcesBuildPhase section */
206
+		504EC3001FED79650016851F /* Sources */ = {
207
+			isa = PBXSourcesBuildPhase;
208
+			buildActionMask = 2147483647;
209
+			files = (
210
+				504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
211
+			);
212
+			runOnlyForDeploymentPostprocessing = 0;
213
+		};
214
+/* End PBXSourcesBuildPhase section */
215
+
216
+/* Begin PBXVariantGroup section */
217
+		504EC30B1FED79650016851F /* Main.storyboard */ = {
218
+			isa = PBXVariantGroup;
219
+			children = (
220
+				504EC30C1FED79650016851F /* Base */,
221
+			);
222
+			name = Main.storyboard;
223
+			sourceTree = "<group>";
224
+		};
225
+		504EC3101FED79650016851F /* LaunchScreen.storyboard */ = {
226
+			isa = PBXVariantGroup;
227
+			children = (
228
+				504EC3111FED79650016851F /* Base */,
229
+			);
230
+			name = LaunchScreen.storyboard;
231
+			sourceTree = "<group>";
232
+		};
233
+/* End PBXVariantGroup section */
234
+
235
+/* Begin XCBuildConfiguration section */
236
+		504EC3141FED79650016851F /* Debug */ = {
237
+			isa = XCBuildConfiguration;
238
+			buildSettings = {
239
+				ALWAYS_SEARCH_USER_PATHS = NO;
240
+				CLANG_ANALYZER_NONNULL = YES;
241
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
242
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
243
+				CLANG_CXX_LIBRARY = "libc++";
244
+				CLANG_ENABLE_MODULES = YES;
245
+				CLANG_ENABLE_OBJC_ARC = YES;
246
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
247
+				CLANG_WARN_BOOL_CONVERSION = YES;
248
+				CLANG_WARN_COMMA = YES;
249
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
250
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
251
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
252
+				CLANG_WARN_EMPTY_BODY = YES;
253
+				CLANG_WARN_ENUM_CONVERSION = YES;
254
+				CLANG_WARN_INFINITE_RECURSION = YES;
255
+				CLANG_WARN_INT_CONVERSION = YES;
256
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
257
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
258
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
259
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
260
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
261
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
262
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
263
+				CLANG_WARN_UNREACHABLE_CODE = YES;
264
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
265
+				CODE_SIGN_IDENTITY = "iPhone Developer";
266
+				COPY_PHASE_STRIP = NO;
267
+				DEBUG_INFORMATION_FORMAT = dwarf;
268
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
269
+				ENABLE_TESTABILITY = YES;
270
+				GCC_C_LANGUAGE_STANDARD = gnu11;
271
+				GCC_DYNAMIC_NO_PIC = NO;
272
+				GCC_NO_COMMON_BLOCKS = YES;
273
+				GCC_OPTIMIZATION_LEVEL = 0;
274
+				GCC_PREPROCESSOR_DEFINITIONS = (
275
+					"DEBUG=1",
276
+					"$(inherited)",
277
+				);
278
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
279
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
280
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
281
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
282
+				GCC_WARN_UNUSED_FUNCTION = YES;
283
+				GCC_WARN_UNUSED_VARIABLE = YES;
284
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
285
+				MTL_ENABLE_DEBUG_INFO = YES;
286
+				ONLY_ACTIVE_ARCH = YES;
287
+				SDKROOT = iphoneos;
288
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
289
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
290
+			};
291
+			name = Debug;
292
+		};
293
+		504EC3151FED79650016851F /* Release */ = {
294
+			isa = XCBuildConfiguration;
295
+			buildSettings = {
296
+				ALWAYS_SEARCH_USER_PATHS = NO;
297
+				CLANG_ANALYZER_NONNULL = YES;
298
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
299
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
300
+				CLANG_CXX_LIBRARY = "libc++";
301
+				CLANG_ENABLE_MODULES = YES;
302
+				CLANG_ENABLE_OBJC_ARC = YES;
303
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
304
+				CLANG_WARN_BOOL_CONVERSION = YES;
305
+				CLANG_WARN_COMMA = YES;
306
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
307
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
308
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
309
+				CLANG_WARN_EMPTY_BODY = YES;
310
+				CLANG_WARN_ENUM_CONVERSION = YES;
311
+				CLANG_WARN_INFINITE_RECURSION = YES;
312
+				CLANG_WARN_INT_CONVERSION = YES;
313
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
314
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
315
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
316
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
317
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
318
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
319
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
320
+				CLANG_WARN_UNREACHABLE_CODE = YES;
321
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
322
+				CODE_SIGN_IDENTITY = "iPhone Developer";
323
+				COPY_PHASE_STRIP = NO;
324
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
325
+				ENABLE_NS_ASSERTIONS = NO;
326
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
327
+				GCC_C_LANGUAGE_STANDARD = gnu11;
328
+				GCC_NO_COMMON_BLOCKS = YES;
329
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
330
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
331
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
332
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
333
+				GCC_WARN_UNUSED_FUNCTION = YES;
334
+				GCC_WARN_UNUSED_VARIABLE = YES;
335
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
336
+				MTL_ENABLE_DEBUG_INFO = NO;
337
+				SDKROOT = iphoneos;
338
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
339
+				VALIDATE_PRODUCT = YES;
340
+			};
341
+			name = Release;
342
+		};
343
+		504EC3171FED79650016851F /* Debug */ = {
344
+			isa = XCBuildConfiguration;
345
+			baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
346
+			buildSettings = {
347
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
348
+				CODE_SIGN_STYLE = Automatic;
349
+				CURRENT_PROJECT_VERSION = 1;
350
+				INFOPLIST_FILE = App/Info.plist;
351
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
352
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
353
+				MARKETING_VERSION = 1.0;
354
+				OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
355
+				PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter;
356
+				PRODUCT_NAME = "$(TARGET_NAME)";
357
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
358
+				SWIFT_VERSION = 5.0;
359
+				TARGETED_DEVICE_FAMILY = "1,2";
360
+			};
361
+			name = Debug;
362
+		};
363
+		504EC3181FED79650016851F /* Release */ = {
364
+			isa = XCBuildConfiguration;
365
+			baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
366
+			buildSettings = {
367
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
368
+				CODE_SIGN_STYLE = Automatic;
369
+				CURRENT_PROJECT_VERSION = 1;
370
+				INFOPLIST_FILE = App/Info.plist;
371
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
372
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
373
+				MARKETING_VERSION = 1.0;
374
+				PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter;
375
+				PRODUCT_NAME = "$(TARGET_NAME)";
376
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
377
+				SWIFT_VERSION = 5.0;
378
+				TARGETED_DEVICE_FAMILY = "1,2";
379
+			};
380
+			name = Release;
381
+		};
382
+/* End XCBuildConfiguration section */
383
+
384
+/* Begin XCConfigurationList section */
385
+		504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = {
386
+			isa = XCConfigurationList;
387
+			buildConfigurations = (
388
+				504EC3141FED79650016851F /* Debug */,
389
+				504EC3151FED79650016851F /* Release */,
390
+			);
391
+			defaultConfigurationIsVisible = 0;
392
+			defaultConfigurationName = Release;
393
+		};
394
+		504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = {
395
+			isa = XCConfigurationList;
396
+			buildConfigurations = (
397
+				504EC3171FED79650016851F /* Debug */,
398
+				504EC3181FED79650016851F /* Release */,
399
+			);
400
+			defaultConfigurationIsVisible = 0;
401
+			defaultConfigurationName = Release;
402
+		};
403
+/* End XCConfigurationList section */
404
+	};
405
+	rootObject = 504EC2FC1FED79650016851F /* Project object */;
406
+}

+ 7 - 0
ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "self:App.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

+ 10 - 0
ios/App/App.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:App.xcodeproj">
6
+   </FileRef>
7
+   <FileRef
8
+      location = "group:Pods/Pods.xcodeproj">
9
+   </FileRef>
10
+</Workspace>

+ 8 - 0
ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 49 - 0
ios/App/App/AppDelegate.swift

@@ -0,0 +1,49 @@
1
+import UIKit
2
+import Capacitor
3
+
4
+@UIApplicationMain
5
+class AppDelegate: UIResponder, UIApplicationDelegate {
6
+
7
+    var window: UIWindow?
8
+
9
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
10
+        // Override point for customization after application launch.
11
+        return true
12
+    }
13
+
14
+    func applicationWillResignActive(_ application: UIApplication) {
15
+        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
16
+        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
17
+    }
18
+
19
+    func applicationDidEnterBackground(_ application: UIApplication) {
20
+        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
21
+        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
22
+    }
23
+
24
+    func applicationWillEnterForeground(_ application: UIApplication) {
25
+        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
26
+    }
27
+
28
+    func applicationDidBecomeActive(_ application: UIApplication) {
29
+        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
30
+    }
31
+
32
+    func applicationWillTerminate(_ application: UIApplication) {
33
+        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
34
+    }
35
+
36
+    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
37
+        // Called when the app was launched with a url. Feel free to add additional processing here,
38
+        // but if you want the App API to support tracking app url opens, make sure to keep this call
39
+        return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
40
+    }
41
+
42
+    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
43
+        // Called when the app was launched with an activity, including Universal Links.
44
+        // Feel free to add additional processing here, but if you want the App API to support
45
+        // tracking app url opens, make sure to keep this call
46
+        return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
47
+    }
48
+
49
+}

BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png


+ 116 - 0
ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,116 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "size" : "20x20",
5
+      "idiom" : "iphone",
6
+      "filename" : "AppIcon-20x20@2x.png",
7
+      "scale" : "2x"
8
+    },
9
+    {
10
+      "size" : "20x20",
11
+      "idiom" : "iphone",
12
+      "filename" : "AppIcon-20x20@3x.png",
13
+      "scale" : "3x"
14
+    },
15
+    {
16
+      "size" : "29x29",
17
+      "idiom" : "iphone",
18
+      "filename" : "AppIcon-29x29@2x-1.png",
19
+      "scale" : "2x"
20
+    },
21
+    {
22
+      "size" : "29x29",
23
+      "idiom" : "iphone",
24
+      "filename" : "AppIcon-29x29@3x.png",
25
+      "scale" : "3x"
26
+    },
27
+    {
28
+      "size" : "40x40",
29
+      "idiom" : "iphone",
30
+      "filename" : "AppIcon-40x40@2x.png",
31
+      "scale" : "2x"
32
+    },
33
+    {
34
+      "size" : "40x40",
35
+      "idiom" : "iphone",
36
+      "filename" : "AppIcon-40x40@3x.png",
37
+      "scale" : "3x"
38
+    },
39
+    {
40
+      "size" : "60x60",
41
+      "idiom" : "iphone",
42
+      "filename" : "AppIcon-60x60@2x.png",
43
+      "scale" : "2x"
44
+    },
45
+    {
46
+      "size" : "60x60",
47
+      "idiom" : "iphone",
48
+      "filename" : "AppIcon-60x60@3x.png",
49
+      "scale" : "3x"
50
+    },
51
+    {
52
+      "size" : "20x20",
53
+      "idiom" : "ipad",
54
+      "filename" : "AppIcon-20x20@1x.png",
55
+      "scale" : "1x"
56
+    },
57
+    {
58
+      "size" : "20x20",
59
+      "idiom" : "ipad",
60
+      "filename" : "AppIcon-20x20@2x-1.png",
61
+      "scale" : "2x"
62
+    },
63
+    {
64
+      "size" : "29x29",
65
+      "idiom" : "ipad",
66
+      "filename" : "AppIcon-29x29@1x.png",
67
+      "scale" : "1x"
68
+    },
69
+    {
70
+      "size" : "29x29",
71
+      "idiom" : "ipad",
72
+      "filename" : "AppIcon-29x29@2x.png",
73
+      "scale" : "2x"
74
+    },
75
+    {
76
+      "size" : "40x40",
77
+      "idiom" : "ipad",
78
+      "filename" : "AppIcon-40x40@1x.png",
79
+      "scale" : "1x"
80
+    },
81
+    {
82
+      "size" : "40x40",
83
+      "idiom" : "ipad",
84
+      "filename" : "AppIcon-40x40@2x-1.png",
85
+      "scale" : "2x"
86
+    },
87
+    {
88
+      "size" : "76x76",
89
+      "idiom" : "ipad",
90
+      "filename" : "AppIcon-76x76@1x.png",
91
+      "scale" : "1x"
92
+    },
93
+    {
94
+      "size" : "76x76",
95
+      "idiom" : "ipad",
96
+      "filename" : "AppIcon-76x76@2x.png",
97
+      "scale" : "2x"
98
+    },
99
+    {
100
+      "size" : "83.5x83.5",
101
+      "idiom" : "ipad",
102
+      "filename" : "AppIcon-83.5x83.5@2x.png",
103
+      "scale" : "2x"
104
+    },
105
+    {
106
+      "size" : "1024x1024",
107
+      "idiom" : "ios-marketing",
108
+      "filename" : "AppIcon-512@2x.png",
109
+      "scale" : "1x"
110
+    }
111
+  ],
112
+  "info" : {
113
+    "version" : 1,
114
+    "author" : "xcode"
115
+  }
116
+}

+ 6 - 0
ios/App/App/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "xcode"
5
+  }
6
+}

+ 23 - 0
ios/App/App/Assets.xcassets/Splash.imageset/Contents.json

@@ -0,0 +1,23 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "universal",
5
+      "filename" : "splash-2732x2732-2.png",
6
+      "scale" : "1x"
7
+    },
8
+    {
9
+      "idiom" : "universal",
10
+      "filename" : "splash-2732x2732-1.png",
11
+      "scale" : "2x"
12
+    },
13
+    {
14
+      "idiom" : "universal",
15
+      "filename" : "splash-2732x2732.png",
16
+      "scale" : "3x"
17
+    }
18
+  ],
19
+  "info" : {
20
+    "version" : 1,
21
+    "author" : "xcode"
22
+  }
23
+}

BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png


+ 32 - 0
ios/App/App/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,32 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3
+    <device id="retina4_7" orientation="portrait" appearance="light"/>
4
+    <dependencies>
5
+        <deployment identifier="iOS"/>
6
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
7
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
8
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--View Controller-->
12
+        <scene sceneID="EHf-IW-A2E">
13
+            <objects>
14
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
15
+                    <imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
16
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
17
+                        <autoresizingMask key="autoresizingMask"/>
18
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
19
+                    </imageView>
20
+                </viewController>
21
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
22
+            </objects>
23
+            <point key="canvasLocation" x="53" y="375"/>
24
+        </scene>
25
+    </scenes>
26
+    <resources>
27
+        <image name="Splash" width="1366" height="1366"/>
28
+        <systemColor name="systemBackgroundColor">
29
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30
+        </systemColor>
31
+    </resources>
32
+</document>

+ 19 - 0
ios/App/App/Base.lproj/Main.storyboard

@@ -0,0 +1,19 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
3
+    <device id="retina4_7" orientation="portrait">
4
+        <adaptation id="fullscreen"/>
5
+    </device>
6
+    <dependencies>
7
+        <deployment identifier="iOS"/>
8
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--Bridge View Controller-->
12
+        <scene sceneID="tne-QT-ifu">
13
+            <objects>
14
+                <viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
15
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
16
+            </objects>
17
+        </scene>
18
+    </scenes>
19
+</document>

+ 49 - 0
ios/App/App/Info.plist

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleDisplayName</key>
8
+        <string>ra100</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>$(PRODUCT_NAME)</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>$(MARKETING_VERSION)</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>$(CURRENT_PROJECT_VERSION)</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>UILaunchStoryboardName</key>
26
+	<string>LaunchScreen</string>
27
+	<key>UIMainStoryboardFile</key>
28
+	<string>Main</string>
29
+	<key>UIRequiredDeviceCapabilities</key>
30
+	<array>
31
+		<string>armv7</string>
32
+	</array>
33
+	<key>UISupportedInterfaceOrientations</key>
34
+	<array>
35
+		<string>UIInterfaceOrientationPortrait</string>
36
+		<string>UIInterfaceOrientationLandscapeLeft</string>
37
+		<string>UIInterfaceOrientationLandscapeRight</string>
38
+	</array>
39
+	<key>UISupportedInterfaceOrientations~ipad</key>
40
+	<array>
41
+		<string>UIInterfaceOrientationPortrait</string>
42
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
43
+		<string>UIInterfaceOrientationLandscapeLeft</string>
44
+		<string>UIInterfaceOrientationLandscapeRight</string>
45
+	</array>
46
+	<key>UIViewControllerBasedStatusBarAppearance</key>
47
+	<true/>
48
+</dict>
49
+</plist>

+ 27 - 0
ios/App/Podfile

@@ -0,0 +1,27 @@
1
+require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
2
+
3
+platform :ios, '13.0'
4
+use_frameworks!
5
+
6
+# workaround to avoid Xcode caching of Pods that requires
7
+# Product -> Clean Build Folder after new Cordova plugins installed
8
+# Requires CocoaPods 1.6 or newer
9
+install! 'cocoapods', :disable_input_output_paths => true
10
+
11
+def capacitor_pods
12
+  pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
13
+  pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
14
+  pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
15
+  pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
16
+  pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
17
+  pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
18
+end
19
+
20
+target 'App' do
21
+  capacitor_pods
22
+  # Add your Pods here
23
+end
24
+
25
+post_install do |installer|
26
+  assertDeploymentTarget(installer)
27
+end

File diff suppressed because it is too large
+ 43 - 16987
package-lock.json


+ 1 - 0
package.json

@@ -22,6 +22,7 @@
22 22
     "@capacitor/app": "4.1.0",
23 23
     "@capacitor/core": "4.4.0",
24 24
     "@capacitor/haptics": "4.0.1",
25
+    "@capacitor/ios": "4.4.0",
25 26
     "@capacitor/keyboard": "4.0.1",
26 27
     "@capacitor/status-bar": "4.0.1",
27 28
     "@fortawesome/angular-fontawesome": "^0.11.1",

+ 1 - 1
src/app/home/home.page.html

@@ -72,4 +72,4 @@
72 72
     <img src="../../../assets/img-static/banner-320x100.jpeg" alt="">
73 73
   </ion-grid>
74 74
 
75
-</ion-content>
75
+</ion-content>

BIN
www/IBMPlexSansThai-Regular.ttf


BIN
www/IBMPlexSansThai-SemiBold.ttf


BIN
www/K2D-Light.ttf


BIN
www/Montserrat-Medium.ttf


BIN
www/Prompt-Medium.ttf


BIN
www/Prompt-Regular.ttf


File diff suppressed because it is too large
+ 3244 - 0
www/assets/api/news-api.json


BIN
www/assets/fonts/IBMPlexSansThai-Regular.ttf


BIN
www/assets/fonts/IBMPlexSansThai-SemiBold.ttf


BIN
www/assets/fonts/K2D-Light.ttf


BIN
www/assets/fonts/Montserrat-Medium.ttf


BIN
www/assets/fonts/Montserrat-SemiBold.ttf


BIN
www/assets/fonts/Prompt-Light.ttf


BIN
www/assets/fonts/Prompt-Medium.ttf


BIN
www/assets/fonts/Prompt-Regular.ttf


BIN
www/assets/icon/favicon.png


BIN
www/assets/icon/logo-fm99.png


BIN
www/assets/img-static/SEI129887404-c4a9.jpg


BIN
www/assets/img-static/background_982645-1-min.png


BIN
www/assets/img-static/banner-250x250.jpeg


BIN
www/assets/img-static/banner-320x100.jpeg


BIN
www/assets/img-static/banner-320x50.jpeg


BIN
www/assets/img-static/bg-content-min.jpg


BIN
www/assets/img-static/fb-Ad-1.jpeg


BIN
www/assets/img-static/fb-Ad-2.jpeg


BIN
www/assets/img-static/fb-Ad-3.jpeg


BIN
www/assets/img-static/mqdefault-1.jpg


BIN
www/assets/img-static/mqdefault-2.jpg


BIN
www/assets/img-static/mqdefault-3.jpg


File diff suppressed because it is too large
+ 1 - 0
www/assets/shapes.svg


BIN
www/background_982645-1-min.png


BIN
www/bg-content-min.jpg


File diff suppressed because it is too large
+ 1329 - 0
www/common.js


File diff suppressed because it is too large
+ 1 - 0
www/common.js.map


File diff suppressed because it is too large
+ 1823 - 0
www/default-node_modules_ionic_core_dist_esm_parse-71f28cd7_js-node_modules_ionic_core_dist_esm_t-0c999b.js


File diff suppressed because it is too large
+ 1 - 0
www/default-node_modules_ionic_core_dist_esm_parse-71f28cd7_js-node_modules_ionic_core_dist_esm_t-0c999b.js.map


+ 26 - 0
www/index.html

@@ -0,0 +1,26 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+
4
+<head>
5
+  <meta charset="utf-8"/>
6
+  <title>Ionic App</title>
7
+
8
+  <base href="/"/>
9
+
10
+  <meta name="color-scheme" content="light dark"/>
11
+  <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
12
+  <meta name="format-detection" content="telephone=no"/>
13
+  <meta name="msapplication-tap-highlight" content="no"/>
14
+
15
+  <link rel="icon" type="image/png" href="assets/icon/favicon.png"/>
16
+
17
+  <!-- add to homescreen for ios -->
18
+  <meta name="apple-mobile-web-app-capable" content="yes"/>
19
+  <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
20
+<link rel="stylesheet" href="styles.css"></head>
21
+
22
+<body>
23
+  <app-root></app-root>
24
+<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
25
+
26
+</html>

File diff suppressed because it is too large
+ 501 - 0
www/main.js


File diff suppressed because it is too large
+ 1 - 0
www/main.js.map


+ 239 - 0
www/node_modules_ionic_core_dist_esm_index-0bc00b33_js.js

@@ -0,0 +1,239 @@
1
+"use strict";
2
+(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["node_modules_ionic_core_dist_esm_index-0bc00b33_js"],{
3
+
4
+/***/ 1612:
5
+/*!*************************************************************!*\
6
+  !*** ./node_modules/@ionic/core/dist/esm/index-0bc00b33.js ***!
7
+  \*************************************************************/
8
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
+
10
+__webpack_require__.r(__webpack_exports__);
11
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+/* harmony export */   "startTapClick": () => (/* binding */ startTapClick)
13
+/* harmony export */ });
14
+/* harmony import */ var _helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers-3b390e48.js */ 9234);
15
+/*!
16
+ * (C) Ionic http://ionicframework.com - MIT License
17
+ */
18
+
19
+
20
+const startTapClick = config => {
21
+  let lastTouch = -MOUSE_WAIT * 10;
22
+  let lastActivated = 0;
23
+  let activatableEle;
24
+  let activeRipple;
25
+  let activeDefer;
26
+  const useRippleEffect = config.getBoolean('animated', true) && config.getBoolean('rippleEffect', true);
27
+  const clearDefers = new WeakMap(); // Touch Events
28
+
29
+  const onTouchStart = ev => {
30
+    lastTouch = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev);
31
+    pointerDown(ev);
32
+  };
33
+
34
+  const onTouchEnd = ev => {
35
+    lastTouch = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev);
36
+    pointerUp(ev);
37
+  };
38
+
39
+  const onMouseDown = ev => {
40
+    // Ignore right clicks
41
+    if (ev.button === 2) {
42
+      return;
43
+    }
44
+
45
+    const t = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev) - MOUSE_WAIT;
46
+
47
+    if (lastTouch < t) {
48
+      pointerDown(ev);
49
+    }
50
+  };
51
+
52
+  const onMouseUp = ev => {
53
+    const t = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.u)(ev) - MOUSE_WAIT;
54
+
55
+    if (lastTouch < t) {
56
+      pointerUp(ev);
57
+    }
58
+  };
59
+
60
+  const cancelActive = () => {
61
+    clearTimeout(activeDefer);
62
+    activeDefer = undefined;
63
+
64
+    if (activatableEle) {
65
+      removeActivated(false);
66
+      activatableEle = undefined;
67
+    }
68
+  };
69
+
70
+  const pointerDown = ev => {
71
+    if (activatableEle) {
72
+      return;
73
+    }
74
+
75
+    setActivatedElement(getActivatableTarget(ev), ev);
76
+  };
77
+
78
+  const pointerUp = ev => {
79
+    setActivatedElement(undefined, ev);
80
+  };
81
+
82
+  const setActivatedElement = (el, ev) => {
83
+    // do nothing
84
+    if (el && el === activatableEle) {
85
+      return;
86
+    }
87
+
88
+    clearTimeout(activeDefer);
89
+    activeDefer = undefined;
90
+    const {
91
+      x,
92
+      y
93
+    } = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_0__.p)(ev); // deactivate selected
94
+
95
+    if (activatableEle) {
96
+      if (clearDefers.has(activatableEle)) {
97
+        throw new Error('internal error');
98
+      }
99
+
100
+      if (!activatableEle.classList.contains(ACTIVATED)) {
101
+        addActivated(activatableEle, x, y);
102
+      }
103
+
104
+      removeActivated(true);
105
+    } // activate
106
+
107
+
108
+    if (el) {
109
+      const deferId = clearDefers.get(el);
110
+
111
+      if (deferId) {
112
+        clearTimeout(deferId);
113
+        clearDefers.delete(el);
114
+      }
115
+
116
+      const delay = isInstant(el) ? 0 : ADD_ACTIVATED_DEFERS;
117
+      el.classList.remove(ACTIVATED);
118
+      activeDefer = setTimeout(() => {
119
+        addActivated(el, x, y);
120
+        activeDefer = undefined;
121
+      }, delay);
122
+    }
123
+
124
+    activatableEle = el;
125
+  };
126
+
127
+  const addActivated = (el, x, y) => {
128
+    lastActivated = Date.now();
129
+    el.classList.add(ACTIVATED);
130
+    if (!useRippleEffect) return;
131
+    const rippleEffect = getRippleEffect(el);
132
+
133
+    if (rippleEffect !== null) {
134
+      removeRipple();
135
+      activeRipple = rippleEffect.addRipple(x, y);
136
+    }
137
+  };
138
+
139
+  const removeRipple = () => {
140
+    if (activeRipple !== undefined) {
141
+      activeRipple.then(remove => remove());
142
+      activeRipple = undefined;
143
+    }
144
+  };
145
+
146
+  const removeActivated = smooth => {
147
+    removeRipple();
148
+    const active = activatableEle;
149
+
150
+    if (!active) {
151
+      return;
152
+    }
153
+
154
+    const time = CLEAR_STATE_DEFERS - Date.now() + lastActivated;
155
+
156
+    if (smooth && time > 0 && !isInstant(active)) {
157
+      const deferId = setTimeout(() => {
158
+        active.classList.remove(ACTIVATED);
159
+        clearDefers.delete(active);
160
+      }, CLEAR_STATE_DEFERS);
161
+      clearDefers.set(active, deferId);
162
+    } else {
163
+      active.classList.remove(ACTIVATED);
164
+    }
165
+  };
166
+
167
+  const doc = document;
168
+  doc.addEventListener('ionGestureCaptured', cancelActive);
169
+  doc.addEventListener('touchstart', onTouchStart, true);
170
+  doc.addEventListener('touchcancel', onTouchEnd, true);
171
+  doc.addEventListener('touchend', onTouchEnd, true);
172
+  /**
173
+   * Tap click effects such as the ripple effect should
174
+   * not happen when scrolling. For example, if a user scrolls
175
+   * the page but also happens to do a touchstart on a button
176
+   * as part of the scroll, the ripple effect should not
177
+   * be dispatched. The ripple effect should only happen
178
+   * if the button is activated and the page is not scrolling.
179
+   *
180
+   * pointercancel is dispatched on a gesture when scrolling
181
+   * starts, so this lets us avoid having to listen for
182
+   * ion-content's scroll events.
183
+   */
184
+
185
+  doc.addEventListener('pointercancel', cancelActive, true);
186
+  doc.addEventListener('mousedown', onMouseDown, true);
187
+  doc.addEventListener('mouseup', onMouseUp, true);
188
+};
189
+
190
+const getActivatableTarget = ev => {
191
+  if (ev.composedPath !== undefined) {
192
+    /**
193
+     * composedPath returns EventTarget[]. However,
194
+     * objects other than Element can be targets too.
195
+     * For example, AudioContext can be a target. In this
196
+     * case, we know that the event is a UIEvent so we
197
+     * can assume that the path will contain either Element
198
+     * or ShadowRoot.
199
+     */
200
+    const path = ev.composedPath();
201
+
202
+    for (let i = 0; i < path.length - 2; i++) {
203
+      const el = path[i];
204
+
205
+      if (!(el instanceof ShadowRoot) && el.classList.contains('ion-activatable')) {
206
+        return el;
207
+      }
208
+    }
209
+  } else {
210
+    return ev.target.closest('.ion-activatable');
211
+  }
212
+};
213
+
214
+const isInstant = el => {
215
+  return el.classList.contains('ion-activatable-instant');
216
+};
217
+
218
+const getRippleEffect = el => {
219
+  if (el.shadowRoot) {
220
+    const ripple = el.shadowRoot.querySelector('ion-ripple-effect');
221
+
222
+    if (ripple) {
223
+      return ripple;
224
+    }
225
+  }
226
+
227
+  return el.querySelector('ion-ripple-effect');
228
+};
229
+
230
+const ACTIVATED = 'ion-activated';
231
+const ADD_ACTIVATED_DEFERS = 200;
232
+const CLEAR_STATE_DEFERS = 200;
233
+const MOUSE_WAIT = 2500;
234
+
235
+
236
+/***/ })
237
+
238
+}]);
239
+//# sourceMappingURL=node_modules_ionic_core_dist_esm_index-0bc00b33_js.js.map

File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_index-0bc00b33_js.js.map


+ 526 - 0
www/node_modules_ionic_core_dist_esm_input-shims-6ed8f5a5_js.js

@@ -0,0 +1,526 @@
1
+"use strict";
2
+(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["node_modules_ionic_core_dist_esm_input-shims-6ed8f5a5_js"],{
3
+
4
+/***/ 4508:
5
+/*!*******************************************************************!*\
6
+  !*** ./node_modules/@ionic/core/dist/esm/input-shims-6ed8f5a5.js ***!
7
+  \*******************************************************************/
8
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
+
10
+__webpack_require__.r(__webpack_exports__);
11
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+/* harmony export */   "startInputShims": () => (/* binding */ startInputShims)
13
+/* harmony export */ });
14
+/* harmony import */ var _Users_simplicoltd_projects_fm99_rev_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js */ 1670);
15
+/* harmony import */ var _index_5d0c8232_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index-5d0c8232.js */ 3081);
16
+/* harmony import */ var _helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers-3b390e48.js */ 9234);
17
+/* harmony import */ var _index_c4b11676_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./index-c4b11676.js */ 9273);
18
+
19
+
20
+/*!
21
+ * (C) Ionic http://ionicframework.com - MIT License
22
+ */
23
+
24
+
25
+
26
+const cloneMap = new WeakMap();
27
+
28
+const relocateInput = (componentEl, inputEl, shouldRelocate, inputRelativeY = 0) => {
29
+  if (cloneMap.has(componentEl) === shouldRelocate) {
30
+    return;
31
+  }
32
+
33
+  if (shouldRelocate) {
34
+    addClone(componentEl, inputEl, inputRelativeY);
35
+  } else {
36
+    removeClone(componentEl, inputEl);
37
+  }
38
+};
39
+
40
+const isFocused = input => {
41
+  return input === input.getRootNode().activeElement;
42
+};
43
+
44
+const addClone = (componentEl, inputEl, inputRelativeY) => {
45
+  // this allows for the actual input to receive the focus from
46
+  // the user's touch event, but before it receives focus, it
47
+  // moves the actual input to a location that will not screw
48
+  // up the app's layout, and does not allow the native browser
49
+  // to attempt to scroll the input into place (messing up headers/footers)
50
+  // the cloned input fills the area of where native input should be
51
+  // while the native input fakes out the browser by relocating itself
52
+  // before it receives the actual focus event
53
+  // We hide the focused input (with the visible caret) invisible by making it scale(0),
54
+  const parentEl = inputEl.parentNode; // DOM WRITES
55
+
56
+  const clonedEl = inputEl.cloneNode(false);
57
+  clonedEl.classList.add('cloned-input');
58
+  clonedEl.tabIndex = -1;
59
+  parentEl.appendChild(clonedEl);
60
+  cloneMap.set(componentEl, clonedEl);
61
+  const doc = componentEl.ownerDocument;
62
+  const tx = doc.dir === 'rtl' ? 9999 : -9999;
63
+  componentEl.style.pointerEvents = 'none';
64
+  inputEl.style.transform = `translate3d(${tx}px,${inputRelativeY}px,0) scale(0)`;
65
+};
66
+
67
+const removeClone = (componentEl, inputEl) => {
68
+  const clone = cloneMap.get(componentEl);
69
+
70
+  if (clone) {
71
+    cloneMap.delete(componentEl);
72
+    clone.remove();
73
+  }
74
+
75
+  componentEl.style.pointerEvents = '';
76
+  inputEl.style.transform = '';
77
+};
78
+
79
+const enableHideCaretOnScroll = (componentEl, inputEl, scrollEl) => {
80
+  if (!scrollEl || !inputEl) {
81
+    return () => {
82
+      return;
83
+    };
84
+  }
85
+
86
+  const scrollHideCaret = shouldHideCaret => {
87
+    if (isFocused(inputEl)) {
88
+      relocateInput(componentEl, inputEl, shouldHideCaret);
89
+    }
90
+  };
91
+
92
+  const onBlur = () => relocateInput(componentEl, inputEl, false);
93
+
94
+  const hideCaret = () => scrollHideCaret(true);
95
+
96
+  const showCaret = () => scrollHideCaret(false);
97
+
98
+  (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.a)(scrollEl, 'ionScrollStart', hideCaret);
99
+  (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.a)(scrollEl, 'ionScrollEnd', showCaret);
100
+  inputEl.addEventListener('blur', onBlur);
101
+  return () => {
102
+    (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.b)(scrollEl, 'ionScrollStart', hideCaret);
103
+    (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.b)(scrollEl, 'ionScrollEnd', showCaret);
104
+    inputEl.addEventListener('ionBlur', onBlur);
105
+  };
106
+};
107
+
108
+const SKIP_SELECTOR = 'input, textarea, [no-blur], [contenteditable]';
109
+
110
+const enableInputBlurring = () => {
111
+  let focused = true;
112
+  let didScroll = false;
113
+  const doc = document;
114
+
115
+  const onScroll = () => {
116
+    didScroll = true;
117
+  };
118
+
119
+  const onFocusin = () => {
120
+    focused = true;
121
+  };
122
+
123
+  const onTouchend = ev => {
124
+    // if app did scroll return early
125
+    if (didScroll) {
126
+      didScroll = false;
127
+      return;
128
+    }
129
+
130
+    const active = doc.activeElement;
131
+
132
+    if (!active) {
133
+      return;
134
+    } // only blur if the active element is a text-input or a textarea
135
+
136
+
137
+    if (active.matches(SKIP_SELECTOR)) {
138
+      return;
139
+    } // if the selected target is the active element, do not blur
140
+
141
+
142
+    const tapped = ev.target;
143
+
144
+    if (tapped === active) {
145
+      return;
146
+    }
147
+
148
+    if (tapped.matches(SKIP_SELECTOR) || tapped.closest(SKIP_SELECTOR)) {
149
+      return;
150
+    }
151
+
152
+    focused = false; // TODO: find a better way, why 50ms?
153
+
154
+    setTimeout(() => {
155
+      if (!focused) {
156
+        active.blur();
157
+      }
158
+    }, 50);
159
+  };
160
+
161
+  (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.a)(doc, 'ionScrollStart', onScroll);
162
+  doc.addEventListener('focusin', onFocusin, true);
163
+  doc.addEventListener('touchend', onTouchend, false);
164
+  return () => {
165
+    (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.b)(doc, 'ionScrollStart', onScroll, true);
166
+    doc.removeEventListener('focusin', onFocusin, true);
167
+    doc.removeEventListener('touchend', onTouchend, false);
168
+  };
169
+};
170
+
171
+const SCROLL_ASSIST_SPEED = 0.3;
172
+
173
+const getScrollData = (componentEl, contentEl, keyboardHeight) => {
174
+  var _a;
175
+
176
+  const itemEl = (_a = componentEl.closest('ion-item,[ion-item]')) !== null && _a !== void 0 ? _a : componentEl;
177
+  return calcScrollData(itemEl.getBoundingClientRect(), contentEl.getBoundingClientRect(), keyboardHeight, componentEl.ownerDocument.defaultView.innerHeight);
178
+};
179
+
180
+const calcScrollData = (inputRect, contentRect, keyboardHeight, platformHeight) => {
181
+  // compute input's Y values relative to the body
182
+  const inputTop = inputRect.top;
183
+  const inputBottom = inputRect.bottom; // compute visible area
184
+
185
+  const visibleAreaTop = contentRect.top;
186
+  const visibleAreaBottom = Math.min(contentRect.bottom, platformHeight - keyboardHeight); // compute safe area
187
+
188
+  const safeAreaTop = visibleAreaTop + 15;
189
+  const safeAreaBottom = visibleAreaBottom * 0.75; // figure out if each edge of the input is within the safe area
190
+
191
+  const distanceToBottom = safeAreaBottom - inputBottom;
192
+  const distanceToTop = safeAreaTop - inputTop; // desiredScrollAmount is the negated distance to the safe area according to our calculations.
193
+
194
+  const desiredScrollAmount = Math.round(distanceToBottom < 0 ? -distanceToBottom : distanceToTop > 0 ? -distanceToTop : 0); // our calculations make some assumptions that aren't always true, like the keyboard being closed when an input
195
+  // gets focus, so make sure we don't scroll the input above the visible area
196
+
197
+  const scrollAmount = Math.min(desiredScrollAmount, inputTop - visibleAreaTop);
198
+  const distance = Math.abs(scrollAmount);
199
+  const duration = distance / SCROLL_ASSIST_SPEED;
200
+  const scrollDuration = Math.min(400, Math.max(150, duration));
201
+  return {
202
+    scrollAmount,
203
+    scrollDuration,
204
+    scrollPadding: keyboardHeight,
205
+    inputSafeY: -(inputTop - safeAreaTop) + 4
206
+  };
207
+};
208
+
209
+const enableScrollAssist = (componentEl, inputEl, contentEl, footerEl, keyboardHeight) => {
210
+  let coord;
211
+
212
+  const touchStart = ev => {
213
+    coord = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.p)(ev);
214
+  };
215
+
216
+  const touchEnd = ev => {
217
+    // input cover touchend/mouseup
218
+    if (!coord) {
219
+      return;
220
+    } // get where the touchend/mouseup ended
221
+
222
+
223
+    const endCoord = (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.p)(ev); // focus this input if the pointer hasn't moved XX pixels
224
+    // and the input doesn't already have focus
225
+
226
+    if (!hasPointerMoved(6, coord, endCoord) && !isFocused(inputEl)) {
227
+      // begin the input focus process
228
+      jsSetFocus(componentEl, inputEl, contentEl, footerEl, keyboardHeight);
229
+    }
230
+  };
231
+
232
+  componentEl.addEventListener('touchstart', touchStart, {
233
+    capture: true,
234
+    passive: true
235
+  });
236
+  componentEl.addEventListener('touchend', touchEnd, true);
237
+  return () => {
238
+    componentEl.removeEventListener('touchstart', touchStart, true);
239
+    componentEl.removeEventListener('touchend', touchEnd, true);
240
+  };
241
+};
242
+
243
+const jsSetFocus = /*#__PURE__*/function () {
244
+  var _ref = (0,_Users_simplicoltd_projects_fm99_rev_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* (componentEl, inputEl, contentEl, footerEl, keyboardHeight) {
245
+    if (!contentEl && !footerEl) {
246
+      return;
247
+    }
248
+
249
+    const scrollData = getScrollData(componentEl, contentEl || footerEl, keyboardHeight);
250
+
251
+    if (contentEl && Math.abs(scrollData.scrollAmount) < 4) {
252
+      // the text input is in a safe position that doesn't
253
+      // require it to be scrolled into view, just set focus now
254
+      inputEl.focus();
255
+      return;
256
+    } // temporarily move the focus to the focus holder so the browser
257
+    // doesn't freak out while it's trying to get the input in place
258
+    // at this point the native text input still does not have focus
259
+
260
+
261
+    relocateInput(componentEl, inputEl, true, scrollData.inputSafeY);
262
+    inputEl.focus();
263
+    /**
264
+     * Relocating/Focusing input causes the
265
+     * click event to be cancelled, so
266
+     * manually fire one here.
267
+     */
268
+
269
+    (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.r)(() => componentEl.click());
270
+
271
+    if (typeof window !== 'undefined') {
272
+      let scrollContentTimeout;
273
+
274
+      const scrollContent = /*#__PURE__*/function () {
275
+        var _ref2 = (0,_Users_simplicoltd_projects_fm99_rev_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* () {
276
+          // clean up listeners and timeouts
277
+          if (scrollContentTimeout !== undefined) {
278
+            clearTimeout(scrollContentTimeout);
279
+          }
280
+
281
+          window.removeEventListener('ionKeyboardDidShow', doubleKeyboardEventListener);
282
+          window.removeEventListener('ionKeyboardDidShow', scrollContent); // scroll the input into place
283
+
284
+          if (contentEl) {
285
+            yield (0,_index_5d0c8232_js__WEBPACK_IMPORTED_MODULE_1__.c)(contentEl, 0, scrollData.scrollAmount, scrollData.scrollDuration);
286
+          } // the scroll view is in the correct position now
287
+          // give the native text input focus
288
+
289
+
290
+          relocateInput(componentEl, inputEl, false, scrollData.inputSafeY); // ensure this is the focused input
291
+
292
+          inputEl.focus();
293
+        });
294
+
295
+        return function scrollContent() {
296
+          return _ref2.apply(this, arguments);
297
+        };
298
+      }();
299
+
300
+      const doubleKeyboardEventListener = () => {
301
+        window.removeEventListener('ionKeyboardDidShow', doubleKeyboardEventListener);
302
+        window.addEventListener('ionKeyboardDidShow', scrollContent);
303
+      };
304
+
305
+      if (contentEl) {
306
+        const scrollEl = yield (0,_index_5d0c8232_js__WEBPACK_IMPORTED_MODULE_1__.g)(contentEl);
307
+        /**
308
+         * scrollData will only consider the amount we need
309
+         * to scroll in order to properly bring the input
310
+         * into view. It will not consider the amount
311
+         * we can scroll in the content element.
312
+         * As a result, scrollData may request a greater
313
+         * scroll position than is currently available
314
+         * in the DOM. If this is the case, we need to
315
+         * wait for the webview to resize/the keyboard
316
+         * to show in order for additional scroll
317
+         * bandwidth to become available.
318
+         */
319
+
320
+        const totalScrollAmount = scrollEl.scrollHeight - scrollEl.clientHeight;
321
+
322
+        if (scrollData.scrollAmount > totalScrollAmount - scrollEl.scrollTop) {
323
+          /**
324
+           * On iOS devices, the system will show a "Passwords" bar above the keyboard
325
+           * after the initial keyboard is shown. This prevents the webview from resizing
326
+           * until the "Passwords" bar is shown, so we need to wait for that to happen first.
327
+           */
328
+          if (inputEl.type === 'password') {
329
+            // Add 50px to account for the "Passwords" bar
330
+            scrollData.scrollAmount += 50;
331
+            window.addEventListener('ionKeyboardDidShow', doubleKeyboardEventListener);
332
+          } else {
333
+            window.addEventListener('ionKeyboardDidShow', scrollContent);
334
+          }
335
+          /**
336
+           * This should only fire in 2 instances:
337
+           * 1. The app is very slow.
338
+           * 2. The app is running in a browser on an old OS
339
+           * that does not support Ionic Keyboard Events
340
+           */
341
+
342
+
343
+          scrollContentTimeout = setTimeout(scrollContent, 1000);
344
+          return;
345
+        }
346
+      }
347
+
348
+      scrollContent();
349
+    }
350
+  });
351
+
352
+  return function jsSetFocus(_x, _x2, _x3, _x4, _x5) {
353
+    return _ref.apply(this, arguments);
354
+  };
355
+}();
356
+
357
+const hasPointerMoved = (threshold, startCoord, endCoord) => {
358
+  if (startCoord && endCoord) {
359
+    const deltaX = startCoord.x - endCoord.x;
360
+    const deltaY = startCoord.y - endCoord.y;
361
+    const distance = deltaX * deltaX + deltaY * deltaY;
362
+    return distance > threshold * threshold;
363
+  }
364
+
365
+  return false;
366
+};
367
+
368
+const PADDING_TIMER_KEY = '$ionPaddingTimer';
369
+
370
+const enableScrollPadding = keyboardHeight => {
371
+  const doc = document;
372
+
373
+  const onFocusin = ev => {
374
+    setScrollPadding(ev.target, keyboardHeight);
375
+  };
376
+
377
+  const onFocusout = ev => {
378
+    setScrollPadding(ev.target, 0);
379
+  };
380
+
381
+  doc.addEventListener('focusin', onFocusin);
382
+  doc.addEventListener('focusout', onFocusout);
383
+  return () => {
384
+    doc.removeEventListener('focusin', onFocusin);
385
+    doc.removeEventListener('focusout', onFocusout);
386
+  };
387
+};
388
+
389
+const setScrollPadding = (input, keyboardHeight) => {
390
+  var _a, _b;
391
+
392
+  if (input.tagName !== 'INPUT') {
393
+    return;
394
+  }
395
+
396
+  if (input.parentElement && input.parentElement.tagName === 'ION-INPUT') {
397
+    return;
398
+  }
399
+
400
+  if (((_b = (_a = input.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.tagName) === 'ION-SEARCHBAR') {
401
+    return;
402
+  }
403
+
404
+  const el = (0,_index_5d0c8232_js__WEBPACK_IMPORTED_MODULE_1__.f)(input);
405
+
406
+  if (el === null) {
407
+    return;
408
+  }
409
+
410
+  const timer = el[PADDING_TIMER_KEY];
411
+
412
+  if (timer) {
413
+    clearTimeout(timer);
414
+  }
415
+
416
+  if (keyboardHeight > 0) {
417
+    el.style.setProperty('--keyboard-offset', `${keyboardHeight}px`);
418
+  } else {
419
+    el[PADDING_TIMER_KEY] = setTimeout(() => {
420
+      el.style.setProperty('--keyboard-offset', '0px');
421
+    }, 120);
422
+  }
423
+};
424
+
425
+const INPUT_BLURRING = true;
426
+const SCROLL_PADDING = true;
427
+
428
+const startInputShims = config => {
429
+  const doc = document;
430
+  const keyboardHeight = config.getNumber('keyboardHeight', 290);
431
+  const scrollAssist = config.getBoolean('scrollAssist', true);
432
+  const hideCaret = config.getBoolean('hideCaretOnScroll', true);
433
+  const inputBlurring = config.getBoolean('inputBlurring', true);
434
+  const scrollPadding = config.getBoolean('scrollPadding', true);
435
+  const inputs = Array.from(doc.querySelectorAll('ion-input, ion-textarea'));
436
+  const hideCaretMap = new WeakMap();
437
+  const scrollAssistMap = new WeakMap();
438
+
439
+  const registerInput = /*#__PURE__*/function () {
440
+    var _ref3 = (0,_Users_simplicoltd_projects_fm99_rev_node_modules_babel_runtime_helpers_esm_asyncToGenerator_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function* (componentEl) {
441
+      yield new Promise(resolve => (0,_helpers_3b390e48_js__WEBPACK_IMPORTED_MODULE_2__.c)(componentEl, resolve));
442
+      const inputRoot = componentEl.shadowRoot || componentEl;
443
+      const inputEl = inputRoot.querySelector('input') || inputRoot.querySelector('textarea');
444
+      const scrollEl = (0,_index_5d0c8232_js__WEBPACK_IMPORTED_MODULE_1__.f)(componentEl);
445
+      const footerEl = !scrollEl ? componentEl.closest('ion-footer') : null;
446
+
447
+      if (!inputEl) {
448
+        return;
449
+      }
450
+
451
+      if (!!scrollEl && hideCaret && !hideCaretMap.has(componentEl)) {
452
+        const rmFn = enableHideCaretOnScroll(componentEl, inputEl, scrollEl);
453
+        hideCaretMap.set(componentEl, rmFn);
454
+      }
455
+      /**
456
+       * date/datetime-locale inputs on mobile devices show date picker
457
+       * overlays instead of keyboards. As a result, scroll assist is
458
+       * not needed. This also works around a bug in iOS <16 where
459
+       * scroll assist causes the browser to lock up. See FW-1997.
460
+       */
461
+
462
+
463
+      const isDateInput = inputEl.type === 'date' || inputEl.type === 'datetime-local';
464
+
465
+      if (!isDateInput && (!!scrollEl || !!footerEl) && scrollAssist && !scrollAssistMap.has(componentEl)) {
466
+        const rmFn = enableScrollAssist(componentEl, inputEl, scrollEl, footerEl, keyboardHeight);
467
+        scrollAssistMap.set(componentEl, rmFn);
468
+      }
469
+    });
470
+
471
+    return function registerInput(_x6) {
472
+      return _ref3.apply(this, arguments);
473
+    };
474
+  }();
475
+
476
+  const unregisterInput = componentEl => {
477
+    if (hideCaret) {
478
+      const fn = hideCaretMap.get(componentEl);
479
+
480
+      if (fn) {
481
+        fn();
482
+      }
483
+
484
+      hideCaretMap.delete(componentEl);
485
+    }
486
+
487
+    if (scrollAssist) {
488
+      const fn = scrollAssistMap.get(componentEl);
489
+
490
+      if (fn) {
491
+        fn();
492
+      }
493
+
494
+      scrollAssistMap.delete(componentEl);
495
+    }
496
+  };
497
+
498
+  if (inputBlurring && INPUT_BLURRING) {
499
+    enableInputBlurring();
500
+  }
501
+
502
+  if (scrollPadding && SCROLL_PADDING) {
503
+    enableScrollPadding(keyboardHeight);
504
+  } // Input might be already loaded in the DOM before ion-device-hacks did.
505
+  // At this point we need to look for all of the inputs not registered yet
506
+  // and register them.
507
+
508
+
509
+  for (const input of inputs) {
510
+    registerInput(input);
511
+  }
512
+
513
+  doc.addEventListener('ionInputDidLoad', ev => {
514
+    registerInput(ev.detail);
515
+  });
516
+  doc.addEventListener('ionInputDidUnload', ev => {
517
+    unregisterInput(ev.detail);
518
+  });
519
+};
520
+
521
+
522
+
523
+/***/ })
524
+
525
+}]);
526
+//# sourceMappingURL=node_modules_ionic_core_dist_esm_input-shims-6ed8f5a5_js.js.map

File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_input-shims-6ed8f5a5_js.js.map


File diff suppressed because it is too large
+ 799 - 0
www/node_modules_ionic_core_dist_esm_ion-accordion_2_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-accordion_2_entry_js.js.map


File diff suppressed because it is too large
+ 450 - 0
www/node_modules_ionic_core_dist_esm_ion-action-sheet_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-action-sheet_entry_js.js.map


File diff suppressed because it is too large
+ 780 - 0
www/node_modules_ionic_core_dist_esm_ion-alert_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-alert_entry_js.js.map


File diff suppressed because it is too large
+ 1726 - 0
www/node_modules_ionic_core_dist_esm_ion-app_8_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-app_8_entry_js.js.map


File diff suppressed because it is too large
+ 160 - 0
www/node_modules_ionic_core_dist_esm_ion-avatar_3_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-avatar_3_entry_js.js.map


File diff suppressed because it is too large
+ 257 - 0
www/node_modules_ionic_core_dist_esm_ion-back-button_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-back-button_entry_js.js.map


+ 97 - 0
www/node_modules_ionic_core_dist_esm_ion-backdrop_entry_js.js

@@ -0,0 +1,97 @@
1
+"use strict";
2
+(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["node_modules_ionic_core_dist_esm_ion-backdrop_entry_js"],{
3
+
4
+/***/ 3059:
5
+/*!*****************************************************************!*\
6
+  !*** ./node_modules/@ionic/core/dist/esm/ion-backdrop.entry.js ***!
7
+  \*****************************************************************/
8
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9
+
10
+__webpack_require__.r(__webpack_exports__);
11
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
12
+/* harmony export */   "ion_backdrop": () => (/* binding */ Backdrop)
13
+/* harmony export */ });
14
+/* harmony import */ var _index_8e692445_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index-8e692445.js */ 1559);
15
+/* harmony import */ var _ionic_global_c95cf239_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ionic-global-c95cf239.js */ 8607);
16
+/* harmony import */ var _gesture_controller_17060b7c_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gesture-controller-17060b7c.js */ 6379);
17
+/*!
18
+ * (C) Ionic http://ionicframework.com - MIT License
19
+ */
20
+
21
+
22
+
23
+const backdropIosCss = ":host{left:0;right:0;top:0;bottom:0;display:block;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);contain:strict;cursor:pointer;opacity:0.01;-ms-touch-action:none;touch-action:none;z-index:2}:host(.backdrop-hide){background:transparent}:host(.backdrop-no-tappable){cursor:auto}:host{background-color:var(--ion-backdrop-color, #000)}";
24
+const backdropMdCss = ":host{left:0;right:0;top:0;bottom:0;display:block;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);contain:strict;cursor:pointer;opacity:0.01;-ms-touch-action:none;touch-action:none;z-index:2}:host(.backdrop-hide){background:transparent}:host(.backdrop-no-tappable){cursor:auto}:host{background-color:var(--ion-backdrop-color, #000)}";
25
+const Backdrop = class {
26
+  constructor(hostRef) {
27
+    (0,_index_8e692445_js__WEBPACK_IMPORTED_MODULE_0__.r)(this, hostRef);
28
+    this.ionBackdropTap = (0,_index_8e692445_js__WEBPACK_IMPORTED_MODULE_0__.e)(this, "ionBackdropTap", 7);
29
+    this.blocker = _gesture_controller_17060b7c_js__WEBPACK_IMPORTED_MODULE_2__.G.createBlocker({
30
+      disableScroll: true
31
+    });
32
+    /**
33
+     * If `true`, the backdrop will be visible.
34
+     */
35
+
36
+    this.visible = true;
37
+    /**
38
+     * If `true`, the backdrop will can be clicked and will emit the `ionBackdropTap` event.
39
+     */
40
+
41
+    this.tappable = true;
42
+    /**
43
+     * If `true`, the backdrop will stop propagation on tap.
44
+     */
45
+
46
+    this.stopPropagation = true;
47
+  }
48
+
49
+  connectedCallback() {
50
+    if (this.stopPropagation) {
51
+      this.blocker.block();
52
+    }
53
+  }
54
+
55
+  disconnectedCallback() {
56
+    this.blocker.unblock();
57
+  }
58
+
59
+  onMouseDown(ev) {
60
+    this.emitTap(ev);
61
+  }
62
+
63
+  emitTap(ev) {
64
+    if (this.stopPropagation) {
65
+      ev.preventDefault();
66
+      ev.stopPropagation();
67
+    }
68
+
69
+    if (this.tappable) {
70
+      this.ionBackdropTap.emit();
71
+    }
72
+  }
73
+
74
+  render() {
75
+    const mode = (0,_ionic_global_c95cf239_js__WEBPACK_IMPORTED_MODULE_1__.b)(this);
76
+    return (0,_index_8e692445_js__WEBPACK_IMPORTED_MODULE_0__.h)(_index_8e692445_js__WEBPACK_IMPORTED_MODULE_0__.H, {
77
+      tabindex: "-1",
78
+      "aria-hidden": "true",
79
+      class: {
80
+        [mode]: true,
81
+        'backdrop-hide': !this.visible,
82
+        'backdrop-no-tappable': !this.tappable
83
+      }
84
+    });
85
+  }
86
+
87
+};
88
+Backdrop.style = {
89
+  ios: backdropIosCss,
90
+  md: backdropMdCss
91
+};
92
+
93
+
94
+/***/ })
95
+
96
+}]);
97
+//# sourceMappingURL=node_modules_ionic_core_dist_esm_ion-backdrop_entry_js.js.map

File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-backdrop_entry_js.js.map


File diff suppressed because it is too large
+ 414 - 0
www/node_modules_ionic_core_dist_esm_ion-breadcrumb_2_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-breadcrumb_2_entry_js.js.map


File diff suppressed because it is too large
+ 770 - 0
www/node_modules_ionic_core_dist_esm_ion-button_2_entry_js.js


File diff suppressed because it is too large
+ 1 - 0
www/node_modules_ionic_core_dist_esm_ion-button_2_entry_js.js.map


File diff suppressed because it is too large
+ 299 - 0
www/node_modules_ionic_core_dist_esm_ion-card_5_entry_js.js


+ 0 - 0
www/node_modules_ionic_core_dist_esm_ion-card_5_entry_js.js.map


Some files were not shown because too many files changed in this diff

tum/whitesports - Gogs: Simplico Git Service

Brak opisu

module-headings.php 43KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. <?php
  2. /**
  3. * Do not edit this file. It's generated by `jetpack/tools/build-module-headings-translations.php`.
  4. *
  5. * @package automattic/jetpack
  6. */
  7. /**
  8. * For a given module, return an array with translated name and description.
  9. *
  10. * @param string $key Module file name without `.php`.
  11. *
  12. * @return array
  13. */
  14. function jetpack_get_module_i18n( $key ) {
  15. static $modules;
  16. if ( ! isset( $modules ) ) {
  17. $modules = array(
  18. 'carousel' => array(
  19. 'name' => _x( 'Carousel', 'Module Name', 'jetpack' ),
  20. 'description' => _x( 'Display images and galleries in a gorgeous, full-screen browsing experience', 'Module Description', 'jetpack' ),
  21. ),
  22. 'comment-likes' => array(
  23. 'name' => _x( 'Comment Likes', 'Module Name', 'jetpack' ),
  24. 'description' => _x( 'Increase visitor engagement by adding a Like button to comments.', 'Module Description', 'jetpack' ),
  25. ),
  26. 'comments' => array(
  27. 'name' => _x( 'Comments', 'Module Name', 'jetpack' ),
  28. 'description' => _x( 'Let visitors use a WordPress.com, Twitter, Facebook, or Google account to comment', 'Module Description', 'jetpack' ),
  29. ),
  30. 'contact-form' => array(
  31. 'name' => _x( 'Contact Form', 'Module Name', 'jetpack' ),
  32. 'description' => _x( 'Add a customizable contact form to any post or page using the Jetpack Form Block.', 'Module Description', 'jetpack' ),
  33. ),
  34. 'copy-post' => array(
  35. 'name' => _x( 'Copy Post', 'Module Name', 'jetpack' ),
  36. 'description' => _x( 'Enable the option to copy entire posts and pages, including tags and settings', 'Module Description', 'jetpack' ),
  37. ),
  38. 'custom-content-types' => array(
  39. 'name' => _x( 'Custom content types', 'Module Name', 'jetpack' ),
  40. 'description' => _x( 'Display different types of content on your site with custom content types.', 'Module Description', 'jetpack' ),
  41. ),
  42. 'custom-css' => array(
  43. 'name' => _x( 'Custom CSS', 'Module Name', 'jetpack' ),
  44. 'description' => _x( 'Adds options for CSS preprocessor use, disabling the theme\'s CSS, or custom image width.', 'Module Description', 'jetpack' ),
  45. ),
  46. 'enhanced-distribution' => array(
  47. 'name' => _x( 'Enhanced Distribution', 'Module Name', 'jetpack' ),
  48. 'description' => _x( 'Increase reach and traffic.', 'Module Description', 'jetpack' ),
  49. ),
  50. 'google-analytics' => array(
  51. 'name' => _x( 'Google Analytics', 'Module Name', 'jetpack' ),
  52. 'description' => _x( 'Set up Google Analytics without touching a line of code.', 'Module Description', 'jetpack' ),
  53. ),
  54. 'gravatar-hovercards' => array(
  55. 'name' => _x( 'Gravatar Hovercards', 'Module Name', 'jetpack' ),
  56. 'description' => _x( 'Enable pop-up business cards over commenters’ Gravatars.', 'Module Description', 'jetpack' ),
  57. ),
  58. 'infinite-scroll' => array(
  59. 'name' => _x( 'Infinite Scroll', 'Module Name', 'jetpack' ),
  60. 'description' => _x( 'Automatically load new content when a visitor scrolls', 'Module Description', 'jetpack' ),
  61. ),
  62. 'json-api' => array(
  63. 'name' => _x( 'JSON API', 'Module Name', 'jetpack' ),
  64. 'description' => _x( 'Allow applications to securely access your content.', 'Module Description', 'jetpack' ),
  65. ),
  66. 'latex' => array(
  67. 'name' => _x( 'Beautiful Math', 'Module Name', 'jetpack' ),
  68. 'description' => _x( 'Use the LaTeX markup language to write mathematical equations and formulas', 'Module Description', 'jetpack' ),
  69. ),
  70. 'lazy-images' => array(
  71. 'name' => _x( 'Lazy Images', 'Module Name', 'jetpack' ),
  72. 'description' => _x( 'Speed up your site and create a smoother viewing experience by loading images as visitors scroll down the screen, instead of all at once.', 'Module Description', 'jetpack' ),
  73. ),
  74. 'likes' => array(
  75. 'name' => _x( 'Likes', 'Module Name', 'jetpack' ),
  76. 'description' => _x( 'Give visitors an easy way to show they appreciate your content.', 'Module Description', 'jetpack' ),
  77. ),
  78. 'markdown' => array(
  79. 'name' => _x( 'Markdown', 'Module Name', 'jetpack' ),
  80. 'description' => _x( 'Write posts or pages in plain-text Markdown syntax', 'Module Description', 'jetpack' ),
  81. ),
  82. 'masterbar' => array(
  83. 'name' => _x( 'WordPress.com Toolbar and Dashboard customizations', 'Module Name', 'jetpack' ),
  84. 'description' => _x( 'Replaces the admin bar with a useful toolbar to quickly manage your site via WordPress.com. Also adds additional customizations to the WPAdmin dashboard experience for better compatibility with WP.com.', 'Module Description', 'jetpack' ),
  85. ),
  86. 'monitor' => array(
  87. 'name' => _x( 'Monitor', 'Module Name', 'jetpack' ),
  88. 'description' => _x( 'Jetpack’s downtime monitoring will continuously watch your site and alert you the moment that downtime is detected.', 'Module Description', 'jetpack' ),
  89. ),
  90. 'notes' => array(
  91. 'name' => _x( 'Notifications', 'Module Name', 'jetpack' ),
  92. 'description' => _x( 'Receive instant notifications of site comments and likes.', 'Module Description', 'jetpack' ),
  93. ),
  94. 'photon-cdn' => array(
  95. 'name' => _x( 'Asset CDN', 'Module Name', 'jetpack' ),
  96. 'description' => _x( 'Jetpack’s Site Accelerator loads your site faster by optimizing your images and serving your images and static files from our global network of servers.', 'Module Description', 'jetpack' ),
  97. ),
  98. 'photon' => array(
  99. 'name' => _x( 'Image CDN', 'Module Name', 'jetpack' ),
  100. 'description' => _x( 'Mirrors and serves your images from our free and fast image CDN, improving your site’s performance with no additional load on your servers.', 'Module Description', 'jetpack' ),
  101. ),
  102. 'post-by-email' => array(
  103. 'name' => _x( 'Post by email', 'Module Name', 'jetpack' ),
  104. 'description' => _x( 'Publish posts by sending an email', 'Module Description', 'jetpack' ),
  105. ),
  106. 'protect' => array(
  107. 'name' => _x( 'Protect', 'Module Name', 'jetpack' ),
  108. 'description' => _x( 'Enabling brute force protection will prevent bots and hackers from attempting to log in to your website with common username and password combinations.', 'Module Description', 'jetpack' ),
  109. ),
  110. 'publicize' => array(
  111. 'name' => _x( 'Publicize', 'Module Name', 'jetpack' ),
  112. 'description' => _x( 'Publicize makes it easy to share your site’s posts on several social media networks automatically when you publish a new post.', 'Module Description', 'jetpack' ),
  113. ),
  114. 'related-posts' => array(
  115. 'name' => _x( 'Related posts', 'Module Name', 'jetpack' ),
  116. 'description' => _x( 'Keep visitors engaged on your blog by highlighting relevant and new content at the bottom of each published post.', 'Module Description', 'jetpack' ),
  117. ),
  118. 'search' => array(
  119. 'name' => _x( 'Search', 'Module Name', 'jetpack' ),
  120. 'description' => _x( 'Help visitors quickly find answers with highly relevant instant search results and powerful filtering.', 'Module Description', 'jetpack' ),
  121. ),
  122. 'seo-tools' => array(
  123. 'name' => _x( 'SEO Tools', 'Module Name', 'jetpack' ),
  124. 'description' => _x( 'Better results on search engines and social media.', 'Module Description', 'jetpack' ),
  125. ),
  126. 'sharedaddy' => array(
  127. 'name' => _x( 'Sharing', 'Module Name', 'jetpack' ),
  128. 'description' => _x( 'Add Twitter, Facebook and Google+ buttons at the bottom of each post, making it easy for visitors to share your content.', 'Module Description', 'jetpack' ),
  129. ),
  130. 'shortcodes' => array(
  131. 'name' => _x( 'Shortcode Embeds', 'Module Name', 'jetpack' ),
  132. 'description' => _x( 'Shortcodes are WordPress-specific markup that let you add media from popular sites. This feature is no longer necessary as the editor now handles media embeds rather gracefully.', 'Module Description', 'jetpack' ),
  133. ),
  134. 'shortlinks' => array(
  135. 'name' => _x( 'WP.me Shortlinks', 'Module Name', 'jetpack' ),
  136. 'description' => _x( 'Generates shorter links using the wp.me domain.', 'Module Description', 'jetpack' ),
  137. ),
  138. 'sitemaps' => array(
  139. 'name' => _x( 'Sitemaps', 'Module Name', 'jetpack' ),
  140. 'description' => _x( 'Make it easy for search engines to find your site.', 'Module Description', 'jetpack' ),
  141. ),
  142. 'sso' => array(
  143. 'name' => _x( 'Secure Sign On', 'Module Name', 'jetpack' ),
  144. 'description' => _x( 'Allow users to log in to this site using WordPress.com accounts', 'Module Description', 'jetpack' ),
  145. ),
  146. 'stats' => array(
  147. 'name' => _x( 'Site Stats', 'Module Name', 'jetpack' ),
  148. 'description' => _x( 'Collect valuable traffic stats and insights.', 'Module Description', 'jetpack' ),
  149. ),
  150. 'subscriptions' => array(
  151. 'name' => _x( 'Subscriptions', 'Module Name', 'jetpack' ),
  152. 'description' => _x( 'Let visitors subscribe to new posts and comments via email', 'Module Description', 'jetpack' ),
  153. ),
  154. 'tiled-gallery' => array(
  155. 'name' => _x( 'Tiled Galleries', 'Module Name', 'jetpack' ),
  156. 'description' => _x( 'Display image galleries in a variety of elegant arrangements.', 'Module Description', 'jetpack' ),
  157. ),
  158. 'vaultpress' => array(
  159. 'name' => _x( 'Backups and Scanning', 'Module Name', 'jetpack' ),
  160. 'description' => _x( 'Protect your site with daily or real-time backups and automated virus scanning and threat detection.', 'Module Description', 'jetpack' ),
  161. ),
  162. 'verification-tools' => array(
  163. 'name' => _x( 'Site verification', 'Module Name', 'jetpack' ),
  164. 'description' => _x( 'Establish your site\'s authenticity with external services.', 'Module Description', 'jetpack' ),
  165. ),
  166. 'videopress' => array(
  167. 'name' => _x( 'VideoPress', 'Module Name', 'jetpack' ),
  168. 'description' => _x( 'Save on hosting storage and bandwidth costs by streaming fast, ad-free video from our global network.', 'Module Description', 'jetpack' ),
  169. ),
  170. 'widget-visibility' => array(
  171. 'name' => _x( 'Widget Visibility', 'Module Name', 'jetpack' ),
  172. 'description' => _x( 'Control where widgets appear on your site.', 'Module Description', 'jetpack' ),
  173. ),
  174. 'widgets' => array(
  175. 'name' => _x( 'Extra Sidebar Widgets', 'Module Name', 'jetpack' ),
  176. 'description' => _x( 'Provides additional widgets for use on your site.', 'Module Description', 'jetpack' ),
  177. ),
  178. 'woocommerce-analytics' => array(
  179. 'name' => _x( 'WooCommerce Analytics', 'Module Name', 'jetpack' ),
  180. 'description' => _x( 'Enhanced analytics for WooCommerce and Jetpack users.', 'Module Description', 'jetpack' ),
  181. ),
  182. 'wordads' => array(
  183. 'name' => _x( 'Ads', 'Module Name', 'jetpack' ),
  184. 'description' => _x( 'Earn income by allowing Jetpack to display high quality ads.', 'Module Description', 'jetpack' ),
  185. ),
  186. );
  187. }
  188. return isset( $modules[ $key ] ) ? $modules[ $key ] : null;
  189. }
  190. // The lists of filenames below shouldn't be arbitrarily punctuated, but the sniff triggers anyway.
  191. // phpcs:disable Squiz.Commenting.InlineComment.InvalidEndChar
  192. /**
  193. * For a given module tag, return its translated version.
  194. *
  195. * @param string $key Module tag as is in each module heading.
  196. *
  197. * @return string
  198. */
  199. function jetpack_get_module_i18n_tag( $key ) {
  200. static $module_tags;
  201. if ( ! isset( $module_tags ) ) {
  202. $module_tags = array(
  203. // Modules with `Other` tag:
  204. // - modules/contact-form.php
  205. // - modules/notes.php
  206. // - modules/woocommerce-analytics.php
  207. 'Other' => _x( 'Other', 'Module Tag', 'jetpack' ),
  208. // Modules with `Photos and Videos` tag:
  209. // - modules/carousel.php
  210. // - modules/photon-cdn.php
  211. // - modules/photon.php
  212. // - modules/shortcodes.php
  213. // - modules/tiled-gallery.php
  214. // - modules/videopress.php
  215. 'Photos and Videos' => _x( 'Photos and Videos', 'Module Tag', 'jetpack' ),
  216. // Modules with `Social` tag:
  217. // - modules/comment-likes.php
  218. // - modules/comments.php
  219. // - modules/gravatar-hovercards.php
  220. // - modules/likes.php
  221. // - modules/publicize.php
  222. // - modules/seo-tools.php
  223. // - modules/sharedaddy.php
  224. // - modules/shortcodes.php
  225. // - modules/shortlinks.php
  226. // - modules/subscriptions.php
  227. // - modules/widgets.php
  228. 'Social' => _x( 'Social', 'Module Tag', 'jetpack' ),
  229. // Modules with `Writing` tag:
  230. // - modules/copy-post.php
  231. // - modules/custom-content-types.php
  232. // - modules/enhanced-distribution.php
  233. // - modules/json-api.php
  234. // - modules/latex.php
  235. // - modules/markdown.php
  236. // - modules/post-by-email.php
  237. // - modules/shortcodes.php
  238. 'Writing' => _x( 'Writing', 'Module Tag', 'jetpack' ),
  239. // Modules with `Appearance` tag:
  240. // - modules/custom-css.php
  241. // - modules/gravatar-hovercards.php
  242. // - modules/infinite-scroll.php
  243. // - modules/lazy-images.php
  244. // - modules/photon-cdn.php
  245. // - modules/photon.php
  246. // - modules/seo-tools.php
  247. // - modules/shortcodes.php
  248. // - modules/widget-visibility.php
  249. // - modules/widgets.php
  250. // - modules/wordads.php
  251. 'Appearance' => _x( 'Appearance', 'Module Tag', 'jetpack' ),
  252. // Modules with `Developers` tag:
  253. // - modules/json-api.php
  254. // - modules/sso.php
  255. 'Developers' => _x( 'Developers', 'Module Tag', 'jetpack' ),
  256. // Modules with `Recommended` tag:
  257. // - modules/lazy-images.php
  258. // - modules/monitor.php
  259. // - modules/photon-cdn.php
  260. // - modules/photon.php
  261. // - modules/protect.php
  262. // - modules/publicize.php
  263. // - modules/related-posts.php
  264. // - modules/sharedaddy.php
  265. // - modules/sitemaps.php
  266. // - modules/stats.php
  267. // - modules/woocommerce-analytics.php
  268. 'Recommended' => _x( 'Recommended', 'Module Tag', 'jetpack' ),
  269. // Modules with `General` tag:
  270. // - modules/masterbar.php
  271. 'General' => _x( 'General', 'Module Tag', 'jetpack' ),
  272. // Modules with `Traffic` tag:
  273. // - modules/sitemaps.php
  274. // - modules/wordads.php
  275. 'Traffic' => _x( 'Traffic', 'Module Tag', 'jetpack' ),
  276. // Modules with `Site Stats` tag:
  277. // - modules/stats.php
  278. 'Site Stats' => _x( 'Site Stats', 'Module Tag', 'jetpack' ),
  279. );
  280. }
  281. return ! empty( $module_tags[ $key ] ) ? $module_tags[ $key ] : '';
  282. }
  283. /**
  284. * For a given module, return an array with the module info.
  285. *
  286. * @param string $key Module file name without `.php`.
  287. *
  288. * return array|string An array containing the module info or an empty string if the given module isn't known.
  289. */
  290. function jetpack_get_module_info( $key ) {
  291. static $module_info = array (
  292. 'carousel' =>
  293. array (
  294. 'name' => 'Carousel',
  295. 'description' => 'Display images and galleries in a gorgeous, full-screen browsing experience',
  296. 'sort' => '22',
  297. 'recommendation_order' => '12',
  298. 'introduced' => '1.5',
  299. 'changed' => '',
  300. 'deactivate' => '',
  301. 'free' => '',
  302. 'requires_connection' => 'No',
  303. 'requires_user_connection' => '',
  304. 'auto_activate' => 'No',
  305. 'module_tags' => 'Photos and Videos',
  306. 'feature' => 'Appearance',
  307. 'additional_search_queries' => 'gallery, carousel, diaporama, slideshow, images, lightbox, exif, metadata, image',
  308. 'plan_classes' => '',
  309. ),
  310. 'comment-likes' =>
  311. array (
  312. 'name' => 'Comment Likes',
  313. 'description' => 'Increase visitor engagement by adding a Like button to comments.',
  314. 'sort' => '39',
  315. 'recommendation_order' => '17',
  316. 'introduced' => '5.1',
  317. 'changed' => '',
  318. 'deactivate' => '',
  319. 'free' => '',
  320. 'requires_connection' => 'Yes',
  321. 'requires_user_connection' => '',
  322. 'auto_activate' => 'No',
  323. 'module_tags' => 'Social',
  324. 'feature' => '',
  325. 'additional_search_queries' => 'like widget, like button, like, likes',
  326. 'plan_classes' => '',
  327. ),
  328. 'comments' =>
  329. array (
  330. 'name' => 'Comments',
  331. 'description' => 'Let visitors use a WordPress.com, Twitter, Facebook, or Google account to comment',
  332. 'sort' => '20',
  333. 'recommendation_order' => '',
  334. 'introduced' => '1.4',
  335. 'changed' => '',
  336. 'deactivate' => '',
  337. 'free' => '',
  338. 'requires_connection' => 'Yes',
  339. 'requires_user_connection' => '',
  340. 'auto_activate' => 'No',
  341. 'module_tags' => 'Social',
  342. 'feature' => 'Engagement',
  343. 'additional_search_queries' => 'comments, comment, facebook, twitter, google+, social',
  344. 'plan_classes' => '',
  345. ),
  346. 'contact-form' =>
  347. array (
  348. 'name' => 'Contact Form',
  349. 'description' => 'Add a customizable contact form to any post or page using the Jetpack Form Block.',
  350. 'sort' => '15',
  351. 'recommendation_order' => '14',
  352. 'introduced' => '1.3',
  353. 'changed' => '',
  354. 'deactivate' => '',
  355. 'free' => '',
  356. 'requires_connection' => 'No',
  357. 'requires_user_connection' => '',
  358. 'auto_activate' => 'Yes',
  359. 'module_tags' => 'Other',
  360. 'feature' => 'Writing',
  361. 'additional_search_queries' => 'contact, form, grunion, feedback, submission, contact form, email, feedback, contact form plugin, custom form, custom form plugin, form builder, forms, form maker, survey, contact by jetpack, contact us, forms free',
  362. 'plan_classes' => '',
  363. ),
  364. 'copy-post' =>
  365. array (
  366. 'name' => 'Copy Post',
  367. 'description' => 'Enable the option to copy entire posts and pages, including tags and settings',
  368. 'sort' => '15',
  369. 'recommendation_order' => '',
  370. 'introduced' => '7.0',
  371. 'changed' => '',
  372. 'deactivate' => '',
  373. 'free' => '',
  374. 'requires_connection' => 'No',
  375. 'requires_user_connection' => '',
  376. 'auto_activate' => 'No',
  377. 'module_tags' => 'Writing',
  378. 'feature' => 'Writing',
  379. 'additional_search_queries' => 'copy, duplicate',
  380. 'plan_classes' => '',
  381. ),
  382. 'custom-content-types' =>
  383. array (
  384. 'name' => 'Custom content types',
  385. 'description' => 'Display different types of content on your site with custom content types.',
  386. 'sort' => '34',
  387. 'recommendation_order' => '',
  388. 'introduced' => '3.1',
  389. 'changed' => '',
  390. 'deactivate' => '',
  391. 'free' => '',
  392. 'requires_connection' => 'No',
  393. 'requires_user_connection' => '',
  394. 'auto_activate' => 'No',
  395. 'module_tags' => 'Writing',
  396. 'feature' => 'Writing',
  397. 'additional_search_queries' => 'cpt, custom post types, portfolio, portfolios, testimonial, testimonials',
  398. 'plan_classes' => '',
  399. ),
  400. 'custom-css' =>
  401. array (
  402. 'name' => 'Custom CSS',
  403. 'description' => 'Adds options for CSS preprocessor use, disabling the theme\'s CSS, or custom image width.',
  404. 'sort' => '2',
  405. 'recommendation_order' => '',
  406. 'introduced' => '1.7',
  407. 'changed' => '',
  408. 'deactivate' => '',
  409. 'free' => '',
  410. 'requires_connection' => 'No',
  411. 'requires_user_connection' => '',
  412. 'auto_activate' => 'No',
  413. 'module_tags' => 'Appearance',
  414. 'feature' => 'Appearance',
  415. 'additional_search_queries' => 'css, customize, custom, style, editor, less, sass, preprocessor, font, mobile, appearance, theme, stylesheet',
  416. 'plan_classes' => '',
  417. ),
  418. 'enhanced-distribution' =>
  419. array (
  420. 'name' => 'Enhanced Distribution',
  421. 'description' => 'Increase reach and traffic.',
  422. 'sort' => '5',
  423. 'recommendation_order' => '',
  424. 'introduced' => '1.2',
  425. 'changed' => '',
  426. 'deactivate' => '',
  427. 'free' => '',
  428. 'requires_connection' => 'Yes',
  429. 'requires_user_connection' => '',
  430. 'auto_activate' => 'Public',
  431. 'module_tags' => 'Writing',
  432. 'feature' => 'Engagement',
  433. 'additional_search_queries' => 'google, seo, firehose, search, broadcast, broadcasting',
  434. 'plan_classes' => '',
  435. ),
  436. 'google-analytics' =>
  437. array (
  438. 'name' => 'Google Analytics',
  439. 'description' => 'Set up Google Analytics without touching a line of code.',
  440. 'sort' => '37',
  441. 'recommendation_order' => '',
  442. 'introduced' => '4.5',
  443. 'changed' => '',
  444. 'deactivate' => '',
  445. 'free' => '',
  446. 'requires_connection' => 'Yes',
  447. 'requires_user_connection' => '',
  448. 'auto_activate' => 'No',
  449. 'module_tags' => '',
  450. 'feature' => 'Engagement',
  451. 'additional_search_queries' => 'webmaster, google, analytics, console',
  452. 'plan_classes' => 'business, premium, security, complete',
  453. ),
  454. 'gravatar-hovercards' =>
  455. array (
  456. 'name' => 'Gravatar Hovercards',
  457. 'description' => 'Enable pop-up business cards over commenters’ Gravatars.',
  458. 'sort' => '11',
  459. 'recommendation_order' => '13',
  460. 'introduced' => '1.1',
  461. 'changed' => '',
  462. 'deactivate' => '',
  463. 'free' => '',
  464. 'requires_connection' => 'No',
  465. 'requires_user_connection' => '',
  466. 'auto_activate' => 'No',
  467. 'module_tags' => 'Social, Appearance',
  468. 'feature' => 'Appearance',
  469. 'additional_search_queries' => 'gravatar, hovercards',
  470. 'plan_classes' => '',
  471. ),
  472. 'infinite-scroll' =>
  473. array (
  474. 'name' => 'Infinite Scroll',
  475. 'description' => 'Automatically load new content when a visitor scrolls',
  476. 'sort' => '26',
  477. 'recommendation_order' => '',
  478. 'introduced' => '2.0',
  479. 'changed' => '',
  480. 'deactivate' => '',
  481. 'free' => '',
  482. 'requires_connection' => 'No',
  483. 'requires_user_connection' => '',
  484. 'auto_activate' => 'No',
  485. 'module_tags' => 'Appearance',
  486. 'feature' => 'Appearance',
  487. 'additional_search_queries' => 'scroll, infinite, infinite scroll',
  488. 'plan_classes' => '',
  489. ),
  490. 'json-api' =>
  491. array (
  492. 'name' => 'JSON API',
  493. 'description' => 'Allow applications to securely access your content.',
  494. 'sort' => '19',
  495. 'recommendation_order' => '',
  496. 'introduced' => '1.9',
  497. 'changed' => '',
  498. 'deactivate' => '',
  499. 'free' => '',
  500. 'requires_connection' => 'Yes',
  501. 'requires_user_connection' => '',
  502. 'auto_activate' => 'Public',
  503. 'module_tags' => 'Writing, Developers',
  504. 'feature' => 'General',
  505. 'additional_search_queries' => 'api, rest, develop, developers, json, klout, oauth',
  506. 'plan_classes' => '',
  507. ),
  508. 'latex' =>
  509. array (
  510. 'name' => 'Beautiful Math',
  511. 'description' => 'Use the LaTeX markup language to write mathematical equations and formulas',
  512. 'sort' => '12',
  513. 'recommendation_order' => '',
  514. 'introduced' => '1.1',
  515. 'changed' => '',
  516. 'deactivate' => '',
  517. 'free' => '',
  518. 'requires_connection' => 'No',
  519. 'requires_user_connection' => '',
  520. 'auto_activate' => 'No',
  521. 'module_tags' => 'Writing',
  522. 'feature' => 'Writing',
  523. 'additional_search_queries' => 'latex, math, equation, equations, formula, code',
  524. 'plan_classes' => '',
  525. ),
  526. 'lazy-images' =>
  527. array (
  528. 'name' => 'Lazy Images',
  529. 'description' => 'Speed up your site and create a smoother viewing experience by loading images as visitors scroll down the screen, instead of all at once.',
  530. 'sort' => '24',
  531. 'recommendation_order' => '14',
  532. 'introduced' => '5.6.0',
  533. 'changed' => '',
  534. 'deactivate' => '',
  535. 'free' => '',
  536. 'requires_connection' => 'No',
  537. 'requires_user_connection' => '',
  538. 'auto_activate' => 'No',
  539. 'module_tags' => 'Appearance, Recommended',
  540. 'feature' => 'Appearance',
  541. 'additional_search_queries' => 'mobile, theme, fast images, fast image, image, lazy, lazy load, lazyload, images, lazy images, thumbnail, image lazy load, lazy loading, load, loading',
  542. 'plan_classes' => '',
  543. ),
  544. 'likes' =>
  545. array (
  546. 'name' => 'Likes',
  547. 'description' => 'Give visitors an easy way to show they appreciate your content.',
  548. 'sort' => '23',
  549. 'recommendation_order' => '',
  550. 'introduced' => '2.2',
  551. 'changed' => '',
  552. 'deactivate' => '',
  553. 'free' => '',
  554. 'requires_connection' => 'Yes',
  555. 'requires_user_connection' => '',
  556. 'auto_activate' => 'No',
  557. 'module_tags' => 'Social',
  558. 'feature' => 'Engagement',
  559. 'additional_search_queries' => 'like, likes, wordpress.com',
  560. 'plan_classes' => '',
  561. ),
  562. 'markdown' =>
  563. array (
  564. 'name' => 'Markdown',
  565. 'description' => 'Write posts or pages in plain-text Markdown syntax',
  566. 'sort' => '31',
  567. 'recommendation_order' => '',
  568. 'introduced' => '2.8',
  569. 'changed' => '',
  570. 'deactivate' => '',
  571. 'free' => '',
  572. 'requires_connection' => 'No',
  573. 'requires_user_connection' => '',
  574. 'auto_activate' => 'No',
  575. 'module_tags' => 'Writing',
  576. 'feature' => 'Writing',
  577. 'additional_search_queries' => 'md, markdown',
  578. 'plan_classes' => '',
  579. ),
  580. 'masterbar' =>
  581. array (
  582. 'name' => 'WordPress.com Toolbar and Dashboard customizations',
  583. 'description' => 'Replaces the admin bar with a useful toolbar to quickly manage your site via WordPress.com. Also adds additional customizations to the WPAdmin dashboard experience for better compatibility with WP.com.',
  584. 'sort' => '38',
  585. 'recommendation_order' => '16',
  586. 'introduced' => '4.8',
  587. 'changed' => '',
  588. 'deactivate' => '',
  589. 'free' => '',
  590. 'requires_connection' => 'Yes',
  591. 'requires_user_connection' => 'Yes',
  592. 'auto_activate' => 'No',
  593. 'module_tags' => 'General',
  594. 'feature' => '',
  595. 'additional_search_queries' => 'adminbar, masterbar, colorschemes, profile-edit',
  596. 'plan_classes' => '',
  597. ),
  598. 'monitor' =>
  599. array (
  600. 'name' => 'Monitor',
  601. 'description' => 'Jetpack’s downtime monitoring will continuously watch your site and alert you the moment that downtime is detected.',
  602. 'sort' => '28',
  603. 'recommendation_order' => '10',
  604. 'introduced' => '2.6',
  605. 'changed' => '',
  606. 'deactivate' => '',
  607. 'free' => '',
  608. 'requires_connection' => 'Yes',
  609. 'requires_user_connection' => 'Yes',
  610. 'auto_activate' => 'No',
  611. 'module_tags' => 'Recommended',
  612. 'feature' => 'Security',
  613. 'additional_search_queries' => 'monitor, uptime, downtime, monitoring, maintenance, maintenance mode, offline, site is down, site down, down, repair, error',
  614. 'plan_classes' => '',
  615. ),
  616. 'notes' =>
  617. array (
  618. 'name' => 'Notifications',
  619. 'description' => 'Receive instant notifications of site comments and likes.',
  620. 'sort' => '13',
  621. 'recommendation_order' => '',
  622. 'introduced' => '1.9',
  623. 'changed' => '',
  624. 'deactivate' => '',
  625. 'free' => '',
  626. 'requires_connection' => 'Yes',
  627. 'requires_user_connection' => 'Yes',
  628. 'auto_activate' => 'Yes',
  629. 'module_tags' => 'Other',
  630. 'feature' => 'General',
  631. 'additional_search_queries' => 'notification, notifications, toolbar, adminbar, push, comments',
  632. 'plan_classes' => '',
  633. ),
  634. 'photon-cdn' =>
  635. array (
  636. 'name' => 'Asset CDN',
  637. 'description' => 'Jetpack’s Site Accelerator loads your site faster by optimizing your images and serving your images and static files from our global network of servers.',
  638. 'sort' => '26',
  639. 'recommendation_order' => '1',
  640. 'introduced' => '6.6',
  641. 'changed' => '',
  642. 'deactivate' => '',
  643. 'free' => '',
  644. 'requires_connection' => 'No',
  645. 'requires_user_connection' => '',
  646. 'auto_activate' => 'No',
  647. 'module_tags' => 'Photos and Videos, Appearance, Recommended',
  648. 'feature' => 'Recommended, Appearance',
  649. 'additional_search_queries' => 'site accelerator, accelerate, static, assets, javascript, css, files, performance, cdn, bandwidth, content delivery network, pagespeed, combine js, optimize css',
  650. 'plan_classes' => '',
  651. ),
  652. 'photon' =>
  653. array (
  654. 'name' => 'Image CDN',
  655. 'description' => 'Mirrors and serves your images from our free and fast image CDN, improving your site’s performance with no additional load on your servers.',
  656. 'sort' => '25',
  657. 'recommendation_order' => '1',
  658. 'introduced' => '2.0',
  659. 'changed' => '',
  660. 'deactivate' => '',
  661. 'free' => '',
  662. 'requires_connection' => 'Yes',
  663. 'requires_user_connection' => '',
  664. 'auto_activate' => 'No',
  665. 'module_tags' => 'Photos and Videos, Appearance, Recommended',
  666. 'feature' => 'Recommended, Appearance',
  667. 'additional_search_queries' => 'photon, photo cdn, image cdn, speed, compression, resize, responsive images, responsive, content distribution network, optimize, page speed, image optimize, photon jetpack',
  668. 'plan_classes' => '',
  669. ),
  670. 'post-by-email' =>
  671. array (
  672. 'name' => 'Post by email',
  673. 'description' => 'Publish posts by sending an email',
  674. 'sort' => '14',
  675. 'recommendation_order' => '',
  676. 'introduced' => '2.0',
  677. 'changed' => '',
  678. 'deactivate' => '',
  679. 'free' => '',
  680. 'requires_connection' => 'Yes',
  681. 'requires_user_connection' => 'Yes',
  682. 'auto_activate' => 'No',
  683. 'module_tags' => 'Writing',
  684. 'feature' => 'Writing',
  685. 'additional_search_queries' => 'post by email, email',
  686. 'plan_classes' => '',
  687. ),
  688. 'protect' =>
  689. array (
  690. 'name' => 'Protect',
  691. 'description' => 'Enabling brute force protection will prevent bots and hackers from attempting to log in to your website with common username and password combinations.',
  692. 'sort' => '1',
  693. 'recommendation_order' => '4',
  694. 'introduced' => '3.4',
  695. 'changed' => '',
  696. 'deactivate' => '',
  697. 'free' => '',
  698. 'requires_connection' => 'Yes',
  699. 'requires_user_connection' => 'Yes',
  700. 'auto_activate' => 'Yes',
  701. 'module_tags' => 'Recommended',
  702. 'feature' => 'Security',
  703. 'additional_search_queries' => 'security, jetpack protect, secure, protection, botnet, brute force, protect, login, bot, password, passwords, strong passwords, strong password, wp-login.php, protect admin',
  704. 'plan_classes' => '',
  705. ),
  706. 'publicize' =>
  707. array (
  708. 'name' => 'Publicize',
  709. 'description' => 'Publicize makes it easy to share your site’s posts on several social media networks automatically when you publish a new post.',
  710. 'sort' => '10',
  711. 'recommendation_order' => '7',
  712. 'introduced' => '2.0',
  713. 'changed' => '',
  714. 'deactivate' => '',
  715. 'free' => '',
  716. 'requires_connection' => 'Yes',
  717. 'requires_user_connection' => 'Yes',
  718. 'auto_activate' => 'No',
  719. 'module_tags' => 'Social, Recommended',
  720. 'feature' => 'Engagement',
  721. 'additional_search_queries' => 'facebook, jetpack publicize, twitter, tumblr, linkedin, social, tweet, connections, sharing, social media, automated, automated sharing, auto publish, auto tweet and like, auto tweet, facebook auto post, facebook posting',
  722. 'plan_classes' => '',
  723. ),
  724. 'related-posts' =>
  725. array (
  726. 'name' => 'Related posts',
  727. 'description' => 'Keep visitors engaged on your blog by highlighting relevant and new content at the bottom of each published post.',
  728. 'sort' => '29',
  729. 'recommendation_order' => '9',
  730. 'introduced' => '2.9',
  731. 'changed' => '',
  732. 'deactivate' => '',
  733. 'free' => '',
  734. 'requires_connection' => 'Yes',
  735. 'requires_user_connection' => '',
  736. 'auto_activate' => 'No',
  737. 'module_tags' => 'Recommended',
  738. 'feature' => 'Engagement',
  739. 'additional_search_queries' => 'related, jetpack related posts, related posts for wordpress, related posts, popular posts, popular, related content, related post, contextual, context, contextual related posts, related articles, similar posts, easy related posts, related page, simple related posts, free related posts, related thumbnails, similar, engagement, yet another related posts plugin',
  740. 'plan_classes' => '',
  741. ),
  742. 'search' =>
  743. array (
  744. 'name' => 'Search',
  745. 'description' => 'Help visitors quickly find answers with highly relevant instant search results and powerful filtering.',
  746. 'sort' => '34',
  747. 'recommendation_order' => '',
  748. 'introduced' => '5.0',
  749. 'changed' => '',
  750. 'deactivate' => '',
  751. 'free' => 'false',
  752. 'requires_connection' => 'Yes',
  753. 'requires_user_connection' => '',
  754. 'auto_activate' => 'No',
  755. 'module_tags' => '',
  756. 'feature' => 'Search',
  757. 'additional_search_queries' => 'search, elastic, elastic search, elasticsearch, fast search, search results, search performance, google search',
  758. 'plan_classes' => 'business, complete',
  759. ),
  760. 'seo-tools' =>
  761. array (
  762. 'name' => 'SEO Tools',
  763. 'description' => 'Better results on search engines and social media.',
  764. 'sort' => '35',
  765. 'recommendation_order' => '15',
  766. 'introduced' => '4.4',
  767. 'changed' => '',
  768. 'deactivate' => '',
  769. 'free' => '',
  770. 'requires_connection' => 'Yes',
  771. 'requires_user_connection' => 'No',
  772. 'auto_activate' => 'No',
  773. 'module_tags' => 'Social, Appearance',
  774. 'feature' => 'Traffic',
  775. 'additional_search_queries' => 'search engine optimization, social preview, meta description, custom title format',
  776. 'plan_classes' => '',
  777. ),
  778. 'sharedaddy' =>
  779. array (
  780. 'name' => 'Sharing',
  781. 'description' => 'Add Twitter, Facebook and Google+ buttons at the bottom of each post, making it easy for visitors to share your content.',
  782. 'sort' => '7',
  783. 'recommendation_order' => '6',
  784. 'introduced' => '1.1',
  785. 'changed' => '1.2',
  786. 'deactivate' => '',
  787. 'free' => '',
  788. 'requires_connection' => 'No',
  789. 'requires_user_connection' => '',
  790. 'auto_activate' => 'No',
  791. 'module_tags' => 'Social, Recommended',
  792. 'feature' => 'Engagement',
  793. 'additional_search_queries' => 'share, sharing, sharedaddy, social buttons, buttons, share facebook, share twitter, social media sharing, social media share, social share, icons, email, facebook, twitter, linkedin, pinterest, pocket, social widget, social media',
  794. 'plan_classes' => '',
  795. ),
  796. 'shortcodes' =>
  797. array (
  798. 'name' => 'Shortcode Embeds',
  799. 'description' => 'Shortcodes are WordPress-specific markup that let you add media from popular sites. This feature is no longer necessary as the editor now handles media embeds rather gracefully.',
  800. 'sort' => '3',
  801. 'recommendation_order' => '',
  802. 'introduced' => '1.1',
  803. 'changed' => '1.2',
  804. 'deactivate' => '',
  805. 'free' => '',
  806. 'requires_connection' => 'No',
  807. 'requires_user_connection' => '',
  808. 'auto_activate' => 'No',
  809. 'module_tags' => 'Photos and Videos, Social, Writing, Appearance',
  810. 'feature' => 'Writing',
  811. 'additional_search_queries' => 'shortcodes, shortcode, embeds, media, bandcamp, dailymotion, facebook, flickr, google calendars, google maps, google+, polldaddy, recipe, recipes, scribd, slideshare, slideshow, slideshows, soundcloud, ted, twitter, vimeo, vine, youtube',
  812. 'plan_classes' => '',
  813. ),
  814. 'shortlinks' =>
  815. array (
  816. 'name' => 'WP.me Shortlinks',
  817. 'description' => 'Generates shorter links using the wp.me domain.',
  818. 'sort' => '8',
  819. 'recommendation_order' => '',
  820. 'introduced' => '1.1',
  821. 'changed' => '',
  822. 'deactivate' => '',
  823. 'free' => '',
  824. 'requires_connection' => 'Yes',
  825. 'requires_user_connection' => '',
  826. 'auto_activate' => 'No',
  827. 'module_tags' => 'Social',
  828. 'feature' => 'Writing',
  829. 'additional_search_queries' => 'shortlinks, wp.me',
  830. 'plan_classes' => '',
  831. ),
  832. 'sitemaps' =>
  833. array (
  834. 'name' => 'Sitemaps',
  835. 'description' => 'Make it easy for search engines to find your site.',
  836. 'sort' => '13',
  837. 'recommendation_order' => '',
  838. 'introduced' => '3.9',
  839. 'changed' => '',
  840. 'deactivate' => '',
  841. 'free' => '',
  842. 'requires_connection' => 'No',
  843. 'requires_user_connection' => '',
  844. 'auto_activate' => 'No',
  845. 'module_tags' => 'Recommended, Traffic',
  846. 'feature' => 'Recommended',
  847. 'additional_search_queries' => 'sitemap, traffic, search, site map, seo',
  848. 'plan_classes' => '',
  849. ),
  850. 'sso' =>
  851. array (
  852. 'name' => 'Secure Sign On',
  853. 'description' => 'Allow users to log in to this site using WordPress.com accounts',
  854. 'sort' => '30',
  855. 'recommendation_order' => '5',
  856. 'introduced' => '2.6',
  857. 'changed' => '',
  858. 'deactivate' => '',
  859. 'free' => '',
  860. 'requires_connection' => 'Yes',
  861. 'requires_user_connection' => 'Yes',
  862. 'auto_activate' => 'No',
  863. 'module_tags' => 'Developers',
  864. 'feature' => 'Security',
  865. 'additional_search_queries' => 'sso, single sign on, login, log in, 2fa, two-factor',
  866. 'plan_classes' => '',
  867. ),
  868. 'stats' =>
  869. array (
  870. 'name' => 'Site Stats',
  871. 'description' => 'Collect valuable traffic stats and insights.',
  872. 'sort' => '1',
  873. 'recommendation_order' => '2',
  874. 'introduced' => '1.1',
  875. 'changed' => '',
  876. 'deactivate' => '',
  877. 'free' => '',
  878. 'requires_connection' => 'Yes',
  879. 'requires_user_connection' => '',
  880. 'auto_activate' => 'Yes',
  881. 'module_tags' => 'Site Stats, Recommended',
  882. 'feature' => 'Engagement',
  883. 'additional_search_queries' => 'statistics, tracking, analytics, views, traffic, stats',
  884. 'plan_classes' => '',
  885. ),
  886. 'subscriptions' =>
  887. array (
  888. 'name' => 'Subscriptions',
  889. 'description' => 'Let visitors subscribe to new posts and comments via email',
  890. 'sort' => '9',
  891. 'recommendation_order' => '8',
  892. 'introduced' => '1.2',
  893. 'changed' => '',
  894. 'deactivate' => '',
  895. 'free' => '',
  896. 'requires_connection' => 'Yes',
  897. 'requires_user_connection' => 'Yes',
  898. 'auto_activate' => 'No',
  899. 'module_tags' => 'Social',
  900. 'feature' => 'Engagement',
  901. 'additional_search_queries' => 'subscriptions, subscription, email, follow, followers, subscribers, signup',
  902. 'plan_classes' => '',
  903. ),
  904. 'tiled-gallery' =>
  905. array (
  906. 'name' => 'Tiled Galleries',
  907. 'description' => 'Display image galleries in a variety of elegant arrangements.',
  908. 'sort' => '24',
  909. 'recommendation_order' => '',
  910. 'introduced' => '2.1',
  911. 'changed' => '',
  912. 'deactivate' => '',
  913. 'free' => '',
  914. 'requires_connection' => 'No',
  915. 'requires_user_connection' => '',
  916. 'auto_activate' => 'No',
  917. 'module_tags' => 'Photos and Videos',
  918. 'feature' => 'Appearance',
  919. 'additional_search_queries' => 'gallery, tiles, tiled, grid, mosaic, images',
  920. 'plan_classes' => '',
  921. ),
  922. 'vaultpress' =>
  923. array (
  924. 'name' => 'Backups and Scanning',
  925. 'description' => 'Protect your site with daily or real-time backups and automated virus scanning and threat detection.',
  926. 'sort' => '32',
  927. 'recommendation_order' => '',
  928. 'introduced' => '0:1.2',
  929. 'changed' => '',
  930. 'deactivate' => 'false',
  931. 'free' => 'false',
  932. 'requires_connection' => 'Yes',
  933. 'requires_user_connection' => '',
  934. 'auto_activate' => 'No',
  935. 'module_tags' => '',
  936. 'feature' => 'Security, Health',
  937. 'additional_search_queries' => 'backup, cloud backup, database backup, restore, wordpress backup, backup plugin, wordpress backup plugin, back up, backup wordpress, backwpup, vaultpress, backups, off-site backups, offsite backup, offsite, off-site, antivirus, malware scanner, security, virus, viruses, prevent viruses, scan, anti-virus, antimalware, protection, safe browsing, malware, wp security, wordpress security',
  938. 'plan_classes' => 'personal, business, premium, security, complete',
  939. ),
  940. 'verification-tools' =>
  941. array (
  942. 'name' => 'Site verification',
  943. 'description' => 'Establish your site\'s authenticity with external services.',
  944. 'sort' => '33',
  945. 'recommendation_order' => '',
  946. 'introduced' => '3.0',
  947. 'changed' => '',
  948. 'deactivate' => '',
  949. 'free' => '',
  950. 'requires_connection' => 'No',
  951. 'requires_user_connection' => '',
  952. 'auto_activate' => 'Yes',
  953. 'module_tags' => '',
  954. 'feature' => 'Engagement',
  955. 'additional_search_queries' => 'webmaster, seo, google, bing, pinterest, search, console',
  956. 'plan_classes' => '',
  957. ),
  958. 'videopress' =>
  959. array (
  960. 'name' => 'VideoPress',
  961. 'description' => 'Save on hosting storage and bandwidth costs by streaming fast, ad-free video from our global network.',
  962. 'sort' => '27',
  963. 'recommendation_order' => '',
  964. 'introduced' => '2.5',
  965. 'changed' => '',
  966. 'deactivate' => '',
  967. 'free' => '',
  968. 'requires_connection' => 'Yes',
  969. 'requires_user_connection' => '',
  970. 'auto_activate' => '',
  971. 'module_tags' => 'Photos and Videos',
  972. 'feature' => 'Writing',
  973. 'additional_search_queries' => 'video, videos, videopress, video gallery, video player, videoplayer, mobile video, vimeo, youtube, html5 video, stream',
  974. 'plan_classes' => '',
  975. ),
  976. 'widget-visibility' =>
  977. array (
  978. 'name' => 'Widget Visibility',
  979. 'description' => 'Control where widgets appear on your site.',
  980. 'sort' => '17',
  981. 'recommendation_order' => '',
  982. 'introduced' => '2.4',
  983. 'changed' => '',
  984. 'deactivate' => '',
  985. 'free' => '',
  986. 'requires_connection' => 'No',
  987. 'requires_user_connection' => '',
  988. 'auto_activate' => 'No',
  989. 'module_tags' => 'Appearance',
  990. 'feature' => 'Appearance',
  991. 'additional_search_queries' => 'widget visibility, logic, conditional, widgets, widget',
  992. 'plan_classes' => '',
  993. ),
  994. 'widgets' =>
  995. array (
  996. 'name' => 'Extra Sidebar Widgets',
  997. 'description' => 'Provides additional widgets for use on your site.',
  998. 'sort' => '4',
  999. 'recommendation_order' => '',
  1000. 'introduced' => '1.2',
  1001. 'changed' => '',
  1002. 'deactivate' => '',
  1003. 'free' => '',
  1004. 'requires_connection' => 'No',
  1005. 'requires_user_connection' => '',
  1006. 'auto_activate' => 'No',
  1007. 'module_tags' => 'Social, Appearance',
  1008. 'feature' => 'Appearance',
  1009. 'additional_search_queries' => 'widget, widgets, facebook, gallery, twitter, gravatar, image, rss',
  1010. 'plan_classes' => '',
  1011. ),
  1012. 'woocommerce-analytics' =>
  1013. array (
  1014. 'name' => 'WooCommerce Analytics',
  1015. 'description' => 'Enhanced analytics for WooCommerce and Jetpack users.',
  1016. 'sort' => '13',
  1017. 'recommendation_order' => '',
  1018. 'introduced' => '8.4',
  1019. 'changed' => '',
  1020. 'deactivate' => '',
  1021. 'free' => '',
  1022. 'requires_connection' => 'Yes',
  1023. 'requires_user_connection' => '',
  1024. 'auto_activate' => 'Yes',
  1025. 'module_tags' => 'Other, Recommended',
  1026. 'feature' => 'Engagement',
  1027. 'additional_search_queries' => 'woocommerce, analytics, stats, statistics, tracking, analytics, views',
  1028. 'plan_classes' => '',
  1029. ),
  1030. 'wordads' =>
  1031. array (
  1032. 'name' => 'Ads',
  1033. 'description' => 'Earn income by allowing Jetpack to display high quality ads.',
  1034. 'sort' => '1',
  1035. 'recommendation_order' => '',
  1036. 'introduced' => '4.5.0',
  1037. 'changed' => '',
  1038. 'deactivate' => '',
  1039. 'free' => '',
  1040. 'requires_connection' => 'Yes',
  1041. 'requires_user_connection' => '',
  1042. 'auto_activate' => 'No',
  1043. 'module_tags' => 'Traffic, Appearance',
  1044. 'feature' => '',
  1045. 'additional_search_queries' => 'advertising, ad codes, ads',
  1046. 'plan_classes' => 'premium, business, security, complete',
  1047. ),
  1048. );
  1049. return isset( $module_info[ $key ] ) ? $module_info[ $key ] : null;
  1050. }
  1051. /**
  1052. * Return an array containing all module header names.
  1053. *
  1054. * @return array
  1055. */
  1056. function jetpack_get_all_module_header_names() {
  1057. return array (
  1058. 'name' => 'Module Name',
  1059. 'description' => 'Module Description',
  1060. 'sort' => 'Sort Order',
  1061. 'recommendation_order' => 'Recommendation Order',
  1062. 'introduced' => 'First Introduced',
  1063. 'changed' => 'Major Changes In',
  1064. 'deactivate' => 'Deactivate',
  1065. 'free' => 'Free',
  1066. 'requires_connection' => 'Requires Connection',
  1067. 'requires_user_connection' => 'Requires User Connection',
  1068. 'auto_activate' => 'Auto Activate',
  1069. 'module_tags' => 'Module Tags',
  1070. 'feature' => 'Feature',
  1071. 'additional_search_queries' => 'Additional Search Queries',
  1072. 'plan_classes' => 'Plans',
  1073. );
  1074. }
  1075. /**
  1076. * Returns whether the file associated with the given slug has no module info.
  1077. *
  1078. * @param string $slug The slug name.
  1079. *
  1080. * @return bool Whether the file has no module info.
  1081. */
  1082. function jetpack_has_no_module_info( $slug ) {
  1083. $no_info_slugs = array (
  1084. 0 => 'geo-location',
  1085. 1 => 'minileven',
  1086. 2 => 'module-extras',
  1087. 3 => 'module-info',
  1088. 4 => 'plugin-search',
  1089. 5 => 'theme-tools',
  1090. );
  1091. return in_array( $slug, $no_info_slugs, true );
  1092. }