Orbit Fox by ThemeIsle - Version 2.1.0

Version Description

  • 2017-11-08
Download this release

Release Info

Developer themeisle
Plugin Icon 128x128 Orbit Fox by ThemeIsle
Version 2.1.0
Comparing to
See all releases

Code changes from version 2.2.6 to 2.1.0

Files changed (78) hide show
  1. CHANGELOG.md +1 -43
  2. README.md +68 -0
  3. core/app/abstract/class-orbit-fox-module-abstract.php +4 -14
  4. core/app/class-orbit-fox-admin.php +5 -8
  5. core/app/class-orbit-fox-global-settings.php +3 -5
  6. core/app/models/class-orbit-fox-model.php +4 -5
  7. core/assets/css/orbit-fox-admin.css +1 -50
  8. core/assets/js/orbit-fox-admin.js +114 -144
  9. core/includes/class-orbit-fox.php +1 -1
  10. languages/themeisle-companion.pot +29 -88
  11. obfx_modules/beaver-widgets/custom-fields/number-field/number.js +0 -9
  12. obfx_modules/beaver-widgets/custom-fields/number-field/number_field.php +0 -30
  13. obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle.css +0 -84
  14. obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle.js +0 -9
  15. obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle_field.php +0 -44
  16. obfx_modules/beaver-widgets/inc/common-functions.php +0 -117
  17. obfx_modules/beaver-widgets/init.php +0 -107
  18. obfx_modules/beaver-widgets/modules/post-grid/css/frontend.css +0 -64
  19. obfx_modules/beaver-widgets/modules/post-grid/includes/frontend.css.php +0 -173
  20. obfx_modules/beaver-widgets/modules/post-grid/includes/frontend.php +0 -283
  21. obfx_modules/beaver-widgets/modules/post-grid/includes/loop-settings.php +0 -287
  22. obfx_modules/beaver-widgets/modules/post-grid/post-grid.php +0 -348
  23. obfx_modules/beaver-widgets/modules/pricing-table/css/frontend.css +0 -66
  24. obfx_modules/beaver-widgets/modules/pricing-table/includes/frontend.css.php +0 -271
  25. obfx_modules/beaver-widgets/modules/pricing-table/includes/frontend.php +0 -61
  26. obfx_modules/beaver-widgets/modules/pricing-table/pricing-table.php +0 -587
  27. obfx_modules/beaver-widgets/modules/services/css/frontend.css +0 -40
  28. obfx_modules/beaver-widgets/modules/services/includes/frontend.css.php +0 -124
  29. obfx_modules/beaver-widgets/modules/services/includes/frontend.php +0 -48
  30. obfx_modules/beaver-widgets/modules/services/services.php +0 -255
  31. obfx_modules/companion-legacy/inc/hestia/common-functions.php +0 -203
  32. obfx_modules/companion-legacy/inc/hestia/inc/features/feature-clients-bar-section.php +0 -1
  33. obfx_modules/companion-legacy/inc/hestia/inc/img/clients1.png +0 -0
  34. obfx_modules/companion-legacy/inc/hestia/inc/img/clients2.png +0 -0
  35. obfx_modules/companion-legacy/inc/hestia/inc/img/clients3.png +0 -0
  36. obfx_modules/companion-legacy/inc/hestia/inc/img/clients4.png +0 -0
  37. obfx_modules/companion-legacy/inc/hestia/inc/img/clients5.png +0 -0
  38. obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-clients-bar-section.php +10 -3
  39. obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-features-section.php +8 -1
  40. obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-ribbon-section.php +2 -2
  41. obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-team-section.php +16 -12
  42. obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-testimonials-section.php +6 -0
  43. obfx_modules/companion-legacy/init.php +7 -56
  44. obfx_modules/elementor-widgets/css/public.css +0 -293
  45. obfx_modules/elementor-widgets/init.php +0 -160
  46. obfx_modules/elementor-widgets/js/obfx-grid.js +0 -62
  47. obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-posts-grid.php +0 -1761
  48. obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-pricing-table.php +0 -1059
  49. obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-services.php +0 -655
  50. obfx_modules/menu-icons/init.php +0 -5
  51. obfx_modules/menu-icons/js/admin.js +74 -97
  52. obfx_modules/mystock-import/css/media.css +8 -14
  53. obfx_modules/mystock-import/inc/photos.php +25 -24
  54. obfx_modules/mystock-import/init.php +65 -21
  55. obfx_modules/mystock-import/js/admin.js +187 -237
  56. obfx_modules/mystock-import/vendor/phpflickr/{phpflickr.php → phpFlickr.php} +0 -0
  57. obfx_modules/social-sharing/js/admin.js +12 -18
  58. obfx_modules/social-sharing/js/public.js +8 -12
  59. obfx_modules/social-sharing/views/hestia-social-sharing-tpl.php +6 -1
  60. obfx_modules/social-sharing/views/social-sharing-tpl.php +2 -1
  61. obfx_modules/stats/css/stats.css +8 -0
  62. obfx_modules/stats/init.php +314 -0
  63. obfx_modules/stats/js/stats.js +63 -0
  64. obfx_modules/stats/js/vendor/chart.min.js +14 -0
  65. obfx_modules/stats/views/dashboard-widget-tpl.php +37 -0
  66. obfx_modules/template-directory/css/admin.css +0 -323
  67. obfx_modules/template-directory/init.php +0 -450
  68. obfx_modules/template-directory/js/script.js +0 -221
  69. obfx_modules/template-directory/views/template-directory-page-tpl.php +0 -128
  70. obfx_modules/template-directory/views/template-directory-render-template-tpl.php +0 -13
  71. readme.md +51 -235
  72. readme.txt +1 -86
  73. themeisle-companion.php +1 -1
  74. vendor/autoload.php +1 -1
  75. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php +1 -1
  76. vendor/codeinwp/themeisle-sdk/load.php +1 -1
  77. vendor/composer/autoload_real.php +5 -5
  78. vendor/composer/installed.json +4 -4
CHANGELOG.md CHANGED
@@ -1,47 +1,5 @@
1
 
2
- ### v2.2.6 - 2017-12-19
3
- **Changes:**
4
- * Added new Beaver Builder Widgets Module - Pricing table widget, Services widget, Posts Grid widget.
5
- * Better user experience for the template directory.
6
- * More native design for the template directory.
7
- * Added three free new templates to the template directory - Path, Mocha and Ascend.
8
- * Fixed bug with the Elementor Pricing Table widget button link.
9
- * Fixed php notice given by the Elementor Posts Grid widget.
10
- * Removed the useless Stats module.
11
-
12
- ### v2.2.5 - 2017-12-11
13
- **Changes:**
14
- * Better UX for CC0 images import module.
15
- * Improved Elementor Services Widget.
16
- * Added new templates to the template directory.
17
-
18
- ### v2.2.4 - 2017-12-04
19
- **Changes:**
20
- * Fixed issue with menu icons module loading.
21
-
22
- ### v2.2.3 - 2017-11-27
23
- **Changes:**
24
- * [Hestia] Fixed issue with Team member section not opening external links in a new tab
25
- * [Hestia] Fixed alignment issues with the front page sections
26
-
27
- ### v2.2.2 - 2017-11-24
28
- **Changes:**
29
- * Renamed flickr api util file.
30
- * Fixed issue with template directory preview plugin install modal.
31
-
32
- ### v2.2.1 - 2017-11-24
33
- **Changes:**
34
- * Fixed module loading for Elementor widgets module.
35
-
36
- ### v2.2.0 - 2017-11-23
37
- **Changes:**
38
- * - Added new Elementor Widgets module;
39
- * - Added new Template Directory module;
40
- * - Bug fixes for the Photos Import Module;
41
- * - Bug fixes for the Social Sharing module backend interface;
42
- * - Moved Orbit Fox Companion out of Tools Menu;
43
-
44
- ### v2.1.1 - 2017-11-16
45
  **Changes:**
46
  * Adds compatibility with WordPress 4.9.
47
 
1
 
2
+ ### v2.1.0 - 2017-11-16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  **Changes:**
4
  * Adds compatibility with WordPress 4.9.
5
 
README.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Orbit Fox
2
+ [![Build Status](https://travis-ci.org/Codeinwp/orbit-fox.svg?branch=master)](https://travis-ci.org/Codeinwp/orbit-fox)
3
+ [![Code Climate](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/gpa.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox)
4
+ [![Issue Count](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/issue_count.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox)
5
+ [![Test Coverage](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/coverage.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox/coverage)
6
+
7
+ - **Author URI:** http://themeisle.com
8
+ - **Requires at least:** 3.5
9
+ - **Tested up to:** 4.8
10
+ - **Stable tag:** trunk
11
+ - **License:** GPLv2 or later
12
+ - **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
13
+
14
+ ## Description
15
+ > Orbit Fox is a plugin for WordPress that provides an abstraction layer on top of which you can
16
+ write modules to extend its functionality. The plugin provides some predefined workflows and
17
+ methods that work automagically. This means that you can focus more on the logic of your module
18
+ and less on the loading and display of data or files.
19
+
20
+ ### Goals
21
+ 1. **Provide a framework like environment for writing modules:**
22
+
23
+ Have a predefined set of rules and workflows that work out of the box. This should simplify
24
+ the way a developer interacts with data, views or files.
25
+
26
+ 2. **Accessibility:**
27
+
28
+ Modules should be easy to write and deploy, also allow for loading of modules from third party
29
+ developers.
30
+
31
+ ### Specifications
32
+ Have a plugin that can be extended with modules bundled or built by third party developers inside
33
+ their own plugins. The modules must have an abstract class that defines the implemented methods
34
+ required and utility methods that simplify the module development.
35
+
36
+ ## Installation
37
+ 1. Put the `orbit-fox` folder inside WordPress plugins folder.
38
+ 2. Activate via the Plugins WordPress Dashboard.
39
+
40
+ ## Features
41
+ - Easy extensability via modules
42
+ - Support for third party modules
43
+ - Reusable and Utility Classes for faster development
44
+
45
+ ## Development
46
+ [Module development guidelines](docs/MODULE.md)
47
+
48
+ ## Docs
49
+
50
+ [Read the Project Documentation](https://docs.google.com/a/vertistudio.com/document/d/1fFepVs4if5rEmMqA8TiHUFp2WPnkUCW6JZohnsSNtKE/edit?usp=sharing)
51
+
52
+ ## Frequently Asked Questions
53
+
54
+ // TODO
55
+
56
+ ## Change Log
57
+
58
+ **v.1.0.0a**
59
+ - Basic structure and module loading workflow.
60
+ - Support for 3rd party modules
61
+ - Render Helper
62
+ - Model Helper
63
+ - Automagic classes
64
+
65
+ ### Contributors
66
+ **Bogdan Preda** -- bogdan.themeisle.com
67
+
68
+ **Marius Cristea** -- marius.cristea@vertistudio.com
core/app/abstract/class-orbit-fox-module-abstract.php CHANGED
@@ -45,15 +45,6 @@ abstract class Orbit_Fox_Module_Abstract {
45
  */
46
  public $description;
47
 
48
- /**
49
- * Holds the default setting activation state of the module.
50
- *
51
- * @since 2.1.0
52
- * @access protected
53
- * @var boolean $active_default The default active state of the module.
54
- */
55
- protected $active_default = false;
56
-
57
  /**
58
  * Stores an array of notices
59
  *
@@ -287,7 +278,7 @@ abstract class Orbit_Fox_Module_Abstract {
287
  if ( $this->auto == true ) {
288
  return true;
289
  }
290
- return $this->model->get_is_module_active( $this->slug, $this->active_default );
291
  }
292
 
293
  /**
@@ -458,7 +449,6 @@ abstract class Orbit_Fox_Module_Abstract {
458
  $sanitized = str_replace( ' ', '-', strtolower( $this->name ) );
459
 
460
  $module_dir = $this->slug;
461
-
462
  if ( ! empty( $enqueue ) ) {
463
  if ( isset( $enqueue['js'] ) && ! empty( $enqueue['js'] ) ) {
464
  $order = 0;
@@ -500,9 +490,9 @@ abstract class Orbit_Fox_Module_Abstract {
500
  );
501
  }
502
  $order++;
503
- }// End foreach().
504
- }// End if().
505
- }// End if().
506
  }
507
 
508
  /**
45
  */
46
  public $description;
47
 
 
 
 
 
 
 
 
 
 
48
  /**
49
  * Stores an array of notices
50
  *
278
  if ( $this->auto == true ) {
279
  return true;
280
  }
281
+ return $this->model->get_is_module_active( $this->slug );
282
  }
283
 
284
  /**
449
  $sanitized = str_replace( ' ', '-', strtolower( $this->name ) );
450
 
451
  $module_dir = $this->slug;
 
452
  if ( ! empty( $enqueue ) ) {
453
  if ( isset( $enqueue['js'] ) && ! empty( $enqueue['js'] ) ) {
454
  $order = 0;
490
  );
491
  }
492
  $order++;
493
+ }
494
+ }
495
+ }
496
  }
497
 
498
  /**
core/app/class-orbit-fox-admin.php CHANGED
@@ -76,7 +76,7 @@ class Orbit_Fox_Admin {
76
  if ( empty( $screen ) ) {
77
  return;
78
  }
79
- if ( in_array( $screen->id, array( 'toplevel_page_obfx_companion' ) ) ) {
80
  wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . '../assets/css/orbit-fox-admin.css', array(), $this->version, 'all' );
81
  }
82
  do_action( 'obfx_admin_enqueue_styles' );
@@ -105,7 +105,7 @@ class Orbit_Fox_Admin {
105
  if ( empty( $screen ) ) {
106
  return;
107
  }
108
- if ( in_array( $screen->id, array( 'toplevel_page_obfx_companion' ) ) ) {
109
  wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . '../assets/js/orbit-fox-admin.js', array( 'jquery' ), $this->version, false );
110
  }
111
  do_action( 'obfx_admin_enqueue_scripts' );
@@ -118,16 +118,13 @@ class Orbit_Fox_Admin {
118
  * @access public
119
  */
120
  public function menu_pages() {
121
- add_menu_page(
122
- __( 'Orbit Fox', 'themeisle-companion' ), __( 'Orbit Fox', 'themeisle-companion' ), 'manage_options', 'obfx_companion',
123
  array(
124
  $this,
125
  'page_modules_render',
126
- ),
127
- 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MzQuNjIiIGhlaWdodD0iMzkxLjMzIiB2aWV3Qm94PSIwIDAgNDM0LjYyIDM5MS4zMyI+PGRlZnM+PHN0eWxlPi5he2ZpbGw6I2ZmZjt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPmxvZ28tb3JiaXQtZm94LTI8L3RpdGxlPjxwYXRoIGNsYXNzPSJhIiBkPSJNNzA4LjE1LDM5NS4yM2gwYy0xLjQ5LTEzLjc2LTcuNjEtMjkuMjEtMTUuOTQtNDQuNzZsLTE0LjQ2LDguMzVhNzYsNzYsMCwxLDEtMTQ1LDQyLjd2MUg0OTEuMWE3Niw3NiwwLDEsMS0xNDQuODYtNDMuNjVsLTE0LjQyLTguMzNjLTguMTcsMTUuMjgtMTQuMjIsMzAuNDctMTUuODMsNDQtLjA2LjM3LS4xMS43NS0uMTQsMS4xMnMtLjA2LjQ2LS4wOC42OGguMDVBMTUuNTcsMTUuNTcsMCwwLDAsMzIwLjM1LDQwOEw1MDEsNTU1LjExYTE1LjU0LDE1LjU0LDAsMCwwLDExLDQuNTVoMGExNS41NCwxNS41NCwwLDAsMCwxMS00LjU1TDcwMy42OSw0MDhBMTUuNjMsMTUuNjMsMCwwLDAsNzA4LjE1LDM5NS4yM1pNNDc5LjU5LDQ0MC41MWwyMi4wNSw1LjkxLTIuMDcsNy43My0yMi4wNS01LjkxWm0zLDE4Ljc1LDIyLjA1LDUuOTEtMi4wNyw3LjczTDQ4MC41Miw0NjdabTEsMTguNzUsMjIuMDUsNS45MS0yLjA3LDcuNzMtMjIuMDUtNS45MVptMzEsNjMuMzhhMTIuMzgsMTIuMzgsMCwwLDAtMSwuOTEsMi4yMSwyLjIxLDAsMCwxLTEuNTguNjNoMGEyLjIxLDIuMjEsMCwwLDEtMS41OC0uNjMsMTIuMzgsMTIuMzgsMCwwLDAtMS0uOTFMNDg2Ljg5LDUyM2M4LjItLjUzLDE2LjYzLS44MSwyNS4xMS0uODFzMTYuOTMuMjgsMjUuMTUuODFabTUuODktNDkuNzQtMi4wNy03LjczTDU0MC40OSw0NzhsMi4wNyw3LjczWm0xLTE4Ljc1LTIuMDctNy43MywyMi4wNi01LjkxLDIuMDcsNy43M1ptMy0xOC43NS0yLjA3LTcuNzMsMjIuMDYtNS45MSwyLjA3LDcuNzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjk0LjY5IC0xNjguMzQpIi8+PHBhdGggY2xhc3M9ImEiIGQ9Ik03MjkuMjYsMjA5YTEyMC4xOCwxMjAuMTgsMCwwLDAtMS4xOC0xNC43OGMtLjEzLS44OC0uMjctMS43Mi0uNDItMi41Ni0uMjItMS4yLS40Ni0yLjM1LS43Mi0zLjQ3LS4xOC0uNzktLjM4LTEuNTctLjU4LTIuMzItLjM2LTEuMjgtLjc0LTIuNDgtMS4xNi0zLjYyLS4zNi0uOTUtLjc0LTEuODUtMS4xNS0yLjctLjItLjQzLS40MS0uODQtLjYzLTEuMjRzLS40My0uNzktLjY1LTEuMTVhMTkuNzYsMTkuNzYsMCwwLDAtMS4xNS0xLjY4LDE0LjE5LDE0LjE5LDAsMCwwLTEuMTUtMS4zNiwxMS44NywxMS44NywwLDAsMC0xLS45MWMtLjExLS4xLS4yNS0uMTgtLjM3LS4yN2ExNS4yMSwxNS4yMSwwLDAsMC0yLjU0LTEuNTlsLTEuMDYtLjQ5YTI1LjU3LDI1LjU3LDAsMCwwLTMuODUtMS4yNWMtLjc0LS4xOC0xLjUyLS4zNS0yLjMzLS40OS0xLjExLS4xOS0yLjI4LS4zNS0zLjUtLjQ3cy0yLjY5LS4yMS00LjExLS4yNWMtMi4xNC0uMDctNC4zOSwwLTYuNzMuMDktMS41Ny4wOC0zLjE4LjItNC44Mi4zNmwtMi44MS4zYTE3MSwxNzEsMCwwLDAtMTgsMy4xN2wtMy4xMi43NHEtNC44NywxLjItOS43OSwyLjY0Yy0zLjI3LDEtNi41NCwyLTkuNzcsMy4xMXEtNS4yNCwxLjc4LTEwLjMsNGMtLjg1LjM3LTEuNjkuNzUtMi41MywxLjE0cS0zLjc4LDEuNzYtNy40OCwzLjc4YTE0Mi4zNywxNDIuMzcsMCwwLDAtMTIuOCw3Ljg4Yy0xLjQsMS0yLjgxLDItNC4yLDNhMjAxLjUzLDIwMS41MywwLDAsMC0yMy43LDIwLjc3Yy0yMC4zNy0xNC00Mi4zLTIwLTczLjctMjAuNDZ2MS43N2gwdi0xLjc3Yy0zMS40MS41LTUzLjM1LDYuNDQtNzMuNzIsMjAuNDctMTkuODQtMjAuMS0zOS4yNi0zMy4xNi02MS00MC42LTI5LjU2LTEwLjExLTYyLTE0LjU5LTcyLjc2LTUuNnMtMTEuOTUsNDEuNzYtNy4xMyw3Mi42M2M0LjU1LDI5LjEsMTguODMsNTYsNDQuNzgsODdsMCwuMDYsMTQuNDgsOC4zNkE3Niw3NiwwLDAsMSw0OTIuMjIsMzgyaDM5LjU2QTc2LDc2LDAsMCwxLDY2Ny40LDM0MS4xOWwxNC41Mi04LjM5LDAtLjA3cTMuNTctNC4yNiw2Ljg0LTguNDNjMS41LTEuODksMi45NC0zLjc3LDQuMzQtNS42NHMyLjc2LTMuNzMsNC4wNy01LjU3Yy42Ni0uOTIsMS4zLTEuODQsMS45NC0yLjc2cTEuOS0yLjc2LDMuNjctNS40OCwyLjY3LTQuMSw1LTguMTN0NC40NS04LjA1Yy45Mi0xLjc4LDEuODEtMy41NiwyLjY1LTUuMzRxMS44OS00LDMuNTEtOGMuNzItMS43OCwxLjM5LTMuNTUsMi01LjMzLjMyLS44OC42My0xLjc3LjkzLTIuNjYuNi0xLjc4LDEuMTUtMy41NiwxLjY3LTUuMzRhMTMxLjU0LDEzMS41NCwwLDAsMCwzLjYxLTE2LjIxLDIyMS4yNCwyMjEuMjQsMCwwLDAsMi42OC0zMS40NkM3MjkuMzIsMjEyLjUyLDcyOS4zMSwyMTAuNzMsNzI5LjI2LDIwOVpNMzg5LjMxLDI2OC43OWMtOS4yOSwxMS41OC0yMi4zNywyNy43Ni0zNC45NCw0NS42Ni0xMS42NC0xNi45Mi0yNC43Ni0zOC42MS0yNy40OS01Ny42NS0zLjEzLTIxLjg2LTEuOTQtMzcuNTktLjA3LTQzLjQ4YTMyLjY1LDMyLjY1LDAsMCwxLDQuMjktLjI1YzkuODYsMCwyNC4yOCwyLjkyLDM4LjU5LDcuODEsMTMuNTMsNC42MywyNi4xNSwxMi41NiwzOS4yNiwyNC44NUM0MDIuNjgsMjUyLjU0LDM5Ni4yMSwyNjAuMTksMzg5LjMxLDI2OC43OVptMzA3LjgxLTEyYy0yLjczLDE5LTE1LjgzLDQwLjctMjcuNDYsNTcuNjEtMTIuNTctMTcuODgtMjUuNjQtMzQuMDUtMzQuOTMtNDUuNjItNi45MS04LjYxLTEzLjM4LTE2LjI2LTE5LjY2LTIzLjA4LDEzLjExLTEyLjI4LDI1LjcyLTIwLjIsMzkuMjQtMjQuODMsMTQuMzEtNC44OSwyOC43My03LjgxLDM4LjU5LTcuODFhMzIuNjUsMzIuNjUsMCwwLDEsNC4yOS4yNUM2OTkuMDYsMjE5LjIxLDcwMC4yNSwyMzQuOTQsNjk3LjEyLDI1Ni44WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5NC42OSAtMTY4LjM0KSIvPjxwYXRoIGNsYXNzPSJhIiBkPSJNNDE2LjQ0LDMzMS41N0E1Ni41MSw1Ni41MSwwLDEsMCw0NzMsMzg4LjA4LDU2LjU3LDU2LjU3LDAsMCwwLDQxNi40NCwzMzEuNTdabTMxLjYyLDg2LjM2YTIzLjQ0LDIzLjQ0LDAsMSwxLDUtNy4zOCw5LjI1LDkuMjUsMCwwLDEtMS43OSwzLjM5QTIyLjcxLDIyLjcxLDAsMCwxLDQ0OC4wNiw0MTcuOTNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjk0LjY5IC0xNjguMzQpIi8+PHBhdGggY2xhc3M9ImEiIGQ9Ik02MDcuNTYsMzMxLjU3YTU2LjUxLDU2LjUxLDAsMSwwLDU2LjUxLDU2LjUxQTU2LjU3LDU2LjU3LDAsMCwwLDYwNy41NiwzMzEuNTdabTEuNTMsODYuMzZhMjMuNDIsMjMuNDIsMCwwLDEtMzMuMTMsMCwyMy4xOCwyMy4xOCwwLDAsMS0zLjE5LTQsOS4wOCw5LjA4LDAsMCwxLTEuNzgtMy4zOSwyMy40MiwyMy40MiwwLDEsMSwzOC4xLDcuMzhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjk0LjY5IC0xNjguMzQpIi8+PC9zdmc+',
128
- '75'
129
  );
130
- add_submenu_page( 'obfx_companion', __( 'Orbit Fox General Options', 'themeisle-companion' ), __( 'General Settings', 'themeisle-companion' ), 'manage_options', 'obfx_companion' );
131
  }
132
 
133
  /**
76
  if ( empty( $screen ) ) {
77
  return;
78
  }
79
+ if ( in_array( $screen->id, array( 'tools_page_obfx_companion' ) ) ) {
80
  wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . '../assets/css/orbit-fox-admin.css', array(), $this->version, 'all' );
81
  }
82
  do_action( 'obfx_admin_enqueue_styles' );
105
  if ( empty( $screen ) ) {
106
  return;
107
  }
108
+ if ( in_array( $screen->id, array( 'tools_page_obfx_companion' ) ) ) {
109
  wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . '../assets/js/orbit-fox-admin.js', array( 'jquery' ), $this->version, false );
110
  }
111
  do_action( 'obfx_admin_enqueue_scripts' );
118
  * @access public
119
  */
120
  public function menu_pages() {
121
+ add_management_page(
122
+ __( 'Orbit Fox', 'themeisle-companion' ), __( 'Orbit Fox Companion', 'themeisle-companion' ), 'manage_options', 'obfx_companion',
123
  array(
124
  $this,
125
  'page_modules_render',
126
+ )
 
 
127
  );
 
128
  }
129
 
130
  /**
core/app/class-orbit-fox-global-settings.php CHANGED
@@ -25,7 +25,7 @@ class Orbit_Fox_Global_Settings {
25
  *
26
  * @since 1.0.0
27
  * @access public
28
- * @var Orbit_Fox_Global_Settings $instance The instance of this class.
29
  */
30
  public static $instance;
31
 
@@ -61,13 +61,11 @@ class Orbit_Fox_Global_Settings {
61
  self::$instance->modules = apply_filters(
62
  'obfx_modules',
63
  array(
 
64
  'social-sharing',
65
  'companion-legacy',
66
- 'elementor-widgets',
67
- 'template-directory',
68
  'menu-icons',
69
  'mystock-import',
70
- 'beaver-widgets',
71
  )
72
  );
73
  }// End if().
@@ -104,7 +102,7 @@ class Orbit_Fox_Global_Settings {
104
  * @since 1.0.0
105
  * @access public
106
  */
107
- public static function destroy_instance() {
108
  static::$instance = null;
109
  }
110
  }
25
  *
26
  * @since 1.0.0
27
  * @access public
28
+ * @var Orbit_Fox_Global_Settings $instance The istance of this class.
29
  */
30
  public static $instance;
31
 
61
  self::$instance->modules = apply_filters(
62
  'obfx_modules',
63
  array(
64
+ 'stats',
65
  'social-sharing',
66
  'companion-legacy',
 
 
67
  'menu-icons',
68
  'mystock-import',
 
69
  )
70
  );
71
  }// End if().
102
  * @since 1.0.0
103
  * @access public
104
  */
105
+ public static function distroy_instance() {
106
  static::$instance = null;
107
  }
108
  }
core/app/models/class-orbit-fox-model.php CHANGED
@@ -120,16 +120,15 @@ class Orbit_Fox_Model {
120
  *
121
  * @since 1.0.0
122
  * @access public
123
- * @param string $slug The module slug.
124
- * @param boolean $default The default active state.
125
  * @return bool
126
  */
127
- public function get_is_module_active( $slug, $default ) {
128
  $data = $this->get();
129
  if ( isset( $data['module_status'][ $slug ]['active'] ) ) {
130
  return $data['module_status'][ $slug ]['active'];
131
  }
132
- return $default; // @codeCoverageIgnore
133
  }
134
 
135
  /**
@@ -244,7 +243,7 @@ class Orbit_Fox_Model {
244
  * @access public
245
  * @return mixed
246
  */
247
- public function destroy_model() {
248
  return delete_option( $this->namespace );
249
  }
250
  }
120
  *
121
  * @since 1.0.0
122
  * @access public
123
+ * @param string $slug The module slug.
 
124
  * @return bool
125
  */
126
+ public function get_is_module_active( $slug ) {
127
  $data = $this->get();
128
  if ( isset( $data['module_status'][ $slug ]['active'] ) ) {
129
  return $data['module_status'][ $slug ]['active'];
130
  }
131
+ return false; // @codeCoverageIgnore
132
  }
133
 
134
  /**
243
  * @access public
244
  * @return mixed
245
  */
246
+ public function distroy_model() {
247
  return delete_option( $this->namespace );
248
  }
249
  }
core/assets/css/orbit-fox-admin.css CHANGED
@@ -8,7 +8,7 @@
8
  * Extends Spectre.css Library
9
  */
10
  /*
11
- Version: 2.2.6
12
  */
13
 
14
  /* Document
@@ -3593,52 +3593,3 @@ html {
3593
  -webkit-transition: height 1s;
3594
  transition: height 1s;
3595
  }
3596
-
3597
- /** TEMPORARY FIX FOR SOCIAL SHARING STYLE **/
3598
-
3599
- #obfx-mod-social-sharing .form-group.inline-setting {
3600
- display: inline-block;
3601
- }
3602
-
3603
- #obfx-mod-social-sharing .form-group.inline-setting.network-toggle {
3604
- min-width: 300px;
3605
- }
3606
-
3607
- #obfx-mod-social-sharing .form-group.inline-setting.last .form-label {
3608
- display: none;
3609
- }
3610
-
3611
- #obfx-mod-social-sharing .show {
3612
- opacity: 1;
3613
- -webkit-transition: all 0.3s ease;
3614
- transition: all 0.3s ease;
3615
- }
3616
-
3617
- #obfx-mod-social-sharing .show.obfxHiddenOption {
3618
- opacity: 0;
3619
- cursor: default;
3620
- }
3621
-
3622
- .obfx-row {
3623
- margin-bottom: 10px;
3624
- border-bottom: 1px solid #eee;
3625
- }
3626
-
3627
- @media ( max-width: 600px ) {
3628
- #obfx-mod-social-sharing .obfx-row .form-label {
3629
- margin-bottom: 20px;
3630
- font-weight: 600;
3631
- }
3632
-
3633
- #obfx-mod-social-sharing .obfx-row .show .form-label {
3634
- display: none;
3635
- }
3636
-
3637
- #obfx-mod-social-sharing .form-group.inline-setting.network-toggle {
3638
- display: block;
3639
- }
3640
-
3641
- .obfx-row {
3642
- padding: 10px 0;
3643
- }
3644
- }
8
  * Extends Spectre.css Library
9
  */
10
  /*
11
+ Version: 2.1.0
12
  */
13
 
14
  /* Document
3593
  -webkit-transition: height 1s;
3594
  transition: height 1s;
3595
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
core/assets/js/orbit-fox-admin.js CHANGED
@@ -37,151 +37,121 @@ var obfx_admin = function( $ ) {
37
  * Although scripts in the WordPress core, Plugins and Themes may be
38
  * practising this, we should strive to set a better example in our own work.
39
  */
40
- $(
41
- function() {
42
- // if ( $( '#toplevel_page_jetpack' ).length ) {
43
- // var obfx_menu = $( '#toplevel_page_obfx_menu' ).clone().wrap( '<p/>' ).parent().html();
44
- // $( '#toplevel_page_obfx_menu' ).remove();
45
- // $( '#toplevel_page_jetpack' ).before( obfx_menu );
46
- // }
47
- }
48
- );
49
-
50
- $(
51
- function() {
52
- $( '.obfx-mod-switch' ).on(
53
- 'click', function() {
54
- var switch_ref = $( this );
55
- var checked = switch_ref.is( ':checked' );
56
- var name = switch_ref.attr( 'name' );
57
- var noance = switch_ref.val();
58
-
59
- var post_data = {
60
- noance: noance,
61
- name: name,
62
- checked: checked
63
- };
64
- var json_data = JSON.stringify( post_data );
65
-
66
- var ajax_data = {
67
- 'action': 'obfx_update_module_active_status',
68
- 'data': json_data
69
- };
70
-
71
- $.post(
72
- 'admin-ajax.php', ajax_data, function( response ) {
73
- if ( response.type === 'success' ) {
74
- if ( checked ) {
75
- $( '#obfx-mod-' + name ).slideDown();
76
- $( '#obfx-mod-' + name ).find( 'fieldset' ).removeAttr( 'disabled' );
77
- } else {
78
- $( '#obfx-mod-' + name ).hide();
79
- $( '#obfx-mod-' + name ).find( 'fieldset' ).attr( 'disabled', true );
80
- }
81
- } else {
82
- switch_ref.attr( 'checked', ! switch_ref.attr( 'checked' ) );
83
- }
84
- }, 'json'
85
- );
86
  }
87
- );
88
-
89
- $( '.obfx-toast-dismiss' ).on(
90
- 'click', function() {
91
- $( this ).closest( '.obfx-mod-toast' ).slideUp(
92
- 400, function() {
93
- $( this ).removeClass( 'toast-success' );
94
- $( this ).removeClass( 'toast-error' );
95
- $( this ).removeClass( 'toast-warning' );
96
- }
97
- );
98
- }
99
- );
100
-
101
- $( '.btn-expand' ).on(
102
- 'click', function() {
103
- if ( $( this ).hasClass( 'active' ) ) {
104
- $( this ).removeClass( 'active' );
105
- $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).removeClass( 'active' );
106
- $( this ).closest( '.panel.options' ).css( 'height', '75px' );
107
- } else {
108
- $( this ).addClass( 'active' );
109
- $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).addClass( 'active' );
110
- $( this ).closest( '.panel.options' ).css( 'height', ( $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).height() * 1 + 80 ) + 'px' );
111
- }
112
- }
113
- );
114
-
115
- $( '.obfx-module-form' ).on(
116
- 'submit', function (e) {
117
- e.preventDefault();
118
- }
119
- );
120
-
121
- $( '.obfx-module-form' ).on(
122
- 'keyup change', 'input, select, textarea', function () {
123
- $( this ).closest( 'form' ).find( '[class*="obfx-mod-btn"]:disabled' ).removeAttr( 'disabled' );
124
- }
125
- );
126
-
127
- $( '.obfx-mod-btn-cancel' ).on(
128
- 'click', function () {
129
- $( this ).closest( 'form' ).trigger( 'reset' );
130
- $( this ).closest( 'form' ).find( '[class*="obfx-mod-btn"]' ).attr( 'disabled', true );
131
- }
132
- );
133
-
134
- $( '.obfx-mod-btn-save' ).on(
135
- 'click', function () {
136
- var module_form = $( this ).closest( 'form' );
137
- module_form.find( '[class*="obfx-mod-btn"]' ).attr( 'disabled', true );
138
- module_form.find( '.obfx-mod-btn-save' ).addClass( 'loading' );
139
- module_form.find( $( 'input:checkbox:not(:checked)' ) ).each(
140
- function() {
141
- var input = $( '<input />' );
142
- input.attr( 'type', 'hidden' );
143
- input.attr( 'name', $( this ).attr( 'name' ) );
144
- input.attr( 'value', '0' );
145
- var form = $( this )[0].form;
146
- $( form ).append( input );
147
- }
148
- );
149
- var form_data = module_form.serializeArray();
150
- var maped_array = {};
151
- $.each(
152
- form_data, function( i, elem ) {
153
- maped_array[ elem.name ] = elem.value;
154
- }
155
- );
156
-
157
- form_data = JSON.stringify( maped_array );
158
-
159
- var ajax_data = {
160
- 'action': 'obfx_update_module_options',
161
- 'data': form_data
162
- };
163
-
164
- $.post(
165
- 'admin-ajax.php', ajax_data, function( response ) {
166
- module_form.find( '.obfx-mod-btn-save' ).removeClass( 'loading' );
167
- if ( response.type ) {
168
- module_form.closest( '.panel' ).find( '.obfx-mod-toast' ).addClass( 'toast-' + response.type );
169
- module_form.closest( '.panel' ).find( '.obfx-mod-toast span' ).html( response.message );
170
- module_form.closest( '.panel' ).find( '.obfx-mod-toast' ).show();
171
- setTimeout(
172
- function() {
173
- module_form.closest( '.panel' ).find( '.obfx-toast-dismiss' ).trigger( 'click' );
174
- }, 2000
175
- );
176
- }
177
- }, 'json'
178
- );
179
-
180
- }
181
- );
182
-
183
- }
184
- );
185
 
186
  };
187
 
37
  * Although scripts in the WordPress core, Plugins and Themes may be
38
  * practising this, we should strive to set a better example in our own work.
39
  */
40
+ $( function() {
41
+ // if ( $( '#toplevel_page_jetpack' ).length ) {
42
+ // var obfx_menu = $( '#toplevel_page_obfx_menu' ).clone().wrap( '<p/>' ).parent().html();
43
+ // $( '#toplevel_page_obfx_menu' ).remove();
44
+ // $( '#toplevel_page_jetpack' ).before( obfx_menu );
45
+ // }
46
+ } );
47
+
48
+ $( function() {
49
+ $( '.obfx-mod-switch' ).on( 'click', function() {
50
+ var switch_ref = $( this );
51
+ var checked = switch_ref.is( ':checked' );
52
+ var name = switch_ref.attr( 'name' );
53
+ var noance = switch_ref.val();
54
+
55
+ var post_data = {
56
+ noance: noance,
57
+ name: name,
58
+ checked: checked
59
+ };
60
+ var json_data = JSON.stringify( post_data );
61
+
62
+ var ajax_data = {
63
+ 'action': 'obfx_update_module_active_status',
64
+ 'data': json_data
65
+ };
66
+
67
+ $.post( 'admin-ajax.php', ajax_data, function( response ) {
68
+ if ( response.type === 'success' ) {
69
+ if ( checked ) {
70
+ $( '#obfx-mod-' + name ).slideDown();
71
+ $( '#obfx-mod-' + name ).find( 'fieldset' ).removeAttr( 'disabled' );
72
+ } else {
73
+ $( '#obfx-mod-' + name ).hide();
74
+ $( '#obfx-mod-' + name ).find( 'fieldset' ).attr( 'disabled', true );
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
+ } else {
77
+ switch_ref.attr( 'checked', ! switch_ref.attr( 'checked' ) );
78
+ }
79
+ }, 'json');
80
+ } );
81
+
82
+ $( '.obfx-toast-dismiss' ).on( 'click', function() {
83
+ $( this ).closest( '.obfx-mod-toast' ).slideUp( 400, function() {
84
+ $( this ).removeClass( 'toast-success' );
85
+ $( this ).removeClass( 'toast-error' );
86
+ $( this ).removeClass( 'toast-warning' );
87
+ } );
88
+ } );
89
+
90
+ $( '.btn-expand' ).on( 'click', function() {
91
+ if ( $( this ).hasClass( 'active' ) ) {
92
+ $( this ).removeClass( 'active' );
93
+ $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).removeClass( 'active' );
94
+ $( this ).closest( '.panel.options' ).css( 'height', '75px' );
95
+ } else {
96
+ $( this ).addClass( 'active' );
97
+ $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).addClass( 'active' );
98
+ $( this ).closest( '.panel.options' ).css( 'height', ( $( this ).closest( '.panel-header' ).siblings( '.obfx-module-form' ).height() * 1 + 80 ) + 'px' );
99
+ }
100
+ } );
101
+
102
+ $( '.obfx-module-form' ).on( 'submit', function (e) {
103
+ e.preventDefault();
104
+ } );
105
+
106
+ $( '.obfx-module-form' ).on( 'keyup change', 'input, select, textarea', function () {
107
+ $( this ).closest( 'form' ).find( '[class*="obfx-mod-btn"]:disabled' ).removeAttr( 'disabled' );
108
+ } );
109
+
110
+ $( '.obfx-mod-btn-cancel' ).on( 'click', function () {
111
+ $( this ).closest( 'form' ).trigger( 'reset' );
112
+ $( this ).closest( 'form' ).find( '[class*="obfx-mod-btn"]' ).attr( 'disabled', true );
113
+ } );
114
+
115
+ $( '.obfx-mod-btn-save' ).on( 'click', function () {
116
+ var module_form = $( this ).closest( 'form' );
117
+ module_form.find( '[class*="obfx-mod-btn"]' ).attr( 'disabled', true );
118
+ module_form.find( '.obfx-mod-btn-save' ).addClass( 'loading' );
119
+ module_form.find( $( 'input:checkbox:not(:checked)' ) ).each( function() {
120
+ var input = $( '<input />' );
121
+ input.attr( 'type', 'hidden' );
122
+ input.attr( 'name', $( this ).attr( 'name' ) );
123
+ input.attr( 'value', '0' );
124
+ var form = $( this )[0].form;
125
+ $( form ).append( input );
126
+ } );
127
+ var form_data = module_form.serializeArray();
128
+ var maped_array = {};
129
+ $.each( form_data, function( i, elem ) {
130
+ maped_array[ elem.name ] = elem.value;
131
+ } );
132
+
133
+ form_data = JSON.stringify( maped_array );
134
+
135
+ var ajax_data = {
136
+ 'action': 'obfx_update_module_options',
137
+ 'data': form_data
138
+ };
139
+
140
+ $.post( 'admin-ajax.php', ajax_data, function( response ) {
141
+ module_form.find( '.obfx-mod-btn-save' ).removeClass( 'loading' );
142
+ if ( response.type ) {
143
+ module_form.closest( '.panel' ).find( '.obfx-mod-toast' ).addClass( 'toast-' + response.type );
144
+ module_form.closest( '.panel' ).find( '.obfx-mod-toast span' ).html( response.message );
145
+ module_form.closest( '.panel' ).find( '.obfx-mod-toast' ).show();
146
+ setTimeout( function() {
147
+ module_form.closest( '.panel' ).find( '.obfx-toast-dismiss' ).trigger( 'click' );
148
+ }, 2000 );
149
+ }
150
+ }, 'json');
151
+
152
+ } );
153
+
154
+ } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
 
156
  };
157
 
core/includes/class-orbit-fox.php CHANGED
@@ -69,7 +69,7 @@ class Orbit_Fox {
69
 
70
  $this->plugin_name = 'orbit-fox';
71
 
72
- $this->version = '2.2.6';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
69
 
70
  $this->plugin_name = 'orbit-fox';
71
 
72
+ $this->version = '2.1.0';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
languages/themeisle-companion.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the GPL-2.0+.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Orbit Fox Companion 2.1.0\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/orbit-fox/issues\n"
7
- "POT-Creation-Date: 2017-11-10 13:40:54+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -122,7 +122,6 @@ msgid "Module Description ..."
122
  msgstr ""
123
 
124
  #: core/app/views/partials/module-tile-tpl.php:42
125
- #: obfx_modules/template-directory/init.php:457
126
  msgid "Activate"
127
  msgstr ""
128
 
@@ -715,91 +714,91 @@ msgid "Module to define menu icons for navigation."
715
  msgstr ""
716
 
717
  #: obfx_modules/mystock-import/inc/photos.php:28
718
- #: obfx_modules/mystock-import/init.php:187
719
  msgid "Deselect"
720
  msgstr ""
721
 
722
- #: obfx_modules/mystock-import/init.php:49
723
  msgid "Mystock Import"
724
  msgstr ""
725
 
726
- #: obfx_modules/mystock-import/init.php:50
727
- msgid "Module to import images directly from"
728
  msgstr ""
729
 
730
- #: obfx_modules/mystock-import/init.php:132
731
- #: obfx_modules/mystock-import/init.php:139
732
- #: obfx_modules/mystock-import/init.php:146
733
- #: obfx_modules/mystock-import/init.php:154
734
- #: obfx_modules/mystock-import/init.php:159
735
  msgid "Image failed to upload"
736
  msgstr ""
737
 
738
- #: obfx_modules/mystock-import/init.php:217
739
  msgid "Square"
740
  msgstr ""
741
 
742
- #: obfx_modules/mystock-import/init.php:218
743
  msgid "Large Square"
744
  msgstr ""
745
 
746
- #: obfx_modules/mystock-import/init.php:219
747
  msgid "Thumbnail"
748
  msgstr ""
749
 
750
- #: obfx_modules/mystock-import/init.php:220
751
  msgid "Small"
752
  msgstr ""
753
 
754
- #: obfx_modules/mystock-import/init.php:221
755
  msgid "Small 320"
756
  msgstr ""
757
 
758
- #: obfx_modules/mystock-import/init.php:222
759
  msgid "Medium"
760
  msgstr ""
761
 
762
- #: obfx_modules/mystock-import/init.php:223
763
  msgid "Medium 640"
764
  msgstr ""
765
 
766
- #: obfx_modules/mystock-import/init.php:224
767
  msgid "Medium 800"
768
  msgstr ""
769
 
770
- #: obfx_modules/mystock-import/init.php:225
771
  msgid "Large"
772
  msgstr ""
773
 
774
- #: obfx_modules/mystock-import/init.php:226
775
  msgid "Original"
776
  msgstr ""
777
 
778
- #: obfx_modules/mystock-import/init.php:234
779
  msgid "Attachement display settings"
780
  msgstr ""
781
 
782
- #: obfx_modules/mystock-import/init.php:236
783
  msgid "Size"
784
  msgstr ""
785
 
786
- #: obfx_modules/mystock-import/init.php:286
787
  msgid "Fetching data"
788
  msgstr ""
789
 
790
- #: obfx_modules/mystock-import/init.php:287
791
  msgid "Downloading image. Please wait..."
792
  msgstr ""
793
 
794
- #: obfx_modules/mystock-import/init.php:288
795
  msgid "Your image was imported. Go to Media Library tab to use it."
796
  msgstr ""
797
 
798
- #: obfx_modules/mystock-import/init.php:289
799
  msgid "Loading more photos..."
800
  msgstr ""
801
 
802
- #: obfx_modules/mystock-import/init.php:290
803
  msgid "MyStock Library"
804
  msgstr ""
805
 
@@ -811,7 +810,7 @@ msgstr ""
811
  msgid "Add basic social sharing to your posts and pages."
812
  msgstr ""
813
 
814
- #: obfx_modules/social-sharing/views/hestia-social-sharing-tpl.php:36
815
  msgid "Share on "
816
  msgstr ""
817
 
@@ -823,64 +822,6 @@ msgstr ""
823
  msgid "A simple module for your WordPress data."
824
  msgstr ""
825
 
826
- #: obfx_modules/template-directory/init.php:29
827
- msgid "Template Directory Module"
828
- msgstr ""
829
-
830
- #: obfx_modules/template-directory/init.php:30
831
- msgid ""
832
- "The awesome template directory is aiming to provide a wide range of "
833
- "templates that you can import straight into your website."
834
- msgstr ""
835
-
836
- #: obfx_modules/template-directory/init.php:62
837
- msgid "A new Orbit Fox Template"
838
- msgstr ""
839
-
840
- #: obfx_modules/template-directory/init.php:64
841
- msgid "This is an awesome Orbit Fox Template."
842
- msgstr ""
843
-
844
- #: obfx_modules/template-directory/init.php:71
845
- msgid "About Our Business"
846
- msgstr ""
847
-
848
- #: obfx_modules/template-directory/init.php:72
849
- #: obfx_modules/template-directory/init.php:79
850
- msgid "A fancy description here"
851
- msgstr ""
852
-
853
- #: obfx_modules/template-directory/init.php:78
854
- msgid "Contact Us"
855
- msgstr ""
856
-
857
- #: obfx_modules/template-directory/init.php:275
858
- #: obfx_modules/template-directory/views/template-directory-page-tpl.php:19
859
- msgid "Orbit Fox Template Directory"
860
- msgstr ""
861
-
862
- #: obfx_modules/template-directory/init.php:275
863
- msgid "Template Directory"
864
- msgstr ""
865
-
866
- #: obfx_modules/template-directory/init.php:444
867
- msgid "Install and activate"
868
- msgstr ""
869
-
870
- #: obfx_modules/template-directory/views/template-directory-page-tpl.php:40
871
- msgid "Preview"
872
- msgstr ""
873
-
874
- #: obfx_modules/template-directory/views/template-directory-page-tpl.php:44
875
- msgid "Import"
876
- msgstr ""
877
-
878
- #: obfx_modules/template-directory/views/template-plugin-install-tpl.php:17
879
- msgid ""
880
- "In order to import this template, you must have Elementor Page Builder "
881
- "installed. Click the button below to install and activate now."
882
- msgstr ""
883
-
884
  #. Plugin URI of the plugin/theme
885
  msgid "https://themeisle.com/plugins/orbit-fox-companion"
886
  msgstr ""
2
  # This file is distributed under the GPL-2.0+.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Orbit Fox Companion 2.0.11\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/orbit-fox/issues\n"
7
+ "POT-Creation-Date: 2017-11-07 14:30:58+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
122
  msgstr ""
123
 
124
  #: core/app/views/partials/module-tile-tpl.php:42
 
125
  msgid "Activate"
126
  msgstr ""
127
 
714
  msgstr ""
715
 
716
  #: obfx_modules/mystock-import/inc/photos.php:28
717
+ #: obfx_modules/mystock-import/init.php:188
718
  msgid "Deselect"
719
  msgstr ""
720
 
721
+ #: obfx_modules/mystock-import/init.php:44
722
  msgid "Mystock Import"
723
  msgstr ""
724
 
725
+ #: obfx_modules/mystock-import/init.php:45
726
+ msgid "Module to import images from mystock."
727
  msgstr ""
728
 
729
+ #: obfx_modules/mystock-import/init.php:108
730
+ #: obfx_modules/mystock-import/init.php:115
731
+ #: obfx_modules/mystock-import/init.php:122
732
+ #: obfx_modules/mystock-import/init.php:130
733
+ #: obfx_modules/mystock-import/init.php:135
734
  msgid "Image failed to upload"
735
  msgstr ""
736
 
737
+ #: obfx_modules/mystock-import/init.php:222
738
  msgid "Square"
739
  msgstr ""
740
 
741
+ #: obfx_modules/mystock-import/init.php:223
742
  msgid "Large Square"
743
  msgstr ""
744
 
745
+ #: obfx_modules/mystock-import/init.php:224
746
  msgid "Thumbnail"
747
  msgstr ""
748
 
749
+ #: obfx_modules/mystock-import/init.php:225
750
  msgid "Small"
751
  msgstr ""
752
 
753
+ #: obfx_modules/mystock-import/init.php:226
754
  msgid "Small 320"
755
  msgstr ""
756
 
757
+ #: obfx_modules/mystock-import/init.php:227
758
  msgid "Medium"
759
  msgstr ""
760
 
761
+ #: obfx_modules/mystock-import/init.php:228
762
  msgid "Medium 640"
763
  msgstr ""
764
 
765
+ #: obfx_modules/mystock-import/init.php:229
766
  msgid "Medium 800"
767
  msgstr ""
768
 
769
+ #: obfx_modules/mystock-import/init.php:230
770
  msgid "Large"
771
  msgstr ""
772
 
773
+ #: obfx_modules/mystock-import/init.php:231
774
  msgid "Original"
775
  msgstr ""
776
 
777
+ #: obfx_modules/mystock-import/init.php:239
778
  msgid "Attachement display settings"
779
  msgstr ""
780
 
781
+ #: obfx_modules/mystock-import/init.php:241
782
  msgid "Size"
783
  msgstr ""
784
 
785
+ #: obfx_modules/mystock-import/init.php:291
786
  msgid "Fetching data"
787
  msgstr ""
788
 
789
+ #: obfx_modules/mystock-import/init.php:292
790
  msgid "Downloading image. Please wait..."
791
  msgstr ""
792
 
793
+ #: obfx_modules/mystock-import/init.php:293
794
  msgid "Your image was imported. Go to Media Library tab to use it."
795
  msgstr ""
796
 
797
+ #: obfx_modules/mystock-import/init.php:294
798
  msgid "Loading more photos..."
799
  msgstr ""
800
 
801
+ #: obfx_modules/mystock-import/init.php:295
802
  msgid "MyStock Library"
803
  msgstr ""
804
 
810
  msgid "Add basic social sharing to your posts and pages."
811
  msgstr ""
812
 
813
+ #: obfx_modules/social-sharing/views/hestia-social-sharing-tpl.php:37
814
  msgid "Share on "
815
  msgstr ""
816
 
822
  msgid "A simple module for your WordPress data."
823
  msgstr ""
824
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
  #. Plugin URI of the plugin/theme
826
  msgid "https://themeisle.com/plugins/orbit-fox-companion"
827
  msgstr ""
obfx_modules/beaver-widgets/custom-fields/number-field/number.js DELETED
@@ -1,9 +0,0 @@
1
- /* global FLBuilder */
2
-
3
- ( function ( $ ) {
4
- $( 'body' ).delegate(
5
- '.obfx-number-field', 'change', function ( e ) {
6
- $.proxy( FLBuilder.preview.delayPreview( e ), FLBuilder.preview );
7
- }
8
- );
9
- } )( jQuery );
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/custom-fields/number-field/number_field.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /**
3
- * Beaver builder number custom field
4
- *
5
- * @package themeisle-companion
6
- */
7
-
8
- /**
9
- * Render the Number Field to the browser
10
- */
11
- function obfx_number_field( $name, $value, $field ) {
12
- $min = ! empty( $field['min'] ) ? 'min="' . esc_attr( $field['min'] ) . '"' : '';
13
- $max = ! empty( $field['max'] ) ? 'max="' . esc_attr( $field['max'] ) . '"' : ''; ?>
14
- <input type="number" value="<?php echo esc_attr( $value ); ?>" name="<?php echo esc_attr( $name ); ?>" class="obfx-number-field" <?php echo $min; ?> <?php echo $max; ?> />
15
- <?php
16
- }
17
-
18
- add_action( 'fl_builder_control_obfx_number', 'obfx_number_field', 1, 3 );
19
-
20
- /**
21
- * Enqueue number field stylesheet
22
- *
23
- * @return void
24
- */
25
- function obfx_enqueue_field() {
26
- if ( class_exists( 'FLBuilderModel' ) && FLBuilderModel::is_builder_active() ) {
27
- wp_enqueue_script( 'obfx-number-js', BEAVER_WIDGETS_URL . 'custom-fields/number-field/number.js', array(), THEMEISLE_COMPANION_VERSION, true );
28
- }
29
- }
30
- add_action( 'wp_enqueue_scripts', 'obfx_enqueue_field' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle.css DELETED
@@ -1,84 +0,0 @@
1
- .fl-lightbox .btn-switch {
2
- font-size: 0.5em;
3
- position: relative;
4
- display: inline-block;
5
- -webkit-user-select: none;
6
- -moz-user-select: none;
7
- -ms-user-select: none;
8
- user-select: none;
9
- }
10
- .fl-lightbox .btn-switch__radio {
11
- display: none;
12
- }
13
- .fl-lightbox .btn-switch__label {
14
- display: inline-block;
15
- vertical-align: top;
16
- font-size: 10px;
17
- font-weight: 700;
18
- line-height: 30px;
19
- margin: 0;
20
- color: #666;
21
- cursor: pointer;
22
- transition: color .2s ease-in-out;
23
- }
24
-
25
- .fl-lightbox .btn-switch__txt {
26
- position: relative;
27
- z-index: 2;
28
- display: inline-block;
29
- min-width: 1.5em;
30
- opacity: 1;
31
- pointer-events: none;
32
- transition: opacity .2s ease-in-out;
33
- color: inherit;
34
- }
35
- .fl-lightbox .btn-switch__radio_no:checked ~ .btn-switch__label_yes .btn-switch__txt,
36
- .fl-lightbox .btn-switch__radio_yes:checked ~ .btn-switch__label_no .btn-switch__txt {
37
- opacity: 0;
38
- }
39
- .fl-lightbox .btn-switch__label:before {
40
- content: "";
41
- position: absolute;
42
- z-index: -1;
43
- top: 0;
44
- right: 0;
45
- bottom: 0;
46
- left: 0;
47
- background: #f0f0f0;
48
- border-radius: 1.5em;
49
- box-shadow: inset 0 .0715em .3572em rgba(43,43,43,.05);
50
- transition: background .2s ease-in-out;
51
- }
52
- .fl-lightbox .btn-switch__radio_yes:checked ~ .btn-switch__label:before {
53
- background: #6ad500;
54
- }
55
- .fl-lightbox .btn-switch__label_no:after {
56
- content: "";
57
- position: absolute;
58
- z-index: 2;
59
- top: .5em;
60
- bottom: .5em;
61
- left: .5em;
62
- width: 2em;
63
- background: #fff;
64
- border-radius: 1em;
65
- pointer-events: none;
66
- box-shadow: 0 .1429em .2143em rgba(43,43,43,.2), 0 .3572em .3572em rgba(43,43,43,.1);
67
- transition: left .2s ease-in-out, background .2s ease-in-out;
68
- }
69
- .fl-lightbox .btn-switch__radio_yes:checked ~ .btn-switch__label_no:after {
70
- left: calc(100% - 2.5em);
71
- background: #fff;
72
- }
73
- .fl-lightbox .btn-switch__radio_no:checked ~ .btn-switch__label_yes:before,
74
- .fl-lightbox .btn-switch__radio_yes:checked ~ .btn-switch__label_no:before {
75
- z-index: 1;
76
- }
77
- .fl-lightbox .btn-switch__radio_yes:checked ~ .btn-switch__label_yes {
78
- color: #fff;
79
- padding: 0 10px;
80
- }
81
-
82
- .fl-lightbox .btn-switch__radio_no:checked ~ .btn-switch__label_no {
83
- padding: 0 10px;
84
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle.js DELETED
@@ -1,9 +0,0 @@
1
- /* global FLBuilder */
2
-
3
- ( function ( $ ) {
4
- $( 'body' ).delegate(
5
- '.btn-switch__label', 'click', function ( e ) {
6
- $.proxy( FLBuilder.preview.delayPreview( e ), FLBuilder.preview );
7
- }
8
- );
9
- } )( jQuery );
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/custom-fields/toggle-field/toggle_field.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
- /**
3
- * Beaver builder toggle custom field
4
- *
5
- * @package themeisle-companion
6
- */
7
-
8
- /**
9
- * Render the Toggle Field to the browser
10
- */
11
- function obfx_toggle_field( $name, $value, $field ) {
12
- ?>
13
- <p class="btn-switch">
14
- <input type="radio"
15
- <?php
16
- if ( $value === 'yes' ) {
17
- echo 'checked';}
18
- ?>
19
- value="yes" id="<?php echo esc_attr( $name ); ?>_yes" name="<?php echo esc_attr( $name ); ?>" class="btn-switch__radio btn-switch__radio_yes" />
20
- <input type="radio"
21
- <?php
22
- if ( $value !== 'yes' ) {
23
- echo 'checked';}
24
- ?>
25
- value="no" id="<?php echo esc_attr( $name ); ?>_no" name="<?php echo esc_attr( $name ); ?>" class="btn-switch__radio btn-switch__radio_no" />
26
- <label for="<?php echo esc_attr( $name ); ?>_yes" class="btn-switch__label btn-switch__label_yes"><span class="btn-switch__txt"><?php echo esc_html__( 'Yes', 'themeisle-companion' ); ?></span></label>
27
- <label for="<?php echo esc_attr( $name ); ?>_no" class="btn-switch__label btn-switch__label_no"><span class="btn-switch__txt"><?php echo esc_html__( 'No', 'themeisle-companion' ); ?></span></label>
28
- </p>
29
- <?php
30
- }
31
- add_action( 'fl_builder_control_obfx_toggle', 'obfx_toggle_field', 1, 3 );
32
-
33
- /**
34
- * Enqueue toggle field stylesheet
35
- *
36
- * @return void
37
- */
38
- function obfx_enqueue_toggle_field() {
39
- if ( class_exists( 'FLBuilderModel' ) && FLBuilderModel::is_builder_active() ) {
40
- wp_enqueue_style( 'obfx-toggle-css', BEAVER_WIDGETS_URL . 'custom-fields/toggle-field/toggle.css', null, THEMEISLE_COMPANION_VERSION, 'all' );
41
- wp_enqueue_script( 'obfx-toggle-js', BEAVER_WIDGETS_URL . 'custom-fields/toggle-field/toggle.js', array(), THEMEISLE_COMPANION_VERSION, true );
42
- }
43
- }
44
- add_action( 'wp_enqueue_scripts', 'obfx_enqueue_toggle_field' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/inc/common-functions.php DELETED
@@ -1,117 +0,0 @@
1
- <?php
2
- /**
3
- * This file contains common functions that can be used in every Beaver module
4
- *
5
- * @package themeisle-companion
6
- */
7
-
8
- // Get the module directory.
9
- $module_directory = $this->get_dir();
10
-
11
- // Require custom field.
12
- require_once( $module_directory . '/custom-fields/number-field/number_field.php' );
13
-
14
- /**
15
- * Function to return padding controls.
16
- *
17
- * @param array $settings Fields settings.
18
- *
19
- * @return array
20
- */
21
- function themeisle_four_fields_control( $settings ) {
22
- $default = $settings['default'];
23
- $prefix = $settings['field_name_prefix'];
24
- $type = ! empty( $settings['type'] ) ? $settings['type'] : 'padding';
25
- return array(
26
- 'title' => $type === 'margin' ? esc_html__( 'Margins', 'themeisle-companion' ) : esc_html__( 'Padding', 'themeisle-companion' ),
27
- 'fields' => array(
28
- $prefix . 'top' => array(
29
- 'type' => 'obfx_number',
30
- 'label' => esc_html__( 'Top', 'themeisle-companion' ),
31
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
32
- 'default' => $default['top'],
33
- ),
34
- $prefix . 'bottom' => array(
35
- 'type' => 'obfx_number',
36
- 'label' => esc_html__( 'Bottom', 'themeisle-companion' ),
37
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
38
- 'default' => $default['bottom'],
39
- ),
40
- $prefix . 'left' => array(
41
- 'type' => 'obfx_number',
42
- 'label' => esc_html__( 'Left', 'themeisle-companion' ),
43
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
44
- 'default' => $default['left'],
45
- ),
46
- $prefix . 'right' => array(
47
- 'type' => 'obfx_number',
48
- 'label' => esc_html__( 'Right', 'themeisle-companion' ),
49
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
50
- 'default' => $default['right'],
51
- ),
52
- ),
53
- );
54
- }
55
-
56
- /**
57
- * Typography controls.
58
- *
59
- * @param array $settings Typography settings.
60
- *
61
- * @return array
62
- */
63
- function themeisle_typography_settings( $settings ) {
64
- $title = ! empty( $settings['title'] ) ? $settings['title'] : esc_html__( 'Typography', 'themeisle-companion' );
65
- $prefix = $settings['prefix'];
66
- $font_default = ! empty( $settings['font_size_default'] ) ? $settings['font_size_default'] : '';
67
- return array(
68
- 'title' => $title,
69
- 'fields' => array(
70
- $prefix . 'font_size' => array(
71
- 'type' => 'obfx_number',
72
- 'label' => esc_html__( 'Font size', 'themeisle-companion' ),
73
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
74
- 'default' => $font_default,
75
- ),
76
- $prefix . 'font_family' => array(
77
- 'type' => 'font',
78
- 'label' => esc_html__( 'Font family', 'themeisle-companion' ),
79
- 'default' => array(
80
- 'family' => 'Roboto',
81
- 'weight' => 300,
82
- ),
83
- ),
84
- $prefix . 'transform' => array(
85
- 'type' => 'select',
86
- 'label' => esc_html__( 'Transform', 'themeisle-companion' ),
87
- 'default' => 'none',
88
- 'options' => array(
89
- 'none' => esc_html__( 'None', 'themeisle-companion' ),
90
- 'capitalize' => esc_html__( 'Capitalize', 'themeisle-companion' ),
91
- 'uppercase' => esc_html__( 'Uppercase', 'themeisle-companion' ),
92
- 'lowercase' => esc_html__( 'Lowercase', 'themeisle-companion' ),
93
- ),
94
- ),
95
- $prefix . 'font_style' => array(
96
- 'type' => 'select',
97
- 'label' => esc_html__( 'Font style', 'themeisle-companion' ),
98
- 'default' => 'normal',
99
- 'options' => array(
100
- 'normal' => esc_html__( 'Normal', 'themeisle-companion' ),
101
- 'italic' => esc_html__( 'Italic', 'themeisle-companion' ),
102
- 'oblique' => esc_html__( 'Oblique', 'themeisle-companion' ),
103
- ),
104
- ),
105
- $prefix . 'line_height' => array(
106
- 'type' => 'obfx_number',
107
- 'label' => esc_html__( 'Line height', 'themeisle-companion' ),
108
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
109
- ),
110
- $prefix . 'letter_spacing' => array(
111
- 'type' => 'obfx_number',
112
- 'label' => esc_html__( 'Letter spacing', 'themeisle-companion' ),
113
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
114
- ),
115
- ),
116
- );
117
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/init.php DELETED
@@ -1,107 +0,0 @@
1
- <?php
2
- /**
3
- * Beaver Builder modules Orbit Fox Module.
4
- *
5
- * @link https://themeisle.com
6
- * @since 2.2.5
7
- */
8
-
9
- define( 'BEAVER_WIDGETS_PATH', plugin_dir_path( __FILE__ ) );
10
- define( 'BEAVER_WIDGETS_URL', plugins_url( '/', __FILE__ ) );
11
-
12
- /**
13
- * Class Beaver_Widgets_OBFX_Module
14
- */
15
- class Beaver_Widgets_OBFX_Module extends Orbit_Fox_Module_Abstract {
16
-
17
- /**
18
- * Beaver_Widgets_OBFX_Module constructor.
19
- *
20
- * @since 2.2.5
21
- * @access public
22
- */
23
- public function __construct() {
24
- parent::__construct();
25
- $this->name = __( 'Beaver Builder Widgets', 'themeisle-companion' );
26
- $this->description = __( 'Custom Beaver Builder Widgets.', 'themeisle-companion' );
27
- }
28
-
29
- /**
30
- * Determine if module should be loaded.
31
- *
32
- * @since 2.2.5
33
- * @access public
34
- * @return bool
35
- */
36
- public function enable_module() {
37
- return true;
38
- }
39
-
40
- /**
41
- * The loading logic for the module.
42
- *
43
- * @since 2.2.5
44
- * @access public
45
- */
46
- public function load() {
47
- }
48
-
49
- /**
50
- * Method to define hooks needed.
51
- *
52
- * @since 2.2.5
53
- * @access public
54
- */
55
- public function hooks() {
56
- $this->loader->add_action( 'init', $this, 'load_widgets_modules' );
57
- }
58
-
59
- /**
60
- * Method that returns an array of scripts and styles to be loaded
61
- * for the front end part.
62
- *
63
- * @since 2.2.5
64
- * @access public
65
- * @return array
66
- */
67
- public function public_enqueue() {
68
- return array();
69
- }
70
-
71
- /**
72
- * Method that returns an array of scripts and styles to be loaded
73
- * for the admin part.
74
- *
75
- * @since 2.2.5
76
- * @access public
77
- * @return array
78
- */
79
- public function admin_enqueue() {
80
- return array();
81
- }
82
-
83
- /**
84
- * Method to define the options fields for the module
85
- *
86
- * @since 2.2.5
87
- * @access public
88
- * @return array
89
- */
90
- public function options() {
91
- return array();
92
- }
93
-
94
- /**
95
- * Require Beaver Builder modules
96
- *
97
- * @since 2.2.5
98
- * @access public
99
- */
100
- public function load_widgets_modules(){
101
- if ( class_exists( 'FLBuilder' ) ) {
102
- require_once 'modules/pricing-table/pricing-table.php';
103
- require_once 'modules/services/services.php';
104
- require_once 'modules/post-grid/post-grid.php';
105
- }
106
- }
107
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/post-grid/css/frontend.css DELETED
@@ -1,64 +0,0 @@
1
- .obfx-card{
2
- display: inline-block;
3
- position: relative;
4
- width: 100%;
5
- margin-bottom: 30px;
6
- border-radius: 6px;
7
- color: rgba(0, 0, 0, 0.87);
8
- background: #fff;
9
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
10
- }
11
- .obfx-post-grid-thumbnail.obfx-card{
12
- width: auto;
13
- -webkit-box-shadow: 4px 8px 59px -15px rgba(0,0,0,1);
14
- -moz-box-shadow: 4px 8px 59px -15px rgba(0,0,0,1);
15
- box-shadow: 4px 8px 59px -15px rgba(0,0,0,1);
16
- margin: 10px;
17
- }
18
-
19
- .obfx-post-grid-wrapper{
20
- padding: 0 10px;
21
- display: inline-block;
22
- vertical-align: top;
23
- }
24
-
25
- .obfx-post-grid-meta i {
26
- padding-right: 5px;
27
- }
28
-
29
- .obfx-post-grid-meta > div{
30
- display: inline;
31
- word-wrap: initial;
32
- }
33
-
34
- .obfx-post-grid-meta > div:not(:last-child),
35
- .obfx-category a:not(:last-child),
36
- .obfx-tags a:not(:last-child){
37
- padding-right: 5px;
38
- }
39
- .obfx-post-grid-meta > div:not(:last-child):after,
40
- .obfx-category a:not(:last-child):after,
41
- .obfx-tags a:not(:last-child):after{
42
- content: ',';
43
- }
44
- .obfx-category a:not(:last-child):after{
45
- content: ',';
46
- }
47
-
48
- .obfx-post-grid-pagination li{
49
- vertical-align: bottom;
50
- padding: 5px;
51
-
52
- }
53
-
54
- .obfx-post-grid-pagination li a{
55
- padding: 0;
56
- background: none;
57
- }
58
- .page-numbers{
59
- list-style: none;
60
- padding: 0;
61
- }
62
- .page-numbers li{
63
- display: inline-block;
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/post-grid/includes/frontend.css.php DELETED
@@ -1,173 +0,0 @@
1
- <?php
2
-
3
- $post_width = $settings->display_type === 'list' ? 100 : ( ! empty( $settings->columns ) ? 100 / (int) $settings->columns : 33.3333 );
4
- $card_vertical_align = ! empty( $settings->card_vertical_align ) ? $settings->card_vertical_align : 'top';
5
- echo '.fl-node-' . $id . ' .obfx-post-grid-wrapper{
6
- width: ' . $post_width . '%;
7
- vertical-align: ' . $card_vertical_align . ';
8
- }';
9
-
10
-
11
- $post_bg_color = ! empty( $settings->post_bg_color ) ? $settings->post_bg_color : '';
12
- if ( ! empty( $post_bg_color ) ) {
13
- $post_bg_color = strpos( $post_bg_color, 'rgba' ) !== false ? 'background-color:' . $post_bg_color : 'background-color:#' . $post_bg_color;
14
- echo '.fl-node-' . $id . ' .obfx-post-grid{
15
- ' . $post_bg_color . ';
16
- }';
17
- }
18
-
19
- $post_link_color = ! empty( $settings->post_link_color ) ? $settings->post_link_color : '';
20
- if ( ! empty( $post_link_color ) ) {
21
- $post_link_color = strpos( $post_link_color, 'rgba' ) !== false ? 'color:' . $post_link_color : 'color:#' . $post_link_color;
22
- echo '.fl-node-' . $id . ' .obfx-post-grid a, .fl-node-' . $id . ' .obfx-post-grid-pagination a {
23
- ' . $post_link_color . ';
24
- }';
25
- }
26
-
27
- $post_text_color = ! empty( $settings->post_text_color ) ? $settings->post_text_color : '';
28
- if ( ! empty( $post_text_color ) ) {
29
- $post_text_color = strpos( $post_text_color, 'rgba' ) !== false ? 'color:' . $post_text_color : 'color:#' . $post_text_color;
30
- echo '.fl-node-' . $id . ' .obfx-post-grid, .fl-node-' . $id . ' .obfx-post-grid-pagination{
31
- ' . $post_text_color . ';
32
- }';
33
- }
34
-
35
-
36
- $card_margin_top = ! empty( $settings->card_margin_top ) ? $settings->card_margin_top : '0';
37
- $card_margin_bottom = ! empty( $settings->card_margin_bottom ) ? $settings->card_margin_bottom : '0';
38
- echo '.fl-node-' . $id . ' .obfx-post-grid{
39
- margin-top: ' . $card_margin_top . 'px;
40
- margin-bottom: ' . $card_margin_bottom . 'px;
41
- }
42
- ';
43
-
44
- $thumbnail_margin_top = ! empty( $settings->thumbnail_margin_top ) ? $settings->thumbnail_margin_top : '0';
45
- $thumbnail_margin_bottom = ! empty( $settings->thumbnail_margin_bottom ) ? $settings->thumbnail_margin_bottom : '0';
46
- $thumbnail_margin_left = ! empty( $settings->thumbnail_margin_left ) ? $settings->thumbnail_margin_left : '0';
47
- $thumbnail_margin_right = ! empty( $settings->thumbnail_margin_right ) ? $settings->thumbnail_margin_right : '0';
48
- $image_alignment = ! empty( $settings->image_alignment ) ? $settings->image_alignment : 'center';
49
-
50
- echo '.fl-node-' . $id . ' .obfx-post-grid-thumbnail{
51
- margin-top: ' . $thumbnail_margin_top . 'px;
52
- margin-bottom: ' . $thumbnail_margin_bottom . 'px;
53
- margin-left: ' . $thumbnail_margin_left . 'px;
54
- margin-right: ' . $thumbnail_margin_right . 'px;';
55
-
56
- switch ( $image_alignment ) {
57
- case 'center':
58
- echo 'text-align:center; width:100%;';
59
- break;
60
- case 'left':
61
- echo 'float:left';
62
- break;
63
- case 'right':
64
- echo 'float:right';
65
- break;
66
- }
67
- echo '}';
68
-
69
-
70
- $title_padding_top = ! empty( $settings->title_padding_top ) ? $settings->title_padding_top : '0';
71
- $title_padding_bottom = ! empty( $settings->title_padding_bottom ) ? $settings->title_padding_bottom : '0';
72
- $title_padding_left = ! empty( $settings->title_padding_left ) ? $settings->title_padding_left : '0';
73
- $title_padding_right = ! empty( $settings->title_padding_right ) ? $settings->title_padding_right : '0';
74
- $title_alignment = ! empty( $settings->title_alignment ) ? $settings->title_alignment : 'center';
75
- $title_font_size = ! empty( $settings->title_font_size ) ? $settings->title_font_size : '0';
76
- $title_font_family = ! empty( $settings->title_font_family['family'] ) ? $settings->title_font_family['family'] : 'Roboto';
77
- $title_font_weight = ! empty( $settings->title_font_family['weight'] ) ? $settings->title_font_family['weight'] : '400';
78
- $title_transform = ! empty( $settings->title_transform ) ? $settings->title_transform : 'none';
79
- $title_font_style = ! empty( $settings->title_font_style ) ? $settings->title_font_style : 'none';
80
- $title_line_height = ! empty( $settings->title_line_height ) ? $settings->title_line_height : 'inherit';
81
- $title_letter_spacing = ! empty( $settings->title_letter_spacing ) ? $settings->title_letter_spacing : '0';
82
- echo '.fl-node-' . $id . ' .obfx-post-grid-title{
83
- padding-top: ' . $title_padding_top . 'px;
84
- padding-bottom: ' . $title_padding_bottom . 'px;
85
- padding-left: ' . $title_padding_left . 'px;
86
- padding-right: ' . $title_padding_right . 'px;
87
- text-align: ' . $title_alignment . ';
88
- font-size:' . $title_font_size . 'px;
89
- font-family:' . $title_font_family . ';
90
- font-weight:' . $title_font_weight . ';
91
- text-transform:' . $title_transform . ';
92
- font-style:' . $title_font_style . ';
93
- line-height:' . $title_line_height . 'px;
94
- letter-spacing:' . $title_letter_spacing . 'px;
95
- } ';
96
-
97
- $meta_padding_top = ! empty( $settings->meta_padding_top ) ? $settings->meta_padding_top : '0';
98
- $meta_padding_bottom = ! empty( $settings->meta_padding_bottom ) ? $settings->meta_padding_bottom : '0';
99
- $meta_padding_left = ! empty( $settings->meta_padding_left ) ? $settings->meta_padding_left : '0';
100
- $meta_padding_right = ! empty( $settings->meta_padding_right ) ? $settings->meta_padding_right : '0';
101
- $meta_alignment = ! empty( $settings->meta_alignment ) ? $settings->meta_alignment : 'center';
102
- $meta_font_size = ! empty( $settings->meta_font_size ) ? $settings->meta_font_size : '0';
103
- $meta_font_family = ! empty( $settings->meta_font_family['family'] ) ? $settings->meta_font_family['family'] : 'Roboto';
104
- $meta_font_weight = ! empty( $settings->meta_font_family['weight'] ) ? $settings->meta_font_family['weight'] : '400';
105
- $meta_transform = ! empty( $settings->meta_transform ) ? $settings->meta_transform : 'none';
106
- $meta_font_style = ! empty( $settings->meta_font_style ) ? $settings->meta_font_style : 'none';
107
- $meta_line_height = ! empty( $settings->meta_line_height ) ? $settings->meta_line_height : 'inherit';
108
- $meta_letter_spacing = ! empty( $settings->meta_letter_spacing ) ? $settings->meta_letter_spacing : '0';
109
- echo '.fl-node-' . $id . ' .obfx-post-grid-meta{
110
- padding-top: ' . $meta_padding_top . 'px;
111
- padding-bottom: ' . $meta_padding_bottom . 'px;
112
- padding-left: ' . $meta_padding_left . 'px;
113
- padding-right: ' . $meta_padding_right . 'px;
114
- font-size:' . $meta_font_size . 'px;
115
- font-family:' . $meta_font_family . ';
116
- font-weight:' . $meta_font_weight . ';
117
- text-transform:' . $meta_transform . ';
118
- font-style:' . $meta_font_style . ';
119
- line-height:' . $meta_line_height . 'px;
120
- letter-spacing:' . $meta_letter_spacing . 'px;
121
- text-align: ' . $meta_alignment . ';
122
- } ';
123
-
124
-
125
- $content_padding_top = ! empty( $settings->content_padding_top ) ? $settings->content_padding_top : '0';
126
- $content_padding_bottom = ! empty( $settings->content_padding_bottom ) ? $settings->content_padding_bottom : '0';
127
- $content_padding_left = ! empty( $settings->content_padding_left ) ? $settings->content_padding_left : '0';
128
- $content_padding_right = ! empty( $settings->content_padding_right ) ? $settings->content_padding_right : '0';
129
- $content_alignment = ! empty( $settings->content_alignment ) ? $settings->content_alignment : 'center';
130
- $content_font_size = ! empty( $settings->content_font_size ) ? $settings->content_font_size : '0';
131
- $content_font_family = ! empty( $settings->content_font_family['family'] ) ? $settings->content_font_family['family'] : 'Roboto';
132
- $content_font_weight = ! empty( $settings->content_font_family['weight'] ) ? $settings->content_font_family['weight'] : '400';
133
- $content_transform = ! empty( $settings->content_transform ) ? $settings->content_transform : 'none';
134
- $content_font_style = ! empty( $settings->content_font_style ) ? $settings->content_font_style : 'none';
135
- $content_line_height = ! empty( $settings->content_line_height ) ? $settings->content_line_height : 'inherit';
136
- $content_letter_spacing = ! empty( $settings->content_letter_spacing ) ? $settings->content_letter_spacing : '0';
137
-
138
- echo '.fl-node-' . $id . ' .obfx-post-content{
139
- padding-top: ' . $content_padding_top . 'px;
140
- padding-bottom: ' . $content_padding_bottom . 'px;
141
- padding-left: ' . $content_padding_left . 'px;
142
- padding-right: ' . $content_padding_right . 'px;
143
- text-align: ' . $content_alignment . ';
144
- font-size:' . $content_font_size . 'px;
145
- font-family:' . $content_font_family . ';
146
- font-weight:' . $content_font_weight . ';
147
- text-transform:' . $content_transform . ';
148
- font-style:' . $content_font_style . ';
149
- line-height:' . $content_line_height . 'px;
150
- letter-spacing:' . $content_letter_spacing . 'px;
151
- } ';
152
-
153
- $pagination_font_size = ! empty( $settings->pagination_font_size ) ? $settings->pagination_font_size : '0';
154
- $pagination_font_family = ! empty( $settings->pagination_font_family['family'] ) ? $settings->pagination_font_family['family'] : 'Roboto';
155
- $pagination_font_weight = ! empty( $settings->pagination_font_family['weight'] ) ? $settings->pagination_font_family['weight'] : '400';
156
- $pagination_transform = ! empty( $settings->pagination_transform ) ? $settings->pagination_transform : 'none';
157
- $pagination_font_style = ! empty( $settings->pagination_font_style ) ? $settings->pagination_font_style : 'none';
158
- $pagination_line_height = ! empty( $settings->pagination_line_height ) ? $settings->pagination_line_height : 'inherit';
159
- $pagination_letter_spacing = ! empty( $settings->pagination_letter_spacing ) ? $settings->pagination_letter_spacing : '0';
160
- $pagination_alignment = ! empty( $settings->pagination_alignment ) ? $settings->pagination_alignment : 'center';
161
- echo '.fl-node-' . $id . ' .obfx-post-grid-pagination li a, .fl-node-' . $id . ' .obfx-post-grid-pagination li {
162
- font-size:' . $pagination_font_size . 'px;
163
- font-family:' . $pagination_font_family . ';
164
- font-weight:' . $pagination_font_weight . ';
165
- text-transform:' . $pagination_transform . ';
166
- font-style:' . $pagination_font_style . ';
167
- line-height:' . $pagination_line_height . 'px;
168
- letter-spacing:' . $pagination_letter_spacing . 'px;
169
- }';
170
-
171
- echo '.fl-node-' . $id . ' .obfx-post-grid-pagination{
172
- text-align: ' . $pagination_alignment . ';
173
- }';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/post-grid/includes/frontend.php DELETED
@@ -1,283 +0,0 @@
1
- <?php
2
- /**
3
- * This file is used to render each pricing module instance.
4
- * You have access to two variables in this file:
5
- *
6
- * $module An instance of your module class.
7
- * $settings The module's settings.
8
- */
9
-
10
-
11
- if ( ! function_exists( 'obfx_show_post_grid_thumbnail' ) ) {
12
- /**
13
- * Display post grid image.
14
- *
15
- * @param array $settings Post grid settings.
16
- */
17
- function obfx_show_post_grid_thumbnail( $settings ) {
18
- if ( empty( $settings ) ) {
19
- return;
20
- }
21
-
22
- $show_post_thumbnail = ! empty( $settings->show_post_thumbnail ) ? $settings->show_post_thumbnail : '';
23
- if ( $show_post_thumbnail === 'no' ) {
24
- return;
25
- }
26
-
27
- $size = ! empty( $settings->image_size ) ? $settings->image_size : 'post-thumbnail';
28
- $pid = get_the_ID();
29
- $img = get_the_post_thumbnail_url( $pid, $size );
30
- if ( ! empty( $img ) ) {
31
- $thumbnail_shadow = ! empty( $settings->thumbnail_shadow ) && $settings->thumbnail_shadow === 'yes' ? 'obfx-card' : '';
32
- echo '<div class="obfx-post-grid-thumbnail ' . esc_attr( $thumbnail_shadow ) . '">';
33
- if ( ! empty( $settings->show_thumbnail_link ) && $settings->show_thumbnail_link === 'yes' ) {
34
- echo '<a href="' . get_permalink() . '">';
35
- }
36
- echo '<img src="' . esc_url( $img ) . '"/></div>';
37
- if ( ! empty( $settings->show_thumbnail_link ) && $settings->show_thumbnail_link === 'yes' ) {
38
- echo '</a>';
39
- }
40
- }
41
- }
42
- }
43
-
44
- if ( ! function_exists( 'obfx_show_post_grid_title' ) ) {
45
- /**
46
- * Display post grid title.
47
- *
48
- * @param array $settings Post grid settings.
49
- */
50
- function obfx_show_post_grid_title( $settings ) {
51
- if ( empty( $settings ) ) {
52
- return;
53
- }
54
-
55
- $show_post_title = ! empty( $settings->show_post_title ) ? $settings->show_post_title : '';
56
- if ( $show_post_title === 'no' ) {
57
- return;
58
- }
59
-
60
- if ( ! empty( $settings->show_title_link ) && $settings->show_title_link === 'yes' ) {
61
- echo '<a href="' . get_permalink() . '">';
62
- }
63
- $tag = ! empty( $settings->title_tag ) ? $settings->title_tag : 'h4';
64
- the_title( '<' . $tag . ' class="obfx-post-grid-title">', '</' . $tag . '>' );
65
- if ( ! empty( $settings->show_title_link ) && $settings->show_title_link === 'yes' ) {
66
- echo '</a>';
67
- }
68
- }
69
- }
70
-
71
- if ( ! function_exists( 'obfx_show_post_grid_meta' ) ) {
72
- /**
73
- * Display post grid meta.
74
- *
75
- * @param array $settings Post grid settings.
76
- */
77
- function obfx_show_post_grid_meta( $settings ) {
78
- if ( empty( $settings ) ) {
79
- return;
80
- }
81
-
82
- $show_post_meta = ! empty( $settings->show_post_meta ) ? $settings->show_post_meta : '';
83
- if ( $show_post_meta === 'no' ) {
84
- return;
85
- }
86
-
87
- $pid = get_the_ID();
88
- $meta_data = ! empty( $settings->meta_data ) ? ( is_array( $settings->meta_data ) ? $settings->meta_data : array( $settings->meta_data ) ) : array();
89
- $show_icons = ! empty( $settings->show_icons ) ? $settings->show_icons : '';
90
- echo '<div class="obfx-post-grid-meta">';
91
- if ( in_array( 'author', $meta_data ) ) {
92
- $author = get_the_author( $pid );
93
- if ( ! empty( $author ) ) {
94
- echo '<div class="obfx-author">';
95
- if ( $show_icons === 'yes' ) {
96
- echo '<i class="fa fa-user"></i>';
97
- }
98
- printf(
99
- /* translators: %1$s is Author name wrapped, %2$s is Time */
100
- esc_html__( 'By %1$s', 'themeisle-companion' ),
101
- sprintf(
102
- /* translators: %1$s is Author name, %2$s is author link */
103
- '<a href="%2$s" title="%1$s"><b>%1$s</b></a>',
104
- esc_html( get_the_author() ),
105
- esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) )
106
- )
107
- );
108
- echo '</div>';
109
- }
110
- }
111
-
112
- if ( in_array( 'date', $meta_data ) ) {
113
- echo '<div class="obfx-date">';
114
- if ( $show_icons === 'yes' ) {
115
- echo '<i class="fa fa-calendar"></i>';
116
- }
117
- echo get_the_date();
118
- echo '</div>';
119
- }
120
-
121
- if ( in_array( 'category', $meta_data ) ) {
122
- $cat = get_the_category();
123
- if ( ! empty( $cat ) ) {
124
- echo '<div class="obfx-category">';
125
- if ( $show_icons === 'yes' ) {
126
- echo '<i class="fa fa-list"></i>';
127
- }
128
- foreach ( $cat as $category ) {
129
- $cat_id = $category->term_id;
130
- $link = get_category_link( $cat_id );
131
- $name = $category->name;
132
- if ( ! empty( $name ) ) {
133
- if ( ! empty( $link ) ) {
134
- echo '<a href="' . esc_url( $link ) . '">';
135
- }
136
- echo $name;
137
- if ( ! empty( $link ) ) {
138
- echo '</a>';
139
- }
140
- }
141
- }
142
- echo '</div>';
143
- }
144
- }
145
-
146
- if ( in_array( 'tags', $meta_data ) ) {
147
- $tags = wp_get_post_tags( $pid );
148
- if ( ! empty( $tags ) ) {
149
- echo '<div class="obfx-tags">';
150
- if ( $show_icons === 'yes' ) {
151
- echo '<i class="fa fa-tag"></i>';
152
- }
153
- foreach ( $tags as $tag ) {
154
- $tag_id = $tag->term_id;
155
- $link = get_tag_link( $tag_id );
156
- $name = $tag->name;
157
- if ( ! empty( $name ) ) {
158
- if ( ! empty( $link ) ) {
159
- echo '<a href="' . esc_url( $link ) . '">';
160
- }
161
- echo $name;
162
- if ( ! empty( $link ) ) {
163
- echo '</a>';
164
- }
165
- }
166
- }
167
- echo '</div>';
168
- }
169
- }
170
-
171
- if ( in_array( 'comments', $meta_data ) ) {
172
- echo '<div class=obfx-comments">';
173
- if ( $show_icons === 'yes' ) {
174
- echo '<i class="fa fa-comment"></i>';
175
- }
176
- $comments_number = get_comments_number();
177
- if ( 0 == ! $comments_number ) {
178
- if ( 1 === $comments_number ) {
179
- /* translators: %s: post title */
180
- _x( 'One comment', 'comments title', 'themeisle-companion' );
181
- } else {
182
- printf(
183
- /* translators: 1: number of comments, 2: post title */
184
- _nx(
185
- '%1$s Comment',
186
- '%1$s Comments',
187
- $comments_number,
188
- 'comments title',
189
- 'themeisle-companion'
190
- ),
191
- number_format_i18n( $comments_number )
192
- );
193
- }
194
- }
195
- echo '</div>';
196
- }
197
- echo '</div>';
198
- }
199
- }
200
-
201
- if ( ! function_exists( 'obfx_show_post_grid_content' ) ) {
202
- /**
203
- * Display post grid content.
204
- *
205
- * @param array $settings Post grid settings.
206
- */
207
- function obfx_show_post_grid_content( $settings ) {
208
- if ( empty( $settings ) ) {
209
- return;
210
- }
211
-
212
- $show_post_content = ! empty( $settings->show_post_content ) ? $settings->show_post_content : '';
213
- if ( $show_post_content === 'no' ) {
214
- return;
215
- }
216
-
217
- $number_of_words = ! empty( $settings->content_length ) ? $settings->content_length : '';
218
- echo '<div class="obfx-post-content">';
219
- if ( ! empty( $number_of_words ) ) {
220
- $content = obfx_get_limited_content( $number_of_words, $settings );
221
- echo '<p>' . wp_kses_post( $content ) . '</p>';
222
- }
223
- echo '</div>';
224
- }
225
- }
226
-
227
- if ( ! function_exists( 'obfx_get_limited_content' ) ) {
228
- /**
229
- * Get content with limited number of words.
230
- *
231
- * @param int $limit Words limit.
232
- *
233
- * @return string
234
- */
235
- function obfx_get_limited_content( $limit, $settings ) {
236
- $content = explode( ' ', get_the_content(), $limit );
237
-
238
- $show_read_more = ! empty( $settings->show_read_more ) ? $settings->show_read_more : '';
239
- $read_more = $show_read_more === 'yes' ? ( ! empty( $settings->read_more_text ) ? '<a class="obfx-post-grid-read-more" href="' . get_the_permalink() . '">' . $settings->read_more_text . '</a>' : '' ) : '';
240
- if ( count( $content ) >= $limit ) {
241
- array_pop( $content );
242
- $content = implode( ' ', $content );
243
- $content = strip_tags( $content );
244
- $content = $content . '...' . wp_kses_post( $read_more );
245
- } else {
246
- $content = implode( ' ', $content );
247
- }
248
-
249
- $content = preg_replace( '/\[.+\]/', '', $content );
250
- $content = apply_filters( 'the_content', $content );
251
- $content = str_replace( ']]>', ']]&gt;', $content );
252
-
253
- return $content;
254
- }
255
- }
256
-
257
-
258
-
259
- $query = FLBuilderLoop::query( $settings );
260
- if ( $query->have_posts() ) {
261
-
262
- $class_to_add = ! empty( $settings->card_layout ) && $settings->card_layout === 'yes' ? 'obfx-card' : '';
263
- while ( $query->have_posts() ) {
264
- $query->the_post();
265
-
266
- echo '<div class="obfx-post-grid-wrapper">';
267
- echo '<div class="obfx-post-grid ' . esc_attr( $class_to_add ) . '">';
268
- obfx_show_post_grid_thumbnail( $settings );
269
- obfx_show_post_grid_title( $settings );
270
- obfx_show_post_grid_meta( $settings );
271
- obfx_show_post_grid_content( $settings );
272
- echo '</div>';
273
- echo '</div>';
274
- }
275
-
276
- if ( $settings->show_pagination === 'yes' ) {
277
- echo '<div class="obfx-post-grid-pagination">';
278
- FLBuilderLoop::pagination( $query );
279
- echo '</div>';
280
- }
281
- }
282
-
283
- wp_reset_postdata();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/post-grid/includes/loop-settings.php DELETED
@@ -1,287 +0,0 @@
1
- <?php
2
-
3
- // Default Settings
4
- $default_posts_per_page = get_option( 'posts_per_page' );
5
- $defaults = array(
6
- 'data_source' => 'custom_query',
7
- 'post_type' => 'post',
8
- 'order_by' => 'date',
9
- 'order' => 'DESC',
10
- 'offset' => 0,
11
- 'users' => '',
12
- 'posts_per_page' => $default_posts_per_page,
13
- );
14
-
15
- $tab_defaults = isset( $tab['defaults'] ) ? $tab['defaults'] : array();
16
- $settings = (object) array_merge( $defaults, $tab_defaults, (array) $settings );
17
- $settings = apply_filters( 'fl_builder_loop_settings', $settings ); // Allow extension of default Values
18
-
19
- do_action( 'fl_builder_loop_settings_before_form', $settings ); // e.g Add custom FLBuilder::render_settings_field()
20
-
21
- ?>
22
- <div class="fl-custom-query fl-loop-data-source" data-source="custom_query">
23
- <div id="fl-builder-settings-section-general" class="fl-builder-settings-section">
24
- <h3 class="fl-builder-settings-title"><?php _e( 'Custom Query', 'themeisle-companion' ); ?></h3>
25
- <table class="fl-form-table">
26
- <?php
27
-
28
- // Post type
29
- FLBuilder::render_settings_field(
30
- 'post_type', array(
31
- 'type' => 'post-type',
32
- 'label' => esc_html__( 'Post Type', 'themeisle-companion' ),
33
- ), $settings
34
- );
35
-
36
- // Order
37
- FLBuilder::render_settings_field(
38
- 'order', array(
39
- 'type' => 'select',
40
- 'label' => esc_html__( 'Order', 'themeisle-companion' ),
41
- 'options' => array(
42
- 'DESC' => esc_html__( 'Descending', 'themeisle-companion' ),
43
- 'ASC' => esc_html__( 'Ascending', 'themeisle-companion' ),
44
- ),
45
- ), $settings
46
- );
47
-
48
- // Order by
49
- FLBuilder::render_settings_field(
50
- 'order_by', array(
51
- 'type' => 'select',
52
- 'label' => esc_html__( 'Order By', 'themeisle-companion' ),
53
- 'options' => array(
54
- 'author' => esc_html__( 'Author', 'themeisle-companion' ),
55
- 'comment_count' => esc_html__( 'Comment Count', 'themeisle-companion' ),
56
- 'date' => esc_html__( 'Date', 'themeisle-companion' ),
57
- 'modified' => esc_html__( 'Date Last Modified', 'themeisle-companion' ),
58
- 'ID' => esc_html__( 'ID', 'themeisle-companion' ),
59
- 'menu_order' => esc_html__( 'Menu Order', 'themeisle-companion' ),
60
- 'meta_value' => esc_html__( 'Meta Value (Alphabetical)', 'themeisle-companion' ),
61
- 'meta_value_num' => esc_html__( 'Meta Value (Numeric)', 'themeisle-companion' ),
62
- 'rand' => esc_html__( 'Random', 'themeisle-companion' ),
63
- 'title' => esc_html__( 'Title', 'themeisle-companion' ),
64
- ),
65
- 'toggle' => array(
66
- 'meta_value' => array(
67
- 'fields' => array( 'order_by_meta_key' ),
68
- ),
69
- 'meta_value_num' => array(
70
- 'fields' => array( 'order_by_meta_key' ),
71
- ),
72
- ),
73
- ), $settings
74
- );
75
-
76
- // Meta Key
77
- FLBuilder::render_settings_field(
78
- 'order_by_meta_key', array(
79
- 'type' => 'text',
80
- 'label' => esc_html__( 'Meta Key', 'themeisle-companion' ),
81
- ), $settings
82
- );
83
-
84
- // Offset
85
- FLBuilder::render_settings_field(
86
- 'offset', array(
87
- 'type' => 'text',
88
- 'label' => _x( 'Offset', 'How many posts to skip.', 'themeisle-companion' ),
89
- 'default' => '0',
90
- 'size' => '4',
91
- 'help' => esc_html__( 'Skip this many posts that match the specified criteria.', 'themeisle-companion' ),
92
- ), $settings
93
- );
94
-
95
- // Posts per page
96
- FLBuilder::render_settings_field(
97
- 'posts_per_page', array(
98
- 'type' => 'obfx_number',
99
- 'label' => esc_html__( 'Posts per page', 'themeisle-companion' ),
100
- 'default' => $default_posts_per_page,
101
- 'min' => '-1',
102
- 'help' => esc_html__( '-1 means all posts', 'themeisle-companion' ),
103
- ), $settings
104
- );
105
-
106
- // Columns
107
- FLBuilder::render_settings_field(
108
- 'columns', array(
109
- 'type' => 'obfx_number',
110
- 'label' => esc_html__( 'Number of columns', 'themeisle-companion' ),
111
- 'default' => '3',
112
- 'min' => '1',
113
- 'max' => '5',
114
- ), $settings
115
- );
116
- ?>
117
- </table>
118
- </div>
119
- <div id="fl-builder-settings-section-filter" class="fl-builder-settings-section">
120
- <h3 class="fl-builder-settings-title"><?php _e( 'Filter', 'themeisle-companion' ); ?></h3>
121
- <?php foreach ( FLBuilderLoop::post_types() as $slug => $type ) : ?>
122
- <table class="fl-form-table fl-custom-query-filter fl-custom-query-<?php echo $slug; ?>-filter"
123
- <?php
124
- if ( $slug == $settings->post_type ) {
125
- echo 'style="display:table;"';}
126
- ?>
127
- >
128
- <?php
129
-
130
- // Posts
131
- FLBuilder::render_settings_field(
132
- 'posts_' . $slug, array(
133
- 'type' => 'suggest',
134
- 'action' => 'fl_as_posts',
135
- 'data' => $slug,
136
- 'label' => $type->label,
137
- 'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $type->label ),
138
- 'matching' => true,
139
- ), $settings
140
- );
141
-
142
- // Taxonomies
143
- $taxonomies = FLBuilderLoop::taxonomies( $slug );
144
-
145
- foreach ( $taxonomies as $tax_slug => $tax ) {
146
-
147
- FLBuilder::render_settings_field(
148
- 'tax_' . $slug . '_' . $tax_slug, array(
149
- 'type' => 'suggest',
150
- 'action' => 'fl_as_terms',
151
- 'data' => $tax_slug,
152
- 'label' => $tax->label,
153
- 'help' => sprintf( esc_html__( 'Enter a list of %1$s.', 'themeisle-companion' ), $tax->label ),
154
- 'matching' => true,
155
- ), $settings
156
- );
157
- }
158
-
159
- ?>
160
- </table>
161
- <?php endforeach; ?>
162
- <table class="fl-form-table">
163
- <?php
164
-
165
- // Author
166
- FLBuilder::render_settings_field(
167
- 'users', array(
168
- 'type' => 'suggest',
169
- 'action' => 'fl_as_users',
170
- 'label' => esc_html__( 'Authors', 'themeisle-companion' ),
171
- 'help' => esc_html__( 'Enter a list of authors usernames.', 'themeisle-companion' ),
172
- 'matching' => true,
173
- ), $settings
174
- );
175
-
176
- ?>
177
- </table>
178
- </div>
179
- <div id="fl-builder-settings-section-filter" class="fl-builder-settings-section">
180
- <h3 class="fl-builder-settings-title"><?php _e( 'Appearance', 'themeisle-companion' ); ?></h3>
181
- <table class="fl-form-table">
182
-
183
- <?php
184
- // Vertical align
185
- FLBuilder::render_settings_field(
186
- 'card_vertical_align', array(
187
- 'type' => 'select',
188
- 'label' => esc_html__( 'Vertical align', 'themeisle-companion' ),
189
- 'default' => 'grid',
190
- 'options' => array(
191
- 'top' => esc_html__( 'Top', 'themeisle-companion' ),
192
- 'middle' => esc_html__( 'Middle', 'themeisle-companion' ),
193
- 'bottom' => esc_html__( 'Bottom', 'themeisle-companion' ),
194
- ),
195
- ), $settings
196
- );
197
-
198
- // Display type
199
- FLBuilder::render_settings_field(
200
- 'display_type', array(
201
- 'type' => 'select',
202
- 'label' => esc_html__( 'Display type', 'themeisle-companion' ),
203
- 'default' => 'grid',
204
- 'options' => array(
205
- 'grid' => esc_html__( 'Grid', 'themeisle-companion' ),
206
- 'list' => esc_html__( 'List', 'themeisle-companion' ),
207
- ),
208
- ), $settings
209
- );
210
-
211
- // Card layout
212
- FLBuilder::render_settings_field(
213
- 'card_layout', array(
214
- 'type' => 'obfx_toggle',
215
- 'label' => esc_html__( 'Card layout', 'themeisle-companion' ),
216
- ), $settings
217
- );
218
-
219
- // Padding top
220
- FLBuilder::render_settings_field(
221
- 'card_margin_top', array(
222
- 'type' => 'obfx_number',
223
- 'label' => esc_html__( 'Margin top', 'themeisle-companion' ),
224
- 'default' => '0',
225
- 'min' => '0',
226
- ), $settings
227
- );
228
-
229
- // Padding bottom
230
- FLBuilder::render_settings_field(
231
- 'card_margin_bottom', array(
232
- 'type' => 'obfx_number',
233
- 'label' => esc_html__( 'Margin bottom', 'themeisle-companion' ),
234
- 'default' => '30',
235
- 'min' => '0',
236
- ), $settings
237
- );
238
-
239
- // Background color
240
- FLBuilder::render_settings_field(
241
- 'post_bg_color', array(
242
- 'type' => 'color',
243
- 'label' => __( 'Background color', 'themeisle-companion' ),
244
- 'show_reset' => true,
245
- 'show_alpha' => true,
246
- 'preview' => array(
247
- 'type' => 'css',
248
- 'selector' => '.obfx-post-grid',
249
- 'property' => 'background-color',
250
- ),
251
-
252
- ), $settings
253
- );
254
-
255
- // Link color
256
- FLBuilder::render_settings_field(
257
- 'post_link_color', array(
258
- 'type' => 'color',
259
- 'label' => __( 'Link color', 'themeisle-companion' ),
260
- 'show_reset' => true,
261
- 'preview' => array(
262
- 'type' => 'css',
263
- 'selector' => '.obfx-post-grid a, .obfx-post-grid-pagination a',
264
- 'property' => 'color',
265
- ),
266
- ), $settings
267
- );
268
-
269
- // Link color
270
- FLBuilder::render_settings_field(
271
- 'post_text_color', array(
272
- 'type' => 'color',
273
- 'label' => __( 'Text color', 'themeisle-companion' ),
274
- 'show_reset' => true,
275
- 'preview' => array(
276
- 'type' => 'css',
277
- 'selector' => '.obfx-post-grid, .obfx-post-grid-pagination',
278
- 'property' => 'color',
279
- ),
280
- ), $settings
281
- );
282
- ?>
283
- </table>
284
- </div>
285
- </div>
286
- <?php
287
- do_action( 'fl_builder_loop_settings_after_form', $settings ); // e.g Add custom FLBuilder::render_settings_field()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/post-grid/post-grid.php DELETED
@@ -1,348 +0,0 @@
1
- <?php
2
-
3
- // Get the module directory.
4
- $module_directory = $this->get_dir();
5
-
6
- // Include custom fields
7
- require_once( $module_directory . '/custom-fields/toggle-field/toggle_field.php' );
8
-
9
- // Include common functions file.
10
- require_once( $module_directory . '/inc/common-functions.php' );
11
-
12
- /**
13
- * Class PostGridModule
14
- */
15
- class PostGridModule extends FLBuilderModule {
16
-
17
- /**
18
- * Constructor function for the module. You must pass the
19
- * name, description, dir and url in an array to the parent class.
20
- *
21
- * @method __construct
22
- */
23
- public function __construct() {
24
- parent::__construct(
25
- array(
26
- 'name' => esc_html__( 'Post Grid', 'themeisle-companion' ),
27
- 'description' => esc_html__( 'A method to display your posts.', 'themeisle-companion' ),
28
- 'category' => esc_html__( 'Orbit Fox Modules', 'themeisle-companion' ),
29
- 'dir' => BEAVER_WIDGETS_PATH . 'modules/post-grid/',
30
- 'url' => BEAVER_WIDGETS_URL . 'modules/post-grid/',
31
- )
32
- );
33
- }
34
- }
35
-
36
- /**
37
- * Register the module and its form settings.
38
- */
39
- $image_sizes = get_intermediate_image_sizes();
40
- $choices = array();
41
- if ( ! empty( $image_sizes ) ) {
42
- foreach ( $image_sizes as $size ) {
43
- $name = str_replace( '_', ' ', $size );
44
- $name = str_replace( '-', ' ', $name );
45
- $choices[ $size ] = ucfirst( $name );
46
- }
47
- }
48
- FLBuilder::register_module(
49
- 'PostGridModule', array(
50
- 'loop_settings' => array(
51
- 'title' => esc_html__( 'Loop Settings', 'themeisle-companion' ),
52
- 'file' => BEAVER_WIDGETS_PATH . 'modules/post-grid/includes/loop-settings.php',
53
- ),
54
- 'image_options' => array(
55
- 'title' => esc_html__( 'Image options', 'themeisle-companion' ), // Tab title
56
- 'sections' => array(
57
- 'general' => array(
58
- 'title' => '',
59
- 'fields' => array(
60
- 'show_post_thumbnail' => array(
61
- 'type' => 'obfx_toggle',
62
- 'label' => esc_html__( 'Show post thumbnail', 'themeisle-companion' ),
63
- 'default' => 'yes',
64
- ),
65
- 'show_thumbnail_link' => array(
66
- 'type' => 'obfx_toggle',
67
- 'label' => esc_html__( 'Link in thumbnail', 'themeisle-companion' ),
68
- 'default' => 'no',
69
- ),
70
- 'thumbnail_shadow' => array(
71
- 'type' => 'obfx_toggle',
72
- 'label' => esc_html__( 'Enable thumbnail shadow', 'themeisle-companion' ),
73
- 'default' => 'no',
74
- ),
75
- 'image_size' => array(
76
- 'type' => 'select',
77
- 'label' => esc_html__( 'Image size', 'themeisle-companion' ),
78
- 'default' => 'medium_large',
79
- 'options' => $choices,
80
-
81
- ),
82
- 'image_alignment' => array(
83
- 'type' => 'select',
84
- 'label' => esc_html__( 'Image alignment', 'themeisle-companion' ),
85
- 'default' => 'center',
86
- 'options' => array(
87
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
88
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
89
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
90
- ),
91
- 'toggle' => array(
92
- 'left' => array(
93
- 'fields' => array('thumbnail_margin_left', 'thumbnail_margin_right'),
94
- ),
95
- 'right' => array(
96
- 'fields' => array('thumbnail_margin_left', 'thumbnail_margin_right'),
97
- ),
98
- ),
99
- ),
100
- ),
101
- ),
102
- 'thumbnail_margins' => themeisle_four_fields_control(
103
- array(
104
- 'default' => array(
105
- 'top' => 0,
106
- 'bottom' => 30,
107
- 'left' => 0,
108
- 'right' => 0,
109
- ),
110
- 'selector' => '.obfx-post-grid-thumbnail',
111
- 'field_name_prefix' => 'thumbnail_margin_',
112
- 'type' => 'margin',
113
- )
114
- ),
115
- ),
116
- ),
117
- 'title_options' => array(
118
- 'title' => esc_html__( 'Title options', 'themeisle-companion' ), // Tab title
119
- 'sections' => array(
120
- 'general' => array(
121
- 'title' => '',
122
- 'fields' => array(
123
- 'show_post_title' => array(
124
- 'type' => 'obfx_toggle',
125
- 'label' => esc_html__( 'Show post title', 'themeisle-companion' ),
126
- 'default' => 'yes',
127
- ),
128
- 'show_title_link' => array(
129
- 'type' => 'obfx_toggle',
130
- 'label' => esc_html__( 'Link on title', 'themeisle-companion' ),
131
- 'default' => 'yes',
132
- ),
133
- 'title_alignment' => array(
134
- 'type' => 'select',
135
- 'label' => esc_html__( 'Title alignment', 'themeisle-companion' ),
136
- 'default' => 'center',
137
- 'options' => array(
138
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
139
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
140
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
141
- ),
142
-
143
- ),
144
- 'title_tag' => array(
145
- 'type' => 'select',
146
- 'label' => esc_html__( 'Title tag', 'themeisle-companion' ),
147
- 'default' => 'h5',
148
- 'options' => array(
149
- 'h1' => esc_html__( 'H1', 'themeisle-companion' ),
150
- 'h2' => esc_html__( 'H2', 'themeisle-companion' ),
151
- 'h3' => esc_html__( 'H3', 'themeisle-companion' ),
152
- 'h4' => esc_html__( 'H4', 'themeisle-companion' ),
153
- 'h5' => esc_html__( 'H5', 'themeisle-companion' ),
154
- 'h6' => esc_html__( 'H6', 'themeisle-companion' ),
155
- 'span' => esc_html__( 'span', 'themeisle-companion' ),
156
- 'p' => esc_html__( 'p', 'themeisle-companion' ),
157
- 'div' => esc_html__( 'div', 'themeisle-companion' ),
158
- ),
159
- ),
160
- ),
161
- ),
162
- 'title_margins' => themeisle_four_fields_control(
163
- array(
164
- 'default' => array(
165
- 'top' => 0,
166
- 'bottom' => 0,
167
- 'left' => 0,
168
- 'right' => 0,
169
- ),
170
- 'selector' => '.obfx-post-grid-title',
171
- 'field_name_prefix' => 'title_padding_',
172
- 'type' => 'padding',
173
- )
174
- ),
175
- 'title_typography' => themeisle_typography_settings(
176
- array(
177
- 'prefix' => 'title_',
178
- 'selector' => '.obfx-post-grid-title',
179
- 'font_size_default' => 25,
180
- )
181
- ),
182
- ),
183
- ),
184
- 'meta_options' => array(
185
- 'title' => esc_html__( 'Meta options', 'themeisle-companion' ), // Tab title
186
- 'sections' => array(
187
- 'general' => array(
188
- 'title' => '',
189
- 'fields' => array(
190
- 'show_post_meta' => array(
191
- 'type' => 'obfx_toggle',
192
- 'label' => esc_html__( 'Show post meta', 'themeisle-companion' ),
193
- 'default' => 'yes',
194
- ),
195
- 'show_icons' => array(
196
- 'type' => 'obfx_toggle',
197
- 'label' => esc_html__( 'Show icons', 'themeisle-companion' ),
198
- 'default' => 'yes',
199
- 'help' => esc_html__( 'If icons doesn\'t show you have to enqueue FontAwesome in your theme.', 'themeisle-companion' ),
200
- ),
201
- 'meta_data' => array(
202
- 'type' => 'select',
203
- 'label' => esc_html__( 'Display', 'themeisle-companion' ),
204
- 'default' => array('author', 'date'),
205
- 'options' => array(
206
- 'author' => esc_html__( 'Author', 'themeisle-companion' ),
207
- 'date' => esc_html__( 'Date', 'themeisle-companion' ),
208
- 'category' => esc_html__( 'Category', 'themeisle-companion' ),
209
- 'tags' => esc_html__( 'Tags', 'themeisle-companion' ),
210
- 'comments' => esc_html__( 'Comments', 'themeisle-companion' ),
211
- ),
212
- 'multi-select' => true,
213
- ),
214
- 'meta_alignment' => array(
215
- 'type' => 'select',
216
- 'label' => esc_html__( 'Meta alignment', 'themeisle-companion' ),
217
- 'default' => 'center',
218
- 'options' => array(
219
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
220
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
221
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
222
- ),
223
- ),
224
- ),
225
- ),
226
- 'meta_margins' => themeisle_four_fields_control(
227
- array(
228
- 'default' => array(
229
- 'top' => 0,
230
- 'bottom' => 0,
231
- 'left' => 0,
232
- 'right' => 0,
233
- ),
234
- 'selector' => '.obfx-post-grid-meta',
235
- 'field_name_prefix' => 'meta_padding_',
236
- 'type' => 'padding',
237
- )
238
- ),
239
- 'meta_typography' => themeisle_typography_settings(
240
- array(
241
- 'prefix' => 'meta_',
242
- 'selector' => '.obfx-post-grid-meta',
243
- 'font_size_default' => 15,
244
- )
245
- ),
246
- ),
247
- ),
248
- 'content_options' => array(
249
- 'title' => esc_html__( 'Content options', 'themeisle-companion' ), // Tab title
250
- 'sections' => array(
251
- 'general' => array(
252
- 'title' => '',
253
- 'fields' => array(
254
- 'show_post_content' => array(
255
- 'type' => 'obfx_toggle',
256
- 'label' => esc_html__( 'Show post content', 'themeisle-companion' ),
257
- 'default' => 'yes',
258
- ),
259
- 'show_read_more' => array(
260
- 'type' => 'obfx_toggle',
261
- 'label' => esc_html__( 'Show read more', 'themeisle-companion' ),
262
- 'default' => 'yes',
263
- ),
264
- 'content_length' => array(
265
- 'type' => 'obfx_number',
266
- 'label' => esc_html__( 'Number of words', 'themeisle-companion' ),
267
- 'default' => '30',
268
- 'min' => '1',
269
- ),
270
- 'read_more_text' => array(
271
- 'type' => 'text',
272
- 'label' => esc_html__( 'Read more text', 'themeisle-companion' ),
273
- 'default' => esc_html__( 'Read more', 'themeisle-companion' ),
274
- 'maxlength' => '70',
275
- 'size' => '30',
276
- 'preview' => array(
277
- 'type' => 'text',
278
- 'selector' => '.obfx-post-grid-read-more',
279
- ),
280
- ),
281
- 'content_alignment' => array(
282
- 'type' => 'select',
283
- 'label' => esc_html__( 'Text alignment', 'themeisle-companion' ),
284
- 'default' => 'left',
285
- 'options' => array(
286
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
287
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
288
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
289
- ),
290
-
291
- ),
292
- ),
293
- ),
294
- 'content_margins' => themeisle_four_fields_control(
295
- array(
296
- 'default' => array(
297
- 'top' => 0,
298
- 'bottom' => 0,
299
- 'left' => 15,
300
- 'right' => 15,
301
- ),
302
- 'selector' => '.obfx-post-content',
303
- 'field_name_prefix' => 'content_padding_',
304
- 'type' => 'padding',
305
- )
306
- ),
307
- 'content_typography' => themeisle_typography_settings(
308
- array(
309
- 'prefix' => 'content_',
310
- 'selector' => '.obfx-post-content',
311
- 'font_size_default' => 20,
312
- )
313
- ),
314
- ),
315
- ),
316
- 'pagination_options' => array(
317
- 'title' => esc_html__( 'Pagination options', 'themeisle-companion' ),
318
- 'sections' => array(
319
- 'general' => array(
320
- 'title' => '',
321
- 'fields' => array(
322
- 'show_pagination' => array(
323
- 'type' => 'obfx_toggle',
324
- 'label' => esc_html__( 'Enable pagination', 'themeisle-companion' ),
325
- ),
326
- 'pagination_alignment' => array(
327
- 'type' => 'select',
328
- 'label' => esc_html__( 'Pagination alignment', 'themeisle-companion' ),
329
- 'default' => 'center',
330
- 'options' => array(
331
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
332
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
333
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
334
- ),
335
- ),
336
- ),
337
- ),
338
- 'pagination_typography' => themeisle_typography_settings(
339
- array(
340
- 'prefix' => 'pagination_',
341
- 'selector' => '.obfx-post-grid-pagination',
342
- 'font_size_default' => 20,
343
- )
344
- ),
345
- ),
346
- ),
347
- )
348
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/pricing-table/css/frontend.css DELETED
@@ -1,66 +0,0 @@
1
- /**
2
- * This file should contain frontend styles that
3
- * will be applied to all module instances.
4
- */
5
-
6
- .obfx-card{
7
- display: inline-block;
8
- position: relative;
9
- width: 100%;
10
- margin-bottom: 30px;
11
- border-radius: 6px;
12
- color: rgba(0, 0, 0, 0.87);
13
- background: #fff;
14
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
15
- }
16
-
17
- .obfx-pricing-header{
18
- background-position: center;
19
- background-size: cover;
20
- }
21
-
22
- .obfx-pricing-header *{
23
- padding: 0;
24
- margin: 0;
25
- }
26
-
27
- .blog-post .section-text .obfx-pricing-header p{
28
- margin: 0;
29
- }
30
-
31
-
32
- .obfx-pricing-features{
33
- list-style-type: none;
34
- padding: 0;
35
- margin: 0;
36
- }
37
-
38
- .obfx-pricing-features li{
39
- padding: 0;
40
- margin: 0;
41
- }
42
-
43
- .obfx-pricing-feature-content{
44
- float: left;
45
- width: 100%;
46
- }
47
-
48
- .obfx-pricing-features hr{
49
- margin: 0;
50
- width: 100%;
51
- float: left;
52
- }
53
-
54
- .obfx-pricing-features li i{
55
- margin-right: 10px;
56
- }
57
-
58
- .obfx-plan-bottom{
59
- float: left;
60
- width: 100%;
61
- }
62
-
63
- a.obfx-plan-button{
64
- margin: 0;
65
- text-transform: none;
66
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/pricing-table/includes/frontend.css.php DELETED
@@ -1,271 +0,0 @@
1
- <?php
2
- $text_position = ! empty( $settings->text_position ) ? $settings->text_position : '';
3
- if ( ! empty( $text_position ) ) {
4
- echo '.fl-node-' . $id . ' .obfx-pricing-plan > div,.fl-node-' . $id . ' .obfx-pricing-plan li{';
5
- echo 'text-align:' . $text_position . ';';
6
- echo '}';
7
- }
8
-
9
- $padding_top = ! empty( $settings->top ) ? $settings->top : '';
10
- $padding_bottom = ! empty( $settings->bottom ) ? $settings->bottom : '';
11
- $padding_left = ! empty( $settings->left ) ? $settings->left : '';
12
- $padding_right = ! empty( $settings->right ) ? $settings->right : '';
13
- echo '.fl-node-' . $id . '.obfx-pricing-header{';
14
- echo ! empty( $padding_top ) ? 'padding-top: ' . $padding_top . 'px;' : '';
15
- echo ! empty( $padding_bottom ) ? 'padding-bottom: ' . $padding_bottom . 'px;' : '';
16
- echo ! empty( $padding_left ) ? 'padding-left: ' . $padding_left . 'px;' : '';
17
- echo ! empty( $padding_right ) ? 'padding-right: ' . $padding_right . 'px;' : '';
18
-
19
- $type = $settings->bg_type;
20
- switch ( $type ) {
21
- case 'color':
22
- $bg_color = ! empty( $settings->header_bg_color ) ? $settings->header_bg_color : '';
23
- if ( ! empty( $bg_color ) ) {
24
- $bg_color = strpos( $bg_color, 'rgba' ) !== false ? 'background-color:' . $bg_color : 'background-color:#' . $bg_color;
25
- echo $bg_color . ';';
26
- }
27
- break;
28
- case 'image':
29
- $bg_image = ! empty( $settings->header_bg_image ) ? $settings->header_bg_image : '';
30
- if ( ! empty( $bg_image ) ) {
31
- echo 'background-image:url(' . wp_get_attachment_url( $bg_image ) . ');';
32
- }
33
- break;
34
- case 'gradient':
35
- $gradient_color1 = ! empty( $settings->gradient_color1 ) ? $settings->gradient_color1 : '';
36
- $gradient_color2 = ! empty( $settings->gradient_color2 ) ? $settings->gradient_color2 : '';
37
- $gradient_orientation = ! empty( $settings->gradient_orientation ) ? $settings->gradient_orientation : '';
38
- $pos1 = 'left';
39
- $pos2 = 'left';
40
- $pos3 = 'to right';
41
- switch ( $gradient_orientation ) {
42
- case 'vertical':
43
- $pos1 = 'top';
44
- $pos2 = 'to bottom';
45
- $type = 'linear-gradient';
46
- break;
47
- case 'diagonal_bottom':
48
- $pos1 = '-45deg';
49
- $pos2 = '135deg';
50
- $type = 'linear-gradient';
51
- break;
52
- case 'diagonal_top':
53
- $pos1 = '45deg';
54
- $pos2 = '45deg';
55
- $type = 'linear-gradient';
56
- break;
57
- case 'radial':
58
- $pos1 = 'center, ellipse cover';
59
- $pos2 = 'ellipse at center';
60
- $type = 'radial-gradient';
61
- break;
62
- }
63
-
64
- if ( ! empty( $gradient_color1 ) ) {
65
- $gradient_color1 = strpos( $gradient_color1, 'rgba' ) !== false ? $gradient_color1 : '#' . $gradient_color1;
66
- if ( ! empty( $gradient_color2 ) ) {
67
- $gradient_color2 = strpos( $gradient_color2, 'rgba' ) !== false ? $gradient_color2 : '#' . $gradient_color2;
68
- echo '
69
- background: -moz-' . esc_attr( $type ) . '(' . esc_attr( $pos1 ) . ', ' . esc_attr( $gradient_color1 ) . ' 0%, ' . esc_attr( $gradient_color2 ) . ' 100%);
70
- background: -webkit-' . esc_attr( $type ) . '(' . esc_attr( $pos1 ) . ', ' . esc_attr( $gradient_color1 ) . ' 0%, ' . esc_attr( $gradient_color2 ) . ' 100%);
71
- background: ' . esc_attr( $type ) . '(' . esc_attr( $pos2 ) . ', ' . esc_attr( $gradient_color1 ) . ' 0%, ' . esc_attr( $gradient_color2 ) . ' 100%);';
72
- } else {
73
- echo 'background-color:' . esc_attr( $gradient_color1 ) . ';';
74
- }
75
- }
76
- break;
77
- }
78
- echo '}';
79
-
80
- $title_color = ! empty( $settings->title_color ) ? $settings->title_color : '';
81
- if ( ! empty( $title_color ) ) {
82
- $title_color = strpos( $title_color, 'rgba' ) !== false ? $title_color : '#' . $title_color;
83
- }
84
- $title_font_size = ! empty( $settings->title_font_size ) ? $settings->title_font_size : '';
85
- $title_font_family = ! empty( $settings->title_font_family['family'] ) ? $settings->title_font_family['family'] : '';
86
- $title_font_weight = ! empty( $settings->title_font_family['weight'] ) ? $settings->title_font_family['weight'] : '';
87
- $title_transform = ! empty( $settings->title_transform ) ? $settings->title_transform : '';
88
- $title_font_style = ! empty( $settings->title_font_style ) ? $settings->title_font_style : '';
89
- $title_line_height = ! empty( $settings->title_line_height ) ? $settings->title_line_height : '';
90
- $title_letter_spacing = ! empty( $settings->title_letter_spacing ) ? $settings->title_letter_spacing : '';
91
- echo '.fl-node-' . $id . ' .obfx-pricing-header *:first-child{';
92
- echo ! empty( $title_color ) ? 'color: ' . $title_color . ';' : '';
93
- echo ! empty( $title_font_size ) ? 'font-size: ' . $title_font_size . 'px;' : '';
94
- echo ! empty( $title_font_family ) ? 'font-family: ' . $title_font_family . ';' : '';
95
- echo ! empty( $title_font_weight ) ? 'font-weight: ' . $title_font_weight . ';' : '';
96
- echo ! empty( $title_transform ) ? 'text-transform: ' . $title_transform . ';' : '';
97
- echo ! empty( $title_font_style ) ? 'font-style: ' . $title_font_style . ';' : '';
98
- echo ! empty( $title_line_height ) ? 'line-height: ' . $title_line_height . 'px;' : '';
99
- echo ! empty( $title_letter_spacing ) ? 'letter-spacing: ' . $title_letter_spacing . 'px;' : '';
100
- echo '}';
101
-
102
-
103
- $subtitle_color = ! empty( $settings->subtitle_color ) ? $settings->subtitle_color : '';
104
- if ( ! empty( $subtitle_color ) ) {
105
- $subtitle_color = strpos( $subtitle_color, 'rgba' ) !== false ? $subtitle_color : '#' . $subtitle_color;
106
- }
107
- $subtitle_font_size = ! empty( $settings->subtitle_font_size ) ? $settings->subtitle_font_size : '';
108
- $subtitle_font_family = ! empty( $settings->subtitle_font_family['family'] ) ? $settings->subtitle_font_family : '';
109
- $subtitle_font_weight = ! empty( $settings->subtitle_font_family['weight'] ) ? $settings->subtitle_font_family : '';
110
- $subtitle_transform = ! empty( $settings->subtitle_transform ) ? $settings->subtitle_transform : '';
111
- $subtitle_font_style = ! empty( $settings->subtitle_font_style ) ? $settings->subtitle_font_style : '';
112
- $subtitle_line_height = ! empty( $settings->subtitle_line_height ) ? $settings->subtitle_line_height : '';
113
- $subtitle_letter_spacing = ! empty( $settings->subtitle_letter_spacing ) ? $settings->subtitle_letter_spacing : '';
114
- echo '.fl-node-' . $id . ' .obfx-pricing-header *:last-child{';
115
- echo ! empty( $subtitle_color ) ? 'color: ' . $subtitle_color . ';' : '';
116
- echo ! empty( $subtitle_font_size ) ? 'font-size: ' . $subtitle_font_size . 'px;' : '';
117
- echo ! empty( $subtitle_font_family ) ? 'font-family: ' . $subtitle_font_family . ';' : '';
118
- echo ! empty( $subtitle_font_weight ) ? 'font-weight: ' . $subtitle_font_weight . ';' : '';
119
- echo ! empty( $subtitle_transform ) ? 'text-transform: ' . $subtitle_transform . ';' : '';
120
- echo ! empty( $subtitle_font_style ) ? 'font-style: ' . $subtitle_font_style . ';' : '';
121
- echo ! empty( $subtitle_line_height ) ? 'line-height: ' . $subtitle_line_height . 'px;' : '';
122
- echo ! empty( $subtitle_letter_spacing ) ? 'letter-spacing: ' . $subtitle_letter_spacing . 'px;' : '';
123
- echo '}';
124
-
125
- $price_top = ! empty( $settings->price_top ) ? $settings->price_top : '';
126
- $price_bottom = ! empty( $settings->price_bottom ) ? $settings->price_bottom : '';
127
- $price_left = ! empty( $settings->price_left ) ? $settings->price_left : '';
128
- $price_right = ! empty( $settings->price_right ) ? $settings->price_right : '';
129
- $price_font_size = ! empty( $settings->price_font_size ) ? $settings->price_font_size : '';
130
- $price_font_family = ! empty( $settings->price_font_family['family'] ) ? $settings->price_font_family['family'] : '';
131
- $price_font_weight = ! empty( $settings->price_font_family['weight'] ) ? $settings->price_font_family['weight'] : '';
132
- $price_transform = ! empty( $settings->price_transform ) ? $settings->price_transform : '';
133
- $price_font_style = ! empty( $settings->price_font_style ) ? $settings->price_font_style : '';
134
- $price_line_height = ! empty( $settings->price_line_height ) ? $settings->price_line_height : '';
135
- $price_letter_spacing = ! empty( $settings->price_letter_spacing ) ? $settings->price_letter_spacing : '';
136
- echo '.fl-node-' . $id . ' .obfx-pricing-price{';
137
- echo ! empty( $price_top ) ? 'padding-top: ' . $price_top . 'px;' : '';
138
- echo ! empty( $price_bottom ) ? 'padding-bottom: ' . $price_bottom . 'px;' : '';
139
- echo ! empty( $price_left ) ? 'padding-left: ' . $price_left . 'px;' : '';
140
- echo ! empty( $price_right ) ? 'padding-right: ' . $price_right . 'px;' : '';
141
- echo ! empty( $price_font_size ) ? 'font-size: ' . $price_font_size . 'px;' : '';
142
- echo ! empty( $price_font_family ) ? 'font-family: ' . $price_font_family . ';' : '';
143
- echo ! empty( $price_font_weight ) ? 'font-weight: ' . $price_font_weight . ';' : '';
144
- echo ! empty( $price_transform ) ? 'text-transform: ' . $price_transform . ';' : '';
145
- echo ! empty( $price_font_style ) ? 'font-style: ' . $price_font_style . ';' : '';
146
- echo ! empty( $price_line_height ) ? 'line-height: ' . $price_line_height . 'px;' : '';
147
- echo ! empty( $price_letter_spacing ) ? 'letter-spacing: ' . $price_letter_spacing . 'px;' : '';
148
- echo '}';
149
-
150
- if ( ! empty( $settings->price_color ) ) {
151
- $price_color = strpos( $settings->price_color, 'rgba' ) !== false ? $settings->price_color : '#' . $settings->price_color;
152
- echo '.fl-node-' . $id . ' .obfx-pricing-price{';
153
- echo 'color: ' . $price_color . ';';
154
- echo '}';
155
- }
156
-
157
- if ( ! empty( $settings->currency_color ) ) {
158
- $currency_color = strpos( $settings->currency_color, 'rgba' ) !== false ? $settings->currency_color : '#' . $settings->currency_color;
159
- echo '.fl-node-' . $id . ' .obfx-pricing-price sup{';
160
- echo 'color: ' . $currency_color . ';';
161
- echo '}';
162
- }
163
-
164
- if ( ! empty( $settings->period_color ) ) {
165
- $period_color = strpos( $settings->period_color, 'rgba' ) !== false ? $settings->period_color : '#' . $settings->period_color;
166
- echo '.fl-node-' . $id . ' .obfx-pricing-price .obfx-period{';
167
- echo 'color: ' . $period_color . ';';
168
- echo '}';
169
- }
170
- $features_top = ! empty( $settings->features_right ) ? $settings->features_right : '';
171
- $features_bottom = ! empty( $settings->features_right ) ? $settings->features_right : '';
172
- $features_left = ! empty( $settings->features_right ) ? $settings->features_right : '';
173
- $features_right = ! empty( $settings->features_right ) ? $settings->features_right : '';
174
- echo '.fl-node-' . $id . ' .obfx-pricing-features .obfx-pricing-feature-content{';
175
- echo ! empty( $features_top ) ? 'padding-top: ' . $features_top . 'px;' : '';
176
- echo ! empty( $features_bottom ) ? 'padding-bottom: ' . $features_bottom . 'px;' : '';
177
- echo ! empty( $features_left ) ? 'padding-left: ' . $features_left . 'px;' : '';
178
- echo ! empty( $features_right ) ? 'padding-right: ' . $features_right . 'px;' : '';
179
- echo '}';
180
-
181
- $feature_font_size = ! empty( $settings->feature_font_size ) ? $settings->feature_font_size : '';
182
- $feature_transform = ! empty( $settings->feature_transform ) ? $settings->feature_transform : '';
183
- $feature_font_style = ! empty( $settings->feature_font_style ) ? $settings->feature_font_style : '';
184
- $feature_line_height = ! empty( $settings->feature_line_height ) ? $settings->feature_line_height : '';
185
- $feature_letter_spacing = ! empty( $settings->feature_letter_spacing ) ? $settings->feature_letter_spacing : '';
186
- echo '.fl-node-' . $id . ' .obfx-pricing-features .obfx-pricing-feature-content * {';
187
- echo ! empty( $feature_font_size ) ? 'font-size: ' . $feature_font_size . 'px;' : '';
188
- echo ! empty( $feature_transform ) ? 'text-transform: ' . $feature_transform . ';' : '';
189
- echo ! empty( $feature_font_style ) ? 'font-style: ' . $feature_font_style . ';' : '';
190
- echo ! empty( $feature_line_height ) ? 'line-height: ' . $feature_line_height . 'px;' : '';
191
- echo ! empty( $feature_letter_spacing ) ? 'letter-spacing: ' . $feature_letter_spacing . 'px;' : '';
192
- echo '}';
193
-
194
- if ( ! empty( $settings->feature_font_family['family'] ) ) {
195
- echo '.fl-node-' . $id . ' .obfx-pricing-features .obfx-pricing-feature-content:not(i){';
196
- echo 'font-family: ' . $settings->feature_font_family['family'] . ';';
197
- echo '}';
198
- }
199
- if ( ! empty( $settings->feature_font_family['weight'] ) ) {
200
- echo '.fl-node-' . $id . ' .obfx-pricing-features .obfx-pricing-feature-content:not(strong){';
201
- echo 'font-weight: ' . $settings->feature_font_family['weight'] . ';';
202
- echo '}';
203
- }
204
-
205
- if ( ! empty( $settings->icon_color ) ) {
206
- $icon_color = strpos( $settings->icon_color, 'rgba' ) !== false ? $settings->icon_color : '#' . $settings->icon_color;
207
- echo '.fl-node-' . $id . ' .obfx-pricing-feature-content i{';
208
- echo 'color: ' . $icon_color . ';';
209
- echo '}';
210
- }
211
-
212
- if ( ! empty( $settings->bold_color ) ) {
213
- $bold_color = strpos( $settings->bold_color, 'rgba' ) !== false ? $settings->bold_color : '#' . $settings->bold_color;
214
- echo '.fl-node-' . $id . ' .obfx-pricing-feature-content strong{';
215
- echo 'color: ' . $bold_color . ';';
216
- echo '}';
217
- }
218
-
219
- if ( ! empty( $settings->feature_color ) ) {
220
- $feature_color = strpos( $settings->feature_color, 'rgba' ) !== false ? $settings->feature_color : '#' . $settings->feature_color;
221
- echo '.fl-node-' . $id . ' .obfx-pricing-feature-content:not(i):not(strong){';
222
- echo 'color: ' . $feature_color . ';';
223
- echo '}';
224
- }
225
-
226
- $button_margin_bottom = ! empty( $settings->button_margin_bottom ) ? $settings->button_margin_bottom : '';
227
- $button_margin_left = ! empty( $settings->button_margin_left ) ? $settings->button_margin_left : '';
228
- $button_margin_right = ! empty( $settings->button_margin_right ) ? $settings->button_margin_right : '';
229
- $button_margin_top = ! empty( $settings->button_margin_top ) ? $settings->button_margin_top : '';
230
- echo '.fl-node-' . $id . ' .obfx-plan-bottom{';
231
- echo ! empty( $button_margin_bottom ) ? 'margin-bottom: ' . $button_margin_bottom . 'px;' : '';
232
- echo ! empty( $button_margin_left ) ? 'margin-left: ' . $button_margin_left . 'px;' : '';
233
- echo ! empty( $button_margin_right ) ? 'margin-right: ' . $button_margin_right . 'px;' : '';
234
- echo ! empty( $button_margin_top ) ? 'margin-top: ' . $button_margin_top . 'px;' : '';
235
- echo '}';
236
-
237
- $button_padding_top = ! empty( $settings->button_padding_top ) ? $settings->button_padding_top : '';
238
- $button_padding_bottom = ! empty( $settings->button_padding_bottom ) ? $settings->button_padding_bottom : '';
239
- $button_padding_left = ! empty( $settings->button_padding_left ) ? $settings->button_padding_left : '';
240
- $button_padding_right = ! empty( $settings->button_padding_right ) ? $settings->button_padding_right : '';
241
- $button_font_size = ! empty( $settings->button_font_size ) ? $settings->button_font_size : '';
242
- $button_transform = ! empty( $settings->button_transform ) ? $settings->button_transform : '';
243
- $button_font_style = ! empty( $settings->button_font_style ) ? $settings->button_font_style : '';
244
- $button_line_height = ! empty( $settings->button_line_height ) ? $settings->button_line_height : '';
245
- $button_letter_spacing = ! empty( $settings->button_letter_spacing ) ? $settings->button_letter_spacing : '';
246
- $button_font_family = ! empty( $settings->button_font_family['family'] ) ? $settings->button_font_family['family'] : '';
247
- $button_font_weight = ! empty( $settings->button_font_family['weight'] ) ? $settings->button_font_family['weight'] : '';
248
- $button_text_color = ! empty( $settings->button_text_color ) ? ( strpos( $settings->button_text_color, 'rgba' ) !== false ? $settings->button_text_color : '#' . $settings->button_text_color ) : '';
249
- $button_bg_color = ! empty( $settings->button_bg_color ) ? ( strpos( $settings->button_bg_color, 'rgba' ) !== false ? $settings->button_bg_color : '#' . $settings->button_bg_color ) : '';
250
- echo '.fl-node-' . $id . ' .obfx-plan-button{';
251
- echo ! empty( $button_padding_top ) ? 'padding-top: ' . $button_padding_top . 'px;' : '';
252
- echo ! empty( $button_padding_bottom ) ? 'padding-bottom: ' . $button_padding_bottom . 'px;' : '';
253
- echo ! empty( $button_padding_left ) ? 'padding-left: ' . $button_padding_left . 'px;' : '';
254
- echo ! empty( $button_padding_right ) ? 'padding-right: ' . $button_padding_right . 'px;' : '';
255
- echo ! empty( $button_text_color ) ? 'color: ' . $button_text_color . ';' : '';
256
- echo ! empty( $button_bg_color ) ? 'background-color: ' . $button_bg_color . ';' : '';
257
- echo ! empty( $button_font_size ) ? 'font-size: ' . $button_font_size . 'px;' : '';
258
- echo ! empty( $button_transform ) ? 'text-transform: ' . $button_transform . ';' : '';
259
- echo ! empty( $button_font_style ) ? 'font-style: ' . $button_font_style . ';' : '';
260
- echo ! empty( $button_line_height ) ? 'line-height: ' . $button_line_height . 'px;' : '';
261
- echo ! empty( $button_letter_spacing ) ? 'letter-spacing: ' . $button_letter_spacing . 'px;' : '';
262
- echo ! empty( $button_font_family ) ? 'font-family: ' . $button_font_family . ';' : '';
263
- echo ! empty( $button_font_weight ) ? 'font-weight: ' . $button_font_weight . ';' : '';
264
- echo '}';
265
-
266
- $button_text_color_hover = ! empty( $settings->button_text_color_hover ) ? ( strpos( $settings->button_text_color_hover, 'rgba' ) !== false ? $settings->button_text_color_hover : '#' . $settings->button_text_color_hover ) : '';
267
- $button_bg_color_hover = ! empty( $settings->button_bg_color_hover ) ? ( strpos( $settings->button_bg_color_hover, 'rgba' ) !== false ? $settings->button_bg_color_hover : '#' . $settings->button_bg_color_hover ) : '';
268
- echo '.fl-node-' . $id . ' .obfx-plan-button:hover{';
269
- echo ! empty( $button_text_color_hover ) ? 'color: ' . $button_text_color_hover . ';' : '';
270
- echo ! empty( $button_bg_color_hover ) ? 'background-color: ' . $button_bg_color_hover . ';' : '';
271
- echo '}';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/pricing-table/includes/frontend.php DELETED
@@ -1,61 +0,0 @@
1
- <?php
2
- /**
3
- * This file is used to render each pricing module instance.
4
- * You have access to two variables in this file:
5
- *
6
- * $module An instance of your module class.
7
- * $settings The module's settings.
8
- */
9
-
10
- $class_to_add = $settings->card_layout === 'yes' ? 'obfx-card' : '';
11
-
12
- echo '<div class="obfx-pricing-plan ' . esc_attr( $class_to_add ) . '">';
13
- echo '<div class="obfx-pricing-header">';
14
- echo '<' . $settings->plan_title_tag . ' class="obfx-plan-title text-center">' . wp_kses_post( $settings->plan_title ) . '</' . $settings->plan_title_tag . '>';
15
- echo '<' . $settings->plan_subtitle_tag . ' class="obfx-plan-subtitle text-center">' . wp_kses_post( $settings->plan_subtitle ) . '</' . $settings->plan_subtitle_tag . '>';
16
- echo '</div>';
17
- echo '<div class="obfx-pricing-price text-center">';
18
- switch ( $settings->currency_position ) {
19
- case 'after':
20
- echo '<span class="obfx-price">' . wp_kses_post( $settings->price ) . '</span><sup class="obfx-currency">' . wp_kses_post( $settings->currency ) . '</sup><span class="obfx-period">' . wp_kses_post( $settings->period ) . '</span>';
21
- break;
22
- case 'before':
23
- echo '<sup>' . wp_kses_post( $settings->currency ) . '</sup><span class="obfx-price">' . wp_kses_post( $settings->price ) . '</span><span class="obfx-period">' . wp_kses_post( $settings->period ) . '</span>';
24
- break;
25
- }
26
- echo '</div>';
27
-
28
- $features = $settings->features;
29
- if ( ! empty( $features ) ) {
30
- echo '<ul class="obfx-pricing-features text-center">';
31
- foreach ( $features as $feature ) {
32
- $icon = ! empty( $feature->icon ) ? $feature->icon : '';
33
- $bold_text = ! empty( $feature->bold_text ) ? $feature->bold_text : '';
34
- $text = ! empty( $feature->text ) ? $feature->text : '';
35
- $section_is_empty = empty( $icon ) && empty( $bold_text ) && empty( $text );
36
- if ( ! $section_is_empty ) {
37
- echo '<li><span class="obfx-pricing-feature-content">';
38
- if ( ! empty( $icon ) ) {
39
- echo '<i class="fa ' . esc_attr( $icon ) . '"></i>';
40
- }
41
- if ( ! empty( $bold_text ) ) {
42
- echo '<strong>' . wp_kses_post( $bold_text ) . ' </strong> ';
43
- }
44
- if ( ! empty( $text ) ) {
45
- echo wp_kses_post( $text );
46
- }
47
- echo '</span><hr>';
48
- echo '</li>';
49
- }
50
- }
51
- echo '</ul>';
52
- }
53
-
54
- $button_text = ! empty( $settings->text ) ? $settings->text : '';
55
- $button_link = ! empty( $settings->link ) ? $settings->link : '';
56
- if ( ! empty( $button_text ) ) {
57
- echo '<div class="obfx-plan-bottom text-center">';
58
- echo '<a class="btn obfx-plan-button" href="' . esc_url( $button_link ) . '">' . wp_kses_post( $button_text ) . '</a>';
59
- echo '</div>';
60
- }
61
- echo '</div>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/pricing-table/pricing-table.php DELETED
@@ -1,587 +0,0 @@
1
- <?php
2
- /**
3
- * Pricing table module.
4
- *
5
- * @package themeisle-companion
6
- */
7
-
8
- // Get the module directory.
9
- $module_directory = $this->get_dir();
10
-
11
- // Include common functions file.
12
- require_once( $module_directory . '/inc/common-functions.php' );
13
-
14
- // Include custom fields
15
- require_once( $module_directory . '/custom-fields/toggle-field/toggle_field.php' );
16
-
17
- /**
18
- * Class PricingTableModule
19
- */
20
- class PricingTableModule extends FLBuilderModule {
21
-
22
- /**
23
- * Constructor function for the module. You must pass the
24
- * name, description, dir and url in an array to the parent class.
25
- *
26
- * @method __construct
27
- */
28
- public function __construct() {
29
- parent::__construct(
30
- array(
31
- 'name' => esc_html__( 'Pricing table', 'themeisle-companion' ),
32
- 'description' => esc_html__( 'Pricing Tables are the perfect option when showcasing services you have on offer.', 'themeisle-companion' ),
33
- 'category' => esc_html__( 'Orbit Fox Modules', 'themeisle-companion' ),
34
- 'dir' => BEAVER_WIDGETS_PATH . 'modules/pricing-table/',
35
- 'url' => BEAVER_WIDGETS_URL . 'modules/pricing-table/',
36
- 'editor_export' => true, // Defaults to true and can be omitted.
37
- 'enabled' => true, // Defaults to true and can be omitted.
38
- )
39
- );
40
- }
41
- }
42
-
43
- /**
44
- * Register the module and its form settings.
45
- */
46
- FLBuilder::register_module(
47
- 'PricingTableModule', array(
48
- 'content' => array(
49
- 'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
50
- 'sections' => array(
51
- 'header' => array(
52
- 'title' => esc_html__( 'Plan Header', 'themeisle-companion' ),
53
- 'fields' => array(
54
- 'plan_title' => array(
55
- 'type' => 'text',
56
- 'label' => esc_html__( 'Title', 'themeisle-companion' ),
57
- 'default' => esc_html__( 'Plan title', 'themeisle-companion' ),
58
- 'preview' => array(
59
- 'type' => 'text',
60
- 'selector' => '.obfx-plan-title',
61
- ),
62
- ),
63
- 'plan_title_tag' => array(
64
- 'type' => 'select',
65
- 'label' => esc_html__( 'Title tag', 'themeisle-companion' ),
66
- 'default' => 'h2',
67
- 'options' => array(
68
- 'h1' => esc_html__( 'h1', 'themeisle-companion' ),
69
- 'h2' => esc_html__( 'h2', 'themeisle-companion' ),
70
- 'h3' => esc_html__( 'h3', 'themeisle-companion' ),
71
- 'h4' => esc_html__( 'h4', 'themeisle-companion' ),
72
- 'h5' => esc_html__( 'h5', 'themeisle-companion' ),
73
- 'h6' => esc_html__( 'h6', 'themeisle-companion' ),
74
- 'p' => esc_html__( 'p', 'themeisle-companion' ),
75
- ),
76
- ),
77
- 'plan_subtitle' => array(
78
- 'type' => 'text',
79
- 'label' => esc_html__( 'Subtitle', 'themeisle-companion' ),
80
- 'default' => esc_html__( 'Plan subtitle', 'themeisle-companion' ),
81
- 'preview' => array(
82
- 'type' => 'text',
83
- 'selector' => '.obfx-plan-subtitle',
84
- ),
85
- ),
86
- 'plan_subtitle_tag' => array(
87
- 'type' => 'select',
88
- 'label' => esc_html__( 'Subtitle tag', 'themeisle-companion' ),
89
- 'default' => 'p',
90
- 'options' => array(
91
- 'h1' => esc_html__( 'h1', 'themeisle-companion' ),
92
- 'h2' => esc_html__( 'h2', 'themeisle-companion' ),
93
- 'h3' => esc_html__( 'h3', 'themeisle-companion' ),
94
- 'h4' => esc_html__( 'h4', 'themeisle-companion' ),
95
- 'h5' => esc_html__( 'h5', 'themeisle-companion' ),
96
- 'h6' => esc_html__( 'h6', 'themeisle-companion' ),
97
- 'p' => esc_html__( 'p', 'themeisle-companion' ),
98
- ),
99
- ),
100
- ),
101
- ),
102
- 'price' => array(
103
- 'title' => esc_html__( 'Price Tag', 'themeisle-companion' ),
104
- 'fields' => array(
105
- 'price' => array(
106
- 'type' => 'text',
107
- 'label' => esc_html__( 'Price', 'themeisle-companion' ),
108
- 'default' => '50',
109
- 'preview' => array(
110
- 'type' => 'text',
111
- 'selector' => '.obfx-price',
112
- ),
113
- ),
114
- 'currency' => array(
115
- 'type' => 'text',
116
- 'label' => esc_html__( 'Currency', 'themeisle-companion' ),
117
- 'default' => '$',
118
- 'preview' => array(
119
- 'type' => 'text',
120
- 'selector' => '.obfx-currency',
121
- ),
122
- ),
123
- 'currency_position' => array(
124
- 'type' => 'select',
125
- 'label' => esc_html__( 'Currency position', 'themeisle-companion' ),
126
- 'default' => 'after',
127
- 'options' => array(
128
- 'before' => esc_html__( 'Before', 'themeisle-companion' ),
129
- 'after' => esc_html__( 'After', 'themeisle-companion' ),
130
- ),
131
- ),
132
- 'period' => array(
133
- 'type' => 'text',
134
- 'label' => esc_html__( 'Period', 'themeisle-companion' ),
135
- 'default' => esc_html__( '/month', 'themeisle-companion' ),
136
- 'preview' => array(
137
- 'type' => 'text',
138
- 'selector' => '.obfx-period',
139
- ),
140
- ),
141
- ),
142
- ),
143
- 'features' => array(
144
- 'title' => esc_html__( 'Features list', 'themeisle-companion' ),
145
- 'fields' => array(
146
- 'features' => array(
147
- 'multiple' => true,
148
- 'type' => 'form',
149
- 'label' => esc_html__( 'Feature', 'themeisle-companion' ),
150
- 'form' => 'feature_field', // ID of a registered form.
151
- 'preview_text' => 'text', // ID of a field to use for the preview text.
152
- ),
153
- ),
154
- ),
155
- 'button' => array(
156
- 'title' => esc_html__( 'Button', 'themeisle-companion' ),
157
- 'fields' => array(
158
- 'text' => array(
159
- 'type' => 'text',
160
- 'label' => esc_html__( 'Button text', 'themeisle-companion' ),
161
- 'default' => esc_html__( 'Button', 'themeisle-companion' ),
162
- 'preview' => array(
163
- 'type' => 'text',
164
- 'selector' => '.obfx-plan-button',
165
- ),
166
- ),
167
- 'link' => array(
168
- 'type' => 'link',
169
- 'label' => esc_html__( 'Button link', 'themeisle-companion' ),
170
- ),
171
- ),
172
- ),
173
- 'appearance' => array(
174
- 'title' => esc_html__( 'Appearance', 'themeisle-companion' ),
175
- 'fields' => array(
176
- 'card_layout' => array(
177
- 'type' => 'obfx_toggle',
178
- 'label' => esc_html__( 'Card layout', 'themeisle-companion' ),
179
- 'default' => 'yes',
180
- ),
181
- 'text_position' => array(
182
- 'type' => 'select',
183
- 'label' => esc_html__( 'Align', 'themeisle-companion' ),
184
- 'default' => 'center',
185
- 'options' => array(
186
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
187
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
188
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
189
- ),
190
- ),
191
- ),
192
- ),
193
- ),
194
- ),
195
- 'header_style' => array(
196
- 'title' => esc_html__( 'Header Style', 'themeisle-companion' ),
197
- 'sections' => array(
198
- 'header_padding' => themeisle_four_fields_control(
199
- array(
200
- 'default' => array(
201
- 'top' => 15,
202
- 'bottom' => 15,
203
- 'left' => 0,
204
- 'right' => 0,
205
- ),
206
- 'selector' => '.obfx-pricing-header',
207
- 'field_name_prefix' => '',
208
- )
209
- ),
210
- 'colors' => array(
211
- 'title' => esc_html__( 'Colors', 'themeisle-companion' ),
212
- 'fields' => array(
213
- 'title_color' => array(
214
- 'type' => 'color',
215
- 'label' => esc_html__( 'Title color', 'themeisle-companion' ),
216
- 'preview' => array(
217
- 'type' => 'css',
218
- 'rules' => array(
219
- array(
220
- 'selector' => '.obfx-pricing-header *:first-child',
221
- 'property' => 'color',
222
- ),
223
- ),
224
- ),
225
- ),
226
- 'subtitle_color' => array(
227
- 'type' => 'color',
228
- 'label' => esc_html__( 'Subtitle color', 'themeisle-companion' ),
229
- 'preview' => array(
230
- 'type' => 'css',
231
- 'rules' => array(
232
- array(
233
- 'selector' => '.obfx-pricing-header *:last-child',
234
- 'property' => 'color',
235
- ),
236
- ),
237
- ),
238
- ),
239
- ),
240
- ),
241
- 'title_typography' => themeisle_typography_settings(
242
- array(
243
- 'title' => esc_html__( 'Title typography', 'themeisle-companion' ),
244
- 'prefix' => 'title_',
245
- 'selector' => '.obfx-pricing-header *:first-child',
246
- )
247
- ),
248
- 'subtitle_typography' => themeisle_typography_settings(
249
- array(
250
- 'title' => esc_html__( 'Subtitle typography', 'themeisle-companion' ),
251
- 'prefix' => 'subtitle_',
252
- 'selector' => '.obfx-pricing-header *:last-child',
253
- )
254
- ),
255
- 'header_background' => array(
256
- 'title' => esc_html__( 'Background', 'themeisle-companion' ),
257
- 'fields' => array(
258
- 'bg_type' => array(
259
- 'type' => 'select',
260
- 'label' => esc_html__( 'Type', 'themeisle-companion' ),
261
- 'default' => 'color',
262
- 'options' => array(
263
- 'color' => esc_html__( 'Color', 'themeisle-companion' ),
264
- 'image' => esc_html__( 'Background', 'themeisle-companion' ),
265
- 'gradient' => esc_html__( 'Gradient', 'themeisle-companion' ),
266
- ),
267
- 'toggle' => array(
268
- 'color' => array(
269
- 'fields' => array('header_bg_color'),
270
- ),
271
- 'image' => array(
272
- 'fields' => array('header_bg_image'),
273
- ),
274
- 'gradient' => array(
275
- 'fields' => array('gradient_color1', 'gradient_color2', 'gradient_orientation'),
276
- ),
277
- ),
278
- ),
279
- 'header_bg_color' => array(
280
- 'type' => 'color',
281
- 'label' => esc_html__( 'Background color', 'themeisle-companion' ),
282
- 'show_reset' => true,
283
- 'preview' => array(
284
- 'type' => 'css',
285
- 'rules' => array(
286
- array(
287
- 'selector' => '.obfx-pricing-header',
288
- 'property' => 'background-color',
289
- ),
290
- ),
291
- ),
292
- ),
293
- 'header_bg_image' => array(
294
- 'type' => 'photo',
295
- 'label' => esc_html__( 'Photo Field', 'themeisle-companion' ),
296
- 'show_remove' => true,
297
- ),
298
- 'gradient_color1' => array(
299
- 'type' => 'color',
300
- 'label' => esc_html__( 'Gradient color 1', 'themeisle-companion' ),
301
- 'show_reset' => true,
302
- ),
303
- 'gradient_color2' => array(
304
- 'type' => 'color',
305
- 'label' => esc_html__( 'Gradient color 2', 'themeisle-companion' ),
306
- 'show_reset' => true,
307
- ),
308
- 'gradient_orientation' => array(
309
- 'type' => 'select',
310
- 'label' => esc_html__( 'Orientation', 'themeisle-companion' ),
311
- 'default' => 'horizontal',
312
- 'options' => array(
313
- 'horizontal' => esc_html__( 'Horizontal', 'themeisle-companion' ),
314
- 'vertical' => esc_html__( 'Vertical', 'themeisle-companion' ),
315
- 'diagonal_bottom' => esc_html__( 'Diagonal bottom', 'themeisle-companion' ),
316
- 'diagonal_top' => esc_html__( 'Diagonal top', 'themeisle-companion' ),
317
- 'radial' => esc_html__( 'Radial', 'themeisle-companion' ),
318
- ),
319
- ),
320
- ),
321
- ),
322
- ),
323
- ),
324
- 'price_style' => array(
325
- 'title' => esc_html__( 'Price Style', 'themeisle-companion' ),
326
- 'sections' => array(
327
- 'price_padding' => themeisle_four_fields_control(
328
- array(
329
- 'default' => array(
330
- 'top' => 15,
331
- 'bottom' => 15,
332
- 'left' => 0,
333
- 'right' => 0,
334
- ),
335
- 'selector' => '.obfx-pricing-price',
336
- 'field_name_prefix' => 'price_',
337
- )
338
- ),
339
- 'price_colors' => array(
340
- 'title' => esc_html__( 'Colors', 'themeisle-companion' ),
341
- 'fields' => array(
342
- 'price_color' => array(
343
- 'type' => 'color',
344
- 'label' => esc_html__( 'Price color', 'themeisle-companion' ),
345
- 'preview' => array(
346
- 'type' => 'css',
347
- 'rules' => array(
348
- array(
349
- 'selector' => '.obfx-price',
350
- 'property' => 'color',
351
- ),
352
- ),
353
- ),
354
- ),
355
- 'currency_color' => array(
356
- 'type' => 'color',
357
- 'label' => esc_html__( 'Currency color', 'themeisle-companion' ),
358
- 'preview' => array(
359
- 'type' => 'css',
360
- 'rules' => array(
361
- array(
362
- 'selector' => '.obfx-pricing-price sup',
363
- 'property' => 'color',
364
- ),
365
- ),
366
- ),
367
- ),
368
- 'period_color' => array(
369
- 'type' => 'color',
370
- 'label' => esc_html__( 'Period color', 'themeisle-companion' ),
371
- 'preview' => array(
372
- 'type' => 'css',
373
- 'rules' => array(
374
- array(
375
- 'selector' => '.obfx-period',
376
- 'property' => 'color',
377
- ),
378
- ),
379
- ),
380
- ),
381
- ),
382
- ),
383
- 'price_typography' => themeisle_typography_settings(
384
- array(
385
- 'prefix' => 'price_',
386
- 'selector' => '.obfx-pricing-price',
387
- 'font_size_default' => 40,
388
- )
389
- ),
390
- ),
391
- ),
392
- 'features_style' => array(
393
- 'title' => esc_html__( 'Features Style', 'themeisle-companion' ),
394
- 'sections' => array(
395
- 'features_padding' => themeisle_four_fields_control(
396
- array(
397
- 'default' => array(
398
- 'top' => 15,
399
- 'bottom' => 15,
400
- 'left' => 0,
401
- 'right' => 0,
402
- ),
403
- 'selector' => '.obfx-pricing-price',
404
- 'field_name_prefix' => 'features_',
405
- )
406
- ),
407
- 'features_colors' => array(
408
- 'title' => esc_html__( 'Colors', 'themeisle-companion' ),
409
- 'fields' => array(
410
- 'icon_color' => array(
411
- 'type' => 'color',
412
- 'label' => esc_html__( 'Icon color', 'themeisle-companion' ),
413
- 'preview' => array(
414
- 'type' => 'css',
415
- 'rules' => array(
416
- array(
417
- 'selector' => '.obfx-pricing-feature-content i',
418
- 'property' => 'color',
419
- ),
420
- ),
421
- ),
422
- ),
423
- 'bold_color' => array(
424
- 'type' => 'color',
425
- 'label' => esc_html__( 'Bold text color', 'themeisle-companion' ),
426
- 'preview' => array(
427
- 'type' => 'css',
428
- 'rules' => array(
429
- array(
430
- 'selector' => '.obfx-pricing-feature-content strong',
431
- 'property' => 'color',
432
- ),
433
- ),
434
- ),
435
- ),
436
- 'feature_color' => array(
437
- 'type' => 'color',
438
- 'label' => esc_html__( 'Text color', 'themeisle-companion' ),
439
- 'preview' => array(
440
- 'type' => 'css',
441
- 'rules' => array(
442
- array(
443
- 'selector' => '.obfx-pricing-feature-content:not(i):not(strong)',
444
- 'property' => 'color',
445
- ),
446
- ),
447
- ),
448
- ),
449
- ),
450
- ),
451
- 'feature_typography' => themeisle_typography_settings(
452
- array(
453
- 'prefix' => 'feature_',
454
- 'selector' => '.obfx-pricing-feature-content *',
455
- 'font_size_default' => 17,
456
- )
457
- ),
458
- ),
459
- ),
460
- 'button_style' => array(
461
- 'title' => esc_html__( 'Button Style', 'themeisle-companion' ),
462
- 'sections' => array(
463
- 'button_margins' => themeisle_four_fields_control(
464
- array(
465
- 'default' => array(
466
- 'top' => 15,
467
- 'bottom' => 15,
468
- 'left' => 0,
469
- 'right' => 0,
470
- ),
471
- 'selector' => '.obfx-plan-bottom',
472
- 'field_name_prefix' => 'button_margin_',
473
- 'type' => 'margin',
474
- )
475
- ),
476
- 'button_padding' => themeisle_four_fields_control(
477
- array(
478
- 'default' => array(
479
- 'top' => 6,
480
- 'bottom' => 6,
481
- 'left' => 12,
482
- 'right' => 12,
483
- ),
484
- 'selector' => '.obfx-plan-button',
485
- 'field_name_prefix' => 'button_padding_',
486
- )
487
- ),
488
- 'button_colors' => array(
489
- 'title' => esc_html__( 'Colors', 'themeisle-companion' ),
490
- 'fields' => array(
491
- 'button_text_color' => array(
492
- 'type' => 'color',
493
- 'label' => esc_html__( 'Text', 'themeisle-companion' ),
494
- 'preview' => array(
495
- 'type' => 'css',
496
- 'rules' => array(
497
- array(
498
- 'selector' => '.obfx-plan-button',
499
- 'property' => 'color',
500
- ),
501
- ),
502
- ),
503
- ),
504
- 'button_text_color_hover' => array(
505
- 'type' => 'color',
506
- 'label' => esc_html__( 'Text on hover', 'themeisle-companion' ),
507
- 'preview' => array(
508
- 'type' => 'css',
509
- 'rules' => array(
510
- array(
511
- 'selector' => '.obfx-plan-button:hover',
512
- 'property' => 'color',
513
- ),
514
- ),
515
- ),
516
- ),
517
- 'button_bg_color' => array(
518
- 'type' => 'color',
519
- 'label' => esc_html__( 'Button background', 'themeisle-companion' ),
520
- 'preview' => array(
521
- 'type' => 'css',
522
- 'rules' => array(
523
- array(
524
- 'selector' => '.obfx-plan-button',
525
- 'property' => 'background-color',
526
- ),
527
- ),
528
- ),
529
- ),
530
- 'button_bg_color_hover' => array(
531
- 'type' => 'color',
532
- 'label' => esc_html__( 'Button background on hover', 'themeisle-companion' ),
533
- 'preview' => array(
534
- 'type' => 'css',
535
- 'rules' => array(
536
- array(
537
- 'selector' => '.obfx-plan-button:hover',
538
- 'property' => 'background-color',
539
- ),
540
- ),
541
- ),
542
- ),
543
- ),
544
- ),
545
- 'button_typography' => themeisle_typography_settings(
546
- array(
547
- 'prefix' => 'button_',
548
- 'selector' => '.obfx-plan-button',
549
- 'font_size_default' => 15,
550
- )
551
- ),
552
- ),
553
- ),
554
- )
555
- );
556
-
557
-
558
- FLBuilder::register_settings_form(
559
- 'feature_field', array(
560
- 'title' => __( 'Feature', 'themeisle-companion' ),
561
- 'tabs' => array(
562
- 'general' => array(
563
- 'title' => esc_html__( 'General', 'themeisle-companion' ),
564
- 'sections' => array(
565
- 'general' => array(
566
- 'title' => '',
567
- 'fields' => array(
568
- 'bold_text' => array(
569
- 'type' => 'text',
570
- 'label' => esc_html__( 'Bold text', 'themeisle-companion' ),
571
- ),
572
- 'text' => array(
573
- 'type' => 'text',
574
- 'label' => esc_html__( 'Text', 'themeisle-companion' ),
575
- ),
576
- 'icon' => array(
577
- 'type' => 'icon',
578
- 'label' => esc_html__( 'Icon', 'themeisle-companion' ),
579
- 'show_remove' => true,
580
- ),
581
- ),
582
- ),
583
- ),
584
- ),
585
- ),
586
- )
587
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/services/css/frontend.css DELETED
@@ -1,40 +0,0 @@
1
- /**
2
- * This file should contain frontend styles that
3
- * will be applied to all module instances.
4
- */
5
- .obfx-services-section{
6
- text-align: center;
7
- }
8
-
9
- .obfx-service-title{
10
- display: inline-block;
11
- }
12
-
13
- .obfx-card{
14
- display: inline-block;
15
- position: relative;
16
- width: 100%;
17
- margin-bottom: 30px;
18
- border-radius: 6px;
19
- color: rgba(0, 0, 0, 0.87);
20
- background: #fff;
21
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
22
- }
23
-
24
- .obfx-service{
25
- padding: 15px;
26
- }
27
-
28
- .obfx-service-icon{
29
- vertical-align: middle;
30
- }
31
-
32
- .obfx-service-icon i{
33
- vertical-align: inherit;
34
- }
35
- .obfx-service-icon .dashicons,.obfx-service-icon .dashicons-before:before{
36
- width: inherit;
37
- height: inherit;
38
- font-size: inherit;
39
- vertical-align: inherit;
40
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/services/includes/frontend.css.php DELETED
@@ -1,124 +0,0 @@
1
- <?php
2
- $columns = $settings->column_number;
3
- $column_width = 100 / (int) $columns;
4
-
5
- echo '.fl-node-' . $id . ' .obfx-service-wrapper{';
6
- echo 'display:inline-block;';
7
- if ( ! empty( $column_width ) ) {
8
- echo 'width:' . $column_width . '%;';
9
- }
10
- echo 'padding: 0 10px;';
11
- echo '}';
12
-
13
- $bg_color = $settings->background_color;
14
- echo '.fl-node-' . $id . ' .obfx-service{';
15
- if ( ! empty( $bg_color ) ) {
16
- echo 'background:#' . $bg_color . ';';
17
- }
18
- echo '}';
19
-
20
-
21
- $icon_size = $settings->icon_size;
22
- $padding_top = $settings->icon_top;
23
- $padding_bottom = $settings->icon_bottom;
24
- $padding_left = $settings->icon_left;
25
- $padding_right = $settings->icon_right;
26
- $icon_position = $settings->icon_position;
27
-
28
- echo '.fl-node-' . $id . ' .obfx-service-icon{';
29
- if ( ! empty( $icon_size ) ) {
30
- echo 'font-size:' . $icon_size . 'px;';
31
- }
32
- if ( ! empty( $padding_top ) ) {
33
- echo 'padding-top:' . $padding_top . 'px;';
34
- }
35
- if ( ! empty( $padding_bottom ) ) {
36
- echo 'padding-bottom:' . $padding_bottom . 'px;';
37
- }
38
- if ( ! empty( $padding_left ) ) {
39
- echo 'padding-left:' . $padding_left . 'px;';
40
- }
41
- if ( ! empty( $padding_right ) ) {
42
- echo 'padding-right:' . $padding_right . 'px;';
43
- }
44
- if ( ! empty( $icon_position ) && $icon_position !== 'center' ) {
45
- echo 'float:' . $icon_position . ';';
46
- }
47
-
48
- echo '}';
49
-
50
-
51
- $title_color = $settings->title_color;
52
- $title_size = $settings->title_font_size;
53
- $font_family = $settings->title_font_family['family'];
54
- $font_weight = $settings->title_font_family['weight'];
55
- $font_style = $settings->title_font_style;
56
- $transform = $settings->title_transform;
57
- $line_height = $settings->title_line_height;
58
- $letter_spacing = $settings->title_letter_spacing;
59
- echo '.fl-node-' . $id . ' .obfx-service-title{';
60
- if ( ! empty( $title_color ) ) {
61
- echo 'color: #' . $title_color . ';';
62
- }
63
- if ( ! empty( $title_size ) ) {
64
- echo 'font-size:' . $title_size . 'px;';
65
- }
66
- if ( ! empty( $font_family ) ) {
67
- echo 'font-family:' . $font_family . ';';
68
- }
69
- if ( ! empty( $font_weight ) ) {
70
- echo 'font-weight:' . $font_weight . ';';
71
- }
72
- if ( ! empty( $font_style ) ) {
73
- echo 'font-style:' . $font_style . ';';
74
- }
75
- if ( ! empty( $transform ) ) {
76
- echo 'text-transform:' . $transform . ';';
77
- }
78
- if ( ! empty( $line_height ) ) {
79
- echo 'line-height:' . $line_height . 'px;';
80
- }
81
- if ( ! empty( $letter_spacing ) ) {
82
- echo 'letter-spacing:' . $letter_spacing . 'px;';
83
- }
84
- echo '}';
85
-
86
-
87
- $content_color = $settings->content_color;
88
- $content_size = $settings->content_font_size;
89
- $font_family = $settings->content_font_family['family'];
90
- $font_weight = $settings->content_font_family['weight'];
91
- $font_style = $settings->content_font_style;
92
- $transform = $settings->content_transform;
93
- $line_height = $settings->content_line_height;
94
- $alignment = $settings->content_alignment;
95
- $letter_spacing = $settings->content_letter_spacing;
96
- echo '.fl-node-' . $id . ' .obfx-service-content{';
97
- if ( ! empty( $content_color ) ) {
98
- echo 'color: #' . $content_color . ';';
99
- }
100
- if ( ! empty( $content_size ) ) {
101
- echo 'font-size:' . $content_size . 'px;';
102
- }
103
- if ( ! empty( $font_family ) ) {
104
- echo 'font-family:' . $font_family . ';';
105
- }
106
- if ( ! empty( $font_weight ) ) {
107
- echo 'font-weight:' . $font_weight . ';';
108
- }
109
- if ( ! empty( $font_style ) ) {
110
- echo 'font-style:' . $font_style . ';';
111
- }
112
- if ( ! empty( $transform ) ) {
113
- echo 'text-transform:' . $transform . ';';
114
- }
115
- if ( ! empty( $line_height ) ) {
116
- echo 'line-height:' . $line_height . 'px;';
117
- }
118
- if ( ! empty( $alignment ) ) {
119
- echo 'text-align:' . $alignment . ';';
120
- }
121
- if ( ! empty( $letter_spacing ) ) {
122
- echo 'letter-spacing:' . $letter_spacing . 'px;';
123
- }
124
- echo '}';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/services/includes/frontend.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
- /**
3
- * This file is used to render services module.
4
- * You have access to two variables in this file:
5
- *
6
- * $module An instance of your module class.
7
- * $settings The module's settings.
8
- */
9
-
10
- $columns = $settings->column_number;
11
- $services = $settings->services;
12
- $services_nb = sizeof( $services );
13
- $card_layout = $settings->card_layout;
14
- $container_class = $card_layout === 'yes' ? 'obfx-card obfx-service' : 'obfx-service';
15
- if ( ! empty( $columns ) ) {
16
- echo '<div class="obfx-services-section">';
17
- foreach ( $services as $service ) {
18
- echo '<div class="obfx-service-wrapper">';
19
- echo '<div class="' . esc_attr( $container_class ) . '">';
20
- $title = $service->title;
21
- $text = $service->text;
22
- $icon = $service->icon;
23
- $link = $service->link;
24
-
25
- if ( ! empty( $icon ) ) {
26
- $icon_color = ! empty( $service->icon_color ) ? '#' . $service->icon_color : '#d6d6d6';
27
- echo '<div class="obfx-service-icon" style="color:' . esc_attr( $icon_color ) . '"><i class="' . esc_attr( $icon ) . '"></i></div>';
28
- }
29
- if ( ! empty( $title ) ) {
30
- if ( ! empty( $link ) ) {
31
- echo '<a class="obfx-service-title" href="' . esc_url( $link ) . '" target="_blank">';
32
- }
33
- echo '<h4 class="obfx-service-title">' . wp_kses_post( $title ) . '</h4>';
34
- if ( ! empty( $link ) ) {
35
- echo '</a>';
36
- }
37
- }
38
-
39
- if ( ! empty( $text ) ) {
40
- echo '<p class="obfx-service-content">' . wp_kses_post( $text ) . '</p>';
41
- }
42
-
43
- echo '</div>';
44
- echo '</div>';
45
- }
46
- echo '</div>';
47
-
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/beaver-widgets/modules/services/services.php DELETED
@@ -1,255 +0,0 @@
1
- <?php
2
- /**
3
- * Services module.
4
- *
5
- * @package themeisle-companion
6
- */
7
-
8
- // Get the module directory.
9
- $module_directory = $this->get_dir();
10
-
11
- // Include common functions file.
12
- require_once( $module_directory . '/inc/common-functions.php' );
13
-
14
- // Include custom fields
15
- require_once( $module_directory . '/custom-fields/toggle-field/toggle_field.php' );
16
-
17
- /**
18
- * Class PricingTableModule
19
- */
20
- class ServicesModule extends FLBuilderModule {
21
-
22
- /**
23
- * Constructor function for the module. You must pass the
24
- * name, description, dir and url in an array to the parent class.
25
- *
26
- * @method __construct
27
- */
28
- public function __construct() {
29
- parent::__construct(
30
- array(
31
- 'name' => esc_html__( 'Services', 'themeisle-companion' ),
32
- 'description' => esc_html__( 'An overview of the products or services.', 'themeisle-companion' ),
33
- 'category' => esc_html__( 'Orbit Fox Modules', 'themeisle-companion' ),
34
- 'dir' => BEAVER_WIDGETS_PATH . 'modules/services/',
35
- 'url' => BEAVER_WIDGETS_URL . 'modules/services/',
36
- )
37
- );
38
- }
39
- }
40
-
41
- /**
42
- * Register the module and its form settings.
43
- */
44
- FLBuilder::register_module(
45
- 'ServicesModule', array(
46
- 'content' => array(
47
- 'title' => esc_html__( 'Content', 'themeisle-companion' ), // Tab title
48
- 'sections' => array(
49
- 'content' => array(
50
- 'title' => '',
51
- 'fields' => array(
52
- 'services' => array(
53
- 'multiple' => true,
54
- 'type' => 'form',
55
- 'label' => esc_html__( 'Service', 'themeisle-companion' ),
56
- 'form' => 'service_content', // ID of a registered form.
57
- 'preview_text' => 'title', // ID of a field to use for the preview text.
58
- ),
59
- 'column_number' => array(
60
- 'type' => 'select',
61
- 'label' => esc_html__( 'Number of columns', 'themeisle-companion' ),
62
- 'default' => '3',
63
- 'options' => array(
64
- '1' => esc_html__( '1', 'themeisle-companion' ),
65
- '2' => esc_html__( '2', 'themeisle-companion' ),
66
- '3' => esc_html__( '3', 'themeisle-companion' ),
67
- '4' => esc_html__( '4', 'themeisle-companion' ),
68
- '5' => esc_html__( '5', 'themeisle-companion' ),
69
- ),
70
- ),
71
- 'card_layout' => array(
72
- 'type' => 'obfx_toggle',
73
- 'label' => esc_html__( 'Card layout', 'themeisle-companion' ),
74
- 'default' => 'yes',
75
- ),
76
- 'background_color' => array(
77
- 'type' => 'color',
78
- 'label' => esc_html__( 'Background color', 'themeisle-companion' ),
79
- 'default' => 'ffffff',
80
- 'preview' => array(
81
- 'type' => 'css',
82
- 'rules' => array(
83
- array(
84
- 'selector' => '.obfx-service',
85
- 'property' => 'background',
86
- ),
87
- ),
88
- ),
89
- ),
90
-
91
- ),
92
- ),
93
- ),
94
- ),
95
- 'icon_style' => array(
96
- 'title' => esc_html__( 'Icon style', 'themeisle-companion' ), // Tab title
97
- 'sections' => array(
98
- 'font' => array(
99
- 'title' => esc_html__( 'General', 'themeisle-companion' ),
100
- 'fields' => array(
101
- 'icon_position' => array(
102
- 'type' => 'select',
103
- 'label' => esc_html__( 'Position', 'themeisle-companion' ),
104
- 'default' => 'center',
105
- 'options' => array(
106
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
107
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
108
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
109
- ),
110
- ),
111
- 'icon_size' => array(
112
- 'type' => 'text',
113
- 'label' => esc_html__( 'Size', 'themeisle-companion' ),
114
- 'description' => esc_html__( 'px', 'themeisle-companion' ),
115
- 'default' => '45',
116
- 'maxlength' => '3',
117
- 'size' => '4',
118
- 'preview' => array(
119
- 'type' => 'css',
120
- 'rules' => array(
121
- array(
122
- 'selector' => '.obfx-service-icon',
123
- 'property' => 'font-size',
124
- 'unit' => 'px',
125
- ),
126
- ),
127
- ),
128
- ),
129
- ),
130
- ),
131
- 'icon_padding' => themeisle_four_fields_control(
132
- array(
133
- 'default' => array(
134
- 'top' => 30,
135
- 'bottom' => 15,
136
- 'left' => 25,
137
- 'right' => 25,
138
- ),
139
- 'selector' => '.obfx-service-icon',
140
- 'field_name_prefix' => 'icon_',
141
- )
142
- ),
143
- ),
144
- ),
145
- 'title_style' => array(
146
- 'title' => esc_html__( 'Title style', 'themeisle-companion' ),
147
- 'sections' => array(
148
- 'general' => array(
149
- 'title' => esc_html__( 'General', 'themeisle-companion' ),
150
- 'fields' => array(
151
- 'title_color' => array(
152
- 'type' => 'color',
153
- 'label' => esc_html__( 'Color', 'themeisle-companion' ),
154
- 'preview' => array(
155
- 'type' => 'css',
156
- 'rules' => array(
157
- array(
158
- 'selector' => '.obfx-service-title',
159
- 'property' => 'color',
160
- ),
161
- ),
162
- ),
163
- ),
164
- ),
165
- ),
166
- 'typography' => themeisle_typography_settings(
167
- array(
168
- 'prefix' => 'title_',
169
- 'selector' => '.obfx-service-title',
170
- )
171
- ),
172
- ),
173
- ),
174
- 'content_style' => array(
175
- 'title' => esc_html__( 'Content style', 'themeisle-companion' ),
176
- 'sections' => array(
177
- 'general' => array(
178
- 'title' => esc_html__( 'General', 'themeisle-companion' ),
179
- 'fields' => array(
180
- 'content_alignment' => array(
181
- 'type' => 'select',
182
- 'label' => esc_html__( 'Alignment', 'themeisle-companion' ),
183
- 'default' => 'center',
184
- 'options' => array(
185
- 'left' => esc_html__( 'Left', 'themeisle-companion' ),
186
- 'center' => esc_html__( 'Center', 'themeisle-companion' ),
187
- 'right' => esc_html__( 'Right', 'themeisle-companion' ),
188
- ),
189
- ),
190
- 'content_color' => array(
191
- 'type' => 'color',
192
- 'label' => esc_html__( 'Color', 'themeisle-companion' ),
193
- 'preview' => array(
194
- 'type' => 'css',
195
- 'rules' => array(
196
- array(
197
- 'selector' => '.obfx-service-content',
198
- 'property' => 'color',
199
- ),
200
- ),
201
- ),
202
- ),
203
- ),
204
- ),
205
- 'typography' => themeisle_typography_settings(
206
- array(
207
- 'prefix' => 'content_',
208
- 'selector' => '.obfx-service-content',
209
- )
210
- ),
211
- ),
212
- ),
213
- )
214
- );
215
-
216
- FLBuilder::register_settings_form(
217
- 'service_content', array(
218
- 'title' => __( 'Service', 'themeisle-companion' ),
219
- 'tabs' => array(
220
- 'general' => array(
221
- 'title' => esc_html__( 'General', 'themeisle-companion' ),
222
- 'sections' => array(
223
- 'general' => array(
224
- 'title' => '',
225
- 'fields' => array(
226
- 'title' => array(
227
- 'type' => 'text',
228
- 'label' => esc_html__( 'Title', 'themeisle-companion' ),
229
- ),
230
- 'text' => array(
231
- 'type' => 'textarea',
232
- 'label' => esc_html__( 'Text', 'themeisle-companion' ),
233
- 'rows' => '6',
234
- ),
235
- 'icon' => array(
236
- 'type' => 'icon',
237
- 'label' => esc_html__( 'Icon', 'themeisle-companion' ),
238
- 'show_remove' => true,
239
- ),
240
- 'icon_color' => array(
241
- 'type' => 'color',
242
- 'label' => esc_html__( 'Icon color', 'themeisle-companion' ),
243
- 'default' => 'd6d6d6',
244
- ),
245
- 'link' => array(
246
- 'type' => 'link',
247
- 'label' => esc_html__( 'Link to', 'themeisle-companion' ),
248
- ),
249
- ),
250
- ),
251
- ),
252
- ),
253
- ),
254
- )
255
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/companion-legacy/inc/hestia/common-functions.php DELETED
@@ -1,203 +0,0 @@
1
- <?php
2
- /**
3
- * Functions that are running in both Hestia Lite and Pro
4
- *
5
- * @author Themeisle
6
- * @package themeisle-companion
7
- */
8
-
9
- /**
10
- * Change default alignment for top bar.
11
- */
12
- function themeisle_hestia_top_bar_default_alignment(){
13
- return 'left';
14
- }
15
-
16
- /**
17
- * Add default content to clients section;
18
- */
19
- function themeisle_hestia_clients_default_content(){
20
- $plugin_path = plugins_url( 'inc/img/', __FILE__ );
21
- return json_encode(
22
- array(
23
- array( 'image_url' => $plugin_path . 'clients1.png', 'link' => '#'),
24
- array( 'image_url' => $plugin_path . 'clients2.png', 'link' => '#'),
25
- array( 'image_url' => $plugin_path . 'clients3.png', 'link' => '#'),
26
- array( 'image_url' => $plugin_path . 'clients4.png', 'link' => '#'),
27
- array( 'image_url' => $plugin_path . 'clients5.png', 'link' => '#'),
28
- )
29
- );
30
- }
31
-
32
- /**
33
- * Function to load content in top bar.
34
- */
35
- function themeisle_hestia_top_bar_default_content() {
36
- if ( class_exists( 'WooCommerce' ) ) {
37
- $top_bar_state = 'woo_top';
38
- } else {
39
- if ( 'page' == get_option('show_on_front') ) {
40
- $top_bar_state = 'page_top';
41
- } else {
42
- $top_bar_state = 'blog_top';
43
- }
44
- }
45
-
46
- $load_default = get_option( 'hestia_load_default' );
47
- if ( $load_default !== false ) {
48
- return;
49
- }
50
-
51
- switch ( $top_bar_state ) {
52
- case 'woo_top':
53
- themeisle_hestia_set_top_bar_menu( 'contact' );
54
- themeisle_hestia_set_top_bar_widgets( $top_bar_state );
55
- break;
56
- case 'blog_top':
57
- themeisle_hestia_set_top_bar_menu( 'socials' );
58
- themeisle_hestia_set_top_bar_widgets( $top_bar_state );
59
- break;
60
- case 'page_top':
61
- themeisle_hestia_set_top_bar_menu( 'contact' );
62
- themeisle_hestia_set_top_bar_widgets( $top_bar_state );
63
- break;
64
- }
65
-
66
- add_option( 'hestia_load_default', true );
67
- }
68
-
69
-
70
- /**
71
- * Set default widgets in top bar.
72
- *
73
- * @param string $type Top bar state.
74
- */
75
- function themeisle_hestia_set_top_bar_widgets( $type ) {
76
-
77
- $active_widgets = get_option( 'sidebars_widgets' );
78
-
79
- if ( ! empty( $active_widgets['sidebar-top-bar'] ) ) :
80
- /* There is already some content. */
81
- return;
82
- endif;
83
-
84
- switch ( $type ) {
85
- case 'woo_top':
86
- $counter = 1;
87
- $active_widgets['sidebar-top-bar'][0] = 'woocommerce_widget_cart-' . $counter;
88
- $cart_widget[ $counter ] = array( 'title' => 'Cart' );
89
- update_option( 'widget_woocommerce_widget_cart', $cart_widget );
90
- $counter++;
91
-
92
- $active_widgets['sidebar-top-bar'][] = 'woocommerce_product_search-' . $counter;
93
- $search_widget[ $counter ] = array( 'title' => 'Search' );
94
- update_option( 'widget_woocommerce_product_search', $search_widget );
95
- break;
96
- case 'blog_top':
97
- $active_widgets['sidebar-top-bar'][0] = 'search-1';
98
- $search_widget[1] = array( 'title' => 'Search' );
99
- update_option( 'widget_search', $search_widget );
100
- break;
101
- case 'page_top':
102
- $menu_id = themeisle_hestia_create_menu( 'socials' );
103
- $active_widgets['sidebar-top-bar'][0] = 'nav_menu-1';
104
- $menu_widget[1] = array(
105
- 'title' => 'Socials',
106
- 'nav_menu' => $menu_id,
107
- );
108
- update_option( 'widget_nav_menu', $menu_widget );
109
- break;
110
- }
111
- update_option( 'sidebars_widgets', $active_widgets );
112
- }
113
-
114
- /**
115
- * Set default menu in top bar.
116
- *
117
- * @param string $type Top bar state.
118
- */
119
- function themeisle_hestia_set_top_bar_menu( $type ) {
120
- $theme_navs = get_theme_mod( 'nav_menu_locations' );
121
- if ( empty( $theme_navs['top-bar-menu'] ) ) {
122
- $menu_id = themeisle_hestia_create_menu( $type );
123
- $theme_navs['top-bar-menu'] = $menu_id;
124
- set_theme_mod( 'nav_menu_locations', $theme_navs );
125
- }
126
- }
127
-
128
- /**
129
- * Create default menu for top bar
130
- *
131
- * @param string $type Top bar state.
132
- */
133
- function themeisle_hestia_create_menu( $type ) {
134
-
135
- $menu_name = 'Default Top Menu';
136
- if ( $type === 'socials' ) {
137
- $menu_name = 'Socials Top Menu';
138
- }
139
-
140
- $menu_exists = wp_get_nav_menu_object( $menu_name );
141
- if ( ! $menu_exists ) {
142
-
143
- $menu_id = wp_create_nav_menu( $menu_name );
144
- $menu_items = array();
145
- switch ( $type ) {
146
- case 'contact':
147
- $menu_items = array(
148
- array(
149
- 'title' => esc_html__('1-800-123-4567','themeisle-companion'),
150
- 'url' => esc_html__('tel:1-800-123-4567','themeisle-companion'),
151
- ),
152
- array(
153
- 'title' => esc_html__('friends@themeisle.com','themeisle-companion'),
154
- 'url' => esc_html__('mailto:friends@themeisle.com','themeisle-companion'),
155
- ),
156
- );
157
- break;
158
- case 'socials':
159
- $menu_items = array(
160
- array(
161
- 'title' => esc_html__('Facebook','themeisle-companion'),
162
- 'url' => esc_html__('www.facebook.com','themeisle-companion'),
163
- ),
164
- array(
165
- 'title' => esc_html__('Twitter','themeisle-companion'),
166
- 'url' => esc_html__('www.twitter.com','themeisle-companion'),
167
- ),
168
- array(
169
- 'title' => esc_html__('Google','themeisle-companion'),
170
- 'url' => esc_html__('www.google.com','themeisle-companion'),
171
- ),
172
- array(
173
- 'title' => esc_html__('Linkedin','themeisle-companion'),
174
- 'url' => esc_html__('www.linkedin.com','themeisle-companion'),
175
- ),
176
- array(
177
- 'title' => esc_html__('Instagram','themeisle-companion'),
178
- 'url' => esc_html__('www.instagram.com','themeisle-companion'),
179
- ),
180
- array(
181
- 'title' => esc_html__('Pinterest','themeisle-companion'),
182
- 'url' => esc_html__('www.pinterest.com','themeisle-companion'),
183
- ),
184
- array(
185
- 'title' => esc_html__('Youtube','themeisle-companion'),
186
- 'url' => esc_html__('www.youtube.com','themeisle-companion'),
187
- ),
188
- );
189
- break;
190
- }
191
- foreach ( $menu_items as $menu_item ) {
192
- wp_update_nav_menu_item(
193
- $menu_id, 0, array(
194
- 'menu-item-title' => $menu_item['title'],
195
- 'menu-item-url' => $menu_item['url'],
196
- 'menu-item-status' => 'publish',
197
- )
198
- );
199
- }
200
- return $menu_id;
201
- }
202
- return '';
203
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/companion-legacy/inc/hestia/inc/features/feature-clients-bar-section.php CHANGED
@@ -60,7 +60,6 @@ if ( ! function_exists( 'hestia_clients_bar_customize_register' ) ) :
60
  'hestia_clients_bar_content', array(
61
  'sanitize_callback' => 'hestia_repeater_sanitize',
62
  'transport' => $selective_refresh,
63
- 'default' => apply_filters( 'hestia_clients_bar_default_content', false ),
64
  )
65
  );
66
 
60
  'hestia_clients_bar_content', array(
61
  'sanitize_callback' => 'hestia_repeater_sanitize',
62
  'transport' => $selective_refresh,
 
63
  )
64
  );
65
 
obfx_modules/companion-legacy/inc/hestia/inc/img/clients1.png DELETED
Binary file
obfx_modules/companion-legacy/inc/hestia/inc/img/clients2.png DELETED
Binary file
obfx_modules/companion-legacy/inc/hestia/inc/img/clients3.png DELETED
Binary file
obfx_modules/companion-legacy/inc/hestia/inc/img/clients4.png DELETED
Binary file
obfx_modules/companion-legacy/inc/hestia/inc/img/clients5.png DELETED
Binary file
obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-clients-bar-section.php CHANGED
@@ -25,13 +25,13 @@ if ( ! function_exists( 'hestia_clients_bar' ) ) :
25
  }
26
 
27
  $hide_section = get_theme_mod( 'hestia_clients_bar_hide', true );
28
- $hestia_clients_bar_content = get_theme_mod( 'hestia_clients_bar_content', apply_filters( 'hestia_clients_bar_default_content', false ) );
29
  $hestia_clients_bar_content_decoded = json_decode( $hestia_clients_bar_content );
30
 
31
  /* Don't show section if Disable section is checked or it doesn't have any content. Show it if it's called as a shortcode */
32
  if ( $is_shortcode === false && ( empty( $hestia_clients_bar_content ) || (bool) $hide_section === true ) || empty( $hestia_clients_bar_content_decoded ) ) {
33
  if ( is_customize_preview() ) {
34
- echo '<section class="hestia-clients-bar text-center" id="clients" data-sorder="hestia_clients_bar" style="display: none"></section>';
35
  }
36
  return;
37
  }
@@ -39,10 +39,11 @@ if ( ! function_exists( 'hestia_clients_bar' ) ) :
39
  $wrapper_class = $is_shortcode === true ? 'is-shortcode' : '';
40
 
41
  ?>
42
- <section class="hestia-clients-bar text-center <?php echo esc_attr( $wrapper_class ); ?>" id="clients" data-sorder="hestia_clients_bar">
43
  <div class="container">
44
  <div class="row">
45
  <?php
 
46
  $array_length = sizeof( $hestia_clients_bar_content_decoded );
47
  foreach ( $hestia_clients_bar_content_decoded as $client ) {
48
  $image = ! empty( $client->image_url ) ? apply_filters( 'hestia_translate_single_string', $client->image_url, 'Clients bar section' ) : '';
@@ -70,6 +71,12 @@ if ( ! function_exists( 'hestia_clients_bar' ) ) :
70
  }
71
  echo '</div>';
72
  }
 
 
 
 
 
 
73
  }
74
  ?>
75
  </div>
25
  }
26
 
27
  $hide_section = get_theme_mod( 'hestia_clients_bar_hide', true );
28
+ $hestia_clients_bar_content = get_theme_mod( 'hestia_clients_bar_content' );
29
  $hestia_clients_bar_content_decoded = json_decode( $hestia_clients_bar_content );
30
 
31
  /* Don't show section if Disable section is checked or it doesn't have any content. Show it if it's called as a shortcode */
32
  if ( $is_shortcode === false && ( empty( $hestia_clients_bar_content ) || (bool) $hide_section === true ) || empty( $hestia_clients_bar_content_decoded ) ) {
33
  if ( is_customize_preview() ) {
34
+ echo '<section class="hestia-clients-bar text-center" data-sorder="hestia_clients_bar" style="display: none"></section>';
35
  }
36
  return;
37
  }
39
  $wrapper_class = $is_shortcode === true ? 'is-shortcode' : '';
40
 
41
  ?>
42
+ <section class="hestia-clients-bar text-center <?php echo esc_attr( $wrapper_class ); ?>" data-sorder="hestia_clients_bar">
43
  <div class="container">
44
  <div class="row">
45
  <?php
46
+ $i = 1;
47
  $array_length = sizeof( $hestia_clients_bar_content_decoded );
48
  foreach ( $hestia_clients_bar_content_decoded as $client ) {
49
  $image = ! empty( $client->image_url ) ? apply_filters( 'hestia_translate_single_string', $client->image_url, 'Clients bar section' ) : '';
71
  }
72
  echo '</div>';
73
  }
74
+
75
+ if ( $i % 4 == 0 && $i !== $array_length ) {
76
+ echo '</div><!-- /.row -->';
77
+ echo '<div class="row">';
78
+ }
79
+ $i++;
80
  }
81
  ?>
82
  </div>
obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-features-section.php CHANGED
@@ -97,6 +97,7 @@ function hestia_features_content( $hestia_features_content, $is_callback = false
97
 
98
  $hestia_features_content = json_decode( $hestia_features_content );
99
  if ( ! empty( $hestia_features_content ) ) {
 
100
  echo '<div class="row">';
101
  foreach ( $hestia_features_content as $features_item ) :
102
  $icon = ! empty( $features_item->icon_value ) ? apply_filters( 'hestia_translate_single_string', $features_item->icon_value, 'Features section' ) : '';
@@ -107,7 +108,7 @@ function hestia_features_content( $hestia_features_content, $is_callback = false
107
  $color = ! empty( $features_item->color ) ? $features_item->color : '';
108
  $choice = ! empty( $features_item->choice ) ? $features_item->choice : 'customizer_repeater_icon';
109
  ?>
110
- <div class="col-xs-12 <?php echo apply_filters( 'hestia_features_per_row_class','col-md-4' ); ?> feature-box">
111
  <div class="hestia-info">
112
  <?php
113
  if ( ! empty( $link ) ) {
@@ -152,6 +153,12 @@ function hestia_features_content( $hestia_features_content, $is_callback = false
152
  </div>
153
  </div>
154
  <?php
 
 
 
 
 
 
155
  endforeach;
156
  echo '</div>';
157
  }// End if().
97
 
98
  $hestia_features_content = json_decode( $hestia_features_content );
99
  if ( ! empty( $hestia_features_content ) ) {
100
+ $i = 1;
101
  echo '<div class="row">';
102
  foreach ( $hestia_features_content as $features_item ) :
103
  $icon = ! empty( $features_item->icon_value ) ? apply_filters( 'hestia_translate_single_string', $features_item->icon_value, 'Features section' ) : '';
108
  $color = ! empty( $features_item->color ) ? $features_item->color : '';
109
  $choice = ! empty( $features_item->choice ) ? $features_item->choice : 'customizer_repeater_icon';
110
  ?>
111
+ <div class="<?php echo apply_filters( 'hestia_features_per_row_class','col-md-4' ); ?> feature-box">
112
  <div class="hestia-info">
113
  <?php
114
  if ( ! empty( $link ) ) {
153
  </div>
154
  </div>
155
  <?php
156
+ if ( $i % apply_filters( 'hestia_features_per_row_no', 3 ) == 0 ) {
157
+ echo '</div><!-- /.row -->';
158
+ echo '<div class="row">';
159
+ }
160
+ $i++;
161
+
162
  endforeach;
163
  echo '</div>';
164
  }// End if().
obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-ribbon-section.php CHANGED
@@ -28,7 +28,7 @@ if ( ! function_exists( 'hestia_ribbon' ) ) :
28
  $hestia_ribbon_hide = get_theme_mod( 'hestia_ribbon_hide', true );
29
  if ( $is_shortcode === false && (bool) $hestia_ribbon_hide === true ) {
30
  if ( is_customize_preview() ) {
31
- echo '<section class="hestia-ribbon section section-image" id="ribbon" data-sorder="hestia_ribbon" style="display: none"></section>';
32
  }
33
  return;
34
  }
@@ -43,7 +43,7 @@ if ( ! function_exists( 'hestia_ribbon' ) ) :
43
 
44
  $wrapper_class = $is_shortcode === true ? 'is-shortcode' : '';
45
  ?>
46
- <section class="hestia-ribbon section section-image <?php echo esc_attr( $wrapper_class ); ?>" id="ribbon" data-sorder="hestia_ribbon">
47
  <?php hestia_ribbon_background(); ?>
48
  <div class="container">
49
  <div class="row hestia-xs-text-center hestia-like-table">
28
  $hestia_ribbon_hide = get_theme_mod( 'hestia_ribbon_hide', true );
29
  if ( $is_shortcode === false && (bool) $hestia_ribbon_hide === true ) {
30
  if ( is_customize_preview() ) {
31
+ echo '<section class="hestia-ribbon section section-image" data-sorder="hestia_ribbon" style="display: none"></section>';
32
  }
33
  return;
34
  }
43
 
44
  $wrapper_class = $is_shortcode === true ? 'is-shortcode' : '';
45
  ?>
46
+ <section class="hestia-ribbon section section-image <?php echo esc_attr( $wrapper_class ); ?>" data-sorder="hestia_ribbon">
47
  <?php hestia_ribbon_background(); ?>
48
  <div class="container">
49
  <div class="row hestia-xs-text-center hestia-like-table">
obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-team-section.php CHANGED
@@ -106,6 +106,8 @@ function hestia_team_content( $hestia_team_content, $is_callback = false ) {
106
  $hestia_team_content = json_decode( $hestia_team_content );
107
 
108
  if ( ! empty( $hestia_team_content ) ) {
 
 
109
  echo '<div class="row">';
110
  foreach ( $hestia_team_content as $team_item ) :
111
  $image = ! empty( $team_item->image_url ) ? apply_filters( 'hestia_translate_single_string', $team_item->image_url, 'Team section' ) : '';
@@ -160,20 +162,17 @@ function hestia_team_content( $hestia_team_content, $is_callback = false ) {
160
  ?>
161
  <div class="footer">
162
  <?php
163
- foreach ( $icons_decoded as $value ) {
164
  $social_icon = ! empty( $value['icon'] ) ? apply_filters( 'hestia_translate_single_string', $value['icon'], 'Team section' ) : '';
165
  $social_link = ! empty( $value['link'] ) ? apply_filters( 'hestia_translate_single_string', $value['link'], 'Team section' ) : '';
166
-
167
- if ( ! empty( $social_icon ) ) {
168
- $link = '<a href="' . esc_url( $social_link ) . '"';
169
- if ( function_exists( 'hestia_is_external_url' ) ) {
170
- $link .= hestia_is_external_url( $social_link );
171
- }
172
- $link .= ' class="btn btn-just-icon btn-simple"><i class="fa ' . esc_attr( $social_icon ) . '"></i></a>';
173
- echo $link;
174
- }
175
- }
176
- ?>
177
  </div>
178
  <?php
179
  endif;
@@ -184,6 +183,11 @@ function hestia_team_content( $hestia_team_content, $is_callback = false ) {
184
  </div>
185
  </div>
186
  <?php
 
 
 
 
 
187
  endforeach;
188
  echo '</div>';
189
  }// End if().
106
  $hestia_team_content = json_decode( $hestia_team_content );
107
 
108
  if ( ! empty( $hestia_team_content ) ) {
109
+
110
+ $i = 1;
111
  echo '<div class="row">';
112
  foreach ( $hestia_team_content as $team_item ) :
113
  $image = ! empty( $team_item->image_url ) ? apply_filters( 'hestia_translate_single_string', $team_item->image_url, 'Team section' ) : '';
162
  ?>
163
  <div class="footer">
164
  <?php
165
+ foreach ( $icons_decoded as $value ) :
166
  $social_icon = ! empty( $value['icon'] ) ? apply_filters( 'hestia_translate_single_string', $value['icon'], 'Team section' ) : '';
167
  $social_link = ! empty( $value['link'] ) ? apply_filters( 'hestia_translate_single_string', $value['link'], 'Team section' ) : '';
168
+ ?>
169
+ <?php if ( ! empty( $social_icon ) ) : ?>
170
+ <a href="<?php echo esc_url( $social_link ); ?>"
171
+ class="btn btn-just-icon btn-simple">
172
+ <i class="fa <?php echo esc_attr( $social_icon ); ?>"></i>
173
+ </a>
174
+ <?php endif; ?>
175
+ <?php endforeach; ?>
 
 
 
176
  </div>
177
  <?php
178
  endif;
183
  </div>
184
  </div>
185
  <?php
186
+ if ( $i % 2 == 0 ) {
187
+ echo '</div><!-- /.row -->';
188
+ echo '<div class="row">';
189
+ }
190
+ $i++;
191
  endforeach;
192
  echo '</div>';
193
  }// End if().
obfx_modules/companion-legacy/inc/hestia/inc/sections/hestia-testimonials-section.php CHANGED
@@ -107,6 +107,7 @@ function hestia_testimonials_content( $hestia_testimonials_content, $is_callback
107
  if ( ! empty( $hestia_testimonials_content ) ) :
108
  $hestia_testimonials_content = json_decode( $hestia_testimonials_content );
109
  if ( ! empty( $hestia_testimonials_content ) ) {
 
110
  echo '<div class="row">';
111
  foreach ( $hestia_testimonials_content as $testimonial_item ) :
112
  $image = ! empty( $testimonial_item->image_url ) ? apply_filters( 'hestia_translate_single_string', $testimonial_item->image_url, 'Testimonials section' ) : '';
@@ -154,6 +155,11 @@ function hestia_testimonials_content( $hestia_testimonials_content, $is_callback
154
  </div>
155
  </div>
156
  <?php
 
 
 
 
 
157
  endforeach;
158
  echo '</div>';
159
  }// End if().
107
  if ( ! empty( $hestia_testimonials_content ) ) :
108
  $hestia_testimonials_content = json_decode( $hestia_testimonials_content );
109
  if ( ! empty( $hestia_testimonials_content ) ) {
110
+ $i = 1;
111
  echo '<div class="row">';
112
  foreach ( $hestia_testimonials_content as $testimonial_item ) :
113
  $image = ! empty( $testimonial_item->image_url ) ? apply_filters( 'hestia_translate_single_string', $testimonial_item->image_url, 'Testimonials section' ) : '';
155
  </div>
156
  </div>
157
  <?php
158
+ if ( $i % apply_filters( 'hestia_testimonials_per_row_no', 3 ) == 0 ) {
159
+ echo '</div><!-- /.row -->';
160
+ echo '<div class="row">';
161
+ }
162
+ $i++;
163
  endforeach;
164
  echo '</div>';
165
  }// End if().
obfx_modules/companion-legacy/init.php CHANGED
@@ -27,14 +27,16 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
27
  */
28
  public function __construct() {
29
  parent::__construct();
 
 
30
 
31
- $this->active_default = true;
32
 
33
  $this->inc_dir = $this->get_dir() . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR;
34
- if ( ! defined( 'THEMEISLE_COMPANION_PATH' ) ) {
35
  define( 'THEMEISLE_COMPANION_PATH', $this->inc_dir );
36
  }
37
- if ( ! defined( 'THEMEISLE_COMPANION_URL' ) ) {
38
  define( 'THEMEISLE_COMPANION_URL', plugin_dir_url( $this->inc_dir ) );
39
  }
40
  $theme_name = '';
@@ -59,19 +61,9 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
59
 
60
  if ( $this->is_hestia() ) {
61
  require_once $this->inc_dir . 'hestia' . DIRECTORY_SEPARATOR . 'functions.php';
62
- require_once $this->inc_dir . 'hestia' . DIRECTORY_SEPARATOR . 'common-functions.php';
63
  $theme_name = 'Hestia';
64
 
65
  }
66
-
67
- if ( $this->is_hestia_pro() ) {
68
- require_once $this->inc_dir . 'hestia' . DIRECTORY_SEPARATOR . 'common-functions.php';
69
- $theme_name = 'Hestia Pro';
70
-
71
- }
72
- $this->name = sprintf( __( '%s enhancements ', 'themeisle-companion' ), $theme_name );
73
- $this->description = sprintf( __( 'Module containing frontpage improvements for %s theme.', 'themeisle-companion' ), $theme_name );
74
-
75
  if ( ! empty( $theme_name ) ) {
76
  $this->notices = array(
77
  array(
@@ -108,14 +100,6 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
108
  return false;
109
  }
110
 
111
- private function is_hestia_pro(){
112
- if ( $this->get_active_theme_dir() == 'hestia-pro' ) {
113
- return true;
114
- }
115
-
116
- return false;
117
- }
118
-
119
  /**
120
  * Determine if module should be loaded.
121
  *
@@ -124,7 +108,7 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
124
  * @return bool
125
  */
126
  public function enable_module() {
127
- if ( $this->is_hestia() || $this->is_rhea() || $this->is_zerif() || $this->is_hestia_pro() ) {
128
  return true;
129
  } else {
130
  return false;
@@ -187,37 +171,13 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
187
  themeisle_hestia_require();
188
  }
189
 
190
- /**
191
- * Wrapper method for themeisle_hestia_set_default_content function call.
192
- *
193
- * @since 2.1.1
194
- * @access public
195
- */
196
- public function hestia_load_default_content(){
197
- themeisle_hestia_top_bar_default_content();
198
- }
199
-
200
- /**
201
- * Wrapper method for themeisle_hestia_clients_default_content function call.
202
- *
203
- * @since 2.1.1
204
- * @access public
205
- */
206
- public function hestia_load_clients_default_content(){
207
- return themeisle_hestia_clients_default_content();
208
- }
209
-
210
- public function hestia_top_bar_default_alignment(){
211
- return themeisle_hestia_top_bar_default_alignment();
212
- }
213
-
214
  /**
215
  * Wrapper method for themeisle_hestia_load_controls function call.
216
  *
217
  * @since 2.0.4
218
  * @access public
219
  */
220
- public function hestia_require_customizer() {
221
  themeisle_hestia_load_controls();
222
  }
223
 
@@ -261,18 +221,9 @@ class Companion_Legacy_OBFX_Module extends Orbit_Fox_Module_Abstract {
261
 
262
  if ( $this->is_hestia() ) {
263
  $this->loader->add_action( 'after_setup_theme', $this, 'hestia_require' );
264
- $this->loader->add_action( 'after_setup_theme', $this, 'hestia_load_default_content' );
265
- $this->loader->add_filter( 'after_setup_theme', $this, 'hestia_load_clients_default_content' );
266
- $this->loader->add_filter( 'hestia_top_bar_alignment_default', $this, 'hestia_top_bar_default_alignment' );
267
  $this->loader->add_action( 'customize_register', $this, 'hestia_require_customizer', 0 );
268
  $this->loader->add_action( 'after_switch_theme', $this, 'hestia_set_front_page' );
269
  }
270
-
271
- if ( $this->is_hestia_pro() ) {
272
- $this->loader->add_action( 'after_setup_theme', $this, 'hestia_load_default_content' );
273
- $this->loader->add_filter( 'hestia_clients_bar_default_content', $this, 'hestia_load_clients_default_content' );
274
- $this->loader->add_filter( 'hestia_top_bar_alignment_default', $this, 'hestia_top_bar_default_alignment' );
275
- }
276
  }
277
 
278
  /**
27
  */
28
  public function __construct() {
29
  parent::__construct();
30
+ $this->name = __( 'Companion Legacy', 'themeisle-companion' );
31
+ $this->description = __( 'Module containing legacy functionality from ThemeIsle Companion.', 'themeisle-companion' );
32
 
33
+ $this->auto = true;
34
 
35
  $this->inc_dir = $this->get_dir() . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR;
36
+ if( ! defined('THEMEISLE_COMPANION_PATH') ) {
37
  define( 'THEMEISLE_COMPANION_PATH', $this->inc_dir );
38
  }
39
+ if( ! defined('THEMEISLE_COMPANION_URL') ) {
40
  define( 'THEMEISLE_COMPANION_URL', plugin_dir_url( $this->inc_dir ) );
41
  }
42
  $theme_name = '';
61
 
62
  if ( $this->is_hestia() ) {
63
  require_once $this->inc_dir . 'hestia' . DIRECTORY_SEPARATOR . 'functions.php';
 
64
  $theme_name = 'Hestia';
65
 
66
  }
 
 
 
 
 
 
 
 
 
67
  if ( ! empty( $theme_name ) ) {
68
  $this->notices = array(
69
  array(
100
  return false;
101
  }
102
 
 
 
 
 
 
 
 
 
103
  /**
104
  * Determine if module should be loaded.
105
  *
108
  * @return bool
109
  */
110
  public function enable_module() {
111
+ if ( $this->is_hestia() || $this->is_rhea() || $this->is_zerif() ) {
112
  return true;
113
  } else {
114
  return false;
171
  themeisle_hestia_require();
172
  }
173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  /**
175
  * Wrapper method for themeisle_hestia_load_controls function call.
176
  *
177
  * @since 2.0.4
178
  * @access public
179
  */
180
+ public function hestia_require_customizer(){
181
  themeisle_hestia_load_controls();
182
  }
183
 
221
 
222
  if ( $this->is_hestia() ) {
223
  $this->loader->add_action( 'after_setup_theme', $this, 'hestia_require' );
 
 
 
224
  $this->loader->add_action( 'customize_register', $this, 'hestia_require_customizer', 0 );
225
  $this->loader->add_action( 'after_switch_theme', $this, 'hestia_set_front_page' );
226
  }
 
 
 
 
 
 
227
  }
228
 
229
  /**
obfx_modules/elementor-widgets/css/public.css DELETED
@@ -1,293 +0,0 @@
1
- /* Pricing Table Base CSS */
2
- .obfx-pricing-table-wrapper, .obfx-pricing-table-wrapper p.obfx-pricing-table-subtitle {
3
- text-align: center;
4
- }
5
-
6
- .obfx-pricing-table-wrapper a {
7
- cursor: pointer;
8
- }
9
-
10
- .obfx-title-wrapper {
11
- padding: 15px;
12
- }
13
-
14
- .obfx-pricing-table-title {
15
- font-weight: 600;
16
- }
17
-
18
- .obfx-pricing-table-wrapper .obfx-feature-list {
19
- list-style: none;
20
- padding: 10px 50px;
21
- margin: 0;
22
- }
23
-
24
- .obfx-pricing-table-wrapper .obfx-feature-list li {
25
- font-size: 16px;
26
- }
27
-
28
- .obfx-price-wrapper {
29
- padding: 20px 0;
30
- }
31
-
32
- .obfx-price {
33
- line-height: normal;
34
- font-size: 80px;
35
- font-weight: 600;
36
- }
37
-
38
- .obfx-pricing-period,
39
- .obfx-price-currency {
40
- font-size: 21px;
41
- }
42
-
43
- .obfx-button-icon-align-right i {
44
- margin-left: 5px;
45
- }
46
- .obfx-button-icon-align-left i {
47
- margin-right: 5px;
48
- }
49
-
50
- .obfx-pricing-table-accented {
51
- font-weight: 600;
52
- }
53
-
54
- .obfx-pricing-table-button-wrapper {
55
- padding: 20px 0;
56
- }
57
-
58
- .obfx-pricing-table-button {
59
- padding: 10px 20px;
60
- border-radius: 5px;
61
- }
62
- /* End Of Pricing Table Base CSS */
63
-
64
- /* Post Type Grid Base CSS */
65
-
66
- .obfx-grid:after {
67
- visibility: hidden;
68
- display: block;
69
- font-size: 0;
70
- content: " ";
71
- clear: both;
72
- height: 0;
73
- }
74
-
75
- .obfx-grid-container {
76
- display: -webkit-flex;
77
- display: flex;
78
- -webkit-flex-wrap: wrap;
79
- flex-wrap: wrap;
80
- margin-left: -15px;
81
- margin-right: -15px;
82
- }
83
-
84
- .obfx-grid-wrapper {
85
- padding-left: 15px;
86
- padding-right: 15px;
87
- }
88
-
89
- .obfx-grid .obfx-grid-col-image {
90
- display: block;
91
- margin: 0 0 10px 0;
92
- overflow: hidden;
93
- position: relative;
94
- left: 0;
95
- right: 0;
96
- bottom: 0;
97
- top: 0;
98
- -webkit-box-shadow: 0px 3px 10px 0px rgba(181,181,181,1);
99
- -moz-box-shadow: 0px 3px 10px 0px rgba(181,181,181,1);
100
- box-shadow: 0px 3px 10px 0px rgba(181,181,181,1);
101
- }
102
-
103
- .obfx-grid .obfx-grid-col-image {
104
- display: inline-block;
105
- height: 200px;
106
- width: 100%;
107
- }
108
-
109
- .obfx-grid .obfx-grid-col-image.obfx-fit-height img {
110
- height: 100%;
111
- width: auto;
112
- }
113
-
114
- .obfx-grid .obfx-grid-col-image img {
115
- display: block;
116
- height: auto;
117
- left: 50%;
118
- position: absolute;
119
- max-height: none;
120
- max-width: none;
121
- top: 50%;
122
- transform: translate(-50%,-50%);
123
- width: 100%;
124
- }
125
-
126
- .obfx-grid .obfx-grid-title,
127
- .obfx-grid .obfx-grid-title a {
128
- color: #333;
129
- font-size: 24px;
130
- line-height: 1.5;
131
- margin: 0;
132
- }
133
-
134
- .obfx-grid-meta {
135
- margin: 0 0 10px 0;
136
- }
137
-
138
- .obfx-grid-meta > span {
139
- color: #999;
140
- font-size: 14px;
141
- margin-right: 10px;
142
- }
143
-
144
- .obfx-grid-meta > span:last-of-type {
145
- margin-right: 0;
146
- }
147
-
148
- .obfx-grid-meta .fa {
149
- margin-right: 7px;
150
- }
151
-
152
- .obfx-grid-meta a {
153
- color: #999;
154
- text-decoration: none;
155
- }
156
-
157
- .obfx-grid-meta a:hover,
158
- .obfx-grid-meta a:focus {
159
- color: inherit;
160
- text-decoration: underline;
161
- }
162
-
163
- .obfx-grid-categories-item:after,
164
- .obfx-grid-tags-item:after {
165
- content: ', ';
166
- }
167
-
168
- .obfx-grid-categories-item:last-of-type:after,
169
- .obfx-grid-tags-item:last-of-type:after {
170
- content: '';
171
- display: none;
172
- }
173
-
174
- .obfx-grid-content {
175
- color: #555;
176
- font-size: 16px;
177
- line-height: 1.5;
178
- margin: 0 0 10px 0;
179
- }
180
-
181
- .obfx-grid-footer a {
182
- color: #333;
183
- display: inline-block;
184
- font-size: 14px;
185
- font-weight: 700;
186
- }
187
-
188
- .obfx-grid-container.obfx-grid-style-list .obfx-grid-col {
189
- display: -webkit-flex;
190
- display: flex;
191
- -webkit-flex-wrap: wrap;
192
- flex-wrap: wrap;
193
- }
194
-
195
- .obfx-grid-container.obfx-grid-style-list .obfx-grid-col-image {
196
- width: 40%;
197
- }
198
-
199
- .obfx-grid-container.obfx-grid-style-list .obfx-grid-col-content {
200
- padding-left: 15px;
201
- width: 60%;
202
- }
203
-
204
- .obfx-grid-container.obfx-grid-style-list .obfx-grid-col.obfx-no-image .obfx-grid-col-content {
205
- padding-left: 0;
206
- width: 100%;
207
- }
208
-
209
- .obfx-grid-pagination {
210
- width: 100%;
211
- }
212
-
213
- .obfx-grid-desktop-1 .obfx-grid-wrapper {
214
- width: 100%;
215
- }
216
-
217
- .obfx-grid-desktop-2 .obfx-grid-wrapper {
218
- width: 50%;
219
- }
220
-
221
- .obfx-grid-desktop-3 .obfx-grid-wrapper {
222
- width: 33.333%;
223
- }
224
-
225
- .obfx-grid-desktop-4 .obfx-grid-wrapper {
226
- width: 25%;
227
- }
228
-
229
- .obfx-grid-desktop-5 .obfx-grid-wrapper {
230
- width: 20%;
231
- }
232
-
233
- @media (max-width: 992px) {
234
- .obfx-grid-tablet-1 .obfx-grid-wrapper {
235
- width: 100%;
236
- }
237
-
238
- .obfx-grid-tablet-2 .obfx-grid-wrapper {
239
- width: 50%;
240
- }
241
-
242
- .obfx-grid-tablet-3 .obfx-grid-wrapper {
243
- width: 33.333%;
244
- }
245
-
246
- .obfx-grid-tablet-4 .obfx-grid-wrapper {
247
- width: 25%;
248
- }
249
-
250
- .obfx-grid-tablet-5 .obfx-grid-wrapper {
251
- width: 20%;
252
- }
253
- }
254
-
255
- @media (max-width: 767px) {
256
- .obfx-grid-mobile-1 .obfx-grid-wrapper {
257
- width: 100%;
258
- }
259
-
260
- .obfx-grid-mobile-2 .obfx-grid-wrapper {
261
- width: 50%;
262
- }
263
-
264
- .obfx-grid-mobile-3 .obfx-grid-wrapper {
265
- width: 33.333%;
266
- }
267
-
268
- .obfx-grid-mobile-4 .obfx-grid-wrapper {
269
- width: 25%;
270
- }
271
-
272
- .obfx-grid-mobile-5 .obfx-grid-wrapper {
273
- width: 20%;
274
- }
275
- }
276
- /* End Of Post Type Grid Base CSS */
277
-
278
- .obfx-service-box {
279
- display: flex;
280
- }
281
-
282
- .obfx-position-left .obfx-service-box {
283
- flex-direction: row;
284
- }
285
- .obfx-position-right .obfx-service-box {
286
- flex-direction: row-reverse;
287
- }
288
- .obfx-position-top .obfx-service-box {
289
- flex-direction: column;
290
- }
291
- .obfx-service-box .obfx-service-box-content .obfx-service-title, .obfx-service-box .obfx-service-box-content .obfx-service-text {
292
- margin: 0;
293
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/elementor-widgets/init.php DELETED
@@ -1,160 +0,0 @@
1
- <?php
2
- /**
3
- * Elementor Widgets Core Orbit Fox Module.
4
- *
5
- * @link https://themeisle.com
6
- * @since 1.0.0
7
- *
8
- * @package Elementor_Widgets_OBFX_Module
9
- */
10
-
11
- define( 'OBFX_MODULE_URL', __FILE__ );
12
-
13
- /**
14
- * The class defines a new module to be used by Orbit Fox plugin.
15
- *
16
- * @package Elementor_Widgets_OBFX_Module
17
- * @author Themeisle <friends@themeisle.com>
18
- * @codeCoverageIgnore
19
- */
20
- class Elementor_Widgets_OBFX_Module extends Orbit_Fox_Module_Abstract {
21
-
22
- /**
23
- * Elementor Widgets File Names
24
- *
25
- * @var array
26
- */
27
- private $elementor_widgets = array(
28
- 'class-obfx-elementor-widget-pricing-table',
29
- 'class-obfx-elementor-widget-services',
30
- 'class-obfx-elementor-widget-posts-grid',
31
- );
32
-
33
- /**
34
- * Elementor_Widgets_OBFX_Module constructor.
35
- *
36
- * @since 1.0.0
37
- * @access public
38
- */
39
- public function __construct() {
40
- parent::__construct();
41
- $this->name = __( 'Elementor Modules', 'themeisle-companion' );
42
- $this->description = __( 'Adds new Elementor Widgets.', 'themeisle-companion' );
43
- $this->active_default = true;
44
- }
45
-
46
- /**
47
- * Determine if module should be loaded.
48
- *
49
- * @since 1.0.0
50
- * @access public
51
- * @return bool
52
- */
53
- public function enable_module() {
54
- require_once( ABSPATH . 'wp-admin' . '/includes/plugin.php' );
55
- return is_plugin_active( 'elementor/elementor.php' );
56
- }
57
-
58
- /**
59
- * The loading logic for the module.
60
- *
61
- * @since 1.0.0
62
- * @access public
63
- */
64
- public function load() {}
65
-
66
- /**
67
- * Method to define hooks needed.
68
- *
69
- * @since 1.0.0
70
- * @access public
71
- * @return mixed | array
72
- */
73
- public function hooks() {
74
-
75
- $this->loader->add_action( 'elementor/init', $this, 'add_elementor_category' );
76
- $this->loader->add_action( 'elementor/widgets/widgets_registered', $this, 'add_elementor_widgets' );
77
- $this->loader->add_action( 'elementor/frontend/after_register_scripts', $this, 'enqueue_scripts' );
78
-
79
- }
80
-
81
- /**
82
- * Method that returns an array of scripts and styles to be loaded
83
- * for the front end part.
84
- *
85
- * @since 1.0.0
86
- * @access public
87
- * @return array
88
- */
89
- public function public_enqueue() {
90
- return array(
91
- 'css' => array(
92
- 'public' => false,
93
- ),
94
- );
95
- }
96
-
97
- /**
98
- * Method that returns an array of scripts and styles to be loaded
99
- * for the admin part.
100
- *
101
- * @since 1.0.0
102
- * @access public
103
- * @return array
104
- */
105
- public function admin_enqueue() {
106
- return array();
107
- }
108
-
109
- /**
110
- * Method to define the options fields for the module
111
- *
112
- * @since 1.0.0
113
- * @access public
114
- * @return array
115
- */
116
- public function options() {
117
- $options = array();
118
-
119
- return $options;
120
- }
121
-
122
- /**
123
- * Add the Category for Orbit Fox Widgets.
124
- */
125
- public function add_elementor_category() {
126
- \Elementor\Plugin::instance()->elements_manager->add_category(
127
- 'obfx-elementor-widgets',
128
- array(
129
- 'title' => __( 'Orbit Fox Addons', 'themeisle-companion' ),
130
- 'icon' => 'fa fa-plug',
131
- ),
132
- 1 );
133
- }
134
-
135
- /**
136
- * Require and instantiate Elementor Widgets.
137
- *
138
- * @param $widgets_manager
139
- */
140
- public function add_elementor_widgets( $widgets_manager ) {
141
- foreach ( $this->elementor_widgets as $widget ) {
142
- require_once $this->get_dir() . '/widgets/' . $widget . '.php';
143
- }
144
-
145
- // Pricing table
146
- $widget = new Elementor\OBFX_Elementor_Widget_Pricing_Table();
147
- $widgets_manager->register_widget_type( $widget );
148
- // Services
149
- $widget = new Elementor\OBFX_Elementor_Widget_Services();
150
- $widgets_manager->register_widget_type( $widget );
151
- // Posts grid
152
- $widget = new Elementor\OBFX_Elementor_Widget_Posts_Grid();
153
- $widgets_manager->register_widget_type( $widget );
154
- }
155
-
156
- public function enqueue_scripts() {
157
- // Add custom JS for grid.
158
- wp_enqueue_script( 'obfx-grid-js', plugins_url ( 'js/obfx-grid.js', OBFX_MODULE_URL ), array(), '1.0', true );
159
- }
160
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/elementor-widgets/js/obfx-grid.js DELETED
@@ -1,62 +0,0 @@
1
- /* global elementor */
2
- (function ($) {
3
- $( document ).ready(
4
- function () {
5
- checkImageSize();
6
- }
7
- );
8
-
9
- $( window ).resize(
10
- function () {
11
- checkImageSize();
12
- }
13
- );
14
-
15
- if ( typeof elementor !== 'undefined' ) {
16
- $( window ).on(
17
- 'elementor/frontend/init', function () {
18
- elementor.hooks.addAction(
19
- 'panel/open_editor/widget/obfx-posts-grid', function ( panel ) {
20
- var $element = panel.$el.find( '.elementor-control-section_grid_image' );
21
- $element.click(
22
- function () {
23
- panel.$el.find( '.elementor-control-grid_image_height .elementor-control-input-wrapper' ).mouseup(
24
- function () {
25
- checkImageSize();
26
- }
27
- );
28
- }
29
- );
30
- }
31
- );
32
- }
33
- );
34
- }
35
-
36
- /**
37
- * Check the container and image size.
38
- */
39
- function checkImageSize() {
40
- $( '.obfx-grid .obfx-grid-col' ).each(
41
- function () {
42
- var container = $( this ).find( '.obfx-grid-col-image' ),
43
- containerWidth = $( this ).find( '.obfx-grid-col-image' ).width(),
44
- containerHeight = $( this ).find( '.obfx-grid-col-image' ).height(),
45
- imageWidth = $( this ).find( '.obfx-grid-col-image img' ).width(),
46
- imageHeight = $( this ).find( '.obfx-grid-col-image img' ).height();
47
-
48
- if ( $( this ).find( '.obfx-grid-col-image' ).length > 0 ) {
49
-
50
- if ( containerHeight > imageHeight ) {
51
- container.addClass( 'obfx-fit-height' );
52
- }
53
-
54
- if ( containerWidth > imageWidth && container.hasClass( 'obfx-fit-height' ) ) {
55
- container.removeClass( 'obfx-fit-height' );
56
- }
57
- }
58
- }
59
- );
60
- }
61
-
62
- })( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-posts-grid.php DELETED
@@ -1,1761 +0,0 @@
1
- <?php
2
- /**
3
- * Orbit Fox Elementor Features Widget
4
- *
5
- * @link https://themeisle.com
6
- * @since 1.0.0
7
- *
8
- * @package Elementor_Widgets_OBFX_Module
9
- */
10
- namespace Elementor;
11
-
12
-
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- } // End if().
16
-
17
- /**
18
- * Class OBFX_Elementor_Widget_Features
19
- *
20
- * @package Elementor_Widgets_OBFX_Module
21
- */
22
- class OBFX_Elementor_Widget_Posts_Grid extends Widget_Base {
23
-
24
- /**
25
- * Widget title.
26
- *
27
- * @return string
28
- */
29
- public function get_title() {
30
- return __( 'Post Type Grid', 'themeisle-companion' );
31
- }
32
-
33
- /**
34
- * Widget icon.
35
- *
36
- * @return string
37
- */
38
- public function get_icon() {
39
- return 'eicon-posts-grid';
40
- }
41
-
42
- /**
43
- * Widget name.
44
- *
45
- * @return string
46
- */
47
- public function get_name() {
48
- return 'obfx-posts-grid';
49
- }
50
-
51
- /**
52
- * Widget Category.
53
- *
54
- * @return array
55
- */
56
- public function get_categories() {
57
- return [ 'obfx-elementor-widgets' ];
58
- }
59
-
60
- /**
61
- * Get post types.
62
- */
63
- private function grid_get_all_post_types() {
64
- $options = array();
65
- $exclude = array( 'attachment', 'elementor_library' ); // excluded post types
66
-
67
- $args = array(
68
- 'public' => true,
69
- );
70
-
71
- foreach ( get_post_types( $args, 'objects' ) as $post_type ) {
72
- // Check if post type name exists.
73
- if ( ! isset( $post_type->name ) ) {
74
- continue;
75
- }
76
-
77
- // Check if post type label exists.
78
- if ( ! isset( $post_type->label ) ) {
79
- continue;
80
- }
81
-
82
- // Check if post type is excluded.
83
- if ( in_array( $post_type->name, $exclude ) === true ) {
84
- continue;
85
- }
86
-
87
- $options[ $post_type->name ] = $post_type->label;
88
- }
89
-
90
- return $options;
91
- }
92
-
93
- /**
94
- * Get post type categories.
95
- */
96
- private function grid_get_all_post_type_categories( $post_type ) {
97
- $options = array();
98
-
99
- if ( $post_type == 'post' ) {
100
- $taxonomy = 'category';
101
- } elseif ( $post_type == 'product' ) {
102
- $taxonomy = 'product_cat';
103
- }
104
-
105
- if ( ! empty( $taxonomy ) ) {
106
- // Get categories for post type.
107
- $terms = get_terms(
108
- array(
109
- 'taxonomy' => $taxonomy,
110
- 'hide_empty' => false,
111
- )
112
- );
113
- if ( ! empty( $terms ) ) {
114
- foreach ( $terms as $term ) {
115
- if ( isset( $term ) ) {
116
- if ( isset( $term->slug ) && isset( $term->name ) ) {
117
- $options[ $term->slug ] = $term->name;
118
- }
119
- }
120
- }
121
- }
122
- }
123
- return $options;
124
- }
125
-
126
- /**
127
- * Register Elementor Controls.
128
- */
129
- protected function _register_controls() {
130
- // Content.
131
- $this->grid_options_section();
132
- $this->grid_image_section();
133
- $this->grid_title_section();
134
- $this->grid_meta_section();
135
- $this->grid_content_section();
136
- $this->grid_pagination_section();
137
- // Style.
138
- $this->grid_options_style_section();
139
- $this->grid_image_style_section();
140
- $this->grid_title_style_section();
141
- $this->grid_meta_style_section();
142
- $this->grid_content_style_section();
143
- $this->grid_pagination_style_section();
144
- }
145
-
146
- /**
147
- * Content > Grid.
148
- */
149
- private function grid_options_section() {
150
- $this->start_controls_section(
151
- 'section_grid',
152
- [
153
- 'label' => __( 'Grid Options', 'themeisle-companion' ),
154
- ]
155
- );
156
-
157
- // Post type.
158
- $this->add_control(
159
- 'grid_post_type',
160
- [
161
- 'type' => Controls_Manager::SELECT,
162
- 'label' => '<i class="fa fa-tag"></i> ' . __( 'Post Type', 'themeisle-companion' ),
163
- 'default' => 'post',
164
- 'options' => $this->grid_get_all_post_types(),
165
- ]
166
- );
167
-
168
- // Post categories.
169
- $this->add_control(
170
- 'grid_post_categories',
171
- [
172
- 'type' => Controls_Manager::SELECT,
173
- 'label' => '<i class="fa fa-folder"></i> ' . __( 'Category', 'themeisle-companion' ),
174
- 'options' => $this->grid_get_all_post_type_categories( 'post' ),
175
- 'condition' => [
176
- 'grid_post_type' => 'post',
177
- ],
178
- ]
179
- );
180
-
181
- // Product categories.
182
- $this->add_control(
183
- 'grid_product_categories',
184
- [
185
- 'type' => Controls_Manager::SELECT,
186
- 'label' => '<i class="fa fa-tag"></i> ' . __( 'Category', 'themeisle-companion' ),
187
- 'options' => $this->grid_get_all_post_type_categories( 'product' ),
188
- 'condition' => [
189
- 'grid_post_type' => 'product',
190
- ],
191
- ]
192
- );
193
-
194
- // Style.
195
- $this->add_control(
196
- 'grid_style',
197
- [
198
- 'type' => Controls_Manager::SELECT,
199
- 'label' => '<i class="fa fa-paint-brush"></i> ' . __( 'Style', 'themeisle-companion' ),
200
- 'default' => 'grid',
201
- 'options' => [
202
- 'grid' => __( 'Grid', 'themeisle-companion' ),
203
- 'list' => __( 'List', 'themeisle-companion' ),
204
- ],
205
- ]
206
- );
207
-
208
- // Items.
209
- $this->add_control(
210
- 'grid_items',
211
- [
212
- 'type' => Controls_Manager::NUMBER,
213
- 'label' => '<i class="fa fa-th-large"></i> ' . __( 'Items', 'themeisle-companion' ),
214
- 'placeholder' => __( 'How many items?', 'themeisle-companion' ),
215
- 'default' => 6,
216
- ]
217
- );
218
-
219
- // Columns.
220
- $this->add_responsive_control(
221
- 'grid_columns',
222
- [
223
- 'type' => Controls_Manager::SELECT,
224
- 'label' => '<i class="fa fa-columns"></i> ' . __( 'Columns', 'themeisle-companion' ),
225
- 'default' => 3,
226
- 'tablet_default' => 2,
227
- 'mobile_default' => 1,
228
- 'options' => [
229
- 1 => 1,
230
- 2 => 2,
231
- 3 => 3,
232
- 4 => 4,
233
- 5 => 5,
234
- ],
235
- ]
236
- );
237
-
238
- // Order by.
239
- $this->add_control(
240
- 'grid_order_by',
241
- [
242
- 'type' => Controls_Manager::SELECT,
243
- 'label' => '<i class="fa fa-sort"></i> ' . __( 'Order by', 'themeisle-companion' ),
244
- 'default' => 'date',
245
- 'options' => [
246
- 'date' => __( 'Date', 'themeisle-companion' ),
247
- 'title' => __( 'Title', 'themeisle-companion' ),
248
- 'modified' => __( 'Modified date', 'themeisle-companion' ),
249
- 'comment_count' => __( 'Comment count', 'themeisle-companion' ),
250
- 'rand' => __( 'Random', 'themeisle-companion' ),
251
- ],
252
- ]
253
- );
254
-
255
- // Display pagination.
256
- $this->add_control(
257
- 'grid_pagination',
258
- [
259
- 'label' => '<i class="fa fa-arrow-circle-right"></i> ' . __( 'Pagination', 'themeisle-companion' ),
260
- 'type' => Controls_Manager::SWITCHER,
261
- 'default' => '',
262
- ]
263
- );
264
-
265
- $this->end_controls_section();
266
- }
267
-
268
- /**
269
- * Content > Image Options.
270
- */
271
- private function grid_image_section() {
272
- $this->start_controls_section(
273
- 'section_grid_image',
274
- [
275
- 'label' => __( 'Image', 'themeisle-companion' ),
276
- ]
277
- );
278
-
279
- // Hide image.
280
- $this->add_control(
281
- 'grid_image_hide',
282
- [
283
- 'label' => '<i class="fa fa-minus-circle"></i> ' . __( 'Hide', 'themeisle-companion' ),
284
- 'type' => Controls_Manager::SWITCHER,
285
- 'default' => '',
286
- ]
287
- );
288
-
289
- // Image height.
290
- $this->add_control(
291
- 'grid_image_height',
292
- [
293
- 'label' => '<i class="fa fa-arrows-h"></i> ' . __( 'Image height', 'themeisle-companion' ),
294
- 'type' => Controls_Manager::SLIDER,
295
- 'default' => [
296
- 'size' => 220,
297
- ],
298
- 'range' => [
299
- 'px' => [
300
- 'min' => 1,
301
- 'max' => 1000,
302
- 'step' => 1,
303
- ],
304
- ],
305
- 'selectors' => [
306
- '{{WRAPPER}} .obfx-grid-col-image' => 'height: {{SIZE}}{{UNIT}};',
307
- ],
308
- ]
309
- );
310
-
311
- // Image link.
312
- $this->add_control(
313
- 'grid_image_link',
314
- [
315
- 'label' => '<i class="fa fa-link"></i> ' . __( 'Link', 'themeisle-companion' ),
316
- 'type' => Controls_Manager::SWITCHER,
317
- 'default' => 'yes',
318
- ]
319
- );
320
-
321
- $this->end_controls_section();
322
- }
323
-
324
- /**
325
- * Content > Title Options.
326
- */
327
- private function grid_title_section() {
328
- $this->start_controls_section(
329
- 'section_grid_title',
330
- [
331
- 'label' => __( 'Title', 'themeisle-companion' ),
332
- ]
333
- );
334
-
335
- // Hide title.
336
- $this->add_control(
337
- 'grid_title_hide',
338
- [
339
- 'label' => '<i class="fa fa-minus-circle"></i> ' . __( 'Hide', 'themeisle-companion' ),
340
- 'type' => Controls_Manager::SWITCHER,
341
- 'default' => '',
342
- ]
343
- );
344
-
345
- // Title tag.
346
- $this->add_control(
347
- 'grid_title_tag',
348
- [
349
- 'type' => Controls_Manager::SELECT,
350
- 'label' => '<i class="fa fa-code"></i> ' . __( 'Tag', 'themeisle-companion' ),
351
- 'default' => 'h2',
352
- 'options' => [
353
- 'h1' => 'H1',
354
- 'h2' => 'H2',
355
- 'h3' => 'H3',
356
- 'h4' => 'H4',
357
- 'h5' => 'H5',
358
- 'h6' => 'H6',
359
- 'span' => 'span',
360
- 'p' => 'p',
361
- 'div' => 'div',
362
- ],
363
- ]
364
- );
365
-
366
- // Title link.
367
- $this->add_control(
368
- 'grid_title_link',
369
- [
370
- 'label' => '<i class="fa fa-link"></i> ' . __( 'Link', 'themeisle-companion' ),
371
- 'type' => Controls_Manager::SWITCHER,
372
- 'default' => 'yes',
373
- ]
374
- );
375
-
376
- $this->end_controls_section();
377
- }
378
-
379
- /**
380
- * Content > Meta Options.
381
- */
382
- private function grid_meta_section() {
383
- $this->start_controls_section(
384
- 'section_grid_meta',
385
- [
386
- 'label' => __( 'Meta', 'themeisle-companion' ),
387
- ]
388
- );
389
-
390
- // Hide content.
391
- $this->add_control(
392
- 'grid_meta_hide',
393
- [
394
- 'label' => '<i class="fa fa-minus-circle"></i> ' . __( 'Hide', 'themeisle-companion' ),
395
- 'type' => Controls_Manager::SWITCHER,
396
- 'default' => '',
397
- ]
398
- );
399
-
400
- // Meta.
401
- $this->add_control(
402
- 'grid_meta_display',
403
- [
404
- 'label' => '<i class="fa fa-info-circle"></i> ' . __( 'Display', 'themeisle-companion' ),
405
- 'label_block' => true,
406
- 'type' => Controls_Manager::SELECT2,
407
- 'default' => [ 'author', 'date' ],
408
- 'multiple' => true,
409
- 'options' => [
410
- 'author' => __( 'Author', 'themeisle-companion' ),
411
- 'date' => __( 'Date', 'themeisle-companion' ),
412
- 'category' => __( 'Category', 'themeisle-companion' ),
413
- 'tags' => __( 'Tags', 'themeisle-companion' ),
414
- 'comments' => __( 'Comments', 'themeisle-companion' ),
415
- ],
416
- ]
417
- );
418
-
419
- // No. of Categories.
420
- $this->add_control(
421
- 'grid_meta_categories_max',
422
- [
423
- 'type' => Controls_Manager::NUMBER,
424
- 'label' => __( 'No. of Categories', 'themeisle-companion' ),
425
- 'placeholder' => __( 'How many categories to display?', 'themeisle-companion' ),
426
- 'default' => __( '1', 'themeisle-companion' ),
427
- 'condition' => [
428
- 'grid_meta_display' => 'category',
429
- ],
430
- ]
431
- );
432
-
433
- // No. of Tags.
434
- $this->add_control(
435
- 'grid_meta_tags_max',
436
- [
437
- 'type' => Controls_Manager::NUMBER,
438
- 'label' => __( 'No. of Tags', 'themeisle-companion' ),
439
- 'placeholder' => __( 'How many tags to display?', 'themeisle-companion' ),
440
- 'condition' => [
441
- 'grid_meta_display' => 'tags',
442
- ],
443
- ]
444
- );
445
-
446
- // Remove meta icons.
447
- $this->add_control(
448
- 'grid_meta_remove_icons',
449
- [
450
- 'label' => '<i class="fa fa-minus-circle"></i> ' . __( 'Remove icons', 'themeisle-companion' ),
451
- 'type' => Controls_Manager::SWITCHER,
452
- 'default' => '',
453
- ]
454
- );
455
-
456
- $this->end_controls_section();
457
- }
458
-
459
- /**
460
- * Content > Content Options.
461
- */
462
- private function grid_content_section() {
463
- $this->start_controls_section(
464
- 'section_grid_content',
465
- [
466
- 'label' => __( 'Content', 'themeisle-companion' ),
467
- ]
468
- );
469
-
470
- // Hide content.
471
- $this->add_control(
472
- 'grid_content_hide',
473
- [
474
- 'label' => '<i class="fa fa-minus-circle"></i> ' . __( 'Hide', 'themeisle-companion' ),
475
- 'type' => Controls_Manager::SWITCHER,
476
- 'default' => '',
477
- ]
478
- );
479
-
480
- // Length.
481
- $this->add_control(
482
- 'grid_content_length',
483
- [
484
- 'type' => Controls_Manager::NUMBER,
485
- 'label' => '<i class="fa fa-arrows-h"></i> ' . __( 'Length (words)', 'themeisle-companion' ),
486
- 'placeholder' => __( 'Length of content (words)', 'themeisle-companion' ),
487
- 'default' => 30,
488
- ]
489
- );
490
-
491
- // Price.
492
- $this->add_control(
493
- 'grid_content_price',
494
- [
495
- 'label' => '<i class="fa fa-usd"></i> ' . __( 'Price', 'themeisle-companion' ),
496
- 'type' => Controls_Manager::SWITCHER,
497
- 'default' => 'yes',
498
- 'condition' => [
499
- 'section_grid.grid_post_type' => 'product',
500
- ],
501
- ]
502
- );
503
-
504
- // Read more button hide.
505
- $this->add_control(
506
- 'grid_content_default_btn',
507
- [
508
- 'label' => '<i class="fa fa-check-square"></i> ' . __( 'Button', 'themeisle-companion' ),
509
- 'type' => Controls_Manager::SWITCHER,
510
- 'default' => 'yes',
511
- 'condition' => [
512
- 'section_grid.grid_post_type!' => 'product',
513
- ],
514
- ]
515
- );
516
-
517
- // Default button text.
518
- $this->add_control(
519
- 'grid_content_default_btn_text',
520
- [
521
- 'type' => Controls_Manager::TEXT,
522
- 'label' => __( 'Button text', 'themeisle-companion' ),
523
- 'placeholder' => __( 'Read more', 'themeisle-companion' ),
524
- 'default' => __( 'Read more', 'themeisle-companion' ),
525
- 'condition' => [
526
- 'grid_content_default_btn!' => '',
527
- 'section_grid.grid_post_type!' => 'product',
528
- ],
529
- ]
530
- );
531
-
532
- // Add to cart button hide.
533
- $this->add_control(
534
- 'grid_content_product_btn',
535
- [
536
- 'label' => '<i class="fa fa-check-square"></i> ' . __( 'Button', 'themeisle-companion' ),
537
- 'type' => Controls_Manager::SWITCHER,
538
- 'default' => 'yes',
539
- 'condition' => [
540
- 'section_grid.grid_post_type' => 'product',
541
- ],
542
- ]
543
- );
544
-
545
- // Button alignment.
546
- $this->add_responsive_control(
547
- 'grid_content_btn_alignment',
548
- [
549
- 'label' => __( 'Button alignment', 'themeisle-companion' ),
550
- 'type' => Controls_Manager::CHOOSE,
551
- 'options' => [
552
- 'left' => [
553
- 'title' => __( 'Left', 'themeisle-companion' ),
554
- 'icon' => 'fa fa-align-left',
555
- ],
556
- 'center' => [
557
- 'title' => __( 'Center', 'themeisle-companion' ),
558
- 'icon' => 'fa fa-align-center',
559
- ],
560
- 'right' => [
561
- 'title' => __( 'Right', 'themeisle-companion' ),
562
- 'icon' => 'fa fa-align-right',
563
- ],
564
- 'justify' => [
565
- 'title' => __( 'Justified', 'themeisle-companion' ),
566
- 'icon' => 'fa fa-align-justify',
567
- ],
568
- ],
569
- 'default' => 'left',
570
- 'tablet_default' => 'left',
571
- 'mobile_default' => 'center',
572
- 'selectors' => [
573
- '{{WRAPPER}} .obfx-grid-footer' => 'text-align: {{VALUE}};',
574
- ],
575
- 'condition' => [
576
- 'grid_content_btn!' => '',
577
- ],
578
- ]
579
- );
580
-
581
- // Content alignment.
582
- $this->add_responsive_control(
583
- 'grid_content_alignment',
584
- [
585
- 'label' => '<i class="fa fa-align-right"></i> ' . __( 'Alignment', 'themeisle-companion' ),
586
- 'type' => Controls_Manager::CHOOSE,
587
- 'options' => [
588
- 'left' => [
589
- 'title' => __( 'Left', 'themeisle-companion' ),
590
- 'icon' => 'fa fa-align-left',
591
- ],
592
- 'center' => [
593
- 'title' => __( 'Center', 'themeisle-companion' ),
594
- 'icon' => 'fa fa-align-center',
595
- ],
596
- 'right' => [
597
- 'title' => __( 'Right', 'themeisle-companion' ),
598
- 'icon' => 'fa fa-align-right',
599
- ],
600
- ],
601
- 'default' => 'left',
602
- 'tablet_default' => 'left',
603
- 'mobile_default' => 'center',
604
- 'selectors' => [
605
- '{{WRAPPER}} .obfx-grid-col-content' => 'text-align: {{VALUE}};',
606
- ],
607
- ]
608
- );
609
-
610
- $this->end_controls_section();
611
- }
612
-
613
- /**
614
- * Content > Pagination Options.
615
- */
616
- private function grid_pagination_section() {
617
- $this->start_controls_section(
618
- 'section_grid_pagination',
619
- [
620
- 'label' => __( 'Pagination', 'themeisle-companion' ),
621
- 'condition' => [
622
- 'section_grid.grid_pagination' => 'yes',
623
- ],
624
- ]
625
- );
626
-
627
- // Pagination alignment.
628
- $this->add_responsive_control(
629
- 'grid_pagination_alignment',
630
- [
631
- 'label' => __( 'Alignment', 'themeisle-companion' ),
632
- 'type' => Controls_Manager::CHOOSE,
633
- 'options' => [
634
- 'left' => [
635
- 'title' => __( 'Left', 'themeisle-companion' ),
636
- 'icon' => 'fa fa-align-left',
637
- ],
638
- 'center' => [
639
- 'title' => __( 'Center', 'themeisle-companion' ),
640
- 'icon' => 'fa fa-align-center',
641
- ],
642
- 'right' => [
643
- 'title' => __( 'Right', 'themeisle-companion' ),
644
- 'icon' => 'fa fa-align-right',
645
- ],
646
- ],
647
- 'default' => 'center',
648
- 'tablet_default' => 'center',
649
- 'mobile_default' => 'center',
650
- 'selectors' => [
651
- '{{WRAPPER}} .obfx-grid-pagination .pagination' => 'text-align: {{VALUE}};',
652
- ],
653
- ]
654
- );
655
-
656
- $this->end_controls_section();
657
- }
658
-
659
- /**
660
- * Style > Grid options.
661
- */
662
- private function grid_options_style_section() {
663
- // Tab.
664
- $this->start_controls_section(
665
- 'section_grid_style',
666
- [
667
- 'label' => __( 'Grid Options', 'themeisle-companion' ),
668
- 'tab' => Controls_Manager::TAB_STYLE,
669
- ]
670
- );
671
-
672
- // Columns margin.
673
- $this->add_control(
674
- 'grid_style_columns_margin',
675
- [
676
- 'label' => __( 'Columns margin', 'themeisle-companion' ),
677
- 'type' => Controls_Manager::SLIDER,
678
- 'default' => [
679
- 'size' => 15,
680
- ],
681
- 'range' => [
682
- 'px' => [
683
- 'min' => 0,
684
- 'max' => 100,
685
- ],
686
- ],
687
- 'selectors' => [
688
- '{{WRAPPER}} .obfx-grid-wrapper' => 'padding-right: calc( {{SIZE}}{{UNIT}} ); padding-left: calc( {{SIZE}}{{UNIT}} );',
689
- '{{WRAPPER}} .obfx-grid-container' => 'margin-left: calc( -{{SIZE}}{{UNIT}} ); margin-right: calc( -{{SIZE}}{{UNIT}} );',
690
- ],
691
- ]
692
- );
693
-
694
- // Row margin.
695
- $this->add_control(
696
- 'grid_style_rows_margin',
697
- [
698
- 'label' => __( 'Rows margin', 'themeisle-companion' ),
699
- 'type' => Controls_Manager::SLIDER,
700
- 'default' => [
701
- 'size' => 30,
702
- ],
703
- 'range' => [
704
- 'px' => [
705
- 'min' => 0,
706
- 'max' => 100,
707
- ],
708
- ],
709
- 'selectors' => [
710
- '{{WRAPPER}} .obfx-grid-wrapper' => 'padding-bottom: {{SIZE}}{{UNIT}};',
711
- ],
712
- ]
713
- );
714
-
715
- // Background.
716
- $this->add_group_control(
717
- Group_Control_Background::get_type(),
718
- [
719
- 'name' => 'grid_style_background',
720
- 'types' => [ 'classic', 'gradient' ],
721
- 'selector' => '{{WRAPPER}} .obfx-grid',
722
- ]
723
- );
724
-
725
- // Items options.
726
- $this->add_control(
727
- 'grid_items_style_heading',
728
- [
729
- 'label' => __( 'Items', 'themeisle-companion' ),
730
- 'type' => Controls_Manager::HEADING,
731
- 'separator' => 'before',
732
- ]
733
- );
734
-
735
- // Items internal padding.
736
- $this->add_control(
737
- 'grid_items_style_padding',
738
- [
739
- 'label' => __( 'Padding', 'themeisle-companion' ),
740
- 'type' => Controls_Manager::DIMENSIONS,
741
- 'size_units' => [ 'px', '%' ],
742
- 'selectors' => [
743
- '{{WRAPPER}} .obfx-grid-col' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
744
- ],
745
- ]
746
- );
747
-
748
- // Items border radius.
749
- $this->add_control(
750
- 'grid_items_style_border_radius',
751
- [
752
- 'label' => __( 'Border Radius', 'themeisle-companion' ),
753
- 'type' => Controls_Manager::DIMENSIONS,
754
- 'size_units' => [ 'px', '%' ],
755
- 'selectors' => [
756
- '{{WRAPPER}} .obfx-grid-col' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
757
- ],
758
- ]
759
- );
760
-
761
- // Items box shadow.
762
- $this->add_group_control(
763
- Group_Control_Box_Shadow::get_type(),
764
- [
765
- 'name' => 'grid_items_style_box_shadow',
766
- 'selector' => '{{WRAPPER}} .obfx-grid-col',
767
- 'separator' => '',
768
- ]
769
- );
770
-
771
- // Background for items options.
772
- $this->add_group_control(
773
- Group_Control_Background::get_type(),
774
- [
775
- 'name' => 'grid_items_style_background',
776
- 'types' => [ 'classic', 'gradient' ],
777
- 'selector' => '{{WRAPPER}} .obfx-grid-col',
778
- ]
779
- );
780
-
781
- $this->end_controls_section();
782
- }
783
-
784
- /**
785
- * Style > Image.
786
- */
787
- private function grid_image_style_section() {
788
- // Tab.
789
- $this->start_controls_section(
790
- 'section_grid_image_style',
791
- [
792
- 'label' => __( 'Image', 'themeisle-companion' ),
793
- 'tab' => Controls_Manager::TAB_STYLE,
794
- 'condition' => [
795
- 'section_grid_image.grid_image_hide' => '',
796
- ],
797
- ]
798
- );
799
-
800
- // Image border radius.
801
- $this->add_control(
802
- 'grid_image_style_border_radius',
803
- [
804
- 'label' => __( 'Border Radius', 'themeisle-companion' ),
805
- 'type' => Controls_Manager::DIMENSIONS,
806
- 'size_units' => [ 'px', '%' ],
807
- 'selectors' => [
808
- '{{WRAPPER}} .obfx-grid-col-image' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
809
- ],
810
- 'condition' => [
811
- 'section_grid_image.grid_image_hide' => '',
812
- ],
813
- ]
814
- );
815
-
816
- // Image box shadow.
817
- $this->add_group_control(
818
- Group_Control_Box_Shadow::get_type(),
819
- [
820
- 'name' => 'grid_image_style_box_shadow',
821
- 'selector' => '{{WRAPPER}} .obfx-grid-col-image',
822
- 'separator' => '',
823
- 'condition' => [
824
- 'section_grid_image.grid_image_hide' => '',
825
- ],
826
- ]
827
- );
828
-
829
- // Image margin.
830
- $this->add_control(
831
- 'grid_image_style_margin',
832
- [
833
- 'label' => __( 'Margin', 'themeisle-companion' ),
834
- 'type' => Controls_Manager::DIMENSIONS,
835
- 'size_units' => [ 'px' ],
836
- 'selectors' => [
837
- '{{WRAPPER}} .obfx-grid-col-image' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
838
- ],
839
- 'condition' => [
840
- 'section_grid_image.grid_image_hide' => '',
841
- ],
842
- ]
843
- );
844
-
845
- $this->end_controls_section();
846
- }
847
-
848
- /**
849
- * Style > Title.
850
- */
851
- private function grid_title_style_section() {
852
- // Tab.
853
- $this->start_controls_section(
854
- 'section_grid_title_style',
855
- [
856
- 'label' => __( 'Title', 'themeisle-companion' ),
857
- 'tab' => Controls_Manager::TAB_STYLE,
858
- 'condition' => [
859
- 'section_grid_title.grid_title_hide' => '',
860
- ],
861
- ]
862
- );
863
-
864
- // Title typography.
865
- $this->add_group_control(
866
- Group_Control_Typography::get_type(),
867
- [
868
- 'name' => 'grid_title_style_typography',
869
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
870
- 'selector' => '{{WRAPPER}} .obfx-grid-title',
871
- ]
872
- );
873
-
874
- // Title color.
875
- $this->add_control(
876
- 'grid_title_style_color',
877
- [
878
- 'type' => Controls_Manager::COLOR,
879
- 'label' => __( 'Color', 'themeisle-companion' ),
880
- 'scheme' => [
881
- 'type' => Scheme_Color::get_type(),
882
- 'value' => Scheme_Color::COLOR_1,
883
- ],
884
- 'selectors' => [
885
- '{{WRAPPER}} .obfx-grid-title' => 'color: {{VALUE}};',
886
- '{{WRAPPER}} .obfx-grid-title a' => 'color: {{VALUE}};',
887
- ],
888
- ]
889
- );
890
-
891
- // Title margin.
892
- $this->add_control(
893
- 'grid_title_style_margin',
894
- [
895
- 'label' => __( 'Margin', 'themeisle-companion' ),
896
- 'type' => Controls_Manager::DIMENSIONS,
897
- 'size_units' => [ 'px' ],
898
- 'selectors' => [
899
- '{{WRAPPER}} .obfx-grid-title' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
900
- ],
901
- ]
902
- );
903
-
904
- $this->end_controls_section();
905
- }
906
-
907
- /**
908
- * Style > Meta.
909
- */
910
- private function grid_meta_style_section() {
911
- // Tab.
912
- $this->start_controls_section(
913
- 'section_grid_meta_style',
914
- [
915
- 'label' => __( 'Meta', 'themeisle-companion' ),
916
- 'tab' => Controls_Manager::TAB_STYLE,
917
- 'condition' => [
918
- 'section_grid_meta.grid_meta_hide' => '',
919
- ],
920
- ]
921
- );
922
-
923
- // Meta typography.
924
- $this->add_group_control(
925
- Group_Control_Typography::get_type(),
926
- [
927
- 'name' => 'grid_meta_style_typography',
928
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
929
- 'selector' => '{{WRAPPER}} .obfx-grid-meta',
930
- ]
931
- );
932
-
933
- // Meta color.
934
- $this->add_control(
935
- 'grid_meta_style_color',
936
- [
937
- 'type' => Controls_Manager::COLOR,
938
- 'label' => __( 'Color', 'themeisle-companion' ),
939
- 'scheme' => [
940
- 'type' => Scheme_Color::get_type(),
941
- 'value' => Scheme_Color::COLOR_1,
942
- ],
943
- 'selectors' => [
944
- '{{WRAPPER}} .obfx-grid-meta' => 'color: {{VALUE}};',
945
- '{{WRAPPER}} .obfx-grid-meta span' => 'color: {{VALUE}};',
946
- '{{WRAPPER}} .obfx-grid-meta a' => 'color: {{VALUE}};',
947
- ],
948
- ]
949
- );
950
-
951
- // Meta margin.
952
- $this->add_control(
953
- 'grid_meta_style_margin',
954
- [
955
- 'label' => __( 'Margin', 'themeisle-companion' ),
956
- 'type' => Controls_Manager::DIMENSIONS,
957
- 'size_units' => [ 'px' ],
958
- 'selectors' => [
959
- '{{WRAPPER}} .obfx-grid-meta' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
960
- ],
961
- ]
962
- );
963
-
964
- $this->end_controls_section();
965
- }
966
-
967
- /**
968
- * Style > Content.
969
- */
970
- private function grid_content_style_section() {
971
- // Tab.
972
- $this->start_controls_section(
973
- 'section_grid_content_style',
974
- [
975
- 'label' => __( 'Content', 'themeisle-companion' ),
976
- 'tab' => Controls_Manager::TAB_STYLE,
977
- ]
978
- );
979
-
980
- // Content typography.
981
- $this->add_group_control(
982
- Group_Control_Typography::get_type(),
983
- [
984
- 'name' => 'grid_content_style_typography',
985
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
986
- 'selector' => '{{WRAPPER}} .obfx-grid-content',
987
- 'condition' => [
988
- 'section_grid_content.grid_content_hide' => '',
989
- ],
990
- ]
991
- );
992
-
993
- // Content color.
994
- $this->add_control(
995
- 'grid_content_style_color',
996
- [
997
- 'type' => Controls_Manager::COLOR,
998
- 'label' => __( 'Color', 'themeisle-companion' ),
999
- 'scheme' => [
1000
- 'type' => Scheme_Color::get_type(),
1001
- 'value' => Scheme_Color::COLOR_1,
1002
- ],
1003
- 'selectors' => [
1004
- '{{WRAPPER}} .obfx-grid-content' => 'color: {{VALUE}};',
1005
- ],
1006
- 'condition' => [
1007
- 'section_grid_content.grid_content_hide' => '',
1008
- ],
1009
- ]
1010
- );
1011
-
1012
- // Content margin
1013
- $this->add_control(
1014
- 'grid_content_style_margin',
1015
- [
1016
- 'label' => __( 'Margin', 'themeisle-companion' ),
1017
- 'type' => Controls_Manager::DIMENSIONS,
1018
- 'size_units' => [ 'px' ],
1019
- 'selectors' => [
1020
- '{{WRAPPER}} .obfx-grid-content' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1021
- ],
1022
- 'condition' => [
1023
- 'section_grid_content.grid_content_hide' => '',
1024
- ],
1025
- ]
1026
- );
1027
-
1028
- // Heading for price options.
1029
- $this->add_control(
1030
- 'grid_content_price_style_heading',
1031
- [
1032
- 'label' => __( 'Price', 'themeisle-companion' ),
1033
- 'type' => Controls_Manager::HEADING,
1034
- 'separator' => 'before',
1035
- 'condition' => [
1036
- 'section_grid_content.grid_content_price' => 'yes',
1037
- 'section_grid.grid_post_type' => 'product',
1038
- ],
1039
- ]
1040
- );
1041
-
1042
- // Price typography.
1043
- $this->add_group_control(
1044
- Group_Control_Typography::get_type(),
1045
- [
1046
- 'name' => 'grid_content_price_style_typography',
1047
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
1048
- 'selector' => '{{WRAPPER}} .obfx-grid-price',
1049
- 'condition' => [
1050
- 'section_grid_content.grid_content_price' => 'yes',
1051
- 'section_grid.grid_post_type' => 'product',
1052
- ],
1053
- ]
1054
- );
1055
-
1056
- // Price color.
1057
- $this->add_control(
1058
- 'grid_content_price_style_color',
1059
- [
1060
- 'type' => Controls_Manager::COLOR,
1061
- 'label' => __( 'Color', 'themeisle-companion' ),
1062
- 'scheme' => [
1063
- 'type' => Scheme_Color::get_type(),
1064
- 'value' => Scheme_Color::COLOR_1,
1065
- ],
1066
- 'selectors' => [
1067
- '{{WRAPPER}} .obfx-grid-price' => 'color: {{VALUE}};',
1068
- ],
1069
- 'condition' => [
1070
- 'section_grid_content.grid_content_price' => 'yes',
1071
- 'section_grid.grid_post_type' => 'product',
1072
- ],
1073
- ]
1074
- );
1075
-
1076
- // Price bottom margin.
1077
- $this->add_control(
1078
- 'grid_content_price_style_margin',
1079
- [
1080
- 'label' => __( 'Margin', 'themeisle-companion' ),
1081
- 'type' => Controls_Manager::DIMENSIONS,
1082
- 'size_units' => [ 'px' ],
1083
- 'selectors' => [
1084
- '{{WRAPPER}} .obfx-grid-price' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1085
- ],
1086
- 'condition' => [
1087
- 'section_grid_content.grid_content_price' => 'yes',
1088
- 'section_grid.grid_post_type' => 'product',
1089
- ],
1090
- ]
1091
- );
1092
-
1093
- // Buttons options.
1094
- $this->grid_content_style_button();
1095
-
1096
- $this->end_controls_section();
1097
- }
1098
-
1099
- /**
1100
- * Tabs for the Style > Button section.
1101
- */
1102
- private function grid_content_style_button() {
1103
- // Heading for button options.
1104
- $this->add_control(
1105
- 'grid_button_style_heading',
1106
- [
1107
- 'label' => __( 'Button', 'themeisle-companion' ),
1108
- 'type' => Controls_Manager::HEADING,
1109
- 'separator' => 'before',
1110
- 'condition' => [
1111
- 'section_grid_content.grid_content_default_btn!' => '',
1112
- 'section_grid_content.grid_content_product_btn!' => '',
1113
- ],
1114
- ]
1115
- );
1116
-
1117
- // Content typography.
1118
- $this->add_group_control(
1119
- Group_Control_Typography::get_type(),
1120
- [
1121
- 'name' => 'grid_button_style_typography',
1122
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
1123
- 'selector' => '{{WRAPPER}} .obfx-grid-footer a',
1124
- 'condition' => [
1125
- 'section_grid_content.grid_content_default_btn!' => '',
1126
- 'section_grid_content.grid_content_product_btn!' => '',
1127
- ],
1128
- ]
1129
- );
1130
-
1131
- $this->start_controls_tabs( 'grid_button_style' );
1132
-
1133
- // Normal tab.
1134
- $this->start_controls_tab(
1135
- 'grid_button_style_normal',
1136
- [
1137
- 'label' => __( 'Normal', 'themeisle-companion' ),
1138
- 'condition' => [
1139
- 'section_grid_content.grid_content_default_btn!' => '',
1140
- 'section_grid_content.grid_content_product_btn!' => '',
1141
- ],
1142
- ]
1143
- );
1144
-
1145
- // Normal text color.
1146
- $this->add_control(
1147
- 'grid_button_style_normal_text_color',
1148
- [
1149
- 'type' => Controls_Manager::COLOR,
1150
- 'label' => __( 'Text Color', 'themeisle-companion' ),
1151
- 'scheme' => [
1152
- 'type' => Scheme_Color::get_type(),
1153
- 'value' => Scheme_Color::COLOR_1,
1154
- ],
1155
- 'separator' => '',
1156
- 'selectors' => [
1157
- '{{WRAPPER}} .obfx-grid-footer a' => 'color: {{VALUE}};',
1158
- ],
1159
- 'condition' => [
1160
- 'section_grid_content.grid_content_default_btn!' => '',
1161
- 'section_grid_content.grid_content_product_btn!' => '',
1162
- ],
1163
- ]
1164
- );
1165
-
1166
- // Normal background color.
1167
- $this->add_control(
1168
- 'grid_button_style_normal_bg_color',
1169
- [
1170
- 'type' => Controls_Manager::COLOR,
1171
- 'label' => __( 'Background Color', 'themeisle-companion' ),
1172
- 'scheme' => [
1173
- 'type' => Scheme_Color::get_type(),
1174
- 'value' => Scheme_Color::COLOR_1,
1175
- ],
1176
- 'separator' => '',
1177
- 'selectors' => [
1178
- '{{WRAPPER}} .obfx-grid-footer a' => 'background-color: {{VALUE}};',
1179
- ],
1180
- 'condition' => [
1181
- 'section_grid_content.grid_content_default_btn!' => '',
1182
- 'section_grid_content.grid_content_product_btn!' => '',
1183
- ],
1184
- ]
1185
- );
1186
-
1187
- // Normal box shadow.
1188
- $this->add_group_control(
1189
- Group_Control_Box_Shadow::get_type(),
1190
- [
1191
- 'name' => 'grid_button_style_normal_box_shadow',
1192
- 'selector' => '{{WRAPPER}} .obfx-grid-footer a',
1193
- 'separator' => '',
1194
- 'condition' => [
1195
- 'section_grid_content.grid_content_default_btn!' => '',
1196
- 'section_grid_content.grid_content_product_btn!' => '',
1197
- ],
1198
- ]
1199
- );
1200
-
1201
- $this->end_controls_tab();
1202
-
1203
- // Hover tab.
1204
- $this->start_controls_tab(
1205
- 'grid_button_style_hover',
1206
- [
1207
- 'label' => __( 'Hover', 'themeisle-companion' ),
1208
- 'condition' => [
1209
- 'section_grid_content.grid_content_default_btn!' => '',
1210
- 'section_grid_content.grid_content_product_btn!' => '',
1211
- ],
1212
- ]
1213
- );
1214
-
1215
- // Hover text color.
1216
- $this->add_control(
1217
- 'grid_button_style_hover_text_color',
1218
- [
1219
- 'type' => Controls_Manager::COLOR,
1220
- 'label' => __( 'Text Color', 'themeisle-companion' ),
1221
- 'scheme' => [
1222
- 'type' => Scheme_Color::get_type(),
1223
- 'value' => Scheme_Color::COLOR_1,
1224
- ],
1225
- 'separator' => '',
1226
- 'selectors' => [
1227
- '{{WRAPPER}} .obfx-grid-footer a:hover' => 'color: {{VALUE}};',
1228
- ],
1229
- 'condition' => [
1230
- 'section_grid_content.grid_content_default_btn!' => '',
1231
- 'section_grid_content.grid_content_product_btn!' => '',
1232
- ],
1233
- ]
1234
- );
1235
-
1236
- // Hover background color.
1237
- $this->add_control(
1238
- 'grid_button_style_hover_bg_color',
1239
- [
1240
- 'type' => Controls_Manager::COLOR,
1241
- 'label' => __( 'Background Color', 'themeisle-companion' ),
1242
- 'scheme' => [
1243
- 'type' => Scheme_Color::get_type(),
1244
- 'value' => Scheme_Color::COLOR_1,
1245
- ],
1246
- 'separator' => '',
1247
- 'selectors' => [
1248
- '{{WRAPPER}} .obfx-grid-footer a:hover' => 'background-color: {{VALUE}};',
1249
- ],
1250
- 'condition' => [
1251
- 'section_grid_content.grid_content_default_btn!' => '',
1252
- 'section_grid_content.grid_content_product_btn!' => '',
1253
- ],
1254
- ]
1255
- );
1256
-
1257
- // Hover box shadow.
1258
- $this->add_group_control(
1259
- Group_Control_Box_Shadow::get_type(),
1260
- [
1261
- 'name' => 'grid_button_style_hover_box_shadow',
1262
- 'selector' => '{{WRAPPER}} .obfx-grid-footer a:hover',
1263
- 'separator' => '',
1264
- 'condition' => [
1265
- 'section_grid_content.grid_content_default_btn!' => '',
1266
- 'section_grid_content.grid_content_product_btn!' => '',
1267
- ],
1268
- ]
1269
- );
1270
-
1271
- $this->end_controls_tab();
1272
-
1273
- $this->end_controls_tabs();
1274
-
1275
- // Button padding.
1276
- $this->add_control(
1277
- 'grid_button_style_padding',
1278
- [
1279
- 'label' => __( 'Button padding', 'themeisle-companion' ),
1280
- 'type' => Controls_Manager::DIMENSIONS,
1281
- 'size_units' => [ 'px' ],
1282
- 'selectors' => [
1283
- '{{WRAPPER}} .obfx-grid-footer a' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1284
- ],
1285
- 'condition' => [
1286
- 'section_grid_content.grid_content_default_btn!' => '',
1287
- 'section_grid_content.grid_content_product_btn!' => '',
1288
- ],
1289
- ]
1290
- );
1291
-
1292
- // Button border radius.
1293
- $this->add_control(
1294
- 'grid_button_style_border_radius',
1295
- [
1296
- 'label' => __( 'Button border radius', 'themeisle-companion' ),
1297
- 'type' => Controls_Manager::DIMENSIONS,
1298
- 'size_units' => [ 'px', '%' ],
1299
- 'selectors' => [
1300
- '{{WRAPPER}} .obfx-grid-footer a' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1301
- ],
1302
- 'condition' => [
1303
- 'section_grid_content.grid_content_default_btn!' => '',
1304
- 'section_grid_content.grid_content_product_btn!' => '',
1305
- ],
1306
- ]
1307
- );
1308
- }
1309
-
1310
- /**
1311
- * Style > Pagination.
1312
- */
1313
- private function grid_pagination_style_section() {
1314
- // Tab.
1315
- $this->start_controls_section(
1316
- 'section_grid_pagination_style',
1317
- [
1318
- 'label' => __( 'Pagination', 'themeisle-companion' ),
1319
- 'tab' => Controls_Manager::TAB_STYLE,
1320
- 'condition' => [
1321
- 'section_grid.grid_pagination' => 'yes',
1322
- ],
1323
- ]
1324
- );
1325
-
1326
- // Image margin.
1327
- $this->add_control(
1328
- 'grid_pagination_style_margin',
1329
- [
1330
- 'label' => __( 'Margin', 'themeisle-companion' ),
1331
- 'type' => Controls_Manager::DIMENSIONS,
1332
- 'size_units' => [ 'px' ],
1333
- 'selectors' => [
1334
- '{{WRAPPER}} .obfx-grid-pagination .pagination' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1335
- ],
1336
- ]
1337
- );
1338
-
1339
- $this->end_controls_section();
1340
- }
1341
-
1342
- /**
1343
- * Display categories in meta section.
1344
- */
1345
- protected function metaGridCategories() {
1346
- $settings = $this->get_settings();
1347
- $post_type_category = get_the_category();
1348
- $maxCategories = $settings['grid_meta_categories_max'] ? $settings['grid_meta_categories_max'] : '-1';
1349
- $i = 0; // counter
1350
-
1351
- if ( $post_type_category ) { ?>
1352
- <span class="obfx-grid-categories">
1353
- <?php
1354
- echo ( $settings['grid_meta_remove_icons'] == '' ) ? '<i class="fa fa-bookmark"></i>' : '';
1355
-
1356
- foreach ( $post_type_category as $category ) {
1357
- if ( $i == $maxCategories ) {
1358
- break;
1359
- }
1360
- ?>
1361
- <span class="obfx-grid-categories-item"><a href="<?php echo get_category_link( $category->term_id ); ?>" title="<?php echo $category->name; ?>"><?php echo $category->name; ?></a></span>
1362
- <?php
1363
- $i++;
1364
- }
1365
- ?>
1366
- </span>
1367
- <?php
1368
- }
1369
- }
1370
-
1371
- /**
1372
- * Display tags in meta section.
1373
- */
1374
- protected function metaGridTags() {
1375
- $settings = $this->get_settings();
1376
- $post_type_tags = get_the_tags();
1377
- $maxTags = $settings['grid_meta_tags_max'] ? $settings['grid_meta_tags_max'] : '-1';
1378
- $i = 0; // counter
1379
-
1380
- if ( $post_type_tags ) {
1381
- ?>
1382
- <span class="obfx-grid-tags">
1383
- <?php
1384
- echo ( $settings['grid_meta_remove_icons'] == '' ) ? '<i class="fa fa-tags"></i>' : '';
1385
-
1386
- foreach ( $post_type_tags as $tag ) {
1387
- if ( $i == $maxTags ) {
1388
- break;
1389
- }
1390
- ?>
1391
- <span class="obfx-grid-tags-item"><a href="<?php echo get_tag_link( $tag->term_id ); ?>" title="<?php echo $tag->name; ?>"><?php echo $tag->name; ?></a></span>
1392
- <?php
1393
- $i++;
1394
- }
1395
- ?>
1396
- </span>
1397
- <?php
1398
- }
1399
- }
1400
-
1401
- /**
1402
- * Render image of post type.
1403
- */
1404
- protected function renderImage() {
1405
- $settings = $this->get_settings();
1406
-
1407
- // Only in editor.
1408
- if ( $settings['grid_image_hide'] !== 'yes' ) {
1409
- // Check if post type has featured image.
1410
- if ( has_post_thumbnail() ) {
1411
-
1412
- if ( $settings['grid_image_link'] == 'yes' ) {
1413
- ?>
1414
- <div class="obfx-grid-col-image">
1415
- <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
1416
- <?php
1417
- the_post_thumbnail(
1418
- 'full', array(
1419
- 'class' => 'img-responsive',
1420
- 'alt' => get_the_title( get_post_thumbnail_id() ),
1421
- )
1422
- );
1423
- ?>
1424
- </a>
1425
- </div>
1426
- <?php } else { ?>
1427
- <div class="obfx-grid-col-image">
1428
- <?php
1429
- the_post_thumbnail(
1430
- 'full', array(
1431
- 'class' => 'img-responsive',
1432
- 'alt' => get_the_title( get_post_thumbnail_id() ),
1433
- )
1434
- );
1435
- ?>
1436
- </div>
1437
- <?php
1438
- }
1439
- }
1440
- }
1441
- }
1442
-
1443
- /**
1444
- * Render title of post type.
1445
- */
1446
- protected function renderTitle() {
1447
- $settings = $this->get_settings();
1448
-
1449
- if ( $settings['grid_title_hide'] !== 'yes' ) {
1450
- ?>
1451
- <<?php echo $settings['grid_title_tag']; ?> class="entry-title obfx-grid-title">
1452
- <?php if ( $settings['grid_title_link'] == 'yes' ) { ?>
1453
- <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
1454
- <?php
1455
- the_title();
1456
- ?>
1457
- </a>
1458
- <?php
1459
- } else {
1460
- the_title();
1461
- }
1462
- ?>
1463
- </<?php echo $settings['grid_title_tag']; ?>>
1464
- <?php
1465
- }
1466
- }
1467
-
1468
- /**
1469
- * Render meta of post type.
1470
- */
1471
- protected function renderMeta() {
1472
- $settings = $this->get_settings();
1473
-
1474
- if ( $settings['grid_meta_hide'] !== 'yes' ) {
1475
- if ( ! empty( $settings['grid_meta_display'] ) ) {
1476
- ?>
1477
- <div class="entry-meta obfx-grid-meta">
1478
-
1479
- <?php
1480
- foreach ( $settings['grid_meta_display'] as $meta ) {
1481
-
1482
- switch ( $meta ) :
1483
- // Author
1484
- case 'author':
1485
- ?>
1486
- <span class="obfx-grid-author">
1487
- <?php
1488
- echo ( $settings['grid_meta_remove_icons'] == '' ) ? '<i class="fa fa-user"></i>' : '';
1489
-
1490
- echo get_the_author();
1491
- ?>
1492
- </span>
1493
- <?php
1494
- // Date
1495
- break; case 'date':
1496
- ?>
1497
- <span class="obfx-grid-date">
1498
- <?php
1499
- echo ( $settings['grid_meta_remove_icons'] == '' ) ? '<i class="fa fa-calendar"></i>' : '';
1500
-
1501
- echo get_the_date();
1502
- ?>
1503
- </span>
1504
- <?php
1505
- // Category
1506
- break; case 'category':
1507
- $this->metaGridCategories();
1508
-
1509
- // Tags
1510
- break; case 'tags':
1511
- $this->metaGridTags();
1512
-
1513
- // Comments/Reviews
1514
- break; case 'comments':
1515
- ?>
1516
- <span class="obfx-grid-comments">
1517
- <?php
1518
- echo ( $settings['grid_meta_remove_icons'] == '' ) ? '<i class="fa fa-comment"></i>' : '';
1519
-
1520
- if ( $settings['grid_post_type'] == 'product' ) {
1521
- echo comments_number( __( 'No reviews', 'themeisle-companion' ), __( '1 review', 'themeisle-companion' ), __( '% reviews', 'themeisle-companion' ) );
1522
- } else {
1523
- echo comments_number( __( 'No comments', 'themeisle-companion' ), __( '1 comment', 'themeisle-companion' ), __( '% comments', 'themeisle-companion' ) );
1524
- }
1525
- ?>
1526
- </span>
1527
- <?php
1528
- break;
1529
- endswitch;
1530
- } // End foreach().
1531
- ?>
1532
-
1533
- </div>
1534
- <?php
1535
- }// End if().
1536
- }// End if().
1537
- }
1538
-
1539
- /**
1540
- * Display price if post type is product.
1541
- */
1542
- protected function renderPrice() {
1543
- $settings = $this->get_settings();
1544
- $product = wc_get_product( get_the_ID() );
1545
-
1546
- if ( $settings['grid_post_type'] == 'product' && $settings['grid_content_price'] == 'yes' ) {
1547
- ?>
1548
- <div class="obfx-grid-price">
1549
- <?php
1550
- $price = $product->get_price_html();
1551
- if ( ! empty( $price ) ) {
1552
- echo wp_kses(
1553
- $price, array(
1554
- 'span' => array(
1555
- 'class' => array(),
1556
- ),
1557
- 'del' => array(),
1558
- )
1559
- );
1560
- }
1561
- ?>
1562
- </div>
1563
- <?php
1564
- }
1565
- }
1566
-
1567
- /**
1568
- * Display Add to Cart button.
1569
- */
1570
- protected function renderAddToCart() {
1571
- $product = wc_get_product( get_the_ID() );
1572
-
1573
- echo apply_filters(
1574
- 'woocommerce_loop_add_to_cart_link',
1575
- sprintf(
1576
- '<a href="%s" title="%s" rel="nofollow">%s</a>',
1577
- esc_url( $product->add_to_cart_url() ),
1578
- esc_attr( $product->add_to_cart_text() ),
1579
- esc_html( $product->add_to_cart_text() )
1580
- ), $product
1581
- );
1582
- }
1583
-
1584
- /**
1585
- * Render content of post type.
1586
- */
1587
- protected function renderContent() {
1588
- $settings = $this->get_settings();
1589
-
1590
- if ( $settings['grid_content_hide'] !== 'yes' ) {
1591
- ?>
1592
- <div class="entry-content obfx-grid-content">
1593
- <?php
1594
- if ( empty( $settings['grid_content_length'] ) ) {
1595
- the_excerpt();
1596
- } else {
1597
- echo wp_trim_words( get_the_excerpt(), $settings['grid_content_length'] );
1598
- }
1599
- ?>
1600
- </div>
1601
- <?php
1602
- }
1603
- }
1604
-
1605
- /**
1606
- * Render button of post type.
1607
- */
1608
- protected function renderButton() {
1609
- $settings = $this->get_settings();
1610
-
1611
- if ( $settings['grid_post_type'] == 'product' && $settings['grid_content_product_btn'] == 'yes' ) {
1612
- ?>
1613
- <div class="obfx-grid-footer">
1614
- <?php $this->renderAddToCart(); ?>
1615
- </div>
1616
- <?php } elseif ( $settings['grid_content_default_btn'] == 'yes' && ! empty( $settings['grid_content_default_btn_text'] ) ) { ?>
1617
- <div class="obfx-grid-footer">
1618
- <a href="<?php echo get_the_permalink(); ?>" title="<?php echo $settings['grid_content_default_btn_text']; ?>"><?php echo $settings['grid_content_default_btn_text']; ?></a>
1619
- </div>
1620
- <?php
1621
- }
1622
- }
1623
-
1624
- /**
1625
- * Render function to output the post type grid.
1626
- */
1627
- protected function render() {
1628
- // Get settings.
1629
- $settings = $this->get_settings();
1630
-
1631
- // Output.
1632
- echo '<div class="obfx-grid">';
1633
- echo '<div class="obfx-grid-container' . ( ! empty( $settings['grid_style'] ) && $settings['grid_style'] == 'list' ? ' obfx-grid-style-' . $settings['grid_style'] : '' ) . ( ! empty( $settings['grid_columns_mobile'] ) ? ' obfx-grid-mobile-' . $settings['grid_columns_mobile'] : '' ) . ( ! empty( $settings['grid_columns_tablet'] ) ? ' obfx-grid-tablet-' . $settings['grid_columns_tablet'] : '' ) . ( ! empty( $settings['grid_columns'] ) ? ' obfx-grid-desktop-' . $settings['grid_columns'] : '' ) . '">';
1634
-
1635
- // Arguments for query.
1636
- $args = array();
1637
-
1638
- // Display only published posts.
1639
- $args['post_status'] = 'publish';
1640
-
1641
- // Ignore sticky posts.
1642
- $args['ignore_sticky_posts'] = 1;
1643
-
1644
- // Check if post type exists.
1645
- if ( ! empty( $settings['grid_post_type'] ) && post_type_exists( $settings['grid_post_type'] ) ) {
1646
- $args['post_type'] = $settings['grid_post_type'];
1647
- }
1648
-
1649
- // Display posts in category.
1650
- if ( ! empty( $settings['grid_post_categories'] ) && $settings['grid_post_type'] == 'post' ) {
1651
- $args['category_name'] = $settings['grid_post_categories'];
1652
- }
1653
-
1654
- // Display products in category.
1655
- if ( ! empty( $settings['grid_product_categories'] ) && $settings['grid_post_type'] == 'product' ) {
1656
- $args['tax_query'] = array(
1657
- 'relation' => 'AND',
1658
- array(
1659
- 'taxonomy' => 'product_cat',
1660
- 'field' => 'slug',
1661
- 'terms' => $settings['grid_product_categories'],
1662
- ),
1663
- );
1664
- }
1665
-
1666
- // Items to display.
1667
- if ( ! empty( $settings['grid_items'] ) && intval( $settings['grid_items'] ) == $settings['grid_items'] ) {
1668
- $args['posts_per_page'] = $settings['grid_items'];
1669
- }
1670
-
1671
- // Order by.
1672
- if ( ! empty( $settings['grid_order_by'] ) ) {
1673
- $args['orderby'] = $settings['grid_order_by'];
1674
- }
1675
-
1676
- // Pagination.
1677
- if ( ! empty( $settings['grid_pagination'] ) ) {
1678
- $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
1679
- $args['paged'] = $paged;
1680
- }
1681
-
1682
- // Query.
1683
- $query = new \WP_Query( $args );
1684
-
1685
- // Query results.
1686
- if ( $query->have_posts() ) {
1687
- while ( $query->have_posts() ) {
1688
- $query->the_post();
1689
-
1690
- echo '<div class="obfx-grid-wrapper">';
1691
- echo '<article class="obfx-grid-col' . ( $settings['grid_image_hide'] == 'yes' || ! has_post_thumbnail() ? ' obfx-no-image' : '' ) . '">';
1692
-
1693
- // Image.
1694
- $this->renderImage();
1695
-
1696
- echo '<div class="obfx-grid-col-content">';
1697
- // Title.
1698
- $this->renderTitle();
1699
-
1700
- // Meta.
1701
- $this->renderMeta();
1702
-
1703
- // Content.
1704
- $this->renderContent();
1705
-
1706
- // Price.
1707
- if ( class_exists( 'WooCommerce' ) ) {
1708
- $this->renderPrice();
1709
- }
1710
-
1711
- // Button.
1712
- $this->renderButton();
1713
-
1714
- echo '</div><!-- .obfx-grid-col-content -->';
1715
- echo '</article>';
1716
- echo '</div>';
1717
-
1718
- } // End while().
1719
-
1720
- // Pagination.
1721
- if ( ! empty( $settings['grid_pagination'] ) ) {
1722
- ?>
1723
- <div class="obfx-grid-pagination">
1724
- <?php
1725
- $big = 999999999;
1726
- $totalpages = $query->max_num_pages;
1727
- $current = max( 1, $paged );
1728
- $paginate_args = array(
1729
- 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
1730
- 'format' => '?paged=%#%',
1731
- 'current' => $current,
1732
- 'total' => $totalpages,
1733
- 'show_all' => false,
1734
- 'end_size' => 1,
1735
- 'mid_size' => 3,
1736
- 'prev_next' => true,
1737
- 'prev_text' => esc_html__( 'Previous', 'themeisle-companion' ),
1738
- 'next_text' => esc_html__( 'Next', 'themeisle-companion' ),
1739
- 'type' => 'plain',
1740
- 'add_args' => false,
1741
- );
1742
-
1743
- $pagination = paginate_links( $paginate_args );
1744
- ?>
1745
- <nav class="pagination">
1746
- <?php echo $pagination; ?>
1747
- </nav>
1748
- </div>
1749
- <?php
1750
- }
1751
- } // End if().
1752
-
1753
- // Restore original data.
1754
- wp_reset_postdata();
1755
-
1756
- echo '</div><!-- .obfx-grid-container -->';
1757
-
1758
- echo '</div><!-- .obfx-grid -->';
1759
- }
1760
- }
1761
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-pricing-table.php DELETED
@@ -1,1059 +0,0 @@
1
- <?php
2
- /**
3
- * Orbit Fox Elementor Pricing Table Widget
4
- *
5
- * @link https://themeisle.com
6
- * @since 1.0.0
7
- *
8
- * @package Elementor_Widgets_OBFX_Module
9
- */
10
-
11
- namespace Elementor;
12
-
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- } // End if().
16
-
17
- /**
18
- * Class OBFX_Elementor_Widget_Pricing_Table
19
- *
20
- * @package Elementor_Widgets_OBFX_Module
21
- */
22
- class OBFX_Elementor_Widget_Pricing_Table extends Widget_Base {
23
-
24
- /**
25
- * Widget title.
26
- *
27
- * @return string
28
- */
29
- public function get_title() {
30
- return __( 'Pricing Table', 'themeisle-companion' );
31
- }
32
-
33
- /**
34
- * Widget icon.
35
- *
36
- * @return string
37
- */
38
- public function get_icon() {
39
- return 'eicon-price-table';
40
- }
41
-
42
- /**
43
- * Widget name.
44
- *
45
- * @return string
46
- */
47
- public function get_name() {
48
- return 'obfx-pricing-table';
49
- }
50
-
51
- /**
52
- * Widget Category
53
- *
54
- * @return array
55
- */
56
- public function get_categories() {
57
- return [ 'obfx-elementor-widgets' ];
58
- }
59
-
60
- /**
61
- * Register Elementor Controls
62
- */
63
- protected function _register_controls() {
64
- $this->plan_title_section();
65
-
66
- $this->plan_price_tag_section();
67
-
68
- $this->features_section();
69
-
70
- $this->button_section();
71
-
72
- $this->header_style_section();
73
-
74
- $this->price_tag_style_section();
75
-
76
- $this->features_style_section();
77
-
78
- $this->button_style_section();
79
- }
80
-
81
- /**
82
- * Content > Title section.
83
- */
84
- private function plan_title_section() {
85
- $this->start_controls_section(
86
- 'section_title',
87
- [
88
- 'label' => __( 'Plan Title', 'themeisle-companion' ),
89
- ]
90
- );
91
-
92
- $this->add_control(
93
- 'title',
94
- [
95
- 'type' => Controls_Manager::TEXT,
96
- 'label' => __( 'Title', 'themeisle-companion' ),
97
- 'placeholder' => __( 'Title', 'themeisle-companion' ),
98
- 'default' => __( 'Pricing Plan', 'themeisle-companion' ),
99
- ]
100
- );
101
-
102
- $this->add_control(
103
- 'title_tag',
104
- [
105
- 'type' => Controls_Manager::SELECT,
106
- 'label' => __( 'Title HTML tag', 'themeisle-companion' ),
107
- 'default' => 'h3',
108
- 'options' => [
109
- 'h1' => __( 'h1', 'themeisle-companion' ),
110
- 'h2' => __( 'h2', 'themeisle-companion' ),
111
- 'h3' => __( 'h3', 'themeisle-companion' ),
112
- 'h4' => __( 'h4', 'themeisle-companion' ),
113
- 'h5' => __( 'h5', 'themeisle-companion' ),
114
- 'h6' => __( 'h6', 'themeisle-companion' ),
115
- 'p' => __( 'p', 'themeisle-companion' ),
116
- ],
117
- ]
118
- );
119
-
120
- $this->add_control(
121
- 'subtitle',
122
- [
123
- 'type' => Controls_Manager::TEXT,
124
- 'label' => __( 'Subtitle', 'themeisle-companion' ),
125
- 'placeholder' => __( 'Subtitle', 'themeisle-companion' ),
126
- 'default' => __( 'Description', 'themeisle-companion' ),
127
- ]
128
- );
129
-
130
- $this->add_control(
131
- 'subtitle_tag',
132
- [
133
- 'type' => Controls_Manager::SELECT,
134
- 'label' => __( 'Subtitle HTML Tag', 'themeisle-companion' ),
135
- 'default' => 'p',
136
- 'options' => [
137
- 'h1' => __( 'h1', 'themeisle-companion' ),
138
- 'h2' => __( 'h2', 'themeisle-companion' ),
139
- 'h3' => __( 'h3', 'themeisle-companion' ),
140
- 'h4' => __( 'h4', 'themeisle-companion' ),
141
- 'h5' => __( 'h5', 'themeisle-companion' ),
142
- 'h6' => __( 'h6', 'themeisle-companion' ),
143
- 'p' => __( 'p', 'themeisle-companion' ),
144
- ],
145
- ]
146
- );
147
- $this->end_controls_section(); // end section-title
148
- }
149
-
150
- /**
151
- * Content > Price Tag section.
152
- */
153
- private function plan_price_tag_section() {
154
- $this->start_controls_section(
155
- 'section_price_tag',
156
- [
157
- 'label' => __( 'Price Tag', 'themeisle-companion' ),
158
- ]
159
- );
160
-
161
- $this->add_control(
162
- 'price_tag_text',
163
- [
164
- 'type' => Controls_Manager::TEXT,
165
- 'label' => __( 'Price', 'themeisle-companion' ),
166
- 'placeholder' => __( 'Price', 'themeisle-companion' ),
167
- 'default' => __( '50', 'themeisle-companion' ),
168
- 'separator' => 'after',
169
- ]
170
- );
171
-
172
- $this->add_control(
173
- 'price_tag_currency',
174
- [
175
- 'type' => Controls_Manager::TEXT,
176
- 'label' => __( 'Currency', 'themeisle-companion' ),
177
- 'placeholder' => __( 'Currency', 'themeisle-companion' ),
178
- 'default' => __( '$', 'themeisle-companion' ),
179
- ]
180
- );
181
-
182
- $this->add_control(
183
- 'price_tag_currency_position',
184
- [
185
- 'type' => Controls_Manager::SELECT,
186
- 'label' => __( 'Currency Position', 'themeisle-companion' ),
187
- 'default' => 'left',
188
- 'options' => [
189
- 'left' => __( 'Before', 'themeisle-companion' ),
190
- 'right' => __( 'After', 'themeisle-companion' ),
191
- ],
192
- ]
193
- );
194
-
195
- $this->add_control(
196
- 'price_tag_period',
197
- [
198
- 'type' => Controls_Manager::TEXT,
199
- 'label' => __( 'Period', 'themeisle-companion' ),
200
- 'placeholder' => __( '/month', 'themeisle-companion' ),
201
- 'default' => __( '/month', 'themeisle-companion' ),
202
- 'separator' => 'before',
203
- ]
204
- );
205
- $this->end_controls_section(); // end section-price-tag
206
- }
207
-
208
- /**
209
- * Content > Features section.
210
- */
211
- private function features_section() {
212
- $this->start_controls_section(
213
- 'section_features',
214
- [
215
- 'label' => __( 'Features', 'themeisle-companion' ),
216
- ]
217
- );
218
-
219
- $this->add_control(
220
- 'feature_list',
221
- [
222
- 'label' => __( 'Plan Features', 'themeisle-companion' ),
223
- 'type' => Controls_Manager::REPEATER,
224
- 'default' => [
225
- [
226
- 'accent' => __( 'First', 'themeisle-companion' ),
227
- 'text' => __( 'Feature', 'themeisle-companion' ),
228
- ],
229
- [
230
- 'accent' => __( 'Second', 'themeisle-companion' ),
231
- 'text' => __( 'Feature', 'themeisle-companion' ),
232
- ],
233
- [
234
- 'accent' => __( 'Third', 'themeisle-companion' ),
235
- 'text' => __( 'Feature', 'themeisle-companion' ),
236
- ],
237
- ],
238
- 'fields' => [
239
- [
240
- 'type' => Controls_Manager::TEXT,
241
- 'name' => 'accent',
242
- 'label' => __( 'Accented Text', 'themeisle-companion' ),
243
- 'description' => __( 'Appears before feature text', 'themeisle-companion' ),
244
- 'label_block' => true,
245
- 'default' => __( 'Accent', 'themeisle-companion' ),
246
- ],
247
- [
248
- 'type' => Controls_Manager::TEXT,
249
- 'name' => 'text',
250
- 'label' => __( 'Text', 'themeisle-companion' ),
251
- 'label_block' => true,
252
- 'placeholder' => __( 'Plan Features', 'themeisle-companion' ),
253
- 'default' => __( 'Feature', 'themeisle-companion' ),
254
- ],
255
- [
256
- 'type' => Controls_Manager::ICON,
257
- 'name' => 'feature_icon',
258
- 'label' => __( 'Icon', 'themeisle-companion' ),
259
- 'label_block' => true,
260
- 'default' => 'fa fa-star',
261
- ],
262
- ],
263
- 'title_field' => '{{ accent + " " + text }}',
264
- ]
265
- );
266
-
267
- $this->add_responsive_control(
268
- 'features_align',
269
- [
270
- 'label' => __( 'Alignment', 'themeisle-companion' ),
271
- 'type' => Controls_Manager::CHOOSE,
272
- 'options' => [
273
- 'left' => [
274
- 'title' => __( 'Left', 'themeisle-companion' ),
275
- 'icon' => 'fa fa-align-left',
276
- ],
277
- 'center' => [
278
- 'title' => __( 'Center', 'themeisle-companion' ),
279
- 'icon' => 'fa fa-align-center',
280
- ],
281
- 'right' => [
282
- 'title' => __( 'Right', 'themeisle-companion' ),
283
- 'icon' => 'fa fa-align-right',
284
- ],
285
- 'justify' => [
286
- 'title' => __( 'Justified', 'themeisle-companion' ),
287
- 'icon' => 'fa fa-align-justify',
288
- ],
289
- ],
290
- 'default' => 'center',
291
- 'selectors' => [
292
- '{{WRAPPER}} .obfx-feature-list' => 'text-align: {{VALUE}};',
293
- ],
294
- ]
295
- );
296
-
297
- $this->end_controls_section(); // end section-features
298
- }
299
-
300
- /**
301
- * Content > Button section.
302
- */
303
- private function button_section() {
304
- $this->start_controls_section(
305
- 'section_button',
306
- [
307
- 'label' => __( 'Button', 'themeisle-companion' ),
308
- ]
309
- );
310
-
311
- $this->add_control(
312
- 'button_text',
313
- [
314
- 'type' => Controls_Manager::TEXT,
315
- 'label' => __( 'Text', 'themeisle-companion' ),
316
- 'placeholder' => __( 'Buy Now', 'themeisle-companion' ),
317
- 'default' => __( 'Buy Now', 'themeisle-companion' ),
318
- ]
319
- );
320
-
321
- $this->add_control(
322
- 'button_link',
323
- [
324
- 'type' => Controls_Manager::URL,
325
- 'label' => __( 'Link', 'themeisle-companion' ),
326
- 'placeholder' => __( 'https://example.com', 'themeisle-companion' ),
327
- ]
328
- );
329
-
330
- $this->add_control(
331
- 'button_icon',
332
- [
333
- 'type' => Controls_Manager::ICON,
334
- 'label' => __( 'Icon', 'themeisle-companion' ),
335
- 'label_block' => true,
336
- 'default' => '',
337
- ]
338
- );
339
-
340
- $this->add_control(
341
- 'button_icon_align',
342
- [
343
- 'type' => Controls_Manager::SELECT,
344
- 'label' => __( 'Icon Position', 'themeisle-companion' ),
345
- 'default' => 'left',
346
- 'options' => [
347
- 'left' => __( 'Before', 'themeisle-companion' ),
348
- 'right' => __( 'After', 'themeisle-companion' ),
349
- ],
350
- 'condition' => [
351
- 'button_icon!' => '',
352
- ],
353
- ]
354
- );
355
-
356
- $this->add_control(
357
- 'button_icon_indent',
358
- [
359
- 'type' => Controls_Manager::SLIDER,
360
- 'label' => __( 'Icon Spacing', 'themeisle-companion' ),
361
- 'range' => [
362
- 'px' => [
363
- 'max' => 50,
364
- ],
365
- ],
366
- 'condition' => [
367
- 'button_icon!' => '',
368
- ],
369
- 'selectors' => [
370
- '{{WRAPPER}} .obfx-button-icon-align-right i' => 'margin-left: {{SIZE}}{{UNIT}};',
371
- '{{WRAPPER}} .obfx-button-icon-align-left i' => 'margin-right: {{SIZE}}{{UNIT}};',
372
- ],
373
- ]
374
- );
375
- $this->end_controls_section(); // end section_button
376
- }
377
-
378
- /**
379
- * Style > Header section.
380
- */
381
- private function header_style_section() {
382
- $this->start_controls_section(
383
- 'section_header_style',
384
- [
385
- 'label' => __( 'Header', 'themeisle-companion' ),
386
- 'tab' => Controls_Manager::TAB_STYLE,
387
- ]
388
- );
389
-
390
- $this->add_responsive_control(
391
- 'header_padding',
392
- [
393
- 'label' => __( 'Header Padding', 'themeisle-companion' ),
394
- 'type' => Controls_Manager::DIMENSIONS,
395
- 'size_units' => [ 'px', 'em', '%' ],
396
- 'selectors' => [
397
- '{{WRAPPER}} .obfx-title-wrapper' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
398
- ],
399
- ]
400
- );
401
-
402
- $this->add_control(
403
- 'plan_title_color',
404
- [
405
- 'type' => Controls_Manager::COLOR,
406
- 'label' => __( 'Title Color', 'themeisle-companion' ),
407
- 'scheme' => [
408
- 'type' => Scheme_Color::get_type(),
409
- 'value' => Scheme_Color::COLOR_1,
410
- ],
411
- 'default' => '#464959',
412
- 'selectors' => [
413
- '{{WRAPPER}} .obfx-pricing-table-title' => 'color: {{VALUE}};',
414
- ],
415
- ]
416
- );
417
-
418
- $this->add_group_control(
419
- Group_Control_Typography::get_type(),
420
- [
421
- 'name' => 'plan_title_typography',
422
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
423
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-title',
424
- ]
425
- );
426
-
427
- $this->add_control(
428
- 'plan_subtitle_color',
429
- [
430
- 'type' => Controls_Manager::COLOR,
431
- 'label' => __( 'Subtitle Color', 'themeisle-companion' ),
432
- 'scheme' => [
433
- 'type' => Scheme_Color::get_type(),
434
- 'value' => Scheme_Color::COLOR_1,
435
- ],
436
- 'default' => '#60647d',
437
- 'selectors' => [
438
- '{{WRAPPER}} .obfx-pricing-table-subtitle' => 'color: {{VALUE}};',
439
- ],
440
- ]
441
- );
442
-
443
- $this->add_group_control(
444
- Group_Control_Typography::get_type(),
445
- [
446
- 'name' => 'plan_subtitle_typography',
447
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
448
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-subtitle',
449
- ]
450
- );
451
-
452
- $this->add_group_control(
453
- Group_Control_Background::get_type(),
454
- [
455
- 'name' => 'heading_section_bg',
456
- 'label' => __( 'Section Background', 'themeisle-companion' ),
457
- 'types' => [ 'classic', 'gradient' ],
458
- 'selector' => '{{WRAPPER}} .obfx-title-wrapper',
459
- ]
460
- );
461
- $this->end_controls_section(); // end section_header_style
462
- }
463
-
464
- /**
465
- * Style > Price Tag section.
466
- */
467
- private function price_tag_style_section() {
468
- $this->start_controls_section(
469
- 'section_price_box',
470
- [
471
- 'label' => __( 'Price Tag', 'themeisle-companion' ),
472
- 'tab' => Controls_Manager::TAB_STYLE,
473
- ]
474
- );
475
-
476
- $this->add_responsive_control(
477
- 'price_box_padding',
478
- [
479
- 'type' => Controls_Manager::DIMENSIONS,
480
- 'label' => __( 'Price Box Padding', 'themeisle-companion' ),
481
- 'size_units' => [ 'px', 'em', '%' ],
482
- 'selectors' => [
483
- '{{WRAPPER}} .obfx-price-wrapper' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
484
- ],
485
- ]
486
- );
487
-
488
- $this->add_group_control(
489
- Group_Control_Background::get_type(),
490
- [
491
- 'name' => 'pricing_section_bg',
492
- 'label' => __( 'Section Background', 'themeisle-companion' ),
493
- 'types' => [ 'classic', 'gradient' ],
494
- 'selector' => '{{WRAPPER}} .obfx-price-wrapper',
495
- ]
496
- );
497
-
498
- $this->add_control(
499
- 'price_tag_heading_currency',
500
- [
501
- 'label' => __( 'Currency', 'themeisle-companion' ),
502
- 'type' => Controls_Manager::HEADING,
503
- 'separator' => 'before',
504
- ]
505
- );
506
-
507
- $this->add_control(
508
- 'currency_color',
509
- [
510
- 'label' => __( 'Currency Color', 'themeisle-companion' ),
511
- 'type' => Controls_Manager::COLOR,
512
- 'scheme' => [
513
- 'type' => Scheme_Color::get_type(),
514
- 'value' => Scheme_Color::COLOR_1,
515
- ],
516
- 'default' => '#60647d',
517
- 'selectors' => [
518
- '{{WRAPPER}} .obfx-price-currency' => 'color: {{VALUE}};',
519
- ],
520
- ]
521
- );
522
-
523
- $this->add_group_control(
524
- Group_Control_Typography::get_type(),
525
- [
526
- 'name' => 'currency_typography',
527
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
528
- 'selector' => '{{WRAPPER}} .obfx-price-currency',
529
- ]
530
- );
531
-
532
- $this->add_control(
533
- 'price_tag_heading_price',
534
- [
535
- 'label' => __( 'Price', 'themeisle-companion' ),
536
- 'type' => Controls_Manager::HEADING,
537
- 'separator' => 'before',
538
- ]
539
- );
540
-
541
- $this->add_control(
542
- 'price_text_color',
543
- [
544
- 'label' => __( 'Price Color', 'themeisle-companion' ),
545
- 'type' => Controls_Manager::COLOR,
546
- 'scheme' => [
547
- 'type' => Scheme_Color::get_type(),
548
- 'value' => Scheme_Color::COLOR_1,
549
- ],
550
- 'default' => '#60647d',
551
- 'selectors' => [
552
- '{{WRAPPER}} .obfx-price' => 'color: {{VALUE}};',
553
- ],
554
- ]
555
- );
556
-
557
- $this->add_group_control(
558
- Group_Control_Typography::get_type(),
559
- [
560
- 'name' => 'price_typography',
561
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
562
- 'selector' => '{{WRAPPER}} .obfx-price',
563
- ]
564
- );
565
-
566
- $this->add_control(
567
- 'price_tag_heading_period',
568
- [
569
- 'label' => __( 'Period', 'themeisle-companion' ),
570
- 'type' => Controls_Manager::HEADING,
571
- 'separator' => 'before',
572
- ]
573
- );
574
-
575
- $this->add_control(
576
- 'period_color',
577
- [
578
- 'label' => __( 'Period Color', 'themeisle-companion' ),
579
- 'type' => Controls_Manager::COLOR,
580
- 'scheme' => [
581
- 'type' => Scheme_Color::get_type(),
582
- 'value' => Scheme_Color::COLOR_1,
583
- ],
584
- 'default' => '#60647d',
585
- 'selectors' => [
586
- '{{WRAPPER}} .obfx-pricing-period' => 'color: {{VALUE}};',
587
- ],
588
- ]
589
- );
590
-
591
- $this->add_group_control(
592
- Group_Control_Typography::get_type(),
593
- [
594
- 'name' => 'price_sub_text_typography',
595
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
596
- 'selector' => '{{WRAPPER}} .obfx-pricing-period',
597
- ]
598
- );
599
- $this->end_controls_section(); // end pricing-section
600
- }
601
-
602
- /**
603
- * Style > Features section.
604
- */
605
- private function features_style_section() {
606
- $this->start_controls_section(
607
- 'section_features_style',
608
- [
609
- 'label' => __( 'Features', 'themeisle-companion' ),
610
- 'tab' => Controls_Manager::TAB_STYLE,
611
- ]
612
- );
613
-
614
- $this->add_group_control(
615
- Group_Control_Background::get_type(),
616
- [
617
- 'name' => 'features_section_bg',
618
- 'label' => __( 'Section Background', 'themeisle-companion' ),
619
- 'types' => [ 'classic', 'gradient' ],
620
- 'selector' => '{{WRAPPER}} .obfx-feature-list',
621
- ]
622
- );
623
-
624
- $this->add_responsive_control(
625
- 'features_box_padding',
626
- [
627
- 'type' => Controls_Manager::DIMENSIONS,
628
- 'label' => __( 'Features List Padding', 'themeisle-companion' ),
629
- 'size_units' => [ 'px', 'em', '%' ],
630
- 'selectors' => [
631
- '{{WRAPPER}} .obfx-feature-list' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
632
- ],
633
- ]
634
- );
635
-
636
- $this->add_control(
637
- 'features_accented_heading',
638
- [
639
- 'label' => __( 'Accented', 'themeisle-companion' ),
640
- 'type' => Controls_Manager::HEADING,
641
- 'separator' => 'before',
642
- ]
643
- );
644
-
645
- $this->add_control(
646
- 'features_accented_text_color',
647
- [
648
- 'type' => Controls_Manager::COLOR,
649
- 'label' => __( 'Accented Color', 'themeisle-companion' ),
650
- 'scheme' => [
651
- 'type' => Scheme_Color::get_type(),
652
- 'value' => Scheme_Color::COLOR_1,
653
- ],
654
- 'default' => '#60647d',
655
- 'selectors' => [
656
- '{{WRAPPER}} .obfx-pricing-table-accented' => 'color: {{VALUE}};',
657
- ],
658
- ]
659
- );
660
-
661
- $this->add_group_control(
662
- Group_Control_Typography::get_type(),
663
- [
664
- 'name' => 'features_accented_typography',
665
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
666
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-accented',
667
- ]
668
- );
669
-
670
- $this->add_control(
671
- 'features_features_heading',
672
- [
673
- 'label' => __( 'Features', 'themeisle-companion' ),
674
- 'type' => Controls_Manager::HEADING,
675
- 'separator' => 'before',
676
- ]
677
- );
678
-
679
- $this->add_control(
680
- 'features_text_color',
681
- [
682
- 'label' => __( 'Features Color', 'themeisle-companion' ),
683
- 'type' => Controls_Manager::COLOR,
684
- 'scheme' => [
685
- 'type' => Scheme_Color::get_type(),
686
- 'value' => Scheme_Color::COLOR_1,
687
- ],
688
- 'default' => '#b1b3c0',
689
- 'selectors' => [
690
- '{{WRAPPER}} .obfx-pricing-table-feature' => 'color: {{VALUE}};',
691
- ],
692
- ]
693
- );
694
-
695
- $this->add_group_control(
696
- Group_Control_Typography::get_type(),
697
- [
698
- 'name' => 'features_features_typography',
699
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
700
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-feature',
701
- ]
702
- );
703
-
704
- $this->add_control(
705
- 'features_icons_heading',
706
- [
707
- 'label' => __( 'Icons', 'themeisle-companion' ),
708
- 'type' => Controls_Manager::HEADING,
709
- 'separator' => 'before',
710
- ]
711
- );
712
-
713
- $this->add_control(
714
- 'features_icon_color',
715
- [
716
- 'label' => __( 'Icon Color', 'themeisle-companion' ),
717
- 'type' => Controls_Manager::COLOR,
718
- 'scheme' => [
719
- 'type' => Scheme_Color::get_type(),
720
- 'value' => Scheme_Color::COLOR_1,
721
- ],
722
- 'default' => '#b1b3c0',
723
- 'selectors' => [
724
- '{{WRAPPER}} .obfx-pricing-table-feature-icon' => 'color: {{VALUE}};',
725
- ],
726
- ]
727
- );
728
-
729
- $this->add_control(
730
- 'features_icon_indent',
731
- [
732
- 'type' => Controls_Manager::SLIDER,
733
- 'label' => __( 'Icon Spacing', 'themeisle-companion' ),
734
- 'default' => [
735
- 'size' => 5,
736
- ],
737
- 'range' => [
738
- 'px' => [
739
- 'max' => 50,
740
- ],
741
- ],
742
- 'selectors' => [
743
- '{{WRAPPER}} i.obfx-pricing-table-feature-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
744
- ],
745
- ]
746
- );
747
-
748
- $this->end_controls_section(); // end section_features_style
749
- }
750
-
751
- /**
752
- * Style > Button section.
753
- */
754
- private function button_style_section() {
755
- $this->start_controls_section(
756
- 'section_button_style',
757
- [
758
- 'label' => __( 'Button', 'themeisle-companion' ),
759
- 'tab' => Controls_Manager::TAB_STYLE,
760
- ]
761
- );
762
-
763
- $this->add_group_control(
764
- Group_Control_Background::get_type(), [
765
- 'name' => 'button_section_bg',
766
- 'label' => __( 'Section Background', 'themeisle-companion' ),
767
- 'types' => [ 'classic', 'gradient' ],
768
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-button-wrapper',
769
- ]
770
- );
771
-
772
- $this->add_group_control(
773
- Group_Control_Typography::get_type(),
774
- [
775
- 'name' => 'typography',
776
- 'label' => __( 'Typography', 'themeisle-companion' ),
777
- 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
778
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-button-wrapper',
779
- ]
780
- );
781
-
782
- $this->add_control(
783
- 'border_radius',
784
- [
785
- 'label' => __( 'Border Radius', 'themeisle-companion' ),
786
- 'type' => Controls_Manager::DIMENSIONS,
787
- 'size_units' => [ 'px', '%' ],
788
- 'selectors' => [
789
- '{{WRAPPER}} .obfx-pricing-table-button' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
790
- ],
791
- ]
792
- );
793
-
794
- $this->add_control(
795
- 'text_padding',
796
- [
797
- 'label' => __( 'Padding', 'themeisle-companion' ),
798
- 'type' => Controls_Manager::DIMENSIONS,
799
- 'size_units' => [ 'px', 'em', '%' ],
800
- 'selectors' => [
801
- '{{WRAPPER}} .obfx-pricing-table-button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
802
- ],
803
- ]
804
- );
805
-
806
- // Add the tabbed control.
807
- $this->tabbed_button_controls();
808
-
809
- $this->end_controls_section(); // end section_button_style
810
- }
811
-
812
- /**
813
- * Tabs for the Style > Button section.
814
- */
815
- private function tabbed_button_controls() {
816
- $this->start_controls_tabs( 'tabs_background' );
817
-
818
- $this->start_controls_tab(
819
- 'tab_background_normal',
820
- [
821
- 'label' => __( 'Normal', 'themeisle-companion' ),
822
- ]
823
- );
824
-
825
- $this->add_control(
826
- 'button_text_color',
827
- [
828
- 'type' => Controls_Manager::COLOR,
829
- 'label' => __( 'Text Color', 'themeisle-companion' ),
830
- 'scheme' => [
831
- 'type' => Scheme_Color::get_type(),
832
- 'value' => Scheme_Color::COLOR_1,
833
- ],
834
- 'default' => '#fff',
835
- 'selectors' => [
836
- '{{WRAPPER}} .obfx-pricing-table-button' => 'color: {{VALUE}};',
837
- ],
838
- ]
839
- );
840
- $this->add_control(
841
- 'button_bg_color',
842
- [
843
- 'type' => Controls_Manager::COLOR,
844
- 'label' => __( 'Background Color', 'themeisle-companion' ),
845
- 'scheme' => [
846
- 'type' => Scheme_Color::get_type(),
847
- 'value' => Scheme_Color::COLOR_1,
848
- ],
849
- 'default' => '#93c64f',
850
- 'selectors' => [
851
- '{{WRAPPER}} .obfx-pricing-table-button' => 'background-color: {{VALUE}};',
852
- ],
853
- ]
854
- );
855
-
856
- $this->add_group_control(
857
- Group_Control_Box_Shadow::get_type(),
858
- [
859
- 'name' => 'button_box_shadow',
860
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-button',
861
- 'separator' => '',
862
- ]
863
- );
864
-
865
- $this->end_controls_tab();
866
-
867
- $this->start_controls_tab(
868
- 'tab_background_hover',
869
- [
870
- 'label' => __( 'Hover', 'themeisle-companion' ),
871
- ]
872
- );
873
-
874
- $this->add_control(
875
- 'button_hover_text_color',
876
- [
877
- 'type' => Controls_Manager::COLOR,
878
- 'label' => __( 'Text Color', 'themeisle-companion' ),
879
- 'scheme' => [
880
- 'type' => Scheme_Color::get_type(),
881
- 'value' => Scheme_Color::COLOR_1,
882
- ],
883
- 'default' => '#fff',
884
- 'selectors' => [
885
- '{{WRAPPER}} .obfx-pricing-table-button:hover' => 'color: {{VALUE}};',
886
- ],
887
- ]
888
- );
889
- $this->add_control(
890
- 'button_hover_bg_color',
891
- [
892
- 'type' => Controls_Manager::COLOR,
893
- 'label' => __( 'Background Color', 'themeisle-companion' ),
894
- 'scheme' => [
895
- 'type' => Scheme_Color::get_type(),
896
- 'value' => Scheme_Color::COLOR_1,
897
- ],
898
- 'default' => '#74c600',
899
- 'selectors' => [
900
- '{{WRAPPER}} .obfx-pricing-table-button:hover' => 'background-color: {{VALUE}};',
901
- ],
902
- ]
903
- );
904
-
905
- $this->add_group_control(
906
- Group_Control_Box_Shadow::get_type(),
907
- [
908
- 'name' => 'button_hover_box_shadow',
909
- 'selector' => '{{WRAPPER}} .obfx-pricing-table-button:hover',
910
- 'separator' => '',
911
- ]
912
- );
913
-
914
- $this->add_control(
915
- 'background_hover_transition',
916
- [
917
- 'label' => __( 'Transition Duration', 'themeisle-companion' ),
918
- 'type' => Controls_Manager::SLIDER,
919
- 'default' => [
920
- 'size' => 0.3,
921
- ],
922
- 'range' => [
923
- 'px' => [
924
- 'max' => 3,
925
- 'step' => 0.1,
926
- ],
927
- ],
928
- 'render_type' => 'ui',
929
- 'selectors' => [
930
- '{{WRAPPER}} .obfx-pricing-table-button' => 'transition: all {{SIZE}}s ease;',
931
- ],
932
- ]
933
- );
934
-
935
- $this->end_controls_tab();
936
-
937
- $this->end_controls_tabs();
938
- }
939
-
940
- /**
941
- * Render function to output the pricing table.
942
- */
943
- protected function render() {
944
- $settings = $this->get_settings();
945
- $this->add_render_attribute( 'title', 'class', 'obfx-pricing-table-title' );
946
- $this->add_render_attribute( 'subtitle', 'class', 'obfx-pricing-table-subtitle' );
947
- $this->add_render_attribute( 'button', 'class', 'obfx-pricing-table-button' );
948
- $this->add_render_attribute( 'button_icon', 'class', $settings['button_icon'] );
949
- $this->add_render_attribute( 'button_icon_align', 'class', 'obfx-button-icon-align-' . $settings['button_icon_align'] );
950
- if ( ! empty( $settings['button_link']['url'] ) ) {
951
- $this->add_render_attribute( 'button', 'href', $settings['button_link']['url'] );
952
-
953
- if ( ! empty( $settings['button_link']['is_external'] ) ) {
954
- $this->add_render_attribute( 'button', 'target', '_blank' );
955
- }
956
- if ( ! empty( $settings['button_link']['nofollow'] ) ) {
957
- $this->add_render_attribute( 'button', 'rel', 'nofollow' );
958
- }
959
- }
960
-
961
- $output = '';
962
-
963
- $output .= '<div class="obfx-pricing-table-wrapper">';
964
-
965
- if ( ! empty( $settings['title'] ) || ! empty( $settings['subtitle'] ) ) {
966
- $output .= '<div class="obfx-title-wrapper">';
967
- if ( ! empty( $settings['title'] ) ) {
968
- // Start of title tag.
969
- $output .= '<' . esc_html( $settings['title_tag'] ) . ' ' . $this->get_render_attribute_string( 'title' ) . '>';
970
-
971
- // Title string.
972
- $output .= esc_html( $settings['title'] );
973
-
974
- // End of title tag.
975
- $output .= '</' . esc_html( $settings['title_tag'] ) . '>';
976
- }
977
- if ( ! empty( $settings['subtitle'] ) ) {
978
- // Start of subtitle tag.
979
- $output .= '<' . esc_html( $settings['subtitle_tag'] ) . ' ' . $this->get_render_attribute_string( 'subtitle' ) . '>';
980
-
981
- // Subtitle string.
982
- $output .= esc_html( $settings['subtitle'] );
983
-
984
- // End of subtitle tag.
985
- $output .= '</' . esc_html( $settings['subtitle_tag'] ) . '>';
986
-
987
- }
988
-
989
- $output .= '</div> <!-- /.obfx-title-wrapper -->';
990
- }
991
-
992
- if ( ! empty( $settings['price_tag_text'] ) || ! empty( $settings['price_tag_currency'] ) || ! empty( $settings['price_tag_period'] ) ) {
993
- $output .= '<div class="obfx-price-wrapper">';
994
-
995
- if ( ! empty( $settings['price_tag_currency'] ) && ( $settings['price_tag_currency_position'] == 'left' ) ) {
996
- $output .= '<span class="obfx-price-currency">' . esc_html( $settings['price_tag_currency'] ) . '</span>';
997
- }
998
-
999
- if ( ( isset( $settings['price_tag_text'] ) && $settings['price_tag_text'] === '0' ) || ! empty( $settings['price_tag_text'] ) ) {
1000
- $output .= '<span class="obfx-price">' . esc_html( $settings['price_tag_text'] ) . '</span>';
1001
- }
1002
-
1003
- if ( ! empty( $settings['price_tag_currency'] ) && ( $settings['price_tag_currency_position'] == 'right' ) ) {
1004
- $output .= '<span class="obfx-price-currency">' . esc_html( $settings['price_tag_currency'] ) . '</span>';
1005
- }
1006
-
1007
- if ( ! empty( $settings['price_tag_period'] ) ) {
1008
- $output .= '<span class="obfx-pricing-period">' . esc_html( $settings['price_tag_period'] ) . '</span>';
1009
- }
1010
-
1011
- $output .= '</div> <!-- /.obfx-price-wrapper -->';
1012
- }
1013
-
1014
- if ( count( $settings['feature_list'] ) ) {
1015
- $output .= '<ul class="obfx-feature-list">';
1016
- foreach ( $settings['feature_list'] as $feature ) {
1017
- $output .= '<li>';
1018
- if ( ! empty( $feature['feature_icon'] ) ) {
1019
- $output .= '<i class="obfx-pricing-table-feature-icon ' . esc_attr( $feature['feature_icon'] ) . '"></i>';
1020
- }
1021
- if ( ! empty( $feature['accent'] ) ) {
1022
- $output .= '<span class="obfx-pricing-table-accented">' . esc_html( $feature['accent'] ) . '</span>';
1023
- $output .= ' ';
1024
- }
1025
- if ( ! empty( $feature['text'] ) ) {
1026
- $output .= '<span class="obfx-pricing-table-feature">' . esc_html( $feature['text'] ) . '</span>';
1027
- }
1028
- $output .= '</li>';
1029
- }
1030
- $output .= '</ul>';
1031
- }
1032
-
1033
- if ( ! empty( $settings['button_text'] ) ) {
1034
- $output .= '<div class="obfx-pricing-table-button-wrapper">';
1035
-
1036
- $output .= '<a ' . $this->get_render_attribute_string( 'button' ) . '>';
1037
-
1038
- if ( ! empty( $settings['button_icon'] ) && ( $settings['button_icon_align'] == 'left' ) ) {
1039
- $output .= '<span ' . $this->get_render_attribute_string( 'button_icon_align' ) . ' >';
1040
- $output .= '<i ' . $this->get_render_attribute_string( 'button_icon' ) . '></i>';
1041
- }
1042
-
1043
- $output .= '<span class="elementor-button-text">' . esc_html( $settings['button_text'] ) . '</span>';
1044
-
1045
- if ( ! empty( $settings['button_icon'] ) && ( $settings['button_icon_align'] == 'right' ) ) {
1046
- $output .= '<span ' . $this->get_render_attribute_string( 'button_icon_align' ) . ' >';
1047
- $output .= '<i ' . $this->get_render_attribute_string( 'button_icon' ) . '></i>';
1048
- }
1049
-
1050
- $output .= '</a>';
1051
- $output .= '</div> <!-- /.obfx-pricing-table-button-wrapper -->';
1052
-
1053
- }
1054
- $output .= '</div> <!-- /.obfx-pricing-table-wrapper -->';
1055
-
1056
- echo $output;
1057
- }
1058
- }
1059
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/elementor-widgets/widgets/class-obfx-elementor-widget-services.php DELETED
@@ -1,655 +0,0 @@
1
- <?php
2
- /**
3
- * Orbit Fox Elementor Services Widget
4
- *
5
- * @link https://themeisle.com
6
- * @since 1.0.0
7
- *
8
- * @package Elementor_Widgets_OBFX_Module
9
- */
10
-
11
- namespace Elementor;
12
-
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- } // End if().
16
-
17
- /**
18
- * Class OBFX_Elementor_Widget_Services
19
- *
20
- * @package Elementor_Widgets_OBFX_Module
21
- */
22
- class OBFX_Elementor_Widget_Services extends Widget_Base {
23
-
24
- /**
25
- * Widget name.
26
- *
27
- * @return string
28
- */
29
- public function get_name() {
30
- return 'obfx-services';
31
- }
32
-
33
- /**
34
- * Widget title.
35
- *
36
- * @return string
37
- */
38
- public function get_title() {
39
- return __( 'Services', 'themeisle-companion' );
40
- }
41
-
42
- /**
43
- * Widget icon.
44
- *
45
- * @return string
46
- */
47
- public function get_icon() {
48
- return 'fa fa-diamond';
49
- }
50
-
51
-
52
- /**
53
- * Widget Category
54
- *
55
- * @return array
56
- */
57
- public function get_categories() {
58
- return [ 'obfx-elementor-widgets' ];
59
- }
60
-
61
- /**
62
- * Register Elementor Controls
63
- */
64
- protected function _register_controls() {
65
- $this->services_content();
66
- $this->style_icon();
67
- $this->style_grid_options();
68
- }
69
-
70
- /**
71
- * Content controls
72
- */
73
- private function services_content() {
74
- $this->start_controls_section(
75
- 'section_content',
76
- [
77
- 'label' => __( 'Services', 'themeisle-companion' ),
78
- ]
79
- );
80
-
81
- $this->add_control(
82
- 'services_list',
83
- [
84
- 'label' => __( 'Services', 'themeisle-companion' ),
85
- 'type' => Controls_Manager::REPEATER,
86
- 'default' => [
87
- [
88
- 'title' => __( 'Award-Winning​', 'themeisle-companion' ),
89
- 'text' => __( 'Add some text here to describe your services to the page visitors.​', 'themeisle-companion' ),
90
- 'icon' => 'fa fa-trophy',
91
- 'color' => '#333333',
92
- 'type' => 'icon',
93
- ],
94
- [
95
- 'title' => __( 'Professional​', 'themeisle-companion' ),
96
- 'text' => __( 'Add some text here to describe your services to the page visitors.​', 'themeisle-companion' ),
97
- 'icon' => 'fa fa-suitcase',
98
- 'color' => '#333333',
99
- 'type' => 'icon',
100
- ],
101
- [
102
- 'title' => __( 'Consulting​', 'themeisle-companion' ),
103
- 'text' => __( 'Add some text here to describe your services to the page visitors.​', 'themeisle-companion' ),
104
- 'icon' => 'fa fa-handshake-o',
105
- 'color' => '#333333',
106
- 'type' => 'icon',
107
- ],
108
- ],
109
- 'fields' => [
110
- [
111
- 'type' => Controls_Manager::CHOOSE,
112
- 'name' => 'type',
113
- 'label_block' => true,
114
- 'label' => __( 'Type', 'themeisle-companion' ),
115
- 'default' => 'icon',
116
- 'options' => [
117
- 'icon' => [
118
- 'title' => __( 'Icon', 'themeisle-companion' ),
119
- 'icon' => 'fa fa-diamond',
120
- ],
121
- 'image' => [
122
- 'title' => __( 'Image', 'themeisle-companion' ),
123
- 'icon' => 'fa fa-photo',
124
- ],
125
- ],
126
- ],
127
- [
128
- 'type' => Controls_Manager::TEXT,
129
- 'name' => 'title',
130
- 'label_block' => true,
131
- 'label' => __( 'Title & Description', 'themeisle-companion' ),
132
- 'default' => __( 'Service Title', 'themeisle-companion' ),
133
- ],
134
- [
135
- 'type' => Controls_Manager::TEXTAREA,
136
- 'name' => 'text',
137
- 'placeholder' => __( 'Plan Features', 'themeisle-companion' ),
138
- 'default' => __( 'Feature', 'themeisle-companion' ),
139
- ],
140
- [
141
- 'type' => Controls_Manager::ICON,
142
- 'name' => 'icon',
143
- 'label' => __( 'Icon', 'themeisle-companion' ),
144
- 'default' => 'fa fa-diamond',
145
- 'condition' => [
146
- 'type' => 'icon',
147
- ],
148
- ],
149
- [
150
- 'type' => Controls_Manager::COLOR,
151
- 'name' => 'color',
152
- 'label_block' => false,
153
- 'label' => __( 'Icon Color', 'themeisle-companion' ),
154
- 'default' => '#333333',
155
- 'condition' => [
156
- 'type' => 'icon',
157
- ],
158
- ],
159
- [
160
- 'type' => Controls_Manager::MEDIA,
161
- 'name' => 'image',
162
- 'label' => __( 'Image', 'themeisle-companion' ),
163
- 'condition' => [
164
- 'type' => 'image',
165
- ],
166
- ],
167
- [
168
- 'type' => Controls_Manager::URL,
169
- 'name' => 'link',
170
- 'label' => __( 'Link to', 'themeisle-companion' ),
171
- 'separator' => 'before',
172
- 'placeholder' => __( 'https://example.com', 'themeisle-companion' ),
173
- ],
174
- ],
175
- 'title_field' => '{{title}}',
176
- ]
177
- );
178
-
179
- $this->add_control(
180
- 'align',
181
- [
182
- 'label' => '<i class="fa fa-arrows"></i> ' . __( 'Icon Position', 'themeisle-companion' ),
183
- 'type' => Controls_Manager::CHOOSE,
184
- 'options' => [
185
- 'left' => [
186
- 'title' => __( 'Left', 'themeisle-companion' ),
187
- 'icon' => 'fa fa-angle-left',
188
- ],
189
- 'top' => [
190
- 'title' => __( 'Top', 'themeisle-companion' ),
191
- 'icon' => 'fa fa-angle-up',
192
- ],
193
- 'right' => [
194
- 'title' => __( 'Right', 'themeisle-companion' ),
195
- 'icon' => 'fa fa-angle-right',
196
- ],
197
- ],
198
- 'default' => 'top',
199
- 'prefix_class' => 'obfx-position-',
200
- 'toggle' => false,
201
- ]
202
- );
203
-
204
- // Columns.
205
- $this->add_responsive_control(
206
- 'grid_columns',
207
- [
208
- 'type' => Controls_Manager::SELECT,
209
- 'label' => '<i class="fa fa-columns"></i> ' . __( 'Columns', 'themeisle-companion' ),
210
- 'default' => 3,
211
- 'tablet_default' => 2,
212
- 'mobile_default' => 1,
213
- 'options' => [
214
- 1 => 1,
215
- 2 => 2,
216
- 3 => 3,
217
- 4 => 4,
218
- 5 => 5,
219
- ],
220
- ]
221
- );
222
- $this->end_controls_section();
223
- }
224
-
225
- /**
226
- * Icon Style Controls
227
- */
228
- private function style_icon() {
229
- $this->start_controls_section(
230
- 'section_style_icon',
231
- [
232
- 'label' => __( 'Icon / Image', 'themeisle-companion' ),
233
- 'tab' => Controls_Manager::TAB_STYLE,
234
- ]
235
- );
236
- $this->add_control(
237
- 'icon_space',
238
- [
239
- 'label' => __( 'Spacing', 'themeisle-companion' ),
240
- 'type' => Controls_Manager::SLIDER,
241
- 'default' => [
242
- 'size' => 15,
243
- ],
244
- 'range' => [
245
- 'px' => [
246
- 'min' => 0,
247
- 'max' => 300,
248
- ],
249
- ],
250
- 'selectors' => [
251
- '{{WRAPPER}}.obfx-position-right .obfx-icon, {{WRAPPER}}.obfx-position-right .obfx-image' => 'margin-left: {{SIZE}}{{UNIT}};',
252
- '{{WRAPPER}}.obfx-position-left .obfx-icon, {{WRAPPER}}.obfx-position-left .obfx-image' => 'margin-right: {{SIZE}}{{UNIT}};',
253
- '{{WRAPPER}}.obfx-position-top .obfx-icon, {{WRAPPER}}.obfx-position-top .obfx-image' => 'margin-bottom: {{SIZE}}{{UNIT}};',
254
- ],
255
- ]
256
- );
257
- $this->add_control(
258
- 'icon_size',
259
- [
260
- 'label' => __( 'Size', 'themeisle-companion' ),
261
- 'type' => Controls_Manager::SLIDER,
262
- 'range' => [
263
- 'px' => [
264
- 'min' => 6,
265
- 'max' => 300,
266
- ],
267
- ],
268
- 'default' => [
269
- 'size' => 35,
270
- ],
271
- 'selectors' => [
272
- '{{WRAPPER}} .obfx-icon' => 'font-size: {{SIZE}}{{UNIT}};',
273
- '{{WRAPPER}} .obfx-image' => 'max-width: {{SIZE}}{{UNIT}};',
274
- ],
275
- ]
276
- );
277
- $this->end_controls_section();
278
- $this->start_controls_section(
279
- 'section_style_content',
280
- [
281
- 'label' => __( 'Content', 'themeisle-companion' ),
282
- 'tab' => Controls_Manager::TAB_STYLE,
283
- ]
284
- );
285
-
286
- $this->add_responsive_control(
287
- 'text_align',
288
- [
289
- 'label' => __( 'Alignment', 'themeisle-companion' ),
290
- 'type' => Controls_Manager::CHOOSE,
291
- 'toggle' => false,
292
- 'default' => 'center',
293
- 'options' => [
294
- 'left' => [
295
- 'title' => __( 'Left', 'themeisle-companion' ),
296
- 'icon' => 'fa fa-align-left',
297
- ],
298
- 'center' => [
299
- 'title' => __( 'Center', 'themeisle-companion' ),
300
- 'icon' => 'fa fa-align-center',
301
- ],
302
- 'right' => [
303
- 'title' => __( 'Right', 'themeisle-companion' ),
304
- 'icon' => 'fa fa-align-right',
305
- ],
306
- ],
307
- 'selectors' => [
308
- '{{WRAPPER}} .obfx-grid .obfx-grid-container .obfx-grid-wrapper .obfx-service-box' => 'text-align: {{VALUE}}; justify-content: {{VALUE}};',
309
- '{{WRAPPER}} .obfx-grid .obfx-grid-container .obfx-grid-wrapper .obfx-service-box .obfx-service-text' => 'text-align: {{VALUE}};',
310
- ],
311
- ]
312
- );
313
-
314
- $this->add_control(
315
- 'heading_title',
316
- [
317
- 'label' => __( 'Title', 'themeisle-companion' ),
318
- 'type' => Controls_Manager::HEADING,
319
- 'separator' => 'before',
320
- ]
321
- );
322
-
323
- $this->add_responsive_control(
324
- 'title_bottom_space',
325
- [
326
- 'label' => __( 'Spacing', 'themeisle-companion' ),
327
- 'type' => Controls_Manager::SLIDER,
328
- 'range' => [
329
- 'px' => [
330
- 'min' => 0,
331
- 'max' => 300,
332
- ],
333
- ],
334
- 'selectors' => [
335
- '{{WRAPPER}} .obfx-service-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
336
- ],
337
- ]
338
- );
339
-
340
- $this->add_control(
341
- 'title_color',
342
- [
343
- 'label' => __( 'Color', 'themeisle-companion' ),
344
- 'type' => Controls_Manager::COLOR,
345
- 'default' => '',
346
- 'selectors' => [
347
- '{{WRAPPER}} .obfx-service-title' => 'color: {{VALUE}};',
348
- ],
349
- ]
350
- );
351
-
352
- $this->add_group_control(
353
- Group_Control_Typography::get_type(),
354
- [
355
- 'name' => 'title_typography',
356
- 'selector' => '{{WRAPPER}} .obfx-service-title',
357
- 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
358
- ]
359
- );
360
-
361
- $this->add_control(
362
- 'heading_description',
363
- [
364
- 'label' => __( 'Description', 'themeisle-companion' ),
365
- 'type' => Controls_Manager::HEADING,
366
- 'separator' => 'before',
367
- ]
368
- );
369
-
370
- $this->add_control(
371
- 'description_color',
372
- [
373
- 'label' => __( 'Color', 'themeisle-companion' ),
374
- 'type' => Controls_Manager::COLOR,
375
- 'default' => '',
376
- 'selectors' => [
377
- '{{WRAPPER}} .obfx-service-text' => 'color: {{VALUE}};',
378
- ],
379
- 'scheme' => [
380
- 'type' => Scheme_Color::get_type(),
381
- 'value' => Scheme_Color::COLOR_3,
382
- ],
383
- ]
384
- );
385
-
386
- $this->add_group_control(
387
- Group_Control_Typography::get_type(),
388
- [
389
- 'name' => 'description_typography',
390
- 'selector' => '{{WRAPPER}} .obfx-service-text',
391
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
392
- ]
393
- );
394
-
395
- $this->end_controls_section();
396
- }
397
-
398
- /**
399
- * Grid Style Controls
400
- */
401
- private function style_grid_options() {
402
- $this->start_controls_section(
403
- 'section_grid_style',
404
- [
405
- 'label' => __( 'Grid', 'themeisle-companion' ),
406
- 'tab' => Controls_Manager::TAB_STYLE,
407
- ]
408
- );
409
-
410
- // Columns margin.
411
- $this->add_control(
412
- 'grid_style_columns_margin',
413
- [
414
- 'label' => __( 'Columns margin', 'themeisle-companion' ),
415
- 'type' => Controls_Manager::SLIDER,
416
- 'default' => [
417
- 'size' => 15,
418
- ],
419
- 'range' => [
420
- 'px' => [
421
- 'min' => 0,
422
- 'max' => 100,
423
- ],
424
- ],
425
- 'selectors' => [
426
- '{{WRAPPER}} .obfx-grid-wrapper' => 'padding-right: calc( {{SIZE}}{{UNIT}} ); padding-left: calc( {{SIZE}}{{UNIT}} );',
427
- '{{WRAPPER}} .obfx-grid-container' => 'margin-left: calc( -{{SIZE}}{{UNIT}} ); margin-right: calc( -{{SIZE}}{{UNIT}} );',
428
- ],
429
- ]
430
- );
431
-
432
- // Row margin.
433
- $this->add_control(
434
- 'grid_style_rows_margin',
435
- [
436
- 'label' => __( 'Rows margin', 'themeisle-companion' ),
437
- 'type' => Controls_Manager::SLIDER,
438
- 'default' => [
439
- 'size' => 30,
440
- ],
441
- 'range' => [
442
- 'px' => [
443
- 'min' => 0,
444
- 'max' => 100,
445
- ],
446
- ],
447
- 'selectors' => [
448
- '{{WRAPPER}} .obfx-grid-wrapper' => 'padding-bottom: {{SIZE}}{{UNIT}};',
449
- ],
450
- ]
451
- );
452
-
453
- // Background.
454
- $this->add_group_control(
455
- Group_Control_Background::get_type(),
456
- [
457
- 'name' => 'grid_style_background',
458
- 'types' => [ 'classic', 'gradient' ],
459
- 'selector' => '{{WRAPPER}} .obfx-grid',
460
- ]
461
- );
462
-
463
- // Items options.
464
- $this->add_control(
465
- 'grid_items_style_heading',
466
- [
467
- 'label' => __( 'Items', 'themeisle-companion' ),
468
- 'type' => Controls_Manager::HEADING,
469
- 'separator' => 'before',
470
- ]
471
- );
472
-
473
- // Items internal padding.
474
- $this->add_control(
475
- 'grid_items_style_padding',
476
- [
477
- 'label' => __( 'Padding', 'themeisle-companion' ),
478
- 'type' => Controls_Manager::DIMENSIONS,
479
- 'size_units' => [ 'px', '%' ],
480
- 'selectors' => [
481
- '{{WRAPPER}} .obfx-grid-col' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
482
- ],
483
- ]
484
- );
485
-
486
- // Items border radius.
487
- $this->add_control(
488
- 'grid_items_style_border_radius',
489
- [
490
- 'label' => __( 'Border Radius', 'themeisle-companion' ),
491
- 'type' => Controls_Manager::DIMENSIONS,
492
- 'size_units' => [ 'px', '%' ],
493
- 'selectors' => [
494
- '{{WRAPPER}} .obfx-grid-col' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
495
- ],
496
- ]
497
- );
498
-
499
- $this->items_style_tabs();
500
- $this->end_controls_section();
501
- }
502
-
503
- /**
504
- * Items Style Controls
505
- */
506
- private function items_style_tabs() {
507
- $this->start_controls_tabs( 'tabs_background' );
508
-
509
- $this->start_controls_tab(
510
- 'tab_background_normal',
511
- [
512
- 'label' => __( 'Normal', 'themeisle-companion' ),
513
- ]
514
- );
515
-
516
- $this->add_group_control(
517
- Group_Control_Background::get_type(),
518
- [
519
- 'name' => 'grid_items_background',
520
- 'types' => [ 'classic', 'gradient' ],
521
- 'selector' => '{{WRAPPER}} .obfx-service-box',
522
- ]
523
- );
524
-
525
- $this->add_group_control(
526
- Group_Control_Box_Shadow::get_type(),
527
- [
528
- 'name' => 'grid_items_box_shadow',
529
- 'selector' => '{{WRAPPER}} .obfx-service-box',
530
- ]
531
- );
532
-
533
- $this->end_controls_tab();
534
-
535
- $this->start_controls_tab(
536
- 'tab_background_hover',
537
- [
538
- 'label' => __( 'Hover', 'themeisle-companion' ),
539
- ]
540
- );
541
-
542
- $this->add_group_control(
543
- Group_Control_Background::get_type(),
544
- [
545
- 'name' => 'grid_items_background_hover',
546
- 'types' => [ 'classic', 'gradient' ],
547
- 'selector' => '{{WRAPPER}} .obfx-service-box:hover',
548
- ]
549
- );
550
-
551
- $this->add_group_control(
552
- Group_Control_Box_Shadow::get_type(),
553
- [
554
- 'name' => 'grid_items_box_shadow_hover',
555
- 'selector' => '{{WRAPPER}} .obfx-service-box:hover',
556
- ]
557
- );
558
-
559
- $this->add_control(
560
- 'hover_transition',
561
- [
562
- 'label' => __( 'Transition Duration', 'themeisle-companion' ),
563
- 'type' => Controls_Manager::SLIDER,
564
- 'default' => [
565
- 'size' => 0.3,
566
- ],
567
- 'range' => [
568
- 'px' => [
569
- 'max' => 3,
570
- 'step' => 0.1,
571
- ],
572
- ],
573
- 'selectors' => [
574
- '{{WRAPPER}} .obfx-service-box' => 'transition: all {{SIZE}}s ease;',
575
- ],
576
- ]
577
- );
578
- $this->end_controls_tab();
579
-
580
- $this->end_controls_tabs();
581
- }
582
-
583
- /**
584
- * Render function to output the pricing table.
585
- */
586
- protected function render() {
587
- $settings = $this->get_settings();
588
-
589
- echo '<div class="obfx-grid"><div class="obfx-grid-container' . ( ! empty( $settings['grid_columns_mobile'] ) ? ' obfx-grid-mobile-' . $settings['grid_columns_mobile'] : '' ) . ( ! empty( $settings['grid_columns_tablet'] ) ? ' obfx-grid-tablet-' . $settings['grid_columns_tablet'] : '' ) . ( ! empty( $settings['grid_columns'] ) ? ' obfx-grid-desktop-' . $settings['grid_columns'] : '' ) . '">';
590
- foreach ( $settings['services_list'] as $service ) {
591
- $icon_tag = 'span';
592
-
593
- if ( ! empty( $service['link']['url'] ) ) {
594
- $this->add_render_attribute( 'link', 'href', $settings['link']['url'] );
595
- $icon_tag = 'a';
596
-
597
- if ( $service['link']['is_external'] ) {
598
- $this->add_render_attribute( 'link', 'target', '_blank' );
599
- }
600
-
601
- if ( $service['link']['nofollow'] ) {
602
- $this->add_render_attribute( 'link', 'rel', 'nofollow' );
603
- }
604
- } ?>
605
- <div class="obfx-grid-wrapper">
606
- <?php
607
- if ( ! empty( $service['link']['url'] ) ) {
608
- $link_props = ' href="' . esc_url( $service['link']['url'] ) . '" ';
609
- if ( $service['link']['is_external'] === 'on' ) {
610
- $link_props .= ' target="_blank" ';
611
- }
612
- if ( $service['link']['nofollow'] === 'on' ) {
613
- $link_props .= ' rel="nofollow" ';
614
- }
615
- echo '<a' . $link_props . '>';
616
- }
617
- ?>
618
- <div class="obfx-service-box obfx-grid-col">
619
- <?php
620
- if ( $service['type'] === 'icon' && ! empty( $service['icon'] ) ) {
621
- ?>
622
- <span class="obfx-icon-wrap"><i class="obfx-icon <?php echo esc_attr( $service['icon'] ); ?>" style="color: <?php echo esc_attr( $service['color'] ); ?>"></i></span>
623
- <?php
624
- } elseif ( $service['type'] === 'image' && ! empty( $service['image']['url'] ) ) {
625
- ?>
626
-
627
- <span class="obfx-image-wrap"><img class="obfx-image" src="<?php echo esc_url( $service['image']['url'] ); ?>"/></span>
628
- <?php
629
- }
630
- if ( ! empty( $service['title'] ) || ! empty( $service['text'] ) ) {
631
- ?>
632
- <div class="obfx-service-box-content">
633
- <?php if ( ! empty( $service['title'] ) ) { ?>
634
- <h4 class="obfx-service-title"><?php echo esc_attr( $service['title'] ); ?></h4>
635
- <?php
636
- }
637
- if ( ! empty( $service['text'] ) ) {
638
- ?>
639
- <p class="obfx-service-text"><?php echo esc_attr( $service['text'] ); ?></p>
640
- <?php } ?>
641
- </div><!-- /.obfx-service-box-content -->
642
- <?php } ?>
643
- </div><!-- /.obfx-service-box -->
644
- <?php
645
- if ( ! empty( $service['link'] ) ) {
646
- echo '</a>';
647
- }
648
- ?>
649
- </div><!-- /.obfx-grid-wrapper -->
650
- <?php
651
- }// End foreach().
652
- echo '</div></div>';
653
-
654
- }
655
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/menu-icons/init.php CHANGED
@@ -32,7 +32,6 @@ class Menu_Icons_OBFX_Module extends Orbit_Fox_Module_Abstract {
32
  parent::__construct();
33
  $this->name = __( 'Menu Icons', 'themeisle-companion' );
34
  $this->description = __( 'Module to define menu icons for navigation.', 'themeisle-companion' );
35
- $this->active_default = true;
36
  }
37
 
38
 
@@ -195,10 +194,6 @@ class Menu_Icons_OBFX_Module extends Orbit_Fox_Module_Abstract {
195
  return;
196
  }
197
 
198
- if ( ! function_exists( 'get_current_screen' ) ) {
199
- return;
200
- }
201
-
202
  $screen = get_current_screen();
203
  if ( ! $screen instanceof WP_Screen || 'nav-menus' !== $screen->id ) {
204
  return;
32
  parent::__construct();
33
  $this->name = __( 'Menu Icons', 'themeisle-companion' );
34
  $this->description = __( 'Module to define menu icons for navigation.', 'themeisle-companion' );
 
35
  }
36
 
37
 
194
  return;
195
  }
196
 
 
 
 
 
197
  $screen = get_current_screen();
198
  if ( ! $screen instanceof WP_Screen || 'nav-menus' !== $screen->id ) {
199
  return;
obfx_modules/menu-icons/js/admin.js CHANGED
@@ -7,107 +7,84 @@
7
  * @author ThemeIsle
8
  */
9
 
10
- /* global menu_icons */
11
 
12
  var obfx_menuicons_module_admin = function( $, menu_icons ) {
13
  'use strict';
14
 
15
- var default_icon = menu_icons.icon_default;
16
- // added blank icon for deselection.
17
- var all_icons = $.merge( [default_icon], $.merge( menu_icons.icons, $.iconpicker.defaultOptions.icons ) );
18
-
19
- function get_prefix(icon){
20
- if (typeof icon === 'undefined') {
21
- return '';
22
- }
23
- if (icon.match( /^fa-/ )) {
24
- return 'fa ';
25
- } else if (icon.match( /^dashicons-/ )) {
26
- return 'dashicons ';
27
- } else if (icon.match( /glyphicon-/ )) {
28
- return 'glyphicon ';
29
- }
30
- }
31
-
32
- // lets observe for new li tags added to the ul for when items are added to the menu.
33
- function listen_for_new_items(){
34
- var mutateObserver = new MutationObserver(
35
- function(records) {
36
- records.forEach(
37
- function(record) {
38
- $( record.addedNodes ).each(
39
- function(i, x){
40
- // process only the li elements.
41
- if ($( x ).prop( 'tagName' ) === 'LI') {
42
- add_icon( x );
43
- }
44
- }
45
- );
46
- }
47
- );
48
- }
49
- );
50
-
51
- mutateObserver.observe( $( 'ul#menu-to-edit' ).get( 0 ), {childList: true} );
52
- }
53
-
54
- function add_icon(el){
55
- var item_id = $( el ).find( 'input.menu-item-data-db-id' ).val();
56
- var icon = $( '#menu-item-icon-' + item_id ).val();
57
- var no_icon_class = '';
58
- if ('' === icon) {
59
- icon = default_icon;
60
- no_icon_class = 'obfx-menu-icon-none';
61
- }
62
- var prefix = get_prefix( icon );
63
-
64
- if ( ! $( el ).find( '.menu-item-bar .menu-item-handle .item-title div' ).hasClass( 'obfx-menu-icon-container' ) ) {
65
- $( el ).find( '.menu-item-bar .menu-item-handle .item-title' ).prepend(
66
- $(
67
- '<div class="input-group obfx-menu-icon-container" style="display: inline-block"><input class="form-control obfx-menu-icon ' + no_icon_class + '" value="' + icon + '" style="display: none" type="text" data-menu-item-id="' + item_id + '"><span class="input-group-addon" style="cursor: pointer"><i class="' + prefix + icon + '"></i></span></div>'
68
- )
69
- );
70
- }
71
-
72
- // ensure the popover comes over the menu bar.
73
- $( el ).find( '.menu-item-bar .menu-item-handle' ).css( 'overflow', 'initial' );
74
-
75
- $( el ).find( '.obfx-menu-icon ~ span' ).on(
76
- 'hover', function(){
77
- $( this ).parent().find( '.obfx-menu-icon' ).iconpicker(
78
- {
79
- icons: all_icons,
80
- fullClassFormatter: function(val){
81
- return get_prefix( val ) + val;
82
- },
83
- hideOnSelect: true,
84
- placement: 'bottomLeft',
85
- selectedCustomClass: 'obfx-menu-icon-selected'
86
- }
87
- ).on(
88
- 'iconpickerSelected', function(e) {
89
- var icon = e.iconpickerValue;
90
- var id = $( this ).attr( 'data-menu-item-id' );
91
- $( '#menu-item-icon-' + id ).val( icon );
92
- }
93
- );
94
- }
95
- );
96
-
97
- }
98
-
99
- $(
100
- function() {
101
- // add the existing menu item id to the dropdown as an attribute.
102
- $( 'li.menu-item' ).each(
103
- function(i, x){
104
- add_icon( x );
105
- }
106
- );
107
-
108
- listen_for_new_items();
109
- }
110
- );
111
 
112
  };
113
 
7
  * @author ThemeIsle
8
  */
9
 
10
+ /* global menu_icons */
11
 
12
  var obfx_menuicons_module_admin = function( $, menu_icons ) {
13
  'use strict';
14
 
15
+ var default_icon = menu_icons.icon_default;
16
+
17
+ function get_prefix(icon){
18
+ if(icon.match(/^fa-/)){
19
+ return 'fa ';
20
+ }else if(icon.match(/^dashicons-/)){
21
+ return 'dashicons ';
22
+ }else if(icon.match(/glyphicon-/)){
23
+ return 'glyphicon ';
24
+ }
25
+ }
26
+
27
+ // lets observe for new li tags added to the ul for when items are added to the menu.
28
+ function listen_for_new_items(){
29
+ var mutateObserver = new MutationObserver(function(records) {
30
+ records.forEach(function(record) {
31
+ $(record.addedNodes).each(function(i, x){
32
+ // process only the li elements.
33
+ if($(x).prop('tagName') === 'LI'){
34
+ add_icon(x);
35
+ }
36
+ });
37
+ });
38
+ });
39
+
40
+ mutateObserver.observe($('ul#menu-to-edit').get(0), {childList: true});
41
+ }
42
+
43
+ function add_icon(el){
44
+ var item_id = $(el).find('input.menu-item-data-db-id').val();
45
+ var icon = $('#menu-item-icon-' + item_id).val();
46
+ var no_icon_class = '';
47
+ if('' === icon){
48
+ icon = default_icon;
49
+ no_icon_class = 'obfx-menu-icon-none';
50
+ }
51
+ var prefix = get_prefix(icon);
52
+
53
+ $(el).find('.menu-item-bar .menu-item-handle .item-title').prepend($(
54
+ '<div class="input-group obfx-menu-icon-container" style="display: inline-block"><input class="form-control obfx-menu-icon ' + no_icon_class + '" value="' + icon + '" style="display: none" type="text" data-menu-item-id="' + item_id + '"><span class="input-group-addon" style="cursor: pointer"><i class="' + prefix + icon + '"></i></span></div>'
55
+ ));
56
+
57
+ // ensure the popover comes over the menu bar.
58
+ $(el).find('.menu-item-bar .menu-item-handle').css('overflow', 'initial');
59
+
60
+ $(el).find('.obfx-menu-icon').iconpicker({
61
+ // added blank icon for deselection.
62
+ icons: $.merge([default_icon], $.merge(menu_icons.icons, $.iconpicker.defaultOptions.icons)),
63
+ fullClassFormatter: function(val){
64
+ return get_prefix(val) + val;
65
+ },
66
+ hideOnSelect: true,
67
+ placement: 'bottomLeft',
68
+ selectedCustomClass: 'obfx-menu-icon-selected'
69
+ });
70
+
71
+ // add the selected icon to the hidden element.
72
+ $(el).find('.obfx-menu-icon').on('iconpickerSelected', function(e) {
73
+ var icon = e.iconpickerValue;
74
+ var id = $(this).attr('data-menu-item-id');
75
+ $('#menu-item-icon-' + id).val(icon);
76
+ });
77
+
78
+ }
79
+
80
+ $( function() {
81
+ // add the existing menu item id to the dropdown as an attribute.
82
+ $('li.menu-item').each(function(i, x){
83
+ add_icon(x);
84
+ });
85
+
86
+ listen_for_new_items();
87
+ } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
  };
90
 
obfx_modules/mystock-import/css/media.css CHANGED
@@ -8,9 +8,8 @@
8
  margin: 0;
9
  padding: 2px 8px 8px;
10
  outline: 0;
11
- opacity: 1;
12
  -webkit-overflow-scrolling: touch;
13
- width: 95%;
14
  }
15
 
16
  .obfx-preview {
@@ -165,17 +164,12 @@
165
  }
166
 
167
  .obfx_spinner {
 
 
168
  display: none;
169
- width: 32px;
170
- height: 32px;
171
- margin: 25% auto 0;
172
- opacity: 0.9;
173
- background: url("/wp-admin/images/wpspin_light-2x.gif") no-repeat;
174
- background-size: 32px 32px;
175
  filter: alpha(opacity=70);
176
- }
177
-
178
- .obfx-image-list.obfx_loading {
179
- opacity: .5;
180
- filter: alpha(opacity=50);
181
- }
8
  margin: 0;
9
  padding: 2px 8px 8px;
10
  outline: 0;
11
+
12
  -webkit-overflow-scrolling: touch;
 
13
  }
14
 
15
  .obfx-preview {
164
  }
165
 
166
  .obfx_spinner {
167
+ background: url('/wp-admin/images/wpspin_light.gif') no-repeat;
168
+ background-size: 16px 16px;
169
  display: none;
170
+ opacity: .7;
 
 
 
 
 
171
  filter: alpha(opacity=70);
172
+ width: 16px;
173
+ height: 16px;
174
+ margin: 5px 35%;
175
+ }
 
 
obfx_modules/mystock-import/inc/photos.php CHANGED
@@ -7,32 +7,33 @@
7
 
8
  ?>
9
  <div id='obfx-mystock' data-pagenb="1">
10
- <ul class='obfx-image-list'>
11
- <?php
12
- if ( ! empty( $urls ) ) {
13
- foreach ( $urls as $photo ) {
14
- $pid = $photo['id'];
15
- if ( ! empty( $pid ) ) {
16
- $thumb = $photo['url_m'];
17
- ?>
18
- <li class='obfx-image' data-page="1" data-pid="<?php echo esc_attr( $pid ); ?>" data-url="<?php echo esc_attr( $photo['url_l'] ); ?>">
19
- <div class="obfx-preview">
20
- <div class="thumbnail">
21
- <div class="centered">
22
- <img src='<?php echo esc_url( $thumb ); ?>'>
23
- </div>
24
  </div>
25
  </div>
26
- <button type="button" class="check obfx-image-check" tabindex="0">
27
- <span class="media-modal-icon"></span>
28
- <span class="screen-reader-text"><?php esc_html_e( 'Deselect', 'themeisle-companion' ); ?></span>
29
- </button>
30
- </li>
31
- <?php
32
- }
33
  }
34
  }
35
- ?>
36
- </ul>
37
- <div class="obfx_spinner"></div>
 
 
38
  </div>
7
 
8
  ?>
9
  <div id='obfx-mystock' data-pagenb="1">
10
+ <ul class='obfx-image-list'>
11
+ <?php
12
+ if ( ! empty( $urls ) ) {
13
+ foreach ( $urls as $photo ) {
14
+ $pid = $photo['id'];
15
+ if ( ! empty( $pid ) ) {
16
+ $thumb = $photo['url_m'];
17
+ ?>
18
+ <li class='obfx-image' data-page="1" data-pid="<?php echo esc_attr( $pid ); ?>">
19
+ <div class="obfx-preview">
20
+ <div class="thumbnail">
21
+ <div class="centered">
22
+ <img src='<?php echo esc_url( $thumb ); ?>'>
 
23
  </div>
24
  </div>
25
+ </div>
26
+ <button type="button" class="check obfx-image-check" tabindex="0">
27
+ <span class="media-modal-icon"></span>
28
+ <span class="screen-reader-text"><?php esc_html_e( 'Deselect', 'themeisle-companion' ); ?></span>
29
+ </button>
30
+ </li>
31
+ <?php
32
  }
33
  }
34
+ }
35
+ ?>
36
+ </ul>
37
+ <div class="obfx_spinner"></div>
38
+ <div class="media-sidebar"></div>
39
  </div>
obfx_modules/mystock-import/init.php CHANGED
@@ -48,7 +48,6 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
48
  parent::__construct();
49
  $this->name = __( 'Mystock Import', 'themeisle-companion' );
50
  $this->description = __( 'Module to import images directly from', 'themeisle-companion' ) . sprintf( ' <a href="%s" target="_blank">mystock.photos</a>', 'https://mystock.photos' );
51
- $this->active_default = true;
52
  }
53
 
54
 
@@ -82,9 +81,9 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
82
 
83
  /*Get tab content*/
84
  $this->loader->add_action( 'wp_ajax_get-tab-' . $this->slug, $this, 'get_tab_content' );
 
85
  $this->loader->add_action( 'wp_ajax_infinite-' . $this->slug, $this, 'infinite_scroll' );
86
  $this->loader->add_action( 'wp_ajax_handle-request-' . $this->slug, $this, 'handle_request' );
87
- $this->loader->add_filter( 'media_view_strings', $this, 'media_view_strings' );
88
  }
89
 
90
  /**
@@ -113,10 +112,6 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
113
  if ( $user && isset( $user['nsid'] ) ) {
114
  $photos = $api->people_getPublicPhotos( $user['nsid'], null, 'url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o', self::MAX_IMAGES, $page );
115
  if ( ! empty( $photos ) ) {
116
- $pages = get_transient( $this->slug . 'photos_' . self::MAX_IMAGES . '_pages' );
117
- if ( false === $pages ) {
118
- set_transient( $this->slug . 'photos_' . self::MAX_IMAGES . '_pages', $photos['photos']['pages'], self::CACHE_DAYS * DAY_IN_SECONDS );
119
- }
120
  $photos = $photos['photos']['photo'];
121
  }
122
  }
@@ -132,12 +127,18 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
132
  function handle_request() {
133
  check_ajax_referer( $this->slug . filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP ), 'security' );
134
 
135
- if ( ! isset( $_POST['url'] ) ) {
136
  echo esc_html__( 'Image failed to upload', 'themeisle-companion' );
137
  wp_die();
138
  }
139
 
140
- $url = $_POST['url'];
 
 
 
 
 
 
141
  $name = basename( $url );
142
  $tmp_file = download_url( $url );
143
  if ( is_wp_error( $tmp_file ) ) {
@@ -158,8 +159,6 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
158
  wp_die();
159
  }
160
  wp_update_attachment_metadata( $image_id, $attach_data );
161
-
162
- wp_send_json_success( array( 'id' => $image_id ) );
163
  }
164
 
165
  /**
@@ -193,6 +192,61 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
193
  wp_die();
194
  }
195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  /**
197
  * Method that returns an array of scripts and styles to be loaded
198
  * for the front end part.
@@ -233,13 +287,8 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
233
  'upload_image_complete' => esc_html__( 'Your image was imported. Go to Media Library tab to use it.', 'themeisle-companion' ),
234
  'load_more' => esc_html__( 'Loading more photos...', 'themeisle-companion' ),
235
  'tab_name' => esc_html__( 'MyStock Library', 'themeisle-companion' ),
236
- 'featured_image_new' => esc_html__( 'Import & set featured image', 'themeisle-companion' ),
237
- 'insert_image_new' => esc_html__( 'Import & insert image', 'themeisle-companion' ),
238
- 'featured_image' => $this->strings['setFeaturedImage'],
239
- 'insert_image' => $this->strings['insertIntoPost'],
240
  ),
241
- 'slug' => $this->slug,
242
- 'pages' => get_transient( $this->slug . 'photos_' . self::MAX_IMAGES . '_pages' ),
243
  ),
244
  );
245
 
@@ -263,9 +312,4 @@ class Mystock_Import_OBFX_Module extends Orbit_Fox_Module_Abstract {
263
  public function options() {
264
  return array();
265
  }
266
-
267
- public function media_view_strings( $strings ) {
268
- $this->strings = $strings;
269
- return $strings;
270
- }
271
  }
48
  parent::__construct();
49
  $this->name = __( 'Mystock Import', 'themeisle-companion' );
50
  $this->description = __( 'Module to import images directly from', 'themeisle-companion' ) . sprintf( ' <a href="%s" target="_blank">mystock.photos</a>', 'https://mystock.photos' );
 
51
  }
52
 
53
 
81
 
82
  /*Get tab content*/
83
  $this->loader->add_action( 'wp_ajax_get-tab-' . $this->slug, $this, 'get_tab_content' );
84
+ $this->loader->add_action( 'wp_ajax_' . $this->slug, $this, 'display_photo_sizes' );
85
  $this->loader->add_action( 'wp_ajax_infinite-' . $this->slug, $this, 'infinite_scroll' );
86
  $this->loader->add_action( 'wp_ajax_handle-request-' . $this->slug, $this, 'handle_request' );
 
87
  }
88
 
89
  /**
112
  if ( $user && isset( $user['nsid'] ) ) {
113
  $photos = $api->people_getPublicPhotos( $user['nsid'], null, 'url_sq, url_t, url_s, url_q, url_m, url_n, url_z, url_c, url_l, url_o', self::MAX_IMAGES, $page );
114
  if ( ! empty( $photos ) ) {
 
 
 
 
115
  $photos = $photos['photos']['photo'];
116
  }
117
  }
127
  function handle_request() {
128
  check_ajax_referer( $this->slug . filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP ), 'security' );
129
 
130
+ if ( ! isset( $_POST['formdata'] ) ) {
131
  echo esc_html__( 'Image failed to upload', 'themeisle-companion' );
132
  wp_die();
133
  }
134
 
135
+ $data = array();
136
+ parse_str( $_POST['formdata'], $data );
137
+ if ( empty( $data['imagesizes'] ) ) {
138
+ echo esc_html__( 'Image failed to upload', 'themeisle-companion' );
139
+ wp_die();
140
+ }
141
+ $url = $data['imagesizes'];
142
  $name = basename( $url );
143
  $tmp_file = download_url( $url );
144
  if ( is_wp_error( $tmp_file ) ) {
159
  wp_die();
160
  }
161
  wp_update_attachment_metadata( $image_id, $attach_data );
 
 
162
  }
163
 
164
  /**
192
  wp_die();
193
  }
194
 
195
+ /**
196
+ * Ajax function to display image sizes.
197
+ */
198
+ public function display_photo_sizes() {
199
+
200
+ check_ajax_referer( $this->slug . filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP ), 'security' );
201
+
202
+ $photo_id = $_POST['pid'];
203
+ $page = $_POST['page'];
204
+ if ( empty( $photo_id ) || empty( $page ) ) {
205
+ wp_die();
206
+ }
207
+ $data = $this->get_images( $page );
208
+ $photo = array_filter( $data, function ( $e ) use ( $photo_id ) {
209
+ return $e['id'] === $photo_id;
210
+ }, true );
211
+ $photo = array_pop( array_reverse( $photo ) );
212
+ if ( empty( $photo ) ) {
213
+ wp_die();
214
+ }
215
+ $photo_sizes = array(
216
+ 'url_sq' => __( 'Square', 'themeisle-companion' ),
217
+ 'url_q' => __( 'Large Square', 'themeisle-companion' ),
218
+ 'url_t' => __( 'Thumbnail', 'themeisle-companion' ),
219
+ 'url_s' => __( 'Small', 'themeisle-companion' ),
220
+ 'url_n' => __( 'Small 320', 'themeisle-companion' ),
221
+ 'url_m' => __( 'Medium', 'themeisle-companion' ),
222
+ 'url_z' => __( 'Medium 640', 'themeisle-companion' ),
223
+ 'url_c' => __( 'Medium 800', 'themeisle-companion' ),
224
+ 'url_l' => __( 'Large', 'themeisle-companion' ),
225
+ 'url_o' => __( 'Original', 'themeisle-companion' ),
226
+ );
227
+
228
+ /**
229
+ * Creating response for selected image
230
+ */
231
+ $response = '<div class="attachment-details">';
232
+ $response .= '<form id="importmsp" method="post">';
233
+ $response .= '<h2>' . esc_html__( 'Attachement display settings', 'themeisle-companion' ) . '</h2><hr/>';
234
+ $response .= '<label class="attachement-settings">';
235
+ $response .= '<span class="name">' . esc_html__( 'Size', 'themeisle-companion' ) . '</span>';
236
+ $response .= '<select name="imagesizes">';
237
+ foreach ( $photo_sizes as $key => $label ) {
238
+ $response .= '<option value="' . esc_url( $photo[ $key ] ) . '">' . esc_html( $label ) . '</option>';
239
+ }
240
+ $response .= '</select>';
241
+ $response .= '</label>';
242
+
243
+ $response .= '<input type="submit" class="button obfx-import-media" value="Import media"/>';
244
+ $response .= '</form>';
245
+ $response .= '</div>';
246
+ echo $response;
247
+ wp_die();
248
+ }
249
+
250
  /**
251
  * Method that returns an array of scripts and styles to be loaded
252
  * for the front end part.
287
  'upload_image_complete' => esc_html__( 'Your image was imported. Go to Media Library tab to use it.', 'themeisle-companion' ),
288
  'load_more' => esc_html__( 'Loading more photos...', 'themeisle-companion' ),
289
  'tab_name' => esc_html__( 'MyStock Library', 'themeisle-companion' ),
 
 
 
 
290
  ),
291
+ 'slug' => $this->slug,
 
292
  ),
293
  );
294
 
312
  public function options() {
313
  return array();
314
  }
 
 
 
 
 
315
  }
obfx_modules/mystock-import/js/admin.js CHANGED
@@ -1,239 +1,189 @@
1
  /* global _wpMediaViewsL10n, mystock_import, jQuery */
2
  (function ($) {
3
- var media = wp.media,
4
- l10n = media.view.l10n = typeof _wpMediaViewsL10n === 'undefined' ? {} : _wpMediaViewsL10n;
5
-
6
- media.view.MediaFrame.Select.prototype.browseRouter = function (view) {
7
- view.set(
8
- {
9
- upload: {
10
- text: l10n.uploadFilesTitle,
11
- priority: 20
12
- },
13
- browse: {
14
- text: l10n.mediaLibraryTitle,
15
- priority: 30
16
- },
17
- mystock: {
18
- text: mystock_import.l10n.tab_name,
19
- priority: 40
20
- }
21
- }
22
- );
23
- };
24
-
25
- var bindHandlers = media.view.MediaFrame.Select.prototype.bindHandlers;
26
-
27
- media.view.MediaFrame.Select.prototype.bindHandlers = function () {
28
- bindHandlers.apply( this, arguments );
29
- this.on( 'content:create:mystock', this.mystockContent, this );
30
- this.on(
31
- 'content:render:mystock', function(){
32
- wp.media.frame.state().get( 'selection' ).reset();
33
- $( document ).find( '.media-button-select' ).addClass( 'obfx-mystock-featured' ).html( mystock_import.l10n.featured_image_new );
34
- $( document ).find( '.media-button-insert' ).addClass( 'obfx-mystock-insert' ).html( mystock_import.l10n.insert_image_new );
35
- }, this
36
- );
37
- this.on(
38
- 'content:render:browse content:render:upload', function(){
39
- $( document ).find( '.media-button-select' ).removeClass( 'obfx-mystock-featured' ).html( mystock_import.l10n.featured_image );
40
- $( document ).find( '.media-button-insert' ).removeClass( 'obfx-mystock-insert' ).html( mystock_import.l10n.insert_image );
41
- }, this
42
- );
43
- };
44
-
45
- media.view.MediaFrame.Select.prototype.mystockContent = function ( contentRegion ) {
46
- var state = this.state();
47
-
48
- this.$el.removeClass( 'hide-toolbar' );
49
-
50
- contentRegion.view = new wp.media.view.RemotePhotos(
51
- {
52
- controller: this,
53
- collection: state.get( 'library' ),
54
- selection: state.get( 'selection' ),
55
- model: state,
56
- sortable: state.get( 'sortable' ),
57
- search: state.get( 'searchable' ),
58
- filters: state.get( 'filterable' ),
59
- date: state.get( 'date' ),
60
- display: state.has( 'display' ) ? state.get( 'display' ) : state.get( 'displaySettings' ),
61
- dragInfo: state.get( 'dragInfo' ),
62
-
63
- idealColumnWidth: state.get( 'idealColumnWidth' ),
64
- suggestedWidth: state.get( 'suggestedWidth' ),
65
- suggestedHeight: state.get( 'suggestedHeight' ),
66
-
67
- AttachmentView: state.get( 'AttachmentView' )
68
- }
69
- );
70
- };
71
-
72
- // ensure only one scroll request is sent at one time.
73
- var scroll_called = false;
74
-
75
- media.view.RemotePhotos = media.View.extend(
76
- {
77
- tagName: 'div',
78
- className: 'obfx-attachments-browser',
79
-
80
- initialize: function () {
81
- // _.defaults(this.options, {});
82
- var container = this.$el;
83
- $( container ).html( '<div class="obfx_spinner"></div>' );
84
- this.loadContent( container,this );
85
- this.selectItem();
86
- this.deselectItem();
87
- this.handleRequest();
88
- },
89
-
90
- showSpinner: function(container) {
91
- $( container ).find( '.obfx-image-list' ).addClass( 'obfx_loading' );
92
- $( container ).find( '.obfx_spinner' ).show();
93
- $( document ).find( '.media-button-select' ).attr( 'disabled', 'disabled' ).addClass( 'obfx-mystock-featured' ).html( mystock_import.l10n.featured_image_new );
94
- $( document ).find( '.media-button-insert' ).attr( 'disabled', 'disabled' ).addClass( 'obfx-mystock-insert' ).html( mystock_import.l10n.insert_image_new );
95
- },
96
- hideSpinner: function(container) {
97
- $( container ).find( '.obfx-image-list' ).removeClass( 'obfx_loading' );
98
- $( container ).find( '.obfx_spinner' ).hide();
99
- },
100
- loadContent: function(container, frame){
101
- this.showSpinner( container );
102
- $.ajax(
103
- {
104
- type : 'POST',
105
- data : {
106
- action: 'get-tab-' + mystock_import.slug,
107
- security : mystock_import.nonce
108
- },
109
- url : mystock_import.ajaxurl,
110
- success : function(response) {
111
- container.html( response );
112
- frame.infiniteScroll( container, frame );
113
- }
114
- }
115
- );
116
- },
117
-
118
- selectItem : function(){
119
- $( document ).on(
120
- 'click', '.obfx-image', function () {
121
- $( '.obfx-image' ).removeClass( 'selected details' );
122
- $( this ).addClass( 'selected details' );
123
- $( document ).find( '.media-button-insert' ).removeAttr( 'disabled', 'disabled' ).addClass( 'obfx-mystock-insert' ).html( mystock_import.l10n.insert_image_new );
124
- $( document ).find( '.media-button-select' ).removeAttr( 'disabled', 'disabled' ).addClass( 'obfx-mystock-featured' ).html( mystock_import.l10n.featured_image_new );
125
- }
126
- );
127
- },
128
-
129
- deselectItem :function () {
130
- $( document ).on(
131
- 'click', '.obfx-image-check', function (e) {
132
- e.stopPropagation();
133
- $( this ).parent().removeClass( 'selected details' );
134
- $( document ).find( '.media-button-insert' ).attr( 'disabled', 'disabled' );
135
- $( document ).find( '.media-button-select' ).attr( 'disabled', 'disabled' );
136
- }
137
- );
138
- },
139
-
140
- infiniteScroll : function (container, frame) {
141
- $( '#obfx-mystock .obfx-image-list' ).on(
142
- 'scroll',function() {
143
- if ($( this ).scrollTop() + $( this ).innerHeight() + 10 >= $( this )[0].scrollHeight) {
144
- var current_page = parseInt( $( '#obfx-mystock' ).data( 'pagenb' ) );
145
- if (parseInt( mystock_import.pages ) === current_page) {
146
- return;
147
- }
148
- if (scroll_called) {
149
- return;
150
- }
151
- scroll_called = true;
152
- frame.showSpinner( container );
153
- $.ajax(
154
- {
155
- type : 'POST',
156
- data : {
157
- 'action': 'infinite-' + mystock_import.slug,
158
- 'page' : $( '#obfx-mystock' ).data( 'pagenb' ),
159
- 'security' : mystock_import.nonce
160
- },
161
- url : mystock_import.ajaxurl,
162
- success : function(response) {
163
- scroll_called = false;
164
- if ( response ) {
165
- var imageList = $( '.obfx-image-list' );
166
- var listWrapper = $( '#obfx-mystock' );
167
- var nextPage = parseInt( current_page ) + 1;
168
- listWrapper.data( 'pagenb', nextPage );
169
- imageList.append( response );
170
- }
171
- frame.hideSpinner( container );
172
- frame.deselectItem();
173
- }
174
-
175
- }
176
- );
177
- }
178
- }
179
- );
180
- },
181
-
182
- handleRequest : function () {
183
- $( document ).on(
184
- 'click','.obfx-mystock-insert', function () {
185
- $( document ).find( '.media-button-insert' ).attr( 'disabled', 'disabled' ).html( mystock_import.l10n.upload_image );
186
- $.ajax(
187
- {
188
- method : 'POST',
189
- data : {
190
- 'action': 'handle-request-' + mystock_import.slug,
191
- 'url' : $( '.obfx-image.selected' ).attr( 'data-url' ),
192
- 'security' : mystock_import.nonce
193
- },
194
- url : mystock_import.ajaxurl,
195
- success : function(data) {
196
- $( document ).find( '.media-button-insert' ).attr( 'disabled', 'disabled' ).html( mystock_import.l10n.insert_image_new );
197
- if ( 'mystock' === wp.media.frame.content.mode() ) {
198
- wp.media.frame.content.get( 'library' ).collection.props.set( { '__ignore_force_update': (+ new Date()) } );
199
- wp.media.frame.content.mode( 'browse' );
200
- $( document ).find( '.media-button-insert' ).attr( 'disabled', 'disabled' );
201
- wp.media.frame.state().get( 'selection' ).reset( wp.media.attachment( data.data.id ) );
202
- $( document ).find( '.media-button-insert' ).trigger( 'click' );
203
- }
204
- }
205
- }
206
- );
207
- }
208
- );
209
-
210
- $( document ).on(
211
- 'click','.obfx-mystock-featured', function () {
212
- $( document ).find( '.media-button-select' ).attr( 'disabled', 'disabled' ).html( mystock_import.l10n.upload_image );
213
- $.ajax(
214
- {
215
- method : 'POST',
216
- data : {
217
- 'action': 'handle-request-' + mystock_import.slug,
218
- 'url' : $( '.obfx-image.selected' ).attr( 'data-url' ),
219
- 'security' : mystock_import.nonce
220
- },
221
- url : mystock_import.ajaxurl,
222
- success : function(data) {
223
- $( document ).find( '.media-button-select' ).attr( 'disabled', 'disabled' ).html( mystock_import.l10n.featured_image_new );
224
- if ( 'mystock' === wp.media.frame.content.mode() ) {
225
- wp.media.frame.content.get( 'library' ).collection.props.set( { '__ignore_force_update': (+ new Date()) } );
226
- wp.media.frame.content.mode( 'browse' );
227
- $( document ).find( '.media-button-select' ).attr( 'disabled', 'disabled' );
228
- wp.media.frame.state().get( 'selection' ).reset( wp.media.attachment( data.data.id ) );
229
- $( document ).find( '.media-button-select' ).trigger( 'click' );
230
- }
231
- }
232
- }
233
- );
234
- }
235
- );
236
- }
237
- }
238
- );
239
- })( jQuery );
1
  /* global _wpMediaViewsL10n, mystock_import, jQuery */
2
  (function ($) {
3
+ var media = wp.media,
4
+ l10n = media.view.l10n = typeof _wpMediaViewsL10n === 'undefined' ? {} : _wpMediaViewsL10n;
5
+
6
+ media.view.MediaFrame.Select.prototype.browseRouter = function (view) {
7
+ view.set({
8
+ upload: {
9
+ text: l10n.uploadFilesTitle,
10
+ priority: 20
11
+ },
12
+ browse: {
13
+ text: l10n.mediaLibraryTitle,
14
+ priority: 30
15
+ },
16
+ mystock: {
17
+ text: mystock_import.l10n.tab_name,
18
+ priority: 40
19
+ }
20
+ });
21
+ };
22
+
23
+ var bindHandlers = media.view.MediaFrame.Select.prototype.bindHandlers;
24
+
25
+ media.view.MediaFrame.Select.prototype.bindHandlers = function () {
26
+ bindHandlers.apply(this, arguments);
27
+ this.on('content:create:mystock', this.mystockContent, this);
28
+ };
29
+
30
+ media.view.MediaFrame.Select.prototype.mystockContent = function ( contentRegion ) {
31
+ var state = this.state();
32
+
33
+ this.$el.removeClass('hide-toolbar');
34
+
35
+ contentRegion.view = new wp.media.view.RemotePhotos({
36
+ controller: this,
37
+ collection: state.get('library'),
38
+ selection: state.get('selection'),
39
+ model: state,
40
+ sortable: state.get('sortable'),
41
+ search: state.get('searchable'),
42
+ filters: state.get('filterable'),
43
+ date: state.get('date'),
44
+ display: state.has('display') ? state.get('display') : state.get('displaySettings'),
45
+ dragInfo: state.get('dragInfo'),
46
+
47
+ idealColumnWidth: state.get('idealColumnWidth'),
48
+ suggestedWidth: state.get('suggestedWidth'),
49
+ suggestedHeight: state.get('suggestedHeight'),
50
+
51
+ AttachmentView: state.get('AttachmentView')
52
+ });
53
+ };
54
+
55
+ media.view.RemotePhotos = media.View.extend({
56
+ tagName: 'div',
57
+ className: 'obfx-attachments-browser',
58
+
59
+ initialize: function () {
60
+ // _.defaults(this.options, {});
61
+ var container = this.$el;
62
+ $(container).html('<div class="obfx_spinner"></div>');
63
+ this.loadContent( container,this );
64
+ this.selectItem();
65
+ this.deselectItem();
66
+ this.displayDetails();
67
+ this.handleRequest();
68
+ },
69
+
70
+ showSpinner: function(container) {
71
+ $(container).find('.obfx_spinner').show();
72
+ },
73
+ hideSpinner: function(container) {
74
+ $(container).find('.obfx_spinner').hide();
75
+ },
76
+ loadContent: function(container, frame){
77
+ this.showSpinner(container);
78
+ $.ajax({
79
+ type : 'POST',
80
+ data : {
81
+ action: 'get-tab-' + mystock_import.slug,
82
+ security : mystock_import.nonce
83
+ },
84
+ url : mystock_import.ajaxurl,
85
+ success : function(response) {
86
+ container.html(response);
87
+ frame.infiniteScroll(container, frame);
88
+ }
89
+ });
90
+ },
91
+
92
+ selectItem : function(){
93
+ $(document).on('click', '.obfx-image', function () {
94
+ $('.obfx-image').removeClass('selected details');
95
+ $(this).addClass('selected details');
96
+ });
97
+ },
98
+
99
+ deselectItem :function () {
100
+ $(document).on('click', '.obfx-image-check', function (e) {
101
+ e.stopPropagation();
102
+ $(this).parent().removeClass('selected details');
103
+ $('#obfx-mystock').find('.media-sidebar').html('');
104
+ });
105
+ },
106
+
107
+ infiniteScroll : function (container, frame) {
108
+ $('#obfx-mystock .obfx-image-list').on('scroll',function() {
109
+ if($(this).scrollTop() + $(this).innerHeight() + 10 >= $(this)[0].scrollHeight) {
110
+ frame.showSpinner(container);
111
+ $.ajax({
112
+ type : 'POST',
113
+ data : {
114
+ 'action': 'infinite-' + mystock_import.slug,
115
+ 'page' : $('#obfx-mystock').data('pagenb'),
116
+ 'security' : mystock_import.nonce
117
+ },
118
+ url : mystock_import.ajaxurl,
119
+ success : function(response) {
120
+ if( response ) {
121
+ var imageList = $('.obfx-image-list');
122
+ var listWrapper = $('#obfx-mystock');
123
+ var page = listWrapper.data('pagenb');
124
+ var nextPage = parseInt(page) + 1;
125
+ listWrapper.data('pagenb', nextPage);
126
+ imageList.append(response);
127
+ }
128
+ frame.hideSpinner(container);
129
+ }
130
+
131
+ });
132
+ }
133
+ });
134
+ },
135
+
136
+ displayDetails : function () {
137
+ $(document).on('click', '.obfx-image', function () {
138
+ var th = $(this);
139
+
140
+ $.ajax({
141
+ type : 'POST',
142
+ data : {
143
+ 'action': mystock_import.slug,
144
+ 'pid' : $(this).data('pid'),
145
+ 'page' : $(this).data('page'),
146
+ 'security' : mystock_import.nonce
147
+ },
148
+ url : mystock_import.ajaxurl,
149
+ beforeSend : function () {
150
+ var text = mystock_import.l10n.fetch_image_sizes;
151
+ var data = '<div class="attachement-loading"><h2>'+ text +'</h2><div class="spinner is-active"></div></div>';
152
+ th.parent().parent().find('.media-sidebar').html(data);
153
+ },
154
+ success : function(response) {
155
+ th.parent().parent().find('.media-sidebar').html(response);
156
+ }
157
+
158
+ });
159
+ });
160
+ },
161
+
162
+ handleRequest : function () {
163
+ $(document).on('submit','#obfx-mystock #importmsp', function (e) {
164
+ var mediaContainer = $('#obfx-mystock').find('.media-sidebar');
165
+ $.ajax({
166
+ type : 'POST',
167
+ data : {
168
+ 'action': 'handle-request-' + mystock_import.slug,
169
+ 'formdata' : $('#importmsp').serialize(),
170
+ 'security' : mystock_import.nonce
171
+ },
172
+ url : mystock_import.ajaxurl,
173
+ beforeSend : function () {
174
+ var text = mystock_import.l10n.upload_image;
175
+ var data = '<div class="attachement-loading"><h2>'+ text +'</h2><div class="spinner is-active"></div></div>';
176
+ mediaContainer.html(data);
177
+ },
178
+ success : function() {
179
+ var text = mystock_import.l10n.upload_image_complete;
180
+ var data = '<div class="attachement-loading"><h2>'+ text +'</h2></div>';
181
+ mediaContainer.html(data);
182
+ wp.media.frame.content.get('library').collection.props.set({ '__ignore_force_update': (+ new Date()) });
183
+ }
184
+ });
185
+ e.preventDefault(); // avoid to execute the actual submit of the form.
186
+ });
187
+ }
188
+ });
189
+ })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/mystock-import/vendor/phpflickr/{phpflickr.php → phpFlickr.php} RENAMED
File without changes
obfx_modules/social-sharing/js/admin.js CHANGED
@@ -10,26 +10,20 @@
10
  var obfx_sharing_module_admin = function( $ ) {
11
  'use strict';
12
 
13
- $(
14
- function() {
15
- $( '.network-toggle input:checkbox:not(:checked)' ).each(
16
- function () {
17
- $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', true ).parent().addClass( 'obfxHiddenOption' );
18
- }
19
- );
20
 
21
- $( '.network-toggle input' ).on(
22
- 'change', function () {
23
- if ( $( this ).is( ':checked' ) ) {
24
- $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', false ).parent().removeClass( 'obfxHiddenOption' );
25
- } else {
26
- $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', true ).parent().addClass( 'obfxHiddenOption' );
27
- }
28
- }
29
- );
30
 
31
- }
32
- );
33
 
34
  };
35
 
10
  var obfx_sharing_module_admin = function( $ ) {
11
  'use strict';
12
 
13
+ $( function() {
14
+ $( '.network-toggle input:checkbox:not(:checked)' ).each( function () {
15
+ $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', true ).parent().addClass( 'obfxHiddenOption' );
16
+ } );
 
 
 
17
 
18
+ $( '.network-toggle input' ).on( 'change', function () {
19
+ if ( $( this ).is( ':checked' ) ) {
20
+ $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', false ).parent().removeClass( 'obfxHiddenOption' );
21
+ } else {
22
+ $( this ).parents( '.obfx-row' ).find( '.show input' ).attr( 'disabled', true ).parent().addClass( 'obfxHiddenOption' );
23
+ }
24
+ } );
 
 
25
 
26
+ } );
 
27
 
28
  };
29
 
obfx_modules/social-sharing/js/public.js CHANGED
@@ -10,19 +10,15 @@
10
  var obfx_sharing_module = function( $ ) {
11
  'use strict';
12
 
13
- $(
14
- function() {
15
- $( '.obfx-sharing a, .obfx-sharing-inline a' ).not( '.whatsapp, .mail, .viber' ).on(
16
- 'click', function(e) {
17
- e.preventDefault();
18
- var link = $( this ).attr( 'href' );
19
 
20
- window.open( link, 'obfxShareWindow', 'height=450, width=550, top=' + ( $( window ).height() / 2 - 275 ) + ', left=' + ( $( window ).width() / 2 - 225 ) + ', toolbar=0, location=0, menubar=0, directories=0, scrollbars=0' );
21
- return true;
22
- }
23
- );
24
- }
25
- );
26
  };
27
 
28
  obfx_sharing_module( jQuery );
10
  var obfx_sharing_module = function( $ ) {
11
  'use strict';
12
 
13
+ $( function() {
14
+ $( '.obfx-sharing a, .obfx-sharing-inline a' ).not( '.whatsapp, .mail, .viber' ).on( 'click', function(e) {
15
+ e.preventDefault();
16
+ var link = $( this ).attr( 'href' );
 
 
17
 
18
+ window.open( link, 'obfxShareWindow', 'height=450, width=550, top=' + ( $( window ).height() / 2 - 275 ) + ', left=' + ( $( window ).width() / 2 - 225 ) + ', toolbar=0, location=0, menubar=0, directories=0, scrollbars=0' );
19
+ return true;
20
+ } );
21
+ } );
 
 
22
  };
23
 
24
  obfx_sharing_module( jQuery );
obfx_modules/social-sharing/views/hestia-social-sharing-tpl.php CHANGED
@@ -33,7 +33,12 @@ if ( ! empty( $social_links_array ) ) { ?>
33
  }
34
  ?>
35
  <li class="<?php echo esc_attr( $class ); ?>">
36
- <a rel="tooltip" data-original-title="<?php echo esc_attr( __( 'Share on ', 'themeisle-companion' ) . $network_data['nicename'] ); ?>" class = "btn btn-just-icon btn-round btn-<?php echo esc_attr( $network_data['icon'] ); ?>" <?php echo ( isset( $network_data['target'] ) && $network_data['target'] != '0' ) ? 'target="_blank"' : ''; ?> href="<?php echo esc_url( $network_data['link'] ); ?>"> <i class="socicon-<?php echo esc_attr( $network_data['icon'] ); ?>"></i>
 
 
 
 
 
37
  </a>
38
  </li>
39
  <?php } ?>
33
  }
34
  ?>
35
  <li class="<?php echo esc_attr( $class ); ?>">
36
+ <a rel="tooltip"
37
+ data-original-title="<?php echo esc_attr( __( 'Share on ', 'themeisle-companion' ) . $network_data['nicename'] ); ?>"
38
+ class = "btn btn-just-icon btn-round btn-<?php echo esc_attr( $network_data['icon'] ); ?>"
39
+ <?php echo ( isset( $network_data['target'] ) && $network_data['target'] != '0' ) ? 'target="_blank"' : ''; ?>
40
+ href="<?php echo esc_url( $network_data['link'] ); ?>">
41
+ <i class="socicon-<?php echo esc_attr( $network_data['icon'] ); ?>"></i>
42
  </a>
43
  </li>
44
  <?php } ?>
obfx_modules/social-sharing/views/social-sharing-tpl.php CHANGED
@@ -35,7 +35,8 @@ if ( ! empty( $social_links_array ) ) { ?>
35
  ?>
36
  <li class="<?php echo esc_attr( $class ); ?>">
37
  <a class = "<?php echo esc_attr( $network_data['icon'] ); ?>"
38
- <?php echo ( isset( $network_data['target'] ) && $network_data['target'] != '0' ) ? 'target="_blank"' : ''; ?> href="<?php echo esc_url( $network_data['link'] ); ?>">
 
39
  <i class="socicon-<?php echo esc_attr( $network_data['icon'] ); ?>"></i>
40
  <?php
41
  if ( $show_name ) {
35
  ?>
36
  <li class="<?php echo esc_attr( $class ); ?>">
37
  <a class = "<?php echo esc_attr( $network_data['icon'] ); ?>"
38
+ <?php echo ( isset( $network_data['target'] ) && $network_data['target'] != '0' ) ? 'target="_blank"' : ''; ?>
39
+ href="<?php echo esc_url( $network_data['link'] ); ?>">
40
  <i class="socicon-<?php echo esc_attr( $network_data['icon'] ); ?>"></i>
41
  <?php
42
  if ( $show_name ) {
obfx_modules/stats/css/stats.css ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Test Module Admin Style
3
+ *
4
+ * @since 1.0.0
5
+ * @package obfx_modules/test/css
6
+ *
7
+ * @author ThemeIsle
8
+ */
obfx_modules/stats/init.php ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Mock-up to demonstrate and test module use.
4
+ *
5
+ * @link https://themeisle.com
6
+ * @since 1.0.0
7
+ *
8
+ * @package Test_OBFX_Module
9
+ */
10
+
11
+ /**
12
+ * The class defines a new module to be used by Orbit Fox plugin.
13
+ *
14
+ * @package Test_OBFX_Module
15
+ * @author Themeisle <friends@themeisle.com>
16
+ */
17
+ class Stats_OBFX_Module extends Orbit_Fox_Module_Abstract {
18
+
19
+ /**
20
+ * Test_OBFX_Module constructor.
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ */
25
+ public function __construct() {
26
+ parent::__construct();
27
+ $this->name = __( 'Reports Module', 'themeisle-companion' );
28
+ $this->description = __( 'A simple module for your WordPress data.', 'themeisle-companion' );
29
+
30
+ }
31
+
32
+ /**
33
+ * Determine if module should be loaded.
34
+ *
35
+ * @since 1.0.0
36
+ * @access public
37
+ * @return bool
38
+ */
39
+ public function enable_module() {
40
+ return true;
41
+ }
42
+
43
+ /**
44
+ * The loading logic for the module.
45
+ *
46
+ * @since 1.0.0
47
+ * @access public
48
+ */
49
+ public function load() {
50
+
51
+ }
52
+
53
+ /**
54
+ * Method to define hooks needed.
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ */
59
+ public function hooks() {
60
+ $this->loader->add_action( 'wp_dashboard_setup', $this, 'add_dashboard_widgets' );
61
+ }
62
+
63
+ /**
64
+ * Module method to add a dashboard widget
65
+ *
66
+ * @since 1.0.0
67
+ * @access public
68
+ */
69
+ public function add_dashboard_widgets() {
70
+ wp_add_dashboard_widget(
71
+ 'obfx_dashboard_widget', // Widget slug.
72
+ 'Site Reports <small><i>by Orbit Fox</i></small>', // Title.
73
+ array( $this, 'dashboard_widget_function' ) // Display function.
74
+ );
75
+ }
76
+
77
+ /**
78
+ * Display method for the Dashboard widget.
79
+ *
80
+ * @since 1.0.0
81
+ * @access public
82
+ */
83
+ public function dashboard_widget_function() {
84
+ $display_year = $this->get_option( 'display_year' );
85
+ $posts_count = $this->get_posts_count( $display_year );
86
+ $comments_count = $this->get_comments_count( $display_year );
87
+
88
+ $data = array(
89
+ 'display_year' => $display_year,
90
+ 'title' => $this->get_option( 'dashboard_title' ),
91
+ 'desc' => $this->get_option( 'dashboard_desc' ),
92
+ 'graph_shows' => $this->get_option( 'graph_shows' ),
93
+ 'posts_count' => $posts_count,
94
+ 'comments_count' => $comments_count,
95
+ );
96
+
97
+ echo $this->render_view( 'dashboard-widget', $data );
98
+ }
99
+
100
+ /**
101
+ * Utility method to return posts count,
102
+ *
103
+ * @since 1.0.0
104
+ * @access public
105
+ *
106
+ * @param string $display_year The year to query for.
107
+ *
108
+ * @return array
109
+ */
110
+ public function get_posts_count( $display_year ) {
111
+ $posts_count = array();
112
+ for ( $cnt = 0; $cnt < 12; $cnt ++ ) {
113
+ $posts_count[] = rand( 13, 766 );
114
+ }
115
+
116
+ if ( ! $this->get_option( 'mock_data' ) ) {
117
+ global $wpdb;
118
+ $results = $wpdb->get_results( $this->build_graph_query( $display_year, $wpdb->posts, true ), ARRAY_A );
119
+ $posts_count = $this->build_graph_array( $results, true );
120
+ }
121
+
122
+ return $posts_count;
123
+ }
124
+
125
+ /**
126
+ * Creates a query for graph data.
127
+ *
128
+ * @since 1.0.0
129
+ * @access private
130
+ *
131
+ * @param string $display_year The year to look for.
132
+ * @param string $table The table name
133
+ * @param bool $posts_or_comments Counts posts if `true` or comments if `false`.
134
+ *
135
+ * @return string
136
+ */
137
+ private function build_graph_query( $display_year, $table, $posts_or_comments ) {
138
+ $count = "SUM(`comment_count`) as `comment_count`";
139
+ if ( $posts_or_comments ) {
140
+ $count = "COUNT( `ID` ) AS `post_count`";
141
+ }
142
+ $query = "
143
+ SELECT
144
+ MONTH( `post_date` ) AS `post_month`, {$count}
145
+ FROM {$table}
146
+ WHERE `post_type` = 'post' AND `post_status` = 'publish' AND YEAR( `post_date` ) = '{$display_year}'
147
+ GROUP BY `post_month`
148
+ ";
149
+
150
+ return $query;
151
+ }
152
+
153
+ /**
154
+ * Utility method to build result array.
155
+ *
156
+ * @since 1.0.0
157
+ * @access private
158
+ *
159
+ * @param array $results Query results as associative array.
160
+ * @param bool $posts_or_comments Counts posts if `true` or comments if `false`.
161
+ *
162
+ * @return array
163
+ */
164
+ private function build_graph_array( $results, $posts_or_comments ) {
165
+ $data_count = array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
166
+ foreach ( $results as $posts_published ) {
167
+ $pos = $posts_published['post_month'] - 1;
168
+ $key = 'comment_count';
169
+ if ( $posts_or_comments ) {
170
+ $key = 'post_count';
171
+ }
172
+ $data_count[ $pos ] = (int) $posts_published[ $key ];
173
+ }
174
+
175
+ return $data_count;
176
+ }
177
+
178
+ /**
179
+ * Utility method to return comments count,
180
+ *
181
+ * @since 1.0.0
182
+ * @access public
183
+ *
184
+ * @param string $display_year The year to query for.
185
+ *
186
+ * @return array
187
+ */
188
+ public function get_comments_count( $display_year ) {
189
+ $comments_count = array();
190
+ for ( $cnt = 0; $cnt < 12; $cnt ++ ) {
191
+ $comments_count[] = rand( 7, 484 );
192
+ }
193
+
194
+ if ( ! $this->get_option( 'mock_data' ) ) {
195
+ global $wpdb;
196
+ $results = $wpdb->get_results( $this->build_graph_query( $display_year, $wpdb->posts, false ), ARRAY_A );
197
+ $comments_count = $this->build_graph_array( $results, false );
198
+ }
199
+
200
+ return $comments_count;
201
+ }
202
+
203
+ /**
204
+ * Method that returns an array of scripts and styles to be loaded
205
+ * for the front end part.
206
+ *
207
+ * @since 1.0.0
208
+ * @access public
209
+ * @return array
210
+ */
211
+ public function public_enqueue() {
212
+ return array();
213
+ }
214
+
215
+ /**
216
+ * Method that returns an array of scripts and styles to be loaded
217
+ * for the admin part.
218
+ *
219
+ * @since 1.0.0
220
+ * @access public
221
+ * @return array|boolean
222
+ */
223
+ public function admin_enqueue() {
224
+ $current_screen = get_current_screen();
225
+
226
+ if ( ! isset( $current_screen->id ) ) {
227
+ return array();
228
+ }
229
+ if ( $current_screen->id != 'dashboard' ) {
230
+ return array();
231
+ }
232
+
233
+ return array(
234
+ 'js' => array(
235
+ 'vendor/chart.min' => array( 'jquery' ),
236
+ 'stats' => array( 'jquery' ),
237
+ ),
238
+ 'css' => array(
239
+ 'stats' => false,
240
+ ),
241
+ );
242
+ }
243
+
244
+ /**
245
+ * Method to define the options fields for the module
246
+ *
247
+ * @since 1.0.0
248
+ * @access public
249
+ * @return array
250
+ */
251
+ public function options() {
252
+ return array(
253
+ array(
254
+ 'id' => 'dashboard_title',
255
+ 'name' => 'dashboard_title',
256
+ 'title' => 'Dashboard Title',
257
+ 'description' => 'This title is displayed on the Dasboard widget.',
258
+ 'type' => 'text',
259
+ 'default' => '',
260
+ 'placeholder' => 'Add some text',
261
+ ),
262
+ array(
263
+ 'id' => 'dashboard_desc',
264
+ 'name' => 'dashboard_desc',
265
+ 'title' => 'Dashboard Graph Description (*optional)',
266
+ 'description' => 'This will be displayed inside the Dashboard widget.',
267
+ 'type' => 'textarea',
268
+ 'default' => '',
269
+ 'placeholder' => 'Add some text here ...',
270
+ ),
271
+ array(
272
+ 'id' => 'display_year',
273
+ 'name' => 'display_year',
274
+ 'title' => 'The year to use for graph plotting.',
275
+ 'description' => 'Based on the selected year here will update the graph on the Dashboard widget.',
276
+ 'type' => 'select',
277
+ 'default' => '2017',
278
+ 'placeholder' => 'Select an option',
279
+ 'options' => array(
280
+ '2017' => '2017',
281
+ '2016' => '2016',
282
+ '2015' => '2015',
283
+ '2014' => '2014',
284
+ '2013' => '2013',
285
+ '2012' => '2012',
286
+ '2011' => '2011',
287
+ '2010' => '2010',
288
+ ),
289
+ ),
290
+ array(
291
+ 'id' => 'graph_shows',
292
+ 'name' => 'graph_shows',
293
+ 'title' => 'What does the graph display?',
294
+ 'description' => 'Select what is displayed on the graph.',
295
+ 'type' => 'radio',
296
+ 'default' => '2',
297
+ 'options' => array(
298
+ '0' => 'Posts Count',
299
+ '1' => 'Comments Count',
300
+ '2' => 'Posts & Comments Count',
301
+ ),
302
+ ),
303
+ array(
304
+ 'id' => 'mock_data',
305
+ 'name' => 'mock_data',
306
+ 'label' => 'Disable/Enable',
307
+ 'title' => 'Use mock data for graph?',
308
+ 'description' => 'If enabled this plots mock data on graph.',
309
+ 'type' => 'toggle',
310
+ 'default' => '1',
311
+ ),
312
+ );
313
+ }
314
+ }
obfx_modules/stats/js/stats.js ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Test Module Admin Script
3
+ *
4
+ * @since 1.0.0
5
+ * @package obfx_modules/test/js
6
+ *
7
+ * @author ThemeIsle
8
+ */
9
+
10
+ /* jshint unused:vars */
11
+ /* global console, Chart, jQuery */
12
+ var stats_module = function( $ ) {
13
+ 'use strict';
14
+ $( function() {
15
+ if ( $( '#obfxChart' ).length ) {
16
+ var myChart;
17
+ var ctx = document.getElementById( 'obfxChart' ).getContext( '2d' );
18
+ var posts_data = $( '#obfxChart' ).data( 'posts' );
19
+ var comments_data = $( '#obfxChart' ).data( 'comments' );
20
+
21
+ var dataset = [];
22
+ if ( typeof posts_data !== 'undefined' ) {
23
+ dataset.push( {
24
+ label: '# of Posts',
25
+ data: posts_data,
26
+ backgroundColor: 'rgba( 3, 169, 244, 0.5 )',
27
+ borderColor: 'rgba( 3, 169, 244, 1 )',
28
+ borderWidth: 1
29
+ } );
30
+ }
31
+
32
+ if ( typeof comments_data !== 'undefined' ) {
33
+ dataset.push( {
34
+ label: '# of Comments',
35
+ data: comments_data,
36
+ backgroundColor: 'rgba( 255, 152, 0, 0.5 )',
37
+ borderColor: 'rgba( 255, 152, 0, 1 )',
38
+ borderWidth: 1
39
+ } );
40
+ }
41
+
42
+ console.log( ctx );
43
+ myChart = new Chart(ctx, {
44
+ type: 'bar',
45
+ data: {
46
+ labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
47
+ datasets: dataset
48
+ },
49
+ options: {
50
+ scales: {
51
+ yAxes: [{
52
+ ticks: {
53
+ beginAtZero: true
54
+ }
55
+ }]
56
+ }
57
+ }
58
+ });
59
+ }// End if().
60
+ } );
61
+
62
+ };
63
+ stats_module( jQuery );
obfx_modules/stats/js/vendor/chart.min.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Chart.js
3
+ * http://chartjs.org/
4
+ * Version: 2.6.0
5
+ *
6
+ * Copyright 2017 Nick Downie
7
+ * Released under the MIT license
8
+ * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
9
+ */
10
+ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n?n:t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;r<i.length;r++)a(i[r]);return a}({1:[function(t,e,n){},{}],2:[function(t,e,n){function i(t){if(t){var e=/^#([a-fA-F0-9]{3})$/,n=/^#([a-fA-F0-9]{6})$/,i=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,a=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,o=/(\w+)/,r=[0,0,0],l=1,s=t.match(e);if(s){s=s[1];for(var u=0;u<r.length;u++)r[u]=parseInt(s[u]+s[u],16)}else if(s=t.match(n)){s=s[1];for(var u=0;u<r.length;u++)r[u]=parseInt(s.slice(2*u,2*u+2),16)}else if(s=t.match(i)){for(var u=0;u<r.length;u++)r[u]=parseInt(s[u+1]);l=parseFloat(s[4])}else if(s=t.match(a)){for(var u=0;u<r.length;u++)r[u]=Math.round(2.55*parseFloat(s[u+1]));l=parseFloat(s[4])}else if(s=t.match(o)){if("transparent"==s[1])return[0,0,0,0];if(r=y[s[1]],!r)return}for(var u=0;u<r.length;u++)r[u]=b(r[u],0,255);return l=l||0==l?b(l,0,1):1,r[3]=l,r}}function a(t){if(t){var e=/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,n=t.match(e);if(n){var i=parseFloat(n[4]),a=b(parseInt(n[1]),0,360),o=b(parseFloat(n[2]),0,100),r=b(parseFloat(n[3]),0,100),l=b(isNaN(i)?1:i,0,1);return[a,o,r,l]}}}function o(t){if(t){var e=/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,n=t.match(e);if(n){var i=parseFloat(n[4]),a=b(parseInt(n[1]),0,360),o=b(parseFloat(n[2]),0,100),r=b(parseFloat(n[3]),0,100),l=b(isNaN(i)?1:i,0,1);return[a,o,r,l]}}}function r(t){var e=i(t);return e&&e.slice(0,3)}function l(t){var e=a(t);return e&&e.slice(0,3)}function s(t){var e=i(t);return e?e[3]:(e=a(t))?e[3]:(e=o(t))?e[3]:void 0}function u(t){return"#"+x(t[0])+x(t[1])+x(t[2])}function d(t,e){return e<1||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function h(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"}function f(t,e){var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgba("+n+"%, "+i+"%, "+a+"%, "+(e||t[3]||1)+")"}function g(t,e){return e<1||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function v(t){return k[t.slice(0,3)]}function b(t,e,n){return Math.min(Math.max(e,t),n)}function x(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y=t(6);e.exports={getRgba:i,getHsla:a,getRgb:r,getHsl:l,getHwb:o,getAlpha:s,hexString:u,rgbString:d,rgbaString:c,percentString:h,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:v};var k={};for(var w in y)k[y[w]]=w},{6:6}],3:[function(t,e,n){var i=t(5),a=t(2),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;"string"==typeof t?(e=a.getRgba(t),e?this.setValues("rgb",e):(e=a.getHsla(t))?this.setValues("hsl",e):(e=a.getHwb(t))&&this.setValues("hwb",e)):"object"==typeof t&&(e=t,void 0!==e.r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e))};o.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=t<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},o.prototype.setValues=function(t,e){var n,a=this.values,o=this.spaces,r=this.maxes,l=1;if(this.valid=!0,"alpha"===t)l=e;else if(e.length)a[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];l=e.a}else if(void 0!==e[o[t][0]]){var s=o[t];for(n=0;n<t.length;n++)a[t][n]=e[s[n]];l=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===l?a.alpha:l)),"alpha"===t)return!1;var u;for(n=0;n<t.length;n++)u=Math.max(0,Math.min(r[t][n],a[t][n])),a[t][n]=Math.round(u);for(var d in o)d!==t&&(a[d]=i[t][d](a[t]));return!0},o.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},o.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=o),e.exports=o},{2:2,5:5}],4:[function(t,e,n){function i(t){var e,n,i,a=t[0]/255,o=t[1]/255,r=t[2]/255,l=Math.min(a,o,r),s=Math.max(a,o,r),u=s-l;return s==l?e=0:a==s?e=(o-r)/u:o==s?e=2+(r-a)/u:r==s&&(e=4+(a-o)/u),e=Math.min(60*e,360),e<0&&(e+=360),i=(l+s)/2,n=s==l?0:i<=.5?u/(s+l):u/(2-s-l),[e,100*n,100*i]}function a(t){var e,n,i,a=t[0],o=t[1],r=t[2],l=Math.min(a,o,r),s=Math.max(a,o,r),u=s-l;return n=0==s?0:u/s*1e3/10,s==l?e=0:a==s?e=(o-r)/u:o==s?e=2+(r-a)/u:r==s&&(e=4+(a-o)/u),e=Math.min(60*e,360),e<0&&(e+=360),i=s/255*1e3/10,[e,n,i]}function o(t){var e=t[0],n=t[1],a=t[2],o=i(t)[0],r=1/255*Math.min(e,Math.min(n,a)),a=1-1/255*Math.max(e,Math.max(n,a));return[o,100*r,100*a]}function l(t){var e,n,i,a,o=t[0]/255,r=t[1]/255,l=t[2]/255;return a=Math.min(1-o,1-r,1-l),e=(1-o-a)/(1-a)||0,n=(1-r-a)/(1-a)||0,i=(1-l-a)/(1-a)||0,[100*e,100*n,100*i,100*a]}function s(t){return Z[JSON.stringify(t)]}function u(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var a=.4124*e+.3576*n+.1805*i,o=.2126*e+.7152*n+.0722*i,r=.0193*e+.1192*n+.9505*i;return[100*a,100*o,100*r]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){return B(d(t))}function h(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];n=s<.5?s*(1+l):s+l-s*l,e=2*s-n,a=[0,0,0];for(var u=0;u<3;u++)i=r+1/3*-(u-1),i<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function f(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]}function k(t){return o(x(t))}function w(t){return l(x(t))}function M(t){return s(x(t))}function S(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function C(t){return i(S(t))}function D(t){return a(S(t))}function I(t){return l(S(t))}function A(t){return s(S(t))}function P(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function _(t){return i(P(t))}function T(t){return a(P(t))}function F(t){return o(P(t))}function R(t){return s(P(t))}function L(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+o*-1.5372+r*-.4986,n=a*-.9689+1.8758*o+.0415*r,i=.0557*a+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function V(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function O(t){return B(V(t))}function z(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?(n=100*o/903.3,a=7.787*(n/100)+16/116):(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function B(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),n=360*e/2/Math.PI,n<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function W(t){return L(z(t))}function N(t){var e,n,i,a=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function E(t){return z(N(t))}function H(t){return W(N(t))}function q(t){return J[t]}function j(t){return i(q(t))}function Y(t){return a(q(t))}function U(t){return o(q(t))}function X(t){return l(q(t))}function K(t){return d(q(t))}function G(t){return u(q(t))}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:w,hsv2keyword:M,hwb2rgb:S,hwb2hsl:C,hwb2hsv:D,hwb2cmyk:I,hwb2keyword:A,cmyk2rgb:P,cmyk2hsl:_,cmyk2hsv:T,cmyk2hwb:F,cmyk2keyword:R,keyword2rgb:q,keyword2hsl:j,keyword2hsv:Y,keyword2hwb:U,keyword2cmyk:X,keyword2lab:K,keyword2xyz:G,xyz2rgb:L,xyz2lab:V,xyz2lch:O,lab2xyz:z,lab2rgb:W,lab2lch:B,lch2lab:N,lch2xyz:E,lch2rgb:H};var J={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var Q in J)Z[JSON.stringify(J[Q])]=Q},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];a[l]=a[l]||{},a[l][s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(o)}var u=function(){this.convs={}};u.prototype.routeSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n))},u.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},u.prototype.getValues=function(t){var e=this.convs[t];if(!e){var n=this.space,i=this.convs[n];e=a[n][t](i),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){u.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{4:4}],6:[function(t,e,n){e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],7:[function(t,e,n){var i=t(28)();t(26)(i),t(40)(i),t(22)(i),t(25)(i),t(30)(i),t(21)(i),t(23)(i),t(24)(i),t(29)(i),t(32)(i),t(33)(i),t(31)(i),t(27)(i),t(34)(i),t(35)(i),t(36)(i),t(37)(i),t(38)(i),t(46)(i),t(44)(i),t(45)(i),t(47)(i),t(48)(i),t(49)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i);var a=[];a.push(t(41)(i),t(42)(i),t(43)(i)),i.plugins.register(a),e.exports=i,"undefined"!=typeof window&&(window.Chart=i)},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,8:8,9:9}],8:[function(t,e,n){"use strict";e.exports=function(t){t.Bar=function(e,n){return n.type="bar",new t(e,n)}}},{}],9:[function(t,e,n){"use strict";e.exports=function(t){t.Bubble=function(e,n){return n.type="bubble",new t(e,n)}}},{}],10:[function(t,e,n){"use strict";e.exports=function(t){t.Doughnut=function(e,n){return n.type="doughnut",new t(e,n)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t){t.Line=function(e,n){return n.type="line",new t(e,n)}}},{}],12:[function(t,e,n){"use strict";e.exports=function(t){t.PolarArea=function(e,n){return n.type="polarArea",new t(e,n)}}},{}],13:[function(t,e,n){"use strict";e.exports=function(t){t.Radar=function(e,n){return n.type="radar",new t(e,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,n){return n.type="scatter",new t(e,n)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(){var e,n=this;t.DatasetController.prototype.initialize.apply(n,arguments),e=n.getMeta(),e.stack=n.getDataset().stack,e.bar=!0},update:function(t){var e,n,i=this,a=i.getMeta().data;for(i._ruler=i.getRuler(),e=0,n=a.length;e<n;++e)i.updateElement(a[e],e,t)},updateElement:function(t,n,i){var a=this,o=a.chart,r=a.getMeta(),l=a.getDataset(),s=t.custom||{},u=o.options.elements.rectangle;t._xScale=a.getScaleForId(r.xAxisID),t._yScale=a.getScaleForId(r.yAxisID),t._datasetIndex=a.index,t._index=n,t._model={datasetLabel:l.label,label:o.data.labels[n],borderSkipped:s.borderSkipped?s.borderSkipped:u.borderSkipped,backgroundColor:s.backgroundColor?s.backgroundColor:e.getValueAtIndexOrDefault(l.backgroundColor,n,u.backgroundColor),borderColor:s.borderColor?s.borderColor:e.getValueAtIndexOrDefault(l.borderColor,n,u.borderColor),borderWidth:s.borderWidth?s.borderWidth:e.getValueAtIndexOrDefault(l.borderWidth,n,u.borderWidth)},a.updateElementGeometry(t,n,i),t.pivot()},updateElementGeometry:function(t,e,n){var i=this,a=t._model,o=i.getValueScale(),r=o.getBasePixel(),l=o.isHorizontal(),s=i._ruler||i.getRuler(),u=i.calculateBarValuePixels(i.index,e),d=i.calculateBarIndexPixels(i.index,e,s);a.horizontal=l,a.base=n?r:u.base,a.x=l?n?r:u.head:d.center,a.y=l?d.center:n?r:u.head,a.height=l?d.size:void 0,a.width=l?void 0:d.size},getValueScaleId:function(){return this.getMeta().yAxisID},getIndexScaleId:function(){return this.getMeta().xAxisID},getValueScale:function(){return this.getScaleForId(this.getValueScaleId())},getIndexScale:function(){return this.getScaleForId(this.getIndexScaleId())},getStackCount:function(t){var e,n,i=this,a=i.chart,o=i.getIndexScale(),r=o.options.stacked,l=void 0===t?a.data.datasets.length:t+1,s=[];for(e=0;e<l;++e)n=a.getDatasetMeta(e),n.bar&&a.isDatasetVisible(e)&&(r===!1||r===!0&&s.indexOf(n.stack)===-1||void 0===r&&(void 0===n.stack||s.indexOf(n.stack)===-1))&&s.push(n.stack);return s.length},getStackIndex:function(t){return this.getStackCount(t)-1},getRuler:function(){var t=this,n=t.getIndexScale(),i=n.options,a=t.getStackCount(),o=n.isHorizontal()?n.width:n.height,r=o/n.ticks.length,l=r*i.categoryPercentage,s=l/a,u=s*i.barPercentage;return u=Math.min(e.getValueOrDefault(i.barThickness,u),e.getValueOrDefault(i.maxBarThickness,1/0)),{stackCount:a,tickSize:r,categorySize:l,categorySpacing:r-l,fullBarSize:s,barSize:u,barSpacing:s-u,scale:n}},calculateBarValuePixels:function(t,e){var n,i,a,o,r,l,s=this,u=s.chart,d=s.getMeta(),c=s.getValueScale(),h=u.data.datasets,f=Number(h[t].data[e]),g=c.options.stacked,p=d.stack,m=0;if(g||void 0===g&&void 0!==p)for(n=0;n<t;++n)i=u.getDatasetMeta(n),i.bar&&i.stack===p&&i.controller.getValueScaleId()===c.id&&u.isDatasetVisible(n)&&(a=Number(h[n].data[e]),(f<0&&a<0||f>=0&&a>0)&&(m+=a));return o=c.getPixelForValue(m),r=c.getPixelForValue(m+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i=this,a=n.scale,o=i.chart.isCombo,r=i.getStackIndex(t),l=a.getPixelForValue(null,e,t,o),s=n.barSize;return l-=o?n.tickSize/2:0,l+=n.fullBarSize*r,l+=n.categorySpacing/2,l+=n.barSpacing/2,{size:s,base:l,head:l+s,center:l+s/2}},draw:function(){var t,n=this,i=n.chart,a=n.getMeta().data,o=n.getDataset(),r=a.length,l=0;for(e.canvas.clipArea(i.ctx,i.chartArea);l<r;++l)t=o.data[l],null===t||void 0===t||isNaN(t)||a[l].draw();e.canvas.unclipArea(i.ctx)},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},o=t._model;o.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.hoverBackgroundColor,i,e.getHoverColor(o.backgroundColor)),o.borderColor=a.hoverBorderColor?a.hoverBorderColor:e.getValueAtIndexOrDefault(n.hoverBorderColor,i,e.getHoverColor(o.borderColor)),o.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:e.getValueAtIndexOrDefault(n.hoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},o=t._model,r=this.chart.options.elements.rectangle;o.backgroundColor=a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(n.backgroundColor,i,r.backgroundColor),o.borderColor=a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(n.borderColor,i,r.borderColor),o.borderWidth=a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(n.borderWidth,i,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var n="";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(n=e.labels[t[0].index])),n},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n+": "+t.xLabel}}}},t.controllers.horizontalBar=t.controllers.bar.extend({getValueScaleId:function(){return this.getMeta().xAxisID},getIndexScaleId:function(){return this.getMeta().yAxisID}})}},{}],16:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var n=this,i=n.getMeta(),a=i.data;e.each(a,function(e,i){n.updateElement(e,i,t)})},updateElement:function(n,i,a){var o=this,r=o.getMeta(),l=o.getScaleForId(r.xAxisID),s=o.getScaleForId(r.yAxisID),u=n.custom||{},d=o.getDataset(),c=d.data[i],h=o.chart.options.elements.point,f=o.index;e.extend(n,{_xScale:l,_yScale:s,_datasetIndex:f,_index:i,_model:{x:a?l.getPixelForDecimal(.5):l.getPixelForValue("object"==typeof c?c:NaN,i,f,o.chart.isCombo),y:a?s.getBasePixel():s.getPixelForValue(c,i,f),radius:a?0:u.radius?u.radius:o.getRadius(c),hitRadius:u.hitRadius?u.hitRadius:e.getValueAtIndexOrDefault(d.hitRadius,i,h.hitRadius)}}),t.DatasetController.prototype.removeHoverStyle.call(o,n,h);var g=n._model;g.skip=u.skip?u.skip:isNaN(g.x)||isNaN(g.y),n.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(n){var i=this;t.DatasetController.prototype.setHoverStyle.call(i,n);var a=i.chart.data.datasets[n._datasetIndex],o=n._index,r=n.custom||{},l=n._model;
11
+ l.radius=r.hoverRadius?r.hoverRadius:e.getValueAtIndexOrDefault(a.hoverRadius,o,i.chart.options.elements.point.hoverRadius)+i.getRadius(a.data[o])},removeHoverStyle:function(e){var n=this;t.DatasetController.prototype.removeHoverStyle.call(n,e,n.chart.options.elements.point);var i=n.chart.data.datasets[e._datasetIndex].data[e._index],a=e.custom||{},o=e._model;o.radius=a.radius?a.radius:n.getRadius(i)}})}},{}],17:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults;n.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l&&l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n<i;++n)a=r.getDatasetMeta(n),a.data[o]&&(a.data[o].hidden=!a.data[o].hidden);r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,n){var i=n.labels[t.index],a=": "+n.datasets[t.datasetIndex].data[t.index];return e.isArray(i)?(i=i.slice(),i[0]+=a):i+=a,i}}}},n.pie=e.clone(n.doughnut),e.extend(n.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var n=this,i=n.chart,a=i.chartArea,o=i.options,r=o.elements.arc,l=a.right-a.left-r.borderWidth,s=a.bottom-a.top-r.borderWidth,u=Math.min(l,s),d={x:0,y:0},c=n.getMeta(),h=o.cutoutPercentage,f=o.circumference;if(f<2*Math.PI){var g=o.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&0<=p||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(m.x*(m.x<0?1:w),v.x*(v.x<0?1:w)),y:k?-1:Math.min(m.y*(m.y<0?1:w),v.y*(v.y<0?1:w))},S={x:b?1:Math.max(m.x*(m.x>0?1:w),v.x*(v.x>0?1:w)),y:x?1:Math.max(m.y*(m.y>0?1:w),v.y*(v.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:(S.x+M.x)*-.5,y:(S.y+M.y)*-.5}}i.borderWidth=n.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=n.calculateTotal(),n.outerRadius=i.outerRadius-i.radiusLength*n.getRingIndex(n.index),n.innerRadius=Math.max(n.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){var a=this,o=a.chart,r=o.chartArea,l=o.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=a.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:a.calculateCircumference(f.data[n])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:a.innerRadius,m=i&&s.animateScale?0:a.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:a.index,_index:n,_model:{x:u+o.offsetX,y:d+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,n,o.data.labels[n])}});var b=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===n?b.startAngle=l.rotation:b.startAngle=a.getMeta().data[n-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,n=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){t=n.data[i],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;r<o;r++)e=t[r]._model?t[r]._model.borderWidth:0,n=t[r]._chart?t[r]._chart.config.data.datasets[a].hoverBorderWidth:0,i=e>i?e:i,i=n>i?n:i;return i}})}},{}],18:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return n.getValueOrDefault(t.showLine,e.showLines)}var n=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,a,o,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:o.tension?o.tension:n.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:o.steppedLine?o.steppedLine:n.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:o.cubicInterpolationMode?o.cubicInterpolationMode:n.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),i=0,a=u.length;i<a;++i)r.updateElement(u[i],i,t);for(g&&0!==s._model.tension&&r.updateBezierControlPoints(),i=0,a=u.length;i<a;++i)u[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,a=this.getDataset(),o=t.custom||{};return o.backgroundColor?i=o.backgroundColor:a.pointBackgroundColor?i=n.getValueAtIndexOrDefault(a.pointBackgroundColor,e,i):a.backgroundColor&&(i=a.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,a=this.getDataset(),o=t.custom||{};return o.borderColor?i=o.borderColor:a.pointBorderColor?i=n.getValueAtIndexOrDefault(a.pointBorderColor,e,i):a.borderColor&&(i=a.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,a=this.getDataset(),o=t.custom||{};return isNaN(o.borderWidth)?isNaN(a.pointBorderWidth)?isNaN(a.borderWidth)||(i=a.borderWidth):i=n.getValueAtIndexOrDefault(a.pointBorderWidth,e,i):i=o.borderWidth,i},updateElement:function(t,e,i){var a,o,r=this,l=r.getMeta(),s=t.custom||{},u=r.getDataset(),d=r.index,c=u.data[e],h=r.getScaleForId(l.yAxisID),f=r.getScaleForId(l.xAxisID),g=r.chart.options.elements.point,p=r.chart.data.labels||[],m=1===p.length||1===u.data.length||r.chart.isCombo;void 0!==u.radius&&void 0===u.pointRadius&&(u.pointRadius=u.radius),void 0!==u.hitRadius&&void 0===u.pointHitRadius&&(u.pointHitRadius=u.hitRadius),a=f.getPixelForValue("object"==typeof c?c:NaN,e,d,m),o=i?h.getBasePixel():r.calculatePointY(c,e,d),t._xScale=f,t._yScale=h,t._datasetIndex=d,t._index=e,t._model={x:a,y:o,skip:s.skip||isNaN(a)||isNaN(o),radius:s.radius||n.getValueAtIndexOrDefault(u.pointRadius,e,g.radius),pointStyle:s.pointStyle||n.getValueAtIndexOrDefault(u.pointStyle,e,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,e),borderColor:r.getPointBorderColor(t,e),borderWidth:r.getPointBorderWidth(t,e),tension:l.dataset._model?l.dataset._model.tension:0,steppedLine:!!l.dataset._model&&l.dataset._model.steppedLine,hitRadius:s.hitRadius||n.getValueAtIndexOrDefault(u.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,n){var i,a,o,r=this,l=r.chart,s=r.getMeta(),u=r.getScaleForId(s.yAxisID),d=0,c=0;if(u.options.stacked){for(i=0;i<n;i++)if(a=l.data.datasets[i],o=l.getDatasetMeta(i),"line"===o.type&&o.yAxisID===u.id&&l.isDatasetVisible(i)){var h=Number(u.getRightValue(a.data[e]));h<0?c+=h||0:d+=h||0}var f=Number(u.getRightValue(t));return f<0?u.getPixelForValue(c+f):u.getPixelForValue(d+f)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){function t(t,e,n){return Math.max(Math.min(t,n),e)}var e,i,a,o,r,l=this,s=l.getMeta(),u=l.chart.chartArea,d=s.data||[];if(s.dataset._model.spanGaps&&(d=d.filter(function(t){return!t._model.skip})),"monotone"===s.dataset._model.cubicInterpolationMode)n.splineCurveMonotone(d);else for(e=0,i=d.length;e<i;++e)a=d[e],o=a._model,r=n.splineCurve(n.previousItem(d,e)._model,o,n.nextItem(d,e)._model,s.dataset._model.tension),o.controlPointPreviousX=r.previous.x,o.controlPointPreviousY=r.previous.y,o.controlPointNextX=r.next.x,o.controlPointNextY=r.next.y;if(l.chart.options.elements.line.capBezierPoints)for(e=0,i=d.length;e<i;++e)o=d[e]._model,o.controlPointPreviousX=t(o.controlPointPreviousX,u.left,u.right),o.controlPointPreviousY=t(o.controlPointPreviousY,u.top,u.bottom),o.controlPointNextX=t(o.controlPointNextX,u.left,u.right),o.controlPointNextY=t(o.controlPointNextY,u.top,u.bottom)},draw:function(){var n=this,i=n.chart,a=n.getMeta(),o=a.data||[],r=i.chartArea,l=o.length,s=0;for(t.canvasHelpers.clipArea(i.ctx,r),e(n.getDataset(),i.options)&&a.dataset.draw(),t.canvasHelpers.unclipArea(i.ctx);s<l;++s)o[s].draw(r)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},o=t._model;o.radius=a.hoverRadius||n.getValueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),o.backgroundColor=a.hoverBackgroundColor||n.getValueAtIndexOrDefault(e.pointHoverBackgroundColor,i,n.getHoverColor(o.backgroundColor)),o.borderColor=a.hoverBorderColor||n.getValueAtIndexOrDefault(e.pointHoverBorderColor,i,n.getHoverColor(o.borderColor)),o.borderWidth=a.hoverBorderWidth||n.getValueAtIndexOrDefault(e.pointHoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},r=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),r.radius=o.radius||n.getValueAtIndexOrDefault(i.pointRadius,a,e.chart.options.elements.point.radius),r.backgroundColor=e.getPointBackgroundColor(t,a),r.borderColor=e.getPointBorderColor(t,a),r.borderWidth=e.getPointBorderWidth(t,a)}})}},{}],19:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,aspectRatio:1,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n<i;++n)a=r.getDatasetMeta(n),a.data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var n=this,i=n.chart,a=i.chartArea,o=n.getMeta(),r=i.options,l=r.elements.arc,s=Math.min(a.right-a.left,a.bottom-a.top);i.outerRadius=Math.max((s-l.borderWidth/2)/2,0),i.innerRadius=Math.max(r.cutoutPercentage?i.outerRadius/100*r.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),n.outerRadius=i.outerRadius-i.radiusLength*n.index,n.innerRadius=n.outerRadius-i.radiusLength,o.count=n.countVisibleElements(),e.each(o.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){for(var a=this,o=a.chart,r=a.getDataset(),l=o.options,s=l.animation,u=o.scale,d=e.getValueAtIndexOrDefault,c=o.data.labels,h=a.calculateCircumference(r.data[n]),f=u.xCenter,g=u.yCenter,p=0,m=a.getMeta(),v=0;v<n;++v)isNaN(r.data[v])||m.data[v].hidden||++p;var b=l.startAngle,x=t.hidden?0:u.getDistanceFromCenterForValue(r.data[n]),y=b+h*p,k=y+(t.hidden?0:h),w=s.animateScale?0:u.getDistanceFromCenterForValue(r.data[n]);e.extend(t,{_datasetIndex:a.index,_index:n,_scale:u,_model:{x:f,y:g,innerRadius:0,outerRadius:i?w:x,startAngle:i&&s.animateRotate?b:y,endAngle:i&&s.animateRotate?b:k,label:d(c,n,c[n])}}),a.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),n=this.getMeta(),i=0;return e.each(n.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var n=this,i=n.getMeta(),a=i.dataset,o=i.data,r=a.custom||{},l=n.getDataset(),s=n.chart.options.elements.line,u=n.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:n.index,_scale:u,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),i.dataset.pivot(),e.each(o,function(e,i){n.updateElement(e,i,t)},n),n.updateBezierControlPoints()},updateElement:function(t,n,i){var a=this,o=t.custom||{},r=a.getDataset(),l=a.chart.scale,s=a.chart.options.elements.point,u=l.getPointPositionForValue(n,r.data[n]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),e.extend(t,{_datasetIndex:a.index,_index:n,_scale:l,_model:{x:i?l.xCenter:u.x,y:i?l.yCenter:u.y,tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,a.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,n,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,n,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,n,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,n,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,n,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.pointHitRadius,n,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,n=this.getMeta();e.each(n.data,function(i,a){var o=i._model,r=e.splineCurve(e.previousItem(n.data,a,!0)._model,o,e.nextItem(n.data,a,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(n.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor,a,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(n.pointHoverBorderColor,a,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(n.pointHoverBorderWidth,a,o.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(n.pointRadius,a,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,a,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,a,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,a,r.borderWidth)}})}},{}],21:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a<o;++a)if(r[a].chart===t)return void(r[a]=e);r.push(e),1===r.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var n=e.findIndex(this.animations,function(e){return e.chart===t});n!==-1&&(this.animations.splice(n,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=e.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),n=0;t.dropFrames>1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var n,i,a=this.animations,o=0;o<a.length;)n=a[o],i=n.chart,n.currentStep=(n.currentStep||0)+t,n.currentStep=Math.min(n.currentStep,n.numSteps),e.callback(n.render,[i,n],i),e.callback(n.onAnimationProgress,[n],i),n.currentStep>=n.numSteps?(e.callback(n.onAnimationComplete,[n],i),i.animating=!1,a.splice(o,1)):++o}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{}],22:[function(t,e,n){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,n,i,a,o){var r,l,s,u,d,c;if("object"==typeof n&&(r=n.toString(),"[object HTMLImageElement]"===r||"[object HTMLCanvasElement]"===r))return void e.drawImage(n,a-n.width/2,o-n.height/2,n.width,n.height);if(!(isNaN(i)||i<=0)){switch(n){default:e.beginPath(),e.arc(a,o,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),l=3*i/Math.sqrt(3),d=l*Math.sqrt(3)/2,e.moveTo(a-l/2,o+d/3),e.lineTo(a+l/2,o+d/3),e.lineTo(a,o-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(a-c,o-c,2*c,2*c),e.strokeRect(a-c,o-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=a-h,g=o-h,p=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,p,p,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(a-c,o),e.lineTo(a,o+c),e.lineTo(a+c,o),e.lineTo(a,o-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"crossRot":e.beginPath(),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"dash":e.beginPath(),e.moveTo(a,o),e.lineTo(a+i,o),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()},e.lineTo=function(t,e,n,i){return n.steppedLine?("after"===n.steppedLine?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y)):n.tension?void t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):void t.lineTo(n.x,n.y)},t.helpers.canvas=e}},{}],23:[function(t,e,n){"use strict";e.exports=function(t){function e(e){e=e||{};var n=e.data=e.data||{};return n.datasets=n.datasets||[],n.labels=n.labels||[],e.options=a.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function i(t){return"top"===t||"bottom"===t}var a=t.helpers,o=t.plugins,r=t.platform;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;return o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),void o.update()):void console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return o.notify(t,"beforeInit"),a.retinaScale(t),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),o.notify(t,"afterInit"),t},clear:function(){return a.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,l=Math.floor(a.getMaximumWidth(i)),s=Math.floor(r?l/r:a.getMaximumHeight(i));if((e.width!==l||e.height!==s)&&(i.width=e.width=l,i.height=e.height=s,i.style.width=l+"px",i.style.height=s+"px",a.retinaScale(e),!t)){var u={width:l,height:s};o.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,o=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(r,function(n){var r=n.options,l=a.getValueOrDefault(r.type,n.dtype),s=t.scaleService.getScaleConstructor(l);if(s){i(r.position)!==i(n.dposition)&&(r.position=n.dposition);var u=new s({id:r.id,options:r,ctx:e.ctx,chart:e});o[u.id]=u,n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];if(a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o);if(r.type||(r.type=a.type||e.config.type),n.push(r.type),r.controller)r.controller.updateIndex(o);else{var l=t.controllers[r.type];if(void 0===l)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new l(e,o),i.push(r.controller)}},e),n.length>1)for(var o=1;o<n.length;o++)if(n[o]!==n[o-1]){e.isCombo=!0;break}return i},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t,e){var i=this;if(n(i),o.notify(i,"beforeUpdate")!==!1){i.tooltip._data=i.data;var r=i.buildOrUpdateControllers();a.each(i.data.datasets,function(t,e){i.getDatasetMeta(e).controller.buildOrUpdateElements()},i),i.updateLayout(),a.each(r,function(t){t.reset()}),i.updateDatasets(),o.notify(i,"afterUpdate"),i._bufferedRender?i._bufferedRequest={lazy:e,duration:t}:i.render(t,e)}},updateLayout:function(){var e=this;o.notify(e,"beforeLayout")!==!1&&(t.layoutService.update(this,this.width,this.height),o.notify(e,"afterScaleUpdate"),o.notify(e,"afterLayout"))},updateDatasets:function(){var t=this;if(o.notify(t,"beforeDatasetsUpdate")!==!1){for(var e=0,n=t.data.datasets.length;e<n;++e)t.updateDataset(e);o.notify(t,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this,n=e.getDatasetMeta(t),i={meta:n,index:t};o.notify(e,"beforeDatasetUpdate",[i])!==!1&&(n.controller.update(),o.notify(e,"afterDatasetUpdate",[i]))},render:function(e,n){var i=this;if(o.notify(i,"beforeRender")!==!1){var r=i.options.animation,l=function(t){o.notify(i,"afterRender"),a.callback(r&&r.onComplete,[t],i)};if(r&&("undefined"!=typeof e&&0!==e||"undefined"==typeof e&&0!==r.duration)){var s=new t.Animation({numSteps:(e||r.duration)/16.66,easing:r.easing,render:function(t,e){var n=a.easingEffects[e.easing],i=e.currentStep,o=i/e.numSteps;t.draw(n(o),o,i)},onAnimationProgress:r.onProgress,onAnimationComplete:l});t.animationService.addAnimation(i,s,e,n)}else i.draw(),l(new t.Animation({numSteps:0,chart:i}));return i}},draw:function(t){var e=this;e.clear(),void 0!==t&&null!==t||(t=1),e.transition(t),o.notify(e,"beforeDraw",[t])!==!1&&(a.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.scale&&e.scale.draw(),e.drawDatasets(t),e.tooltip.draw(),o.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=this,n=0,i=(e.data.datasets||[]).length;n<i;++n)e.isDatasetVisible(n)&&e.getDatasetMeta(n).controller.transition(t);e.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(o.notify(e,"beforeDatasetsDraw",[t])!==!1){for(var n=(e.data.datasets||[]).length-1;n>=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);o.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};o.notify(n,"beforeDatasetDraw",[a])!==!1&&(i.controller.draw(e),o.notify(n,"afterDatasetDraw",[a]))},getElementAtEvent:function(e){return t.Interaction.modes.single(this,e)},getElementsAtEvent:function(e){return t.Interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return t.Interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,n,i){var a=t.Interaction.modes[n];return"function"==typeof a?a(this,e,i):[]},getDatasetAtEvent:function(e){return t.Interaction.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){var e,n,i,l=this,s=l.canvas;for(l.stop(),n=0,i=l.data.datasets.length;n<i;++n)e=l.getDatasetMeta(n),e.controller&&(e.controller.destroy(),e.controller=null);s&&(l.unbindEvents(),a.clear(l),r.releaseContext(l.ctx),l.canvas=null,l.ctx=null),o.notify(l,"destroy"),delete t.instances[l.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e),e.tooltip.initialize()},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};a.each(t.options.events,function(i){r.addEventListener(t,i,n),e[i]=n}),t.options.responsive&&(n=function(){t.resize()},r.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,a.each(e,function(e,n){r.removeEventListener(t,n,e)}))},updateHoverStyle:function(t,e,n){var i,a,o,r=n?"setHoverStyle":"removeHoverStyle";for(a=0,o=t.length;a<o;++a)i=t[a],i&&this.getDatasetMeta(i._datasetIndex).controller[r](i)},eventHandler:function(t){var e=this,n=e.tooltip;if(o.notify(e,"beforeEvent",[t])!==!1){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);i|=n&&n.handleEvent(t),o.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a.duration,a.lazy):i&&!e.animating&&(e.stop(),e.render(e.options.hover.animationDuration,!0)),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e=this,n=e.options||{},i=n.hover,o=!1;return e.lastActive=e.lastActive||[],"mouseout"===t.type?e.active=[]:e.active=e.getElementsAtEventForMode(t,i.mode,i),i.onHover&&i.onHover.call(e,t.native,e.active),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(e,t.native,e.active),e.lastActive.length&&e.updateHoverStyle(e.lastActive,i.mode,!1),e.active.length&&i.mode&&e.updateHoverStyle(e.active,i.mode,!0),o=!a.arrayEquals(e.active,e.lastActive),e.lastActive=e.active,o}}),t.Controller=t}},{}],24:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return t._chartjs?void t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),void a.forEach(function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),a=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),o=a.apply(this,e);return i.each(t._chartjs.listeners,function(t){"function"==typeof t[n]&&t[n].apply(t,e)}),o}})}))}function n(t,e){var n=t._chartjs;if(n){var i=n.listeners,o=i.indexOf(e);
12
+ o!==-1&&i.splice(o,1),i.length>0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;t<e;++t)o[t]=o[t]||n.createMetaData(t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t=this,i=t.getDataset(),a=i.data||(i.data=[]);t._data!==a&&(t._data&&n(t._data,t),e(a,t),t._data=a),t.resyncElements()},update:i.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},removeHoverStyle:function(t,e){var n=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},r=i.getValueAtIndexOrDefault,l=t._model;l.backgroundColor=o.backgroundColor?o.backgroundColor:r(n.backgroundColor,a,e.backgroundColor),l.borderColor=o.borderColor?o.borderColor:r(n.borderColor,a,e.borderColor),l.borderWidth=o.borderWidth?o.borderWidth:r(n.borderWidth,a,e.borderWidth)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=i.getValueAtIndexOrDefault,r=i.getHoverColor,l=t._model;l.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:o(e.hoverBackgroundColor,n,r(l.backgroundColor)),l.borderColor=a.hoverBorderColor?a.hoverBorderColor:o(e.hoverBorderColor,n,r(l.borderColor)),l.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:o(e.hoverBorderWidth,n,l.borderWidth)},resyncElements:function(){var t=this,e=t.getMeta(),n=t.getDataset().data,i=e.data.length,a=n.length;a<i?e.data.splice(a,i-a):a>i&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){this.insertElements(this.getDataset().data.length-1,arguments.length)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),t.DatasetController.extend=i.inherits}},{}],25:[function(t,e,n){"use strict";var i=t(3);e.exports=function(t){function e(t,e,n,a){var o,r,l,s,u,d,c,h,f,g=Object.keys(n);for(o=0,r=g.length;o<r;++o)if(l=g[o],d=n[l],e.hasOwnProperty(l)||(e[l]=d),s=e[l],s!==d&&"_"!==l[0]){if(t.hasOwnProperty(l)||(t[l]=s),u=t[l],c=typeof d,c===typeof u)if("string"===c){if(h=i(u),h.valid&&(f=i(d),f.valid)){e[l]=f.mix(h,a).rgbString();continue}}else if("number"===c&&isFinite(u)&&isFinite(d)){e[l]=u+(d-u)*a;continue}e[l]=d}}var n=t.helpers;t.elements={},t.Element=function(t){n.extend(this,t),this.initialize.apply(this,arguments)},n.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=n.clone(t._model)),t._start={},t},transition:function(t){var n=this,i=n._model,a=n._start,o=n._view;return i&&1!==t?(o||(o=n._view={}),a||(a=n._start={}),e(a,o,i,t),n):(n._view=i,n._start=null,n)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return n.isNumber(this._model.x)&&n.isNumber(this._model.y)}}),t.Element.extend=n.inherits}},{3:3}],26:[function(t,e,n){"use strict";var i=t(3);e.exports=function(t){function e(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),t.indexOf("%")!==-1&&(i=i/100*e.parentNode[n])):i=t,i}function n(t){return void 0!==t&&null!==t&&"none"!==t}function a(t,i,a){var o=document.defaultView,r=t.parentNode,l=o.getComputedStyle(t)[i],s=o.getComputedStyle(r)[i],u=n(l),d=n(s),c=Number.POSITIVE_INFINITY;return u||d?Math.min(u?e(l,t,a):c,d?e(s,r,a):c):"none"}var o=t.helpers={};o.each=function(t,e,n,i){var a,r;if(o.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if("object"==typeof t){var l=Object.keys(t);for(r=l.length,a=0;a<r;a++)e.call(n,t[l[a]],l[a])}},o.clone=function(t){var e={};return o.each(t,function(t,n){o.isArray(t)?e[n]=t.slice(0):"object"==typeof t&&null!==t?e[n]=o.clone(t):e[n]=t}),e},o.extend=function(t){for(var e=function(e,n){t[n]=e},n=1,i=arguments.length;n<i;n++)o.each(arguments[n],e);return t},o.configMerge=function(e){var n=o.clone(e);return o.each(Array.prototype.slice.call(arguments,1),function(e){o.each(e,function(e,i){var a=n.hasOwnProperty(i),r=a?n[i]:{};"scales"===i?n[i]=o.scaleMerge(r,e):"scale"===i?n[i]=o.configMerge(r,t.scaleService.getScaleDefaults(e.type),e):!a||"object"!=typeof r||o.isArray(r)||null===r||"object"!=typeof e||o.isArray(e)?n[i]=e:n[i]=o.configMerge(r,e)})}),n},o.scaleMerge=function(e,n){var i=o.clone(e);return o.each(n,function(e,n){"xAxes"===n||"yAxes"===n?i.hasOwnProperty(n)?o.each(e,function(e,a){var r=o.getValueOrDefault(e.type,"xAxes"===n?"category":"linear"),l=t.scaleService.getScaleDefaults(r);a>=i[n].length||!i[n][a].type?i[n].push(o.configMerge(l,e)):e.type&&e.type!==i[n][a].type?i[n][a]=o.configMerge(i[n][a],l,e):i[n][a]=o.configMerge(i[n][a],e)}):(i[n]=[],o.each(e,function(e){var a=o.getValueOrDefault(e.type,"xAxes"===n?"category":"linear");i[n].push(o.configMerge(t.scaleService.getScaleDefaults(a),e))})):i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=o.configMerge(i[n],e):i[n]=e}),i},o.getValueAtIndexOrDefault=function(t,e,n){return void 0===t||null===t?n:o.isArray(t)?e<t.length?t[e]:n:t},o.getValueOrDefault=function(t,e){return void 0===t?e:t},o.indexOf=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var n=0,i=t.length;n<i;++n)if(t[n]===e)return n;return-1},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return o.each(t,function(t){e(t)&&n.push(t)}),n},o.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},o.findNextWhere=function(t,e,n){void 0!==n&&null!==n||(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},o.findPreviousWhere=function(t,e,n){void 0!==n&&null!==n||(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},o.inherits=function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=o.inherits,t&&o.extend(n.prototype,t),n.__super__=e.prototype,n},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)<n},o.almostWhole=function(t,e){var n=Math.round(t);return n-e<t&&n+e>t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e<l;++e)if(i=r[e],!i.model.skip){if(n=e>0?r[e-1]:null,a=e<l-1?r[e+1]:null,a&&!a.model.skip){var s=a.model.x-i.model.x;i.deltaK=0!==s?(a.model.y-i.model.y)/s:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}var u,d,c,h;for(e=0;e<l-1;++e)i=r[e],a=r[e+1],i.model.skip||a.model.skip||(o.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(u=i.mK/i.deltaK,d=a.mK/i.deltaK,h=Math.pow(u,2)+Math.pow(d,2),h<=9||(c=3/Math.sqrt(h),i.mK=u*c*i.deltaK,a.mK=d*c*i.deltaK)));var f;for(e=0;e<l;++e)i=r[e],i.model.skip||(n=e>0?r[e-1]:null,a=e<l-1?r[e+1]:null,n&&!n.model.skip&&(f=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-f,i.model.controlPointPreviousY=i.model.y-f*i.mK),a&&!a.model.skip&&(f=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+f,i.model.controlPointNextY=i.model.y+f*i.mK))},o.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n,i=Math.floor(o.log10(t)),a=t/Math.pow(10,i);return n=e?a<1.5?1:a<3?2:a<7?5:10:a<=1?1:a<=2?2:a<=5?5:10,n*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((1*t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2===(t/=.5)?1:(n||(n=1*(.3*1.5)),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):t<2/2.75?1*(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return t<.5?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};o.requestAnimFrame=function(){return"undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),o.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.addEvent=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},o.removeEvent=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=o.noop},o.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var n=t.canvas,i=t.height,a=t.width;n.height=i*e,n.width=a*e,t.ctx.scale(e,e),n.style.height=i+"px",n.style.width=a+"px"}},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){i=i||{};var a=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;u<s;u++)delete a[r[u]];r.splice(0,s)}return l},o.measureText=function(t,e,n,i,a){var o=e[a];return o||(o=e[a]=t.measureText(a).width,n.push(a)),o>i&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,n,i,a,o){t.beginPath(),t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+o),t.lineTo(e+i,n+a-o),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-o),t.lineTo(e,n+o),t.quadraticCurveTo(e,n,e+o,n),t.closePath()},o.color=i?function(e){return e instanceof CanvasGradient&&(e=t.defaults.global.defaultColor),i(e)}:function(t){return console.error("Color.js not found!"),t},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!o.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},o.callback=function(t,e,n){t&&"function"==typeof t.call&&t.apply(n,e)},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()},o.callCallback=o.callback}},{3:3}],27:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return t.native?{x:t.x,y:t.y}:r.getRelativePosition(t,e)}function n(t,e){var n,i,a,o,r,l=t.data.datasets;for(i=0,o=l.length;i<o;++i)if(t.isDatasetVisible(i))for(n=t.getDatasetMeta(i),a=0,r=n.data.length;a<r;++a){var s=n.data[a];s._view.skip||e(s)}}function i(t,e){var i=[];return n(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function a(t,e,i,a){var o=Number.POSITIVE_INFINITY,l=[];return a||(a=r.distanceBetweenPoints),n(t,function(t){if(!i||t.inRange(e.x,e.y)){var n=t.getCenterPoint(),r=a(e,n);r<o?(l=[t],o=r):r===o&&l.push(t)}}),l}function o(t,n,o){var r=e(n,t),l=function(t,e){return Math.abs(t.x-e.x)},s=o.intersect?i(t,r):a(t,r,!1,l),u=[];return s.length?(t.data.datasets.forEach(function(e,n){if(t.isDatasetVisible(n)){var i=t.getDatasetMeta(n),a=i.data[s[0]._index];a&&!a._view.skip&&u.push(a)}}),u):[]}var r=t.helpers;t.Interaction={modes:{single:function(t,i){var a=e(i,t),o=[];return n(t,function(t){if(t.inRange(a.x,a.y))return o.push(t),o}),o.slice(0,1)},label:o,index:o,dataset:function(t,n,o){var r=e(n,t),l=o.intersect?i(t,r):a(t,r,!1);return l.length>0&&(l=t.getDatasetMeta(l[0]._datasetIndex).data),l},"x-axis":function(t,e){return o(t,e,!0)},point:function(t,n){var a=e(n,t);return i(t,a)},nearest:function(t,n,i){var o=e(n,t),r=a(t,o,i.intersect);return r.length>1&&r.sort(function(t,e){var n=t.getArea(),i=e.getArea(),a=n-i;return 0===a&&(a=t._datasetIndex-e._datasetIndex),a}),r.slice(0,1)},x:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r},y:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r}}}}},{}],28:[function(t,e,n){"use strict";e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var n=0;n<t.data.datasets.length;n++)e.push('<li><span style="background-color:'+t.data.datasets[n].backgroundColor+'"></span>'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("</li>");return e.push("</ul>"),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}var i=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;n!==-1&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;r<o;++r)i=a[r],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,a,o){function r(t){var e,n=t.isHorizontal();n?(e=t.update(t.fullWidth?k:I,D),A-=e.height):(e=t.update(C,S),I-=e.width),P.push({horizontal:n,minSize:e,box:t})}function l(t){var e=i.findNextWhere(P,function(e){return e.box===t});if(e)if(t.isHorizontal()){var n={left:Math.max(L,_),right:Math.max(V,T),top:0,bottom:0};t.update(t.fullWidth?k:I,w/2,n)}else t.update(e.minSize.width,A)}function s(t){var e=i.findNextWhere(P,function(e){return e.box===t}),n={left:0,right:0,top:O,bottom:z};e&&t.update(e.minSize.width,A,n)}function u(t){t.isHorizontal()?(t.left=t.fullWidth?h:L,t.right=t.fullWidth?a-f:L+I,t.top=q,t.bottom=q+t.height,q=t.bottom):(t.left=H,t.right=H+t.width,t.top=O,t.bottom=O+A,H=t.right)}if(t){var d=t.options.layout,c=d?d.padding:null,h=0,f=0,g=0,p=0;isNaN(c)?(h=c.left||0,f=c.right||0,g=c.top||0,p=c.bottom||0):(h=c,f=c,g=c,p=c);var m=e(t.boxes,"left"),v=e(t.boxes,"right"),b=e(t.boxes,"top"),x=e(t.boxes,"bottom"),y=e(t.boxes,"chartArea");n(m,!0),n(v,!1),n(b,!0),n(x,!1);var k=a-h-f,w=o-g-p,M=k/2,S=w/2,C=(a-M)/(m.length+v.length),D=(o-S)/(b.length+x.length),I=k,A=w,P=[];i.each(m.concat(v,b,x),r);var _=0,T=0,F=0,R=0;i.each(b.concat(x),function(t){if(t.getPadding){var e=t.getPadding();_=Math.max(_,e.left),T=Math.max(T,e.right)}}),i.each(m.concat(v),function(t){if(t.getPadding){var e=t.getPadding();F=Math.max(F,e.top),R=Math.max(R,e.bottom)}});var L=h,V=f,O=g,z=p;i.each(m.concat(v),l),i.each(m,function(t){L+=t.width}),i.each(v,function(t){V+=t.width}),i.each(b.concat(x),l),i.each(b,function(t){O+=t.height}),i.each(x,function(t){z+=t.height}),i.each(m.concat(v),s),L=h,V=f,O=g,z=p,i.each(m,function(t){L+=t.width}),i.each(v,function(t){V+=t.width}),i.each(b,function(t){O+=t.height}),i.each(x,function(t){z+=t.height});var B=Math.max(_-L,0);L+=B,V+=Math.max(T-V,0);var W=Math.max(F-O,0);O+=W,z+=Math.max(R-z,0);var N=o-O-z,E=a-L-V;E===I&&N===A||(i.each(m,function(t){t.height=N}),i.each(v,function(t){t.height=N}),i.each(b,function(t){t.fullWidth||(t.width=E)}),i.each(x,function(t){t.fullWidth||(t.width=E)}),A=N,I=E);var H=h+B,q=g+W;i.each(m.concat(b),u),H+=I,q+=A,i.each(v,u),i.each(x,u),t.chartArea={left:L,top:O,right:L+I,bottom:O+A},i.each(y,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(I,A)})}}}}},{}],30:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.plugins={},t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){e.indexOf(t)===-1&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);n!==-1&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,o,r,l,s=this.descriptors(t),u=s.length;for(i=0;i<u;++i)if(a=s[i],o=a.plugin,l=o[e],"function"==typeof l&&(r=[t].concat(n||[]),r.push(a.options),l.apply(o,r)===!1))return!1;return!0},descriptors:function(n){var i=n._plugins||(n._plugins={});if(i.id===this._cacheId)return i.descriptors;var a=[],o=[],r=n&&n.config||{},l=t.defaults.global.plugins,s=r.options&&r.options.plugins||{};return this._plugins.concat(r.plugins||[]).forEach(function(t){var n=a.indexOf(t);if(n===-1){var i=t.id,r=s[i];r!==!1&&(r===!0&&(r=e.clone(l[i])),a.push(t),o.push({plugin:t,options:r||{}}))}}),i.descriptors=o,i.id=this._cacheId,o}},t.pluginService=t.plugins,t.PluginBase=t.Element.extend({})}},{}],31:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e,n){return i.isArray(e)?i.longestText(t,n,e):t.measureText(e).width}function n(e){var n=i.getValueOrDefault,a=t.defaults.global,o=n(e.fontSize,a.defaultFontSize),r=n(e.fontStyle,a.defaultFontStyle),l=n(e.fontFamily,a.defaultFontFamily);return{size:o,style:r,family:l,font:i.fontString(o,r,l)}}var i=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:t.Ticks.formatters.values}},t.Scale=t.Element.extend({getPadding:function(){var t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}},beforeUpdate:function(){i.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var a=this;return a.beforeUpdate(),a.maxWidth=t,a.maxHeight=e,a.margins=i.extend({left:0,right:0,top:0,bottom:0},n),a.longestTextCache=a.longestTextCache||{},a.beforeSetDimensions(),a.setDimensions(),a.afterSetDimensions(),a.beforeDataLimits(),a.determineDataLimits(),a.afterDataLimits(),a.beforeBuildTicks(),a.buildTicks(),a.afterBuildTicks(),a.beforeTickToLabelConversion(),a.convertTicksToLabels(),a.afterTickToLabelConversion(),a.beforeCalculateTickRotation(),a.calculateTickRotation(),a.afterCalculateTickRotation(),a.beforeFit(),a.fit(),a.afterFit(),a.afterUpdate(),a.minSize},afterUpdate:function(){i.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){i.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){i.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){i.callback(this.options.beforeDataLimits,[this])},determineDataLimits:i.noop,afterDataLimits:function(){i.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){i.callback(this.options.beforeBuildTicks,[this])},buildTicks:i.noop,afterBuildTicks:function(){i.callback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){i.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this,e=t.options.ticks;t.ticks=t.ticks.map(e.userCallback||e.callback)},afterTickToLabelConversion:function(){i.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){i.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,a=t.options.ticks,o=n(a);e.font=o.font;var r=a.minRotation||0;if(t.options.display&&t.isHorizontal())for(var l,s,u=i.longestText(e,o.font,t.ticks,t.longestTextCache),d=u,c=t.getPixelForTick(1)-t.getPixelForTick(0)-6;d>c&&r<a.maxRotation;){var h=i.toRadians(r);if(l=Math.cos(h),s=Math.sin(h),s*u>t.maxHeight){r--;break}r++,d=l*u}t.labelRotation=r},afterCalculateTickRotation:function(){i.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=t.options,r=o.ticks,l=o.scaleLabel,s=o.gridLines,u=o.display,d=t.isHorizontal(),c=n(r),h=1.5*n(l).size,f=o.gridLines.tickMarkLength;if(d?a.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:a.width=u&&s.drawTicks?f:0,d?a.height=u&&s.drawTicks?f:0:a.height=t.maxHeight,l.display&&u&&(d?a.height+=h:a.width+=h),r.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),p=i.numberOfLabelLines(t.ticks),m=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),x=Math.sin(v),y=x*g+c.size*p+m*p;a.height=Math.min(t.maxHeight,a.height+y),t.ctx.font=c.font;var k=t.ticks[0],w=e(t.ctx,k,c.font),M=t.ticks[t.ticks.length-1],S=e(t.ctx,M,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?b*w+3:b*m+3,t.paddingRight="bottom"===o.position?b*m+3:b*S+3):(t.paddingLeft=w/2+3,t.paddingRight=S/2+3)}else r.mirror?g=0:g+=t.options.ticks.padding,a.width=Math.min(t.maxWidth,a.width+g),t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var n=this;if(n.isHorizontal()){var i=n.width-(n.paddingLeft+n.paddingRight),a=i/Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),o=a*t+n.paddingLeft;e&&(o+=a/2);var r=n.left+Math.round(o);return r+=n.isFullWidth()?n.margins.left:0}var l=n.height-(n.paddingTop+n.paddingBottom);return n.top+t*(l/(n.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=e.width-(e.paddingLeft+e.paddingRight),i=n*t+e.paddingLeft,a=e.left+Math.round(i);return a+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},draw:function(e){var a=this,o=a.options;if(o.display){var r,l,s=a.ctx,u=t.defaults.global,d=o.ticks,c=o.gridLines,h=o.scaleLabel,f=0!==a.labelRotation,g=d.autoSkip,p=a.isHorizontal();d.maxTicksLimit&&(l=d.maxTicksLimit);var m=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=n(d),b=c.drawTicks?c.tickMarkLength:0,x=i.getValueOrDefault(h.fontColor,u.defaultFontColor),y=n(h),k=i.toRadians(a.labelRotation),w=Math.cos(k),M=a.longestLabelWidth*w;s.fillStyle=m;var S=[];if(p){if(r=!1,(M+d.autoSkipPadding)*a.ticks.length>a.width-(a.paddingLeft+a.paddingRight)&&(r=1+Math.floor((M+d.autoSkipPadding)*a.ticks.length/(a.width-(a.paddingLeft+a.paddingRight)))),l&&a.ticks.length>l)for(;!r||a.ticks.length/(r||1)>l;)r||(r=1),r+=1;g||(r=!1)}var C="right"===o.position?a.left:a.right-b,D="right"===o.position?a.left+b:a.right,I="bottom"===o.position?a.top:a.bottom-b,A="bottom"===o.position?a.top+b:a.bottom;if(i.each(a.ticks,function(t,n){if(void 0!==t&&null!==t){var l=a.ticks.length===n+1,s=r>1&&n%r>0||n%r===0&&n+r>=a.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var h,g,m,v;n===("undefined"!=typeof a.zeroLineIndex?a.zeroLineIndex:0)?(h=c.zeroLineWidth,g=c.zeroLineColor,m=c.zeroLineBorderDash,v=c.zeroLineBorderDashOffset):(h=i.getValueAtIndexOrDefault(c.lineWidth,n),g=i.getValueAtIndexOrDefault(c.color,n),m=i.getValueOrDefault(c.borderDash,u.borderDash),v=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset));var x,y,w,M,P,_,T,F,R,L,V="middle",O="middle";if(p){"bottom"===o.position?(O=f?"middle":"top",V=f?"right":"center",L=a.top+b):(O=f?"middle":"bottom",V=f?"left":"center",L=a.bottom-b);var z=a.getPixelForTick(n)+i.aliasPixel(h);R=a.getPixelForTick(n,c.offsetGridLines)+d.labelOffset,x=w=P=T=z,y=I,M=A,_=e.top,F=e.bottom}else{var B,W="left"===o.position,N=d.padding;d.mirror?(V=W?"left":"right",B=N):(V=W?"right":"left",
13
+ B=b+N),R=W?a.right-B:a.left+B;var E=a.getPixelForTick(n);E+=i.aliasPixel(h),L=a.getPixelForTick(n,c.offsetGridLines),x=C,w=D,P=e.left,T=e.right,y=M=_=F=E}S.push({tx1:x,ty1:y,tx2:w,ty2:M,x1:P,y1:_,x2:T,y2:F,labelX:R,labelY:L,glWidth:h,glColor:g,glBorderDash:m,glBorderDashOffset:v,rotation:-1*k,label:t,textBaseline:O,textAlign:V})}}}),i.each(S,function(t){if(c.display&&(s.save(),s.lineWidth=t.glWidth,s.strokeStyle=t.glColor,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),c.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=v.font,s.textBaseline=t.textBaseline,s.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var n=0,a=0;n<e.length;++n)s.fillText(""+e[n],0,a),a+=1.5*v.size;else s.fillText(e,0,0);s.restore()}}),h.display){var P,_,T=0;if(p)P=a.left+(a.right-a.left)/2,_="bottom"===o.position?a.bottom-y.size/2:a.top+y.size/2;else{var F="left"===o.position;P=F?a.left+y.size/2:a.right-y.size/2,_=a.top+(a.bottom-a.top)/2,T=F?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(P,_),s.rotate(T),s.textAlign="center",s.textBaseline="middle",s.fillStyle=x,s.font=y.font,s.fillText(h.labelString,0,0),s.restore()}if(c.drawBorder){s.lineWidth=i.getValueAtIndexOrDefault(c.lineWidth,0),s.strokeStyle=i.getValueAtIndexOrDefault(c.color,0);var R=a.left,L=a.right,V=a.top,O=a.bottom,z=i.aliasPixel(s.lineWidth);p?(V=O="top"===o.position?a.bottom:a.top,V+=z,O+=z):(R=L="left"===o.position?a.right:a.left,R+=z,L+=z),s.beginPath(),s.moveTo(R,V),s.lineTo(L,O),s.stroke()}}}})}},{}],32:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,n,i){this.constructors[t]=n,this.defaults[t]=e.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(n){return this.defaults.hasOwnProperty(n)?e.scaleMerge(t.defaults.scale,this.defaults[n]):{}},updateScaleDefaults:function(t,n){var i=this.defaults;i.hasOwnProperty(t)&&(i[t]=e.extend(i[t],n))},addScalesToLayout:function(n){e.each(n.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,t.layoutService.addBox(n,e)})}}}},{}],33:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.Ticks={generators:{linear:function(t,n){var i,a=[];if(t.stepSize&&t.stepSize>0)i=t.stepSize;else{var o=e.niceNum(n.max-n.min,!1);i=e.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(n.min/i)*i,l=Math.ceil(n.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,l=t.max);var s=(l-r)/i;s=e.almostEquals(s,Math.round(s),i/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u<s;++u)a.push(r+u*i);return a.push(void 0!==t.max?t.max:l),a},logarithmic:function(t,n){var i,a,o=[],r=e.getValueOrDefault,l=r(t.min,Math.pow(10,Math.floor(e.log10(n.min)))),s=Math.floor(e.log10(n.max)),u=Math.ceil(n.max/Math.pow(10,s));0===l?(i=Math.floor(e.log10(n.minNotZero)),a=Math.floor(n.minNotZero/Math.pow(10,i)),o.push(l),l=a*Math.pow(10,i)):(i=Math.floor(e.log10(l)),a=Math.floor(l/Math.pow(10,i)));do o.push(l),++a,10===a&&(a=1,++i),l=a*Math.pow(10,i);while(i<s||i===s&&a<u);var d=r(t.max,l);return o.push(d),o}},formatters:{values:function(t){return e.isArray(t)?t:""+t},linear:function(t,n,i){var a=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=e.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,n,i){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===n||n===i.length-1?t.toExponential():""}}}}},{}],34:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(s.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function a(e){var n=t.defaults.global,i=s.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,n.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,n.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,n.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,n.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,n.defaultFontStyle),titleFontSize:i(e.titleFontSize,n.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,n.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,n.defaultFontStyle),footerFontSize:i(e.footerFontSize,n.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors,borderColor:e.borderColor,borderWidth:e.borderWidth}}function o(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=l*d,i+=l?(l-1)*e.titleSpacing:0,i+=l?e.titleMarginBottom:0,i+=r*c,i+=r?(r-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=s.fontString(d,e._titleFontStyle,e._titleFontFamily),s.each(e.title,g),n.font=s.fontString(c,e._bodyFontStyle,e._bodyFontFamily),s.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,s.each(o,function(t){s.each(t.before,g),s.each(t.lines,g),s.each(t.after,g)}),f=0,n.font=s.fontString(h,e._footerFontStyle,e._footerFontFamily),s.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function r(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,o="center",r="center";n.y<e.height?r="top":n.y>i.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function l(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}var s=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:s.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.index<a&&(n=i[o.index])}return n},afterTitle:s.noop,beforeBody:s.noop,beforeLabel:s.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),n+=t.yLabel},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex),i=n.data[t.index],a=i._view;return{borderColor:a.borderColor,backgroundColor:a.backgroundColor}},afterLabel:s.noop,afterBody:s.noop,beforeFooter:s.noop,footer:s.noop,afterFooter:s.noop}},t.Tooltip=t.Element.extend({initialize:function(){this._model=a(this._options)},getTitle:function(){var t=this,e=t._options,i=e.callbacks,a=i.beforeTitle.apply(t,arguments),o=i.title.apply(t,arguments),r=i.afterTitle.apply(t,arguments),l=[];return l=n(l,a),l=n(l,o),l=n(l,r)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return s.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var i=this,a=i._options.callbacks,o=[];return s.each(t,function(t){var r={before:[],lines:[],after:[]};n(r.before,a.beforeLabel.call(i,t,e)),n(r.lines,a.label.call(i,t,e)),n(r.after,a.afterLabel.call(i,t,e)),o.push(r)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return s.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,e=t._options.callbacks,i=e.beforeFooter.apply(t,arguments),a=e.footer.apply(t,arguments),o=e.afterFooter.apply(t,arguments),r=[];return r=n(r,i),r=n(r,a),r=n(r,o)},update:function(e){var n,u,d=this,c=d._options,h=d._model,f=d._model=a(c),g=d._active,p=d._data,m={xAlign:h.xAlign,yAlign:h.yAlign},v={x:h.x,y:h.y},b={width:h.width,height:h.height},x={x:h.caretX,y:h.caretY};if(g.length){f.opacity=1;var y=[];x=t.Tooltip.positioners[c.position](g,d._eventPosition);var k=[];for(n=0,u=g.length;n<u;++n)k.push(i(g[n]));c.filter&&(k=k.filter(function(t){return c.filter(t,p)})),c.itemSort&&(k=k.sort(function(t,e){return c.itemSort(t,e,p)})),s.each(k,function(t){y.push(c.callbacks.labelColor.call(d,t,d._chart))}),f.title=d.getTitle(k,p),f.beforeBody=d.getBeforeBody(k,p),f.body=d.getBody(k,p),f.afterBody=d.getAfterBody(k,p),f.footer=d.getFooter(k,p),f.x=Math.round(x.x),f.y=Math.round(x.y),f.caretPadding=c.caretPadding,f.labelColors=y,f.dataPoints=k,b=o(this,f),m=r(this,b),v=l(f,b,m)}else f.opacity=0;return f.xAlign=m.xAlign,f.yAlign=m.yAlign,f.x=v.x,f.y=v.y,f.width=b.width,f.height=b.height,f.caretX=x.x,f.caretY=x.y,d._model=f,e&&c.custom&&c.custom.call(d,f),d},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,o,r,l,s,u=n.caretSize,d=n.cornerRadius,c=n.xAlign,h=n.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===h)l=g+m/2,"left"===c?(i=f,a=i-u,o=i,r=l+u,s=l-u):(i=f+p,a=i+u,o=i,r=l-u,s=l+u);else if("left"===c?(a=f+d+u,i=a-u,o=a+u):"right"===c?(a=f+p-d-u,i=a-u,o=a+u):(a=f+p/2,i=a-u,o=a+u),"top"===h)r=g,l=r-u,s=r;else{r=g+m,l=r+u,s=r;var v=o;o=i,i=v}return{x1:i,x2:a,x3:o,y1:r,y2:l,y3:s}},drawTitle:function(t,n,i,a){var o=n.title;if(o.length){i.textAlign=n._titleAlign,i.textBaseline="top";var r=n.titleFontSize,l=n.titleSpacing;i.fillStyle=e(n.titleFontColor,a),i.font=s.fontString(r,n._titleFontStyle,n._titleFontFamily);var u,d;for(u=0,d=o.length;u<d;++u)i.fillText(o[u],t.x,t.y),t.y+=r+l,u+1===o.length&&(t.y+=n.titleMarginBottom-l)}},drawBody:function(t,n,i,a){var o=n.bodyFontSize,r=n.bodySpacing,l=n.body;i.textAlign=n._bodyAlign,i.textBaseline="top";var u=e(n.bodyFontColor,a);i.fillStyle=u,i.font=s.fontString(o,n._bodyFontStyle,n._bodyFontFamily);var d=0,c=function(e){i.fillText(e,t.x+d,t.y),t.y+=o+r};s.each(n.beforeBody,c);var h=n.displayColors;d=h?o+2:0,s.each(l,function(r,l){s.each(r.before,c),s.each(r.lines,function(r){h&&(i.fillStyle=e(n.legendColorBackground,a),i.fillRect(t.x,t.y,o,o),i.strokeStyle=e(n.labelColors[l].borderColor,a),i.strokeRect(t.x,t.y,o,o),i.fillStyle=e(n.labelColors[l].backgroundColor,a),i.fillRect(t.x+1,t.y+1,o-2,o-2),i.fillStyle=u),c(r)}),s.each(r.after,c)}),d=0,s.each(n.afterBody,c),t.y-=r},drawFooter:function(t,n,i,a){var o=n.footer;o.length&&(t.y+=n.footerMarginTop,i.textAlign=n._footerAlign,i.textBaseline="top",i.fillStyle=e(n.footerFontColor,a),i.font=s.fontString(n.footerFontSize,n._footerFontStyle,n._footerFontFamily),s.each(o,function(e){i.fillText(e,t.x,t.y),t.y+=n.footerFontSize+n.footerSpacing}))},drawBackground:function(t,n,i,a,o){i.fillStyle=e(n.backgroundColor,o),i.strokeStyle=e(n.borderColor,o),i.lineWidth=n.borderWidth;var r=n.xAlign,l=n.yAlign,s=t.x,u=t.y,d=a.width,c=a.height,h=n.cornerRadius;i.beginPath(),i.moveTo(s+h,u),"top"===l&&this.drawCaret(t,a),i.lineTo(s+d-h,u),i.quadraticCurveTo(s+d,u,s+d,u+h),"center"===l&&"right"===r&&this.drawCaret(t,a),i.lineTo(s+d,u+c-h),i.quadraticCurveTo(s+d,u+c,s+d-h,u+c),"bottom"===l&&this.drawCaret(t,a),i.lineTo(s+h,u+c),i.quadraticCurveTo(s,u+c,s,u+c-h),"center"===l&&"left"===r&&this.drawCaret(t,a),i.lineTo(s,u+h),i.quadraticCurveTo(s,u,s+h,u),i.closePath(),i.fill(),n.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),i=!s.arrayEquals(e._active,e._lastActive),!i)return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;e<n;++e){var r=t[e];if(r&&r.hasValue()){var l=r.tooltipPosition();i+=l.x,a+=l.y,++o}}return{x:Math.round(i/o),y:Math.round(a/o)}},nearest:function(t,e){var n,i,a,o=e.x,r=e.y,l=Number.POSITIVE_INFINITY;for(i=0,a=t.length;i<a;++i){var u=t[i];if(u&&u.hasValue()){var d=u.getCenterPoint(),c=s.distanceBetweenPoints(e,d);c<l&&(l=c,n=u)}}if(n){var h=n.tooltipPosition();o=h.x,r=h.y}return{x:o,y:r}}}}},{}],35:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;n.elements.arc={backgroundColor:n.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,n){var i=this._view;if(i){for(var a=e.getAngleFromPoint(i,{x:t,y:n}),o=a.angle,r=a.distance,l=i.startAngle,s=i.endAngle;s<l;)s+=2*Math.PI;for(;o>s;)o-=2*Math.PI;for(;o<l;)o+=2*Math.PI;var u=o>=l&&o<=s,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],36:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){var t,i,a,o,r=this,l=r._view,s=r._chart.ctx,u=l.spanGaps,d=r._children.slice(),c=n.elements.line,h=-1;for(r._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||n.defaultColor,s.beginPath(),h=-1,t=0;t<d.length;++t)i=d[t],a=e.previousItem(d,t),o=i._view,0===t?o.skip||(s.moveTo(o.x,o.y),h=t):(a=h===-1?a:d[h],o.skip||(h!==t-1&&!u||h===-1?s.moveTo(o.x,o.y):e.canvas.lineTo(s,a._view,i._view),h=t));s.stroke(),s.restore()}})}},{}],37:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2)}function n(t){var e=this._view;return!!e&&Math.pow(t-e.y,2)<Math.pow(e.radius+e.hitRadius,2)}var i=t.helpers,a=t.defaults.global,o=a.defaultColor;a.elements.point={radius:3,pointStyle:"circle",backgroundColor:o,borderWidth:1,borderColor:o,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:e,inXRange:e,inYRange:n,getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(e){var n=this._view,r=this._model,l=this._chart.ctx,s=n.pointStyle,u=n.radius,d=n.x,c=n.y,h=t.helpers.color,f=1.01,g=0;n.skip||(l.strokeStyle=n.borderColor||o,l.lineWidth=i.getValueOrDefault(n.borderWidth,a.elements.point.borderWidth),l.fillStyle=n.backgroundColor||o,void 0!==e&&(r.x<e.left||e.right*f<r.x||r.y<e.top||e.bottom*f<r.y)&&(r.x<e.left?g=(d-r.x)/(e.left-r.x):e.right*f<r.x?g=(r.x-d)/(r.x-e.right):r.y<e.top?g=(c-r.y)/(e.top-r.y):e.bottom*f<r.y&&(g=(r.y-c)/(r.y-e.bottom)),g=Math.round(100*g)/100,l.strokeStyle=h(l.strokeStyle).alpha(g).rgbString(),l.fillStyle=h(l.fillStyle).alpha(g).rgbString()),t.canvasHelpers.drawPoint(l,s,u,d,c))}})}},{}],38:[function(t,e,n){"use strict";e.exports=function(t){function e(t){return void 0!==t._view.width}function n(t){var n,i,a,o,r=t._view;if(e(t)){var l=r.width/2;n=r.x-l,i=r.x+l,a=Math.min(r.y,r.base),o=Math.max(r.y,r.base)}else{var s=r.height/2;n=Math.min(r.x,r.base),i=Math.max(r.x,r.base),a=r.y-s,o=r.y+s}return{left:n,top:a,right:i,bottom:o}}var i=t.defaults.global;i.elements.rectangle={backgroundColor:i.defaultColor,borderWidth:0,borderColor:i.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return v[(x+t)%4]}var e,n,i,a,o,r,l,s=this._chart.ctx,u=this._view,d=u.borderWidth;if(u.horizontal?(e=u.base,n=u.x,i=u.y-u.height/2,a=u.y+u.height/2,o=n>e?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,a=u.base,o=1,r=a>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a));d=d>c?c:d;var h=d/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),m=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=m),p!==m&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"],x=b.indexOf(l,0);x===-1&&(x=0);var y=t(0);s.moveTo(y[0],y[1]);for(var k=1;k<4;k++)y=t(k),s.lineTo(y[0],y[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var a=n(this);i=t>=a.left&&t<=a.right&&e>=a.top&&e<=a.bottom}return i},inLabelRange:function(t,i){var a=this;if(!a._view)return!1;var o=!1,r=n(a);return o=e(a)?t>=r.left&&t<=r.right:i>=r.top&&i<=r.bottom},inXRange:function(t){var e=n(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=n(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,n,i=this._view;return e(this)?(t=i.x,n=(i.y+i.base)/2):(t=(i.x+i.base)/2,n=i.y),{x:t,y:n}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],39:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}function n(t,n){var i=t.style,a=t.getAttribute("height"),o=t.getAttribute("width");if(t._chartjs={initial:{height:a,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=e(t,"width");void 0!==r&&(t.width=r)}if(null===a||""===a)if(""===t.style.height)t.height=t.width/(n.options.aspectRatio||2);else{var l=e(t,"height");void 0!==r&&(t.height=l)}return t}function i(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function a(t,e){var n=u[t.type]||t.type,a=s.getRelativePosition(t,e);return i(n,e,a.x,a.y,t)}function o(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,s.addEvent(e,"load",function(){s.addEvent(e.contentWindow||e,"resize",t),t()}),e}function r(t,e,n){var a=t._chartjs={ticking:!1},r=function(){a.ticking||(a.ticking=!0,s.requestAnimFrame.call(window,function(){if(a.resizer)return a.ticking=!1,e(i("resize",n))}))};a.resizer=o(r),t.insertBefore(a.resizer,t.firstChild)}function l(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var s=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(n(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var n=e._chartjs.initial;["height","width"].forEach(function(t){var i=n[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),s.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void r(i.parentNode,n,t);var o=n._chartjs||(n._chartjs={}),l=o.proxies||(o.proxies={}),u=l[t.id+"_"+e]=function(e){n(a(e,t))};s.addEvent(i,e,u)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void l(i.parentNode,n);var a=n._chartjs||{},o=a.proxies||{},r=o[t.id+"_"+e];r&&s.removeEvent(i,e,r)}}}},{}],40:[function(t,e,n){"use strict";var i=t(39);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{39:39}],41:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),o===!1||null===o)return!1;if(o===!0)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function n(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function i(t,e,n){var i,a=t[e],o=a.fill,r=[e];if(!n)return o;for(;o!==!1&&r.indexOf(o)===-1;){if(!isFinite(o))return o;if(i=t[o],!i)return!1;if(i.visible)return o;r.push(o),o=i.fill}return!1}function a(t){var e=t.fill,n="dataset";return e===!1?null:(isFinite(e)||(n="boundary"),d[n](t))}function o(t){return t&&!t.skip}function r(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<i;++o)u.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(n[a-1].x,n[a-1].y),o=a-1;o>0;--o)u.canvas.lineTo(t,n[o],n[o-1],!0)}}function l(t,e,n,i,a,l){var s,u,d,c,h,f,g,p=e.length,m=i.spanGaps,v=[],b=[],x=0,y=0;for(t.beginPath(),s=0,u=p+!!l;s<u;++s)d=s%p,c=e[d]._view,h=n(c,d,i),f=o(c),g=o(h),f&&g?(x=v.push(c),y=b.push(h)):x&&y&&(m?(f&&v.push(c),g&&b.push(h)):(r(t,v,b,x,y),x=y=0,v=[],b=[]));r(t,v,b,x,y),t.closePath(),t.fillStyle=a,t.fill()}t.defaults.global.plugins.filler={propagate:!0};var s=t.defaults,u=t.helpers,d={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e),o=a&&i.dataset._children||[];return o.length?function(t,e){return o[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};return{id:"filler",afterDatasetsUpdate:function(o,r){var l,s,u,d,c=(o.data.datasets||[]).length,h=r.propagate,f=[];for(s=0;s<c;++s)l=o.getDatasetMeta(s),u=l.dataset,d=null,u&&u._model&&u instanceof t.elements.Line&&(d={visible:o.isDatasetVisible(s),fill:e(u,s,c),chart:o,el:u}),l.$filler=d,f.push(d);for(s=0;s<c;++s)d=f[s],d&&(d.fill=i(f,s,h),d.boundary=n(d),d.mapper=a(d))},beforeDatasetDraw:function(t,e){var n=e.meta.$filler;if(n){var i=n.el,a=i._view,o=i._children||[],r=n.mapper,u=a.backgroundColor||s.global.defaultColor;r&&u&&o.length&&l(t.ctx,o,r,a,u,i._loop)}}}}},{}],42:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.ctx,options:n,chart:e});a.configure(e,i,n),a.addBox(e,i),e.legend=i}var i=t.helpers,a=t.layoutService,o=i.noop;return t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return i.isArray(e.datasets)?e.datasets.map(function(e,n){return{text:e.label,fillStyle:i.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(n),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:n}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){i.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:o,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:o,beforeSetDimensions:o,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:o,beforeBuildLabels:o,buildLabels:function(){var t=this,e=t.options.labels,n=e.generateLabels.call(t,t.chart);e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:o,beforeFit:o,fit:function(){var n=this,a=n.options,o=a.labels,r=a.display,l=n.ctx,s=t.defaults.global,u=i.getValueOrDefault,d=u(o.fontSize,s.defaultFontSize),c=u(o.fontStyle,s.defaultFontStyle),h=u(o.fontFamily,s.defaultFontFamily),f=i.fontString(d,c,h),g=n.legendHitBoxes=[],p=n.minSize,m=n.isHorizontal();if(m?(p.width=n.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=n.maxHeight),r)if(l.font=f,m){var v=n.lineWidths=[0],b=n.legendItems.length?d+o.padding:0;l.textAlign="left",l.textBaseline="top",i.each(n.legendItems,function(t,i){var a=e(o,d),r=a+d/2+l.measureText(t.text).width;v[v.length-1]+r+o.padding>=n.width&&(b+=d+o.padding,v[v.length]=n.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+o.padding}),p.height+=b}else{var x=o.padding,y=n.columnWidths=[],k=o.padding,w=0,M=0,S=d+x;i.each(n.legendItems,function(t,n){var i=e(o,d),a=i+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+o.padding,y.push(w),w=0,M=0),w=Math.max(w,a),M+=S,g[n]={left:0,top:0,width:a,height:d}}),k+=w,y.push(w),p.width+=k}n.width=p.width,n.height=p.height},afterFit:o,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var n=this,a=n.options,o=a.labels,r=t.defaults.global,l=r.elements.line,s=n.width,u=n.lineWidths;if(a.display){var d,c=n.ctx,h=i.getValueOrDefault,f=h(o.fontColor,r.defaultFontColor),g=h(o.fontSize,r.defaultFontSize),p=h(o.fontStyle,r.defaultFontStyle),m=h(o.fontFamily,r.defaultFontFamily),v=i.fontString(g,p,m);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(o,g),x=n.legendHitBoxes,y=function(e,n,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var o=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),a.labels&&a.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=e+u,f=n+u;t.canvasHelpers.drawPoint(c,i.pointStyle,s,d,f)}else o||c.strokeRect(e,n,b,g),c.fillRect(e,n,b,g);c.restore()}},k=function(t,e,n,i){c.fillText(n.text,b+g/2+t,e),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},w=n.isHorizontal();d=w?{x:n.left+(s-u[0])/2,y:n.top+o.padding,line:0}:{x:n.left+o.padding,y:n.top+o.padding,line:0};var M=g+o.padding;i.each(n.legendItems,function(t,e){var i=c.measureText(t.text).width,a=b+g/2+i,r=d.x,l=d.y;w?r+a>=s&&(l=d.y+=M,d.line++,r=d.x=n.left+(s-u[d.line])/2):l+M>n.bottom&&(r=d.x=r+n.columnWidths[d.line]+o.padding,l=d.y=n.top+o.padding,d.line++),y(r,l,t),x[e].left=r,x[e].top=l,k(r,l,t,i),w?d.x+=a+o.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s<l.length;++s){var u=l[s];if(o>=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(e){var o=e.options.legend,r=e.legend;o?(o=i.configMerge(t.defaults.global.legend,o),r?(a.configure(e,r,o),r.options=o):n(e,o)):r&&(a.removeBox(e,r),delete e.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{}],43:[function(t,e,n){"use strict";e.exports=function(t){function e(e,n){var a=new t.Title({ctx:e.ctx,options:n,chart:e});i.configure(e,a,n),i.addBox(e,a),e.titleBlock=a}var n=t.helpers,i=t.layoutService,a=n.noop;return t.defaults.global.title={display:!1,position:"top",fullWidth:!0,weight:2e3,fontStyle:"bold",padding:10,text:""},t.Title=t.Element.extend({initialize:function(t){var e=this;n.extend(e,t),e.legendHitBoxes=[];
14
+ },beforeUpdate:a,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:a,afterBuildLabels:a,beforeFit:a,fit:function(){var e=this,i=n.getValueOrDefault,a=e.options,o=t.defaults.global,r=a.display,l=i(a.fontSize,o.defaultFontSize),s=e.minSize;e.isHorizontal()?(s.width=e.maxWidth,s.height=r?l+2*a.padding:0):(s.width=r?l+2*a.padding:0,s.height=e.maxHeight),e.width=s.width,e.height=s.height},afterFit:a,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,a=n.getValueOrDefault,o=e.options,r=t.defaults.global;if(o.display){var l,s,u,d=a(o.fontSize,r.defaultFontSize),c=a(o.fontStyle,r.defaultFontStyle),h=a(o.fontFamily,r.defaultFontFamily),f=n.fontString(d,c,h),g=0,p=e.top,m=e.left,v=e.bottom,b=e.right;i.fillStyle=a(o.fontColor,r.defaultFontColor),i.font=f,e.isHorizontal()?(l=m+(b-m)/2,s=p+(v-p)/2,u=b-m):(l="left"===o.position?m+d/2:b-d/2,s=p+(v-p)/2,u=v-p,g=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(l,s),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0,u),i.restore()}}}),{id:"title",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,r=a.titleBlock;o?(o=n.configMerge(t.defaults.global.title,o),r?(i.configure(a,r,o),r.options=o):e(a,o)):r&&(t.layoutService.removeBox(a,r),delete a.titleBlock)}}}},{}],44:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,n=t.getLabels();t.minIndex=0,t.maxIndex=n.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(n,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(n,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=n[t.minIndex],t.max=n[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e,n,i){var a,o=this,r=Math.max(o.maxIndex+1-o.minIndex-(o.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&null!==t&&(a=o.isHorizontal()?t.x:t.y),void 0!==a||void 0!==t&&isNaN(e)){var l=o.getLabels();t=a||t;var s=l.indexOf(t);e=s!==-1?s:e}if(o.isHorizontal()){var u=o.width/r,d=u*(e-o.minIndex);return(o.options.gridLines.offsetGridLines&&i||o.maxIndex===o.minIndex&&i)&&(d+=u/2),o.left+Math.round(d)}var c=o.height/r,h=c*(e-o.minIndex);return o.options.gridLines.offsetGridLines&&i&&(h+=c/2),o.top+Math.round(h)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,n=this,i=Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),a=n.isHorizontal(),o=(a?n.width:n.height)/i;return t-=a?n.left:n.top,n.options.gridLines.offsetGridLines&&(t-=o/2),e=t<=0?0:Math.round(t/o)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,n)}},{}],45:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=n.chart,o=a.data,r=o.datasets,l=n.isHorizontal(),s=0,u=1;n.min=null,n.max=null;var d=i.stacked;if(void 0===d&&e.each(r,function(e,n){if(!d){var i=a.getDatasetMeta(n);a.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(r,function(o,r){var l=a.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");void 0===c[s]&&(c[s]={positiveValues:[],negativeValues:[]});var u=c[s].positiveValues,d=c[s].negativeValues;a.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var a=+n.getRightValue(t);isNaN(a)||l.data[e].hidden||(u[e]=u[e]||0,d[e]=d[e]||0,i.relativePoints?u[e]=100:a<0?d[e]+=a:u[e]+=a)})}),e.each(c,function(t){var i=t.positiveValues.concat(t.negativeValues),a=e.min(i),o=e.max(i);n.min=null===n.min?a:Math.min(n.min,a),n.max=null===n.max?o:Math.max(n.max,o)})}else e.each(r,function(i,o){var r=a.getDatasetMeta(o);a.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:i<n.min&&(n.min=i),null===n.max?n.max=i:i>n.max&&(n.max=i))})});n.min=isFinite(n.min)?n.min:s,n.max=isFinite(n.max)?n.max:u,this.handleTickRangeOptions()},getTickLimit:function(){var n,i=this,a=i.options.ticks;if(i.isHorizontal())n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(a.fontSize,t.defaults.global.defaultFontSize);n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return n},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,n)}},{}],46:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,n=t.options,i=n.ticks;if(i.beginAtZero){var a=e.sign(t.min),o=e.sign(t.max);a<0&&o<0?t.max=0:a>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(null===t.min?t.min=i.suggestedMin:t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(null===t.max?t.max=i.suggestedMax:t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:n,handleDirectionalChanges:n,buildTicks:function(){var n=this,i=n.options,a=i.ticks,o=n.getTickLimit();o=Math.max(2,o);var r={maxTicks:o,min:a.min,max:a.max,stepSize:e.getValueOrDefault(a.fixedStepSize,a.stepSize)},l=n.ticks=t.Ticks.generators.linear(r,n);n.handleDirectionalChanges(),n.max=e.max(l),n.min=e.min(l),a.reverse?(l.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],47:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=i.ticks,o=n.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,u=n.isHorizontal();n.min=null,n.max=null,n.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(l,function(e,n){if(!d){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(l,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===c[s]&&(c[s]=[]),e.each(a.data,function(t,e){var a=c[s],o=+n.getRightValue(t);isNaN(o)||l.data[e].hidden||(a[e]=a[e]||0,i.relativePoints?a[e]=100:a[e]+=o)}))}),e.each(c,function(t){var i=e.min(t),a=e.max(t);n.min=null===n.min?i:Math.min(n.min,i),n.max=null===n.max?a:Math.max(n.max,a)})}else e.each(l,function(i,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:i<n.min&&(n.min=i),null===n.max?n.max=i:i>n.max&&(n.max=i),0!==i&&(null===n.minNotZero||i<n.minNotZero)&&(n.minNotZero=i))})});n.min=s(a.min,n.min),n.max=s(a.max,n.max),n.min===n.max&&(0!==n.min&&null!==n.min?(n.min=Math.pow(10,Math.floor(e.log10(n.min))-1),n.max=Math.pow(10,Math.floor(e.log10(n.max))+1)):(n.min=1,n.max=10))},buildTicks:function(){var n=this,i=n.options,a=i.ticks,o={min:a.min,max:a.max},r=n.ticks=t.Ticks.generators.logarithmic(o,n);n.isHorizontal()||r.reverse(),n.max=e.max(r),n.min=e.min(r),a.reverse?(r.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},getPixelForValue:function(t){var n,i,a,o=this,r=o.start,l=+o.getRightValue(t),s=o.options,u=s.ticks;return o.isHorizontal()?(a=e.log10(o.end)-e.log10(r),0===l?i=o.left:(n=o.width,i=o.left+n/a*(e.log10(l)-e.log10(r)))):(n=o.height,0!==r||u.reverse?0===o.end&&u.reverse?(a=e.log10(o.start)-e.log10(o.minNotZero),i=l===o.end?o.top:l===o.minNotZero?o.top+.02*n:o.top+.02*n+.98*n/a*(e.log10(l)-e.log10(o.minNotZero))):0===l?i=u.reverse?o.top:o.bottom:(a=e.log10(o.end)-e.log10(r),n=o.height,i=o.bottom-n/a*(e.log10(l)-e.log10(r))):(a=e.log10(o.end)-e.log10(o.minNotZero),i=l===r?o.bottom:l===o.minNotZero?o.bottom-.02*n:o.bottom-.02*n-.98*n/a*(e.log10(l)-e.log10(o.minNotZero)))),i},getValueForPixel:function(t){var n,i,a=this,o=e.log10(a.end)-e.log10(a.start);return a.isHorizontal()?(i=a.width,n=a.start*Math.pow(10,(t-a.left)*o/i)):(i=a.height,n=Math.pow(10,(a.bottom-t)*o/i)/a.start),n}});t.scaleService.registerScaleType("logarithmic",i,n)}},{}],48:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function n(t){var e=t.options.pointLabels,n=f.getValueOrDefault(e.fontSize,g.defaultFontSize),i=f.getValueOrDefault(e.fontStyle,g.defaultFontStyle),a=f.getValueOrDefault(e.fontFamily,g.defaultFontFamily),o=f.fontString(n,i,a);return{size:n,style:i,family:a,font:o}}function i(t,e,n){return f.isArray(n)?{w:f.longestText(t,t.font,n),h:n.length*e+1.5*(n.length-1)*e}:{w:t.measureText(n).width,h:e}}function a(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function o(t){var o,r,l,s=n(t),u=Math.min(t.height/2,t.width/2),d={r:t.width,l:0,t:t.height,b:0},c={};t.ctx.font=s.font,t._pointLabelSizes=[];var h=e(t);for(o=0;o<h;o++){l=t.getPointPosition(o,u),r=i(t.ctx,s.size,t.pointLabels[o]||""),t._pointLabelSizes[o]=r;var g=t.getIndexAngle(o),p=f.toDegrees(g)%360,m=a(p,l.x,r.w,0,180),v=a(p,l.y,r.h,90,270);m.start<d.l&&(d.l=m.start,c.l=g),m.end>d.r&&(d.r=m.end,c.r=g),v.start<d.t&&(d.t=v.start,c.t=g),v.end>d.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function r(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function l(t){return 0===t||180===t?"center":t<180?"left":"right"}function s(t,e,n,i){if(f.isArray(e))for(var a=n.y,o=1.5*i,r=0;r<e.length;++r)t.fillText(e[r],n.x,a),a+=o;else t.fillText(e,n.x,n.y)}function u(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function d(t){var i=t.ctx,a=f.getValueOrDefault,o=t.options,r=o.angleLines,d=o.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var c=t.getDistanceFromCenterForValue(o.reverse?t.min:t.max),h=n(t);i.textBaseline="top";for(var p=e(t)-1;p>=0;p--){if(r.display){var m=t.getPointPosition(p,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(d.display){var v=t.getPointPosition(p,c+5),b=a(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var x=t.getIndexAngle(p),y=f.toDegrees(x);i.textAlign=l(y),u(y,t._pointLabelSizes[p],v),s(i,t.pointLabels[p]||"",v,h.size)}}}function c(t,n,i,a){var o=t.ctx;if(o.strokeStyle=f.getValueAtIndexOrDefault(n.color,a-1),o.lineWidth=f.getValueAtIndexOrDefault(n.lineWidth,a-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var r=e(t);if(0===r)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var s=1;s<r;s++)l=t.getPointPosition(s,i),o.lineTo(l.x,l.y);o.closePath(),o.stroke()}}function h(t){return f.isNumber(t)?t:0}var f=t.helpers,g=t.defaults.global,p={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:t.Ticks.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}},m=t.LinearScaleBase.extend({setDimensions:function(){var t=this,e=t.options,n=e.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var i=f.min([t.height,t.width]),a=f.getValueOrDefault(n.fontSize,g.defaultFontSize);t.drawingArea=e.display?i/2-(a/2+n.backdropPaddingY):i/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;f.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);f.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(n=Math.min(o,n),i=Math.max(o,i))})}}),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,e=f.getValueOrDefault(t.fontSize,g.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*e)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){this.options.pointLabels.display?o(this):r(this)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),o=Math.max(e.r-i.width,0)/Math.sin(n.r),r=-e.t/Math.cos(n.t),l=-Math.max(e.b-i.height,0)/Math.cos(n.b);a=h(a),o=h(o),r=h(r),l=h(l),i.drawingArea=Math.min(Math.round(t-(a+o)/2),Math.round(t-(r+l)/2)),i.setCenterPoint(a,o,r,l)},setCenterPoint:function(t,e,n,i){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,l=n+a.drawingArea,s=a.height-i-a.drawingArea;a.xCenter=Math.round((r+o)/2+a.left),a.yCenter=Math.round((l+s)/2+a.top)},getIndexAngle:function(t){var n=2*Math.PI/e(this),i=this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0,a=i*Math.PI*2/360;return t*n+a},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var n=e.drawingArea/(e.max-e.min);return e.options.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+n.xCenter,y:Math.round(Math.sin(i)*e)+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,n=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,a=f.getValueOrDefault;if(e.display){var o=t.ctx,r=a(i.fontSize,g.defaultFontSize),l=a(i.fontStyle,g.defaultFontStyle),s=a(i.fontFamily,g.defaultFontFamily),u=f.fontString(r,l,s);f.each(t.ticks,function(l,s){if(s>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]),h=t.yCenter-d;if(n.display&&0!==s&&c(t,n,d,s),i.display){var f=a(i.fontColor,g.defaultFontColor);if(o.font=u,i.showLabelBackdrop){var p=o.measureText(l).width;o.fillStyle=i.backdropColor,o.fillRect(t.xCenter-p/2-i.backdropPaddingX,h-r/2-i.backdropPaddingY,p+2*i.backdropPaddingX,r+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=f,o.fillText(l,t.xCenter,h)}}}),(e.angleLines.display||e.pointLabels.display)&&d(t)}}});t.scaleService.registerScaleType("radialLinear",m,p)}},{}],49:[function(t,e,n){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){function e(t,e){var n=t.options.time;if("string"==typeof n.parser)return i(e,n.parser);if("function"==typeof n.parser)return n.parser(e);if("function"==typeof e.getMonth||"number"==typeof e)return i(e);if(e.isValid&&e.isValid())return e;var a=n.format;return"string"!=typeof a&&a.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser."),a(e)):i(e,a)}function n(t,e,n,i){for(var a,o=Object.keys(l),r=o.length,s=o.indexOf(t);s<r;s++){a=o[s];var u=l[a],d=u.steps&&u.steps[u.steps.length-1]||u.maxStep;if(void 0===d||Math.ceil((n-e)/(d*u.size))<=i)break}return a}function a(t,e,n,i){var a=l[n],o=a.size,r=Math.ceil((e-t)/o),s=1,u=e-t;if(a.steps)for(var d=a.steps.length,c=0;c<d&&r>i;c++)s=a.steps[c],r=Math.ceil(u/(o*s));else for(;r>i&&i>0;)++s,r=Math.ceil(u/(o*s));return s}function o(t,e,n){var a=[];if(t.maxTicks){var o=t.stepSize;a.push(void 0!==t.min?t.min:n.min);for(var r=i(n.min);r.add(o,t.unit).valueOf()<n.max;)a.push(r.valueOf());var l=t.max||n.max;a[a.length-1]!==l&&a.push(l)}return a}var r=t.helpers,l={millisecond:{size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{size:1e3,steps:[1,2,5,10,30]},minute:{size:6e4,steps:[1,2,5,10,30]},hour:{size:36e5,steps:[1,2,3,6,12]},day:{size:864e5,steps:[1,2,5]},week:{size:6048e5,maxStep:4},month:{size:2628e6,maxStep:3},quarter:{size:7884e6,maxStep:4},year:{size:3154e7,maxStep:!1}},s={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}};t.Ticks.generators.time=function(t,e){var n,a,r=t.isoWeekday;return"week"===t.unit&&r!==!1?(n=i(e.min).startOf("isoWeek").isoWeekday(r).valueOf(),a=i(e.max).startOf("isoWeek").isoWeekday(r),e.max-a>0&&a.add(1,"week"),a=a.valueOf()):(n=i(e.min).startOf(t.unit).valueOf(),a=i(e.max).startOf(t.unit),e.max-a>0&&a.add(1,t.unit),a=a.valueOf()),o(t,e,{min:n,max:a})};var u=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},determineDataLimits:function(){var t,n=this,i=n.options.time,a=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER,l=n.chart.data,s={labels:[],datasets:[]};r.each(l.labels,function(r,l){var u=e(n,r);u.isValid()&&(i.round&&u.startOf(i.round),t=u.valueOf(),a=Math.min(t,a),o=Math.max(t,o),s.labels[l]=t)}),r.each(l.datasets,function(l,u){var d=[];"object"==typeof l.data[0]&&null!==l.data[0]&&n.chart.isDatasetVisible(u)?r.each(l.data,function(r,l){var s=e(n,n.getRightValue(r));s.isValid()&&(i.round&&s.startOf(i.round),t=s.valueOf(),a=Math.min(t,a),o=Math.max(t,o),d[l]=t)}):d=s.labels.slice(),s.datasets[u]=d}),n.dataMin=a,n.dataMax=o,n._parsedData=s},buildTicks:function(){var i,o,l=this,s=l.options.time,u=l.dataMin,d=l.dataMax;if(s.min){var c=e(l,s.min);s.round&&c.round(s.round),i=c.valueOf()}s.max&&(o=e(l,s.max).valueOf());var h=l.getLabelCapacity(i||u),f=s.unit||n(s.minUnit,i||u,o||d,h);l.displayFormat=s.displayFormats[f];var g=s.stepSize||a(i||u,o||d,f,h);l.ticks=t.Ticks.generators.time({maxTicks:h,min:i,max:o,stepSize:g,unit:f,isoWeekday:s.isoWeekday},{min:u,max:d}),l.max=r.max(l.ticks),l.min=r.min(l.ticks)},getLabelForIndex:function(t,n){var i=this,a=i.chart.data.labels&&t<i.chart.data.labels.length?i.chart.data.labels[t]:"",o=i.chart.data.datasets[n].data[t];return null!==o&&"object"==typeof o&&(a=i.getRightValue(o)),i.options.time.tooltipFormat&&(a=e(i,a).format(i.options.time.tooltipFormat)),a},tickFormatFunction:function(t,e,n){var i=t.format(this.displayFormat),a=this.options.ticks,o=r.getValueOrDefault(a.callback,a.userCallback);return o?o(i,e,n):i},convertTicksToLabels:function(){var t=this;t.ticksAsTimestamps=t.ticks,t.ticks=t.ticks.map(function(t){return i(t)}).map(t.tickFormatFunction,t)},getPixelForOffset:function(t){var e=this,n=e.max-e.min,i=n?(t-e.min)/n:0;if(e.isHorizontal()){var a=e.width*i;return e.left+Math.round(a)}var o=e.height*i;return e.top+Math.round(o)},getPixelForValue:function(t,n,i){var a=this,o=null;if(void 0!==n&&void 0!==i&&(o=a._parsedData.datasets[i][n]),null===o&&(t&&t.isValid||(t=e(a,a.getRightValue(t))),t&&t.isValid&&t.isValid()&&(o=t.valueOf())),null!==o)return a.getPixelForOffset(o)},getPixelForTick:function(t){return this.getPixelForOffset(this.ticksAsTimestamps[t])},getValueForPixel:function(t){var e=this,n=e.isHorizontal()?e.width:e.height,a=(t-(e.isHorizontal()?e.left:e.top))/n;return i(e.min+a*(e.max-e.min))},getLabelWidth:function(e){var n=this,i=n.options.ticks,a=n.ctx.measureText(e).width,o=Math.cos(r.toRadians(i.maxRotation)),l=Math.sin(r.toRadians(i.maxRotation)),s=r.getValueOrDefault(i.fontSize,t.defaults.global.defaultFontSize);return a*o+s*l},getLabelCapacity:function(t){var e=this;e.displayFormat=e.options.time.displayFormats.millisecond;var n=e.tickFormatFunction(i(t),0,[]),a=e.getLabelWidth(n),o=e.isHorizontal()?e.width:e.height,r=o/a;return r}});t.scaleService.registerScaleType("time",u,s)}},{1:1}]},{},[7])(7)});
obfx_modules/stats/views/dashboard-widget-tpl.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Dashboard Widget View for Stats Module of Orbit Fox.
4
+ *
5
+ * @link https://themeisle.com
6
+ * @since 1.0.0
7
+ *
8
+ * @package Orbit_Fox_Modules
9
+ * @subpackage Orbit_Fox_Modules/stats/views
10
+ * @codeCoverageIgnore
11
+ */
12
+
13
+ $html_title = '';
14
+ if ( trim( $title ) != '' ) {
15
+ $html_title = '<h3>' . $title . ' <small><i> for ' . $display_year . '</i></small></h3>';
16
+ }
17
+
18
+ $html_desc = '';
19
+ if ( trim( $desc ) != '' ) {
20
+ $html_desc = '<hr/><small>' . $desc . '</small>';
21
+ }
22
+
23
+ $posts_data = '';
24
+ $comments_data = '';
25
+ $graph_shows = $this->get_option( 'graph_shows' );
26
+ if ( $graph_shows == 0 || $graph_shows == 2 ) {
27
+ $posts_data = 'data-posts="' . json_encode( $posts_count ) . '"';
28
+ }
29
+ if ( $graph_shows == 1 || $graph_shows == 2 ) {
30
+ $comments_data = 'data-comments="' . json_encode( $comments_count ) . '"';
31
+ }
32
+
33
+ ?>
34
+
35
+ <?php echo $html_title; ?>
36
+ <canvas id="obfxChart" <?php echo $posts_data; ?> <?php echo $comments_data; ?> ></canvas>
37
+ <?php echo $html_desc; ?>
obfx_modules/template-directory/css/admin.css DELETED
@@ -1,323 +0,0 @@
1
- .obfx-template-browser {
2
- padding: 35px 0 0;
3
- }
4
-
5
- .obfx-template-browser .template-name {
6
- margin: 0;
7
- padding: 15px;
8
- font-size: 16px;
9
- font-weight: 600;
10
- float: left;
11
- }
12
-
13
- .obfx-template {
14
- float: left;
15
- background: #fff;
16
- cursor: pointer;
17
- position: relative;
18
- border: 1px solid #ddd;
19
- box-shadow: 0 1px 1px -1px rgba(0,0,0,.1);
20
- box-sizing: border-box;
21
- margin: 0 4% 4% 0;
22
- width: 30.6%;
23
- }
24
-
25
- .obfx-template:nth-child(3n) {
26
- margin-right: 0;
27
- }
28
- .obfx-template:hover .obfx-template-actions,
29
- .obfx-template:hover .obfx-preview-template {
30
- opacity: 1;
31
- }
32
- .obfx-template:hover .obfx-template-screenshot {
33
- opacity: .4;
34
- }
35
-
36
- .obfx-template-actions {
37
- position: absolute;
38
- right: 0;
39
- bottom: 0;
40
- transition: .3s ease;
41
- opacity:0;
42
- background: rgba(244,244,244,.7);
43
- border-left: 1px solid rgba(0,0,0,.05);
44
- float: right;
45
- padding: 10px 15px;
46
- }
47
-
48
- .obfx-template-actions .button .dashicons {
49
- line-height: 27px;
50
- }
51
-
52
- .obfx-template-actions .button {
53
- margin-left: 5px;
54
- }
55
-
56
- .obfx-template-screenshot {
57
- background: #fff;
58
- display: inline-block;
59
- overflow: hidden;
60
- position: relative;
61
- border: 1px solid #ddd;
62
- border-right: none;
63
- border-left: none;
64
- float: left;
65
- transition: .3s ease;
66
- width: 100%;
67
- }
68
-
69
- .obfx-template img {
70
- float: left;
71
- width: 100%;
72
- }
73
-
74
- .obfx-template-browser.customizer {
75
- display: block !important;
76
- padding: 10px 20px 60px;
77
- }
78
-
79
- .obfx-next-prev {
80
- position: absolute;
81
- left: 45px;
82
- }
83
-
84
- .obfx-next-prev span:hover {
85
- border-color: #ccc;
86
- outline: 0;
87
- color: #000;
88
- background: #ddd;
89
- box-shadow: none;
90
- }
91
-
92
- .obfx-next-prev .previous-template,
93
- .obfx-next-prev .next-template {
94
- display: block;
95
- float: left;
96
- position: relative;
97
- width: 45px;
98
- height: 45px;
99
- padding-right: 2px;
100
- border: none;
101
- border-right: 1px solid #ddd;
102
- color: #444;
103
- background: #eee;
104
- text-decoration: none;
105
- cursor: pointer;
106
- -webkit-transition: color 0.1s ease-in-out,background 0.1s ease-in-out;
107
- transition: color 0.1s ease-in-out,background 0.1s ease-in-out;
108
- }
109
-
110
- .obfx-next-prev .previous-template {
111
- border-left: 1px solid #ddd;
112
- }
113
-
114
- .obfx-next-prev .next-template:before {
115
- position: relative;
116
- top: 6px;
117
- left: 14px;
118
- font: 400 20px/1 dashicons;
119
- content: "\f345";
120
- }
121
-
122
- .obfx-next-prev .previous-template:before {
123
- position: relative;
124
- top: 6px;
125
- left: 14px;
126
- font: 400 20px/1 dashicons;
127
- content: "\f341";
128
- }
129
-
130
- .obfx-custom-customizer {
131
- background: #fff;
132
- }
133
-
134
- .obfx-template-browser.customizer .obfx-template.active {
135
- display: inline-block;
136
- }
137
-
138
- .customize-controls-preview-toggle {
139
- float: left;
140
- position: relative;
141
- left: 120px;
142
- }
143
-
144
- .obfx-template-browser.customizer .template-name {
145
- padding-left: 0;
146
- }
147
-
148
- .obfx-template-browser.customizer .obfx-template-screenshot {
149
- border: 1px solid #ddd;
150
- }
151
-
152
- .obfx-hide {
153
- display: none;
154
- }
155
-
156
- .obfx-import-elementor-hidden-form {
157
- display: inline-block;
158
- }
159
-
160
- .obfx-done-import {
161
- display: block;
162
- text-align: center;
163
- padding-top: 10px;
164
- margin: 0;
165
- color: green;
166
- }
167
-
168
- .obfx-done-import .dashicons {
169
- font-size: 30px;
170
- }
171
-
172
- .obfx-updating.updating-message.button.button-primary {
173
- padding: 0 4px 0 10px;
174
- }
175
-
176
- .obfx-no-elementor-modal-wrapper {
177
- display: none;
178
- position: fixed;
179
- z-index: 900000;
180
- top: 0;
181
- right: 0;
182
- bottom: 0;
183
- left: 0;
184
- margin: 0 auto;
185
- background: rgba(0, 0, 0, 0.8);
186
- }
187
-
188
- .obfx-no-elementor-modal {
189
- position: relative;
190
- top: 50%;
191
- width: auto;
192
- max-width: 550px;
193
- margin: 0 auto;
194
- padding: 20px;
195
- background-color: #fff;
196
- text-align: right;
197
- -webkit-transform: translateY(-50%);
198
- -ms-transform: translateY(-50%);
199
- transform: translateY(-50%);
200
- }
201
-
202
- .obfx-no-elementor-modal p {
203
- margin: 30px 0 20px;
204
- text-align: left;
205
- }
206
-
207
- .obfx-no-elementor-modal .modal-header {
208
- display: inline-block;
209
- position: absolute;
210
- top: 0;
211
- left: 0;
212
- width: 100%;
213
- height: 30px;
214
- border-bottom: 1px solid #d4d4d4;
215
- background: #e6e6e6;
216
- }
217
-
218
- .obfx-close-modal {
219
- float: right;
220
- position: absolute;
221
- top: 5px;
222
- right: 5px;
223
- color: #7b7b7b;
224
- cursor: pointer;
225
- }
226
-
227
-
228
- .obfx-template-preview.theme-install-overlay .install-theme-info.obfx-theme-info .theme-screenshot{
229
- width: 100%;
230
- }
231
- .obfx-template-preview.theme-install-overlay .install-theme-info.obfx-theme-info {
232
- display: none;
233
- }
234
-
235
- .obfx-template-preview.theme-install-overlay .install-theme-info.obfx-theme-info.active {
236
- display: block;
237
- }
238
-
239
- .more-details.obfx-preview-template {
240
- transition: .3s ease;
241
- cursor: pointer;
242
- position: absolute;
243
- top: 0;
244
- bottom: 51px;
245
- left: 0;
246
- right: 0;
247
- text-align: center;
248
- z-index: 100;
249
- opacity:0;
250
- }
251
-
252
- .more-details.obfx-preview-template span {
253
- background: #23282d;
254
- background: rgba(0,0,0,.7);
255
- color: #fff;
256
- font-size: 15px;
257
- text-shadow: 0 1px 0 rgba(0,0,0,.6);
258
- -webkit-font-smoothing: antialiased;
259
- font-weight: 600;
260
- padding: 15px 12px;
261
- text-align: center;
262
- border-radius: 3px;
263
- transform: translate(-50%, -50%);
264
- position: relative;
265
- left: 50%;
266
- top: 50%;
267
- width: 45%;
268
- display: block;
269
- }
270
-
271
- .obfx-required-plugins > p {
272
- color: #333;
273
- font-weight: 800;
274
- margin-top: 20px;
275
- }
276
-
277
- .obfx-required-plugins .button {
278
- display: none;
279
- }
280
- @media only screen and (min-width: 1640px) {
281
- .obfx-template {
282
- width: 22.7%;
283
- margin: 0 3% 3% 0;
284
- }
285
- .obfx-template:nth-child(3n) {
286
- margin-right: 3%;
287
- }
288
- .obfx-template:nth-child(4n) {
289
- margin-right: 0;
290
- }
291
- }
292
-
293
- @media only screen and (max-width: 1120px){
294
- .obfx-template {
295
- width: 47.5%;
296
- margin: 0 3% 3% 0;
297
- }
298
- .obfx-template:nth-child(3n) {
299
- margin-right: 3%;
300
- }
301
- .obfx-template:nth-child(even) {
302
- margin-right: 0;
303
- }
304
- }
305
-
306
- @media only screen and (max-width: 600px) {
307
- .obfx-template-preview .wp-full-overlay-sidebar {
308
- width: 100%;
309
- }
310
- }
311
-
312
- @media only screen and (min-width: 2000px) {
313
- .obfx-template {
314
- width: 17.6%;
315
- margin: 0 3% 3% 0;
316
- }
317
- .obfx-template:nth-child(4n) {
318
- margin-right: 3%;
319
- }
320
- .obfx-template:nth-child(5n) {
321
- margin-right: 0;
322
- }
323
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/template-directory/init.php DELETED
@@ -1,450 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * The Orbit Fox Template Directory Module.
5
- *
6
- * @link https://themeisle.com
7
- * @since 1.0.0
8
- *
9
- * @package Template_Directory_OBFX_Module
10
- */
11
-
12
- use Elementor\TemplateLibrary\Classes;
13
-
14
- /**
15
- * The class defines a new module to be used by Orbit Fox plugin.
16
- *
17
- * @package Template_Directory_OBFX_Module
18
- * @author Themeisle <friends@themeisle.com>
19
- */
20
- class Template_Directory_OBFX_Module extends Orbit_Fox_Module_Abstract {
21
-
22
- /**
23
- * Template_Directory_OBFX_Module constructor.
24
- *
25
- * @since 1.0.0
26
- * @access public
27
- */
28
- public function __construct() {
29
- parent::__construct();
30
- $this->name = __( 'Template Directory Module', 'themeisle-companion' );
31
- $this->description = __( 'The awesome template directory is aiming to provide a wide range of templates that you can import straight into your website.', 'themeisle-companion' );
32
- $this->active_default = true;
33
- }
34
-
35
- /**
36
- * Determine if module should be loaded.
37
- *
38
- * @since 1.0.0
39
- * @access public
40
- * @return bool
41
- */
42
- public function enable_module() {
43
- return true;
44
- }
45
-
46
- /**
47
- * The loading logic for the module.
48
- *
49
- * @since 1.0.0
50
- * @access public
51
- */
52
- public function load() {
53
- return true;
54
- }
55
-
56
- /**
57
- * Method to define hooks needed.
58
- *
59
- * @since 1.0.0
60
- * @access public
61
- */
62
- public function hooks() {
63
- $this->loader->add_action( 'rest_api_init', $this, 'register_endpoints' );
64
- //Add dashboard menu page.
65
- $this->loader->add_action( 'admin_menu', $this, 'add_menu_page', 100 );
66
- //Add rewrite endpoint.
67
- $this->loader->add_action( 'init', $this, 'demo_listing_register' );
68
- //Add template redirect.
69
- $this->loader->add_action( 'template_redirect', $this, 'demo_listing' );
70
- //Enqueue admin scripts.
71
- $this->loader->add_action( 'admin_enqueue_scripts', $this, 'enqueue_template_dir_scripts' );
72
- }
73
-
74
- /**
75
- * Enqueue the scripts for the dashboard page of the
76
- */
77
- public function enqueue_template_dir_scripts() {
78
- $current_screen = get_current_screen();
79
- if ( $current_screen->id == 'orbit-fox_page_obfx_template_dir' ) {
80
- $script_handle = $this->slug . '-script';
81
- wp_enqueue_script( 'plugin-install' );
82
- wp_enqueue_script( 'updates' );
83
- wp_register_script( $script_handle, plugin_dir_url( $this->get_dir() ) . $this->slug . '/js/script.js', array( 'jquery' ), $this->version );
84
- wp_localize_script( $script_handle, 'importer_endpoint',
85
- array(
86
- 'url' => $this->get_endpoint_url( '/import_elementor' ),
87
- 'nonce' => wp_create_nonce( 'wp_rest' ),
88
- ) );
89
- wp_enqueue_script( $script_handle );
90
- }
91
- }
92
-
93
- /**
94
- *
95
- *
96
- * @param string $path
97
- *
98
- * @return string
99
- */
100
- public function get_endpoint_url( $path = '' ) {
101
- return rest_url( $this->slug . $path );
102
- }
103
-
104
- /**
105
- * Method that returns an array of scripts and styles to be loaded
106
- * for the front end part.
107
- *
108
- * @since 1.0.0
109
- * @access public
110
- * @return array
111
- */
112
- public function public_enqueue() {
113
- return array();
114
- }
115
-
116
- /**
117
- * Method that returns an array of scripts and styles to be loaded
118
- * for the admin part.
119
- *
120
- * @since 1.0.0
121
- * @access public
122
- * @return array|boolean
123
- */
124
- public function admin_enqueue() {
125
- $current_screen = get_current_screen();
126
- if ( ! isset( $current_screen->id ) ) {
127
- return array();
128
- }
129
-
130
- if ( ! ( $current_screen->id == 'orbit-fox_page_obfx_template_dir' ) && ( ! $current_screen == 'customize' ) ) {
131
- return array();
132
- }
133
-
134
- $enqueue = array(
135
- 'css' => array(
136
- 'admin' => array(),
137
- ),
138
- );
139
- return $enqueue;
140
- }
141
-
142
- /**
143
- * Register Rest endpoint for requests.
144
- */
145
- public function register_endpoints() {
146
- register_rest_route( $this->slug, '/import_elementor', array(
147
- 'methods' => 'POST',
148
- 'callback' => array( $this, 'import_elementor' ),
149
- ) );
150
- }
151
-
152
- /**
153
- * The templates list.
154
- *
155
- * @return array
156
- */
157
- public function templates_list() {
158
- $repository_raw_url = 'https://raw.githubusercontent.com/Codeinwp/obfx-templates/master/';
159
- $defaults_if_empty = array(
160
- 'title' => __( 'A new Orbit Fox Template', 'themeisle-companion' ),
161
- 'screenshot' => esc_url( 'https://raw.githubusercontent.com/Codeinwp/obfx-templates/master/placeholder.png' ),
162
- 'description' => __( 'This is an awesome Orbit Fox Template.', 'themeisle-companion' ),
163
- 'demo_url' => esc_url( 'https://demo.themeisle.com/hestia-pro-demo-content/demo-placeholder/' ),
164
- 'import_file' => '',
165
- 'required_plugins' => array( 'elementor' => array( 'title' => __( 'Elementor Page Builder', 'themeisle-companion' ) ) ),
166
- );
167
-
168
- $templates_list = array(
169
- 'about-our-business-elementor' => array(
170
- 'title' => __( 'About Our Business', 'themeisle-companion' ),
171
- 'description' => __( 'Use this layout to present your business in a fancy way. Add an interactive header, shwocase your services via progress bars, introduce your team members, and locate your headquarters on Google Maps. Last but not least, beautify the design by adding catchy images.', 'themeisle-companion' ),
172
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/about-our-business-elementor/',
173
- 'screenshot' => esc_url( $repository_raw_url . 'about-our-business-elementor/screenshot.png' ),
174
- 'import_file' => esc_url( $repository_raw_url . 'about-our-business-elementor/template.json' ),
175
- ),
176
- 'contact-us-elementor' => array(
177
- 'title' => __( 'Contact Us', 'themeisle-companion' ),
178
- 'description' => __( 'A clean and simple template for your Contact page, where we integrated our Pirate Forms plugin. It will let your customers send you a message using an intuitive form. A Google map, together with a few other details about your business, completes the section.', 'themeisle-companion' ),
179
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/contact-us-elementor/',
180
- 'screenshot' => esc_url( $repository_raw_url . 'contact-us-elementor/screenshot.png' ),
181
- 'import_file' => esc_url( $repository_raw_url . 'contact-us-elementor/template.json' ),
182
- ),
183
- 'pricing-elementor' => array(
184
- 'title' => __( 'Pricing', 'themeisle-companion' ),
185
- 'description' => __( 'If you plan to sell your products online, this layout offers you elegant pricing tables so you can differentiate the features and services for your clients. Also, for a better clarification, the template provides a FAQ area where you can answer people\'s questions.', 'themeisle-companion' ),
186
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/pricing-elementor/',
187
- 'screenshot' => esc_url( $repository_raw_url . 'pricing-elementor/screenshot.png' ),
188
- 'import_file' => esc_url( $repository_raw_url . 'pricing-elementor/template.json' ),
189
- ),
190
- 'material-homepage-elementor' => array(
191
- 'title' => __( 'Material Homepage', 'themeisle-companion' ),
192
- 'description' => __( 'This layout could be your main website homepage (or you can use it as an alternative homepage, if you wish). It was built on material design and comes with call to action, catchy icons, testimonials, blog posts, pricing plans, and other sections that you can add yourself by customizing it.', 'themeisle-companion' ),
193
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/material-homepage-elementor/',
194
- 'screenshot' => esc_url( $repository_raw_url . 'material-homepage-elementor/screenshot.png' ),
195
- 'import_file' => esc_url( $repository_raw_url . 'material-homepage-elementor/template.json' ),
196
- ),
197
- 'ether-elementor' => array(
198
- 'title' => __( 'Ether - Landing Page', 'themeisle-companion' ),
199
- 'description' => __( 'An elegant and modern landing page for e-commerce, coming with a clean interface, beautiful typography, photo galleries, and call to action. If you have an online shop and want to promote a certain product, use this layout to tell people why they should buy it.', 'themeisle-companion' ),
200
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/ether-elementor/',
201
- 'screenshot' => esc_url( $repository_raw_url . 'ether-elementor/screenshot.png' ),
202
- 'import_file' => esc_url( $repository_raw_url . 'ether-elementor/template.json' ),
203
- ),
204
- 'jason-elementor' => array(
205
- 'title' => __( 'Jason - Landing Page', 'themeisle-companion' ),
206
- 'description' => __( 'A classy template for freelancers, where you can put your skills and knowldge in the spotlight for potential clients. Talk about yourself, your projects, awards, and let people contact you easily. The template is designed to feature one-page scrolling.', 'themeisle-companion' ),
207
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/jason-elementor/',
208
- 'screenshot' => esc_url( $repository_raw_url . 'jason-elementor/screenshot.png' ),
209
- 'import_file' => esc_url( $repository_raw_url . 'jason-elementor/template.json' ),
210
- ),
211
- 'pulse-elementor' => array(
212
- 'title' => __( 'Pulse - Landing Page', 'themeisle-companion' ),
213
- 'description' => __( 'A good-looking landing page for products and apps, built to mark the features and services that they offer. The layout provides customer reviews, call to action, beautiful pricing tables, an About section, and a creative design. If you want to promote and sell your brand product, this template might help.', 'themeisle-companion' ),
214
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/pulse-elementor/',
215
- 'screenshot' => esc_url( $repository_raw_url . 'pulse-elementor/screenshot.png' ),
216
- 'import_file' => esc_url( $repository_raw_url . 'pulse-elementor/template.json' ),
217
- ),
218
- 'ascend-elementor' => array(
219
- 'title' => __( 'Ascend - Landing Page', 'themeisle-companion' ),
220
- 'description' => __( 'A resume-like template, built for outdoor enthusiasts and nature lovers. Its design and layout make it flexible for any other purpose too, so do not hesitate to showcase any kind of skills and activities, even business-oriented.', 'themeisle-companion' ),
221
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/ascend-elementor/',
222
- 'screenshot' => esc_url( $repository_raw_url . 'ascend-elementor/screenshot.png' ),
223
- 'import_file' => esc_url( $repository_raw_url . 'ascend-elementor/template.json' ),
224
- ),
225
- 'path-elementor' => array(
226
- 'title' => __( 'Path - Landing Page', 'themeisle-companion' ),
227
- 'description' => __( 'If you are a business consultant - agency or working on your own - have a look at this template! It comes with a clean design, call to action, statistics, and sections that put your services first.', 'themeisle-companion' ),
228
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/path-elementor/',
229
- 'screenshot' => esc_url( $repository_raw_url . 'path-elementor/screenshot.png' ),
230
- 'import_file' => esc_url( $repository_raw_url . 'path-elementor/template.json' ),
231
- ),
232
- 'mocha-elementor' => array(
233
- 'title' => __( 'Mocha - Landing Page', 'themeisle-companion' ),
234
- 'description' => __( 'An elegant and modern template for cafes and pubs, where you can display your menu in a mouth-watering way. Call to action, blog posts, attractive images, tabbed menus, and a catchy design will help you convince more people to stop by.', 'themeisle-companion' ),
235
- 'demo_url' => 'https://demo.themeisle.com/hestia-pro-demo-content/mocha-elementor/',
236
- 'screenshot' => esc_url( $repository_raw_url . 'mocha-elementor/screenshot.png' ),
237
- 'import_file' => esc_url( $repository_raw_url . 'mocha-elementor/template.json' ),
238
- ),
239
- );
240
-
241
- foreach ( $templates_list as $template => $properties ) {
242
- $templates_list[ $template ] = wp_parse_args( $properties, $defaults_if_empty );
243
- }
244
-
245
- return $templates_list;
246
- }
247
-
248
- /**
249
- * Register endpoint for themes page.
250
- */
251
- public function demo_listing_register() {
252
- add_rewrite_endpoint( 'obfx_templates', EP_ROOT );
253
- }
254
-
255
- /**
256
- * Return template preview in customizer.
257
- *
258
- * @return bool|string
259
- */
260
- public function demo_listing() {
261
- $flag = get_query_var( 'obfx_templates', false );
262
-
263
- if ( $flag !== '' ) {
264
- return false;
265
- }
266
- if ( ! current_user_can( 'customize' ) ) {
267
- return false;
268
- }
269
- if ( ! is_customize_preview() ) {
270
- return false;
271
- }
272
-
273
- return $this->render_view( 'template-directory-render-template' );
274
- }
275
-
276
- /**
277
- * Add the 'Template Directory' page to the dashboard menu.
278
- */
279
- public function add_menu_page() {
280
- add_submenu_page(
281
- 'obfx_companion', __( 'Orbit Fox Template Directory', 'themeisle-companion' ), __( 'Template Directory', 'themeisle-companion' ), 'manage_options', 'obfx_template_dir',
282
- array( $this, 'render_admin_page' )
283
- );
284
- }
285
-
286
- /**
287
- * Render the template directory admin page.
288
- */
289
- public function render_admin_page() {
290
- $data = array(
291
- 'templates_array' => $this->templates_list(),
292
- );
293
- echo $this->render_view( 'template-directory-page', $data );
294
- }
295
-
296
- /**
297
- * Utility method to call Elementor import routine.
298
- */
299
- public function import_elementor() {
300
- if ( ! defined( 'ELEMENTOR_VERSION' ) ) {
301
- return 'no-elementor';
302
- }
303
-
304
- require_once( ABSPATH . 'wp-admin' . '/includes/file.php' );
305
- require_once( ABSPATH . 'wp-admin' . '/includes/image.php' );
306
-
307
- $template = download_url( esc_url( $_POST['template_url'] ) );
308
- $_FILES['file']['tmp_name'] = $template;
309
- $elementor = new Elementor\TemplateLibrary\Source_Local;
310
- $elementor->import_template();
311
- unlink( $template );
312
-
313
- $args = array(
314
- 'post_type' => 'elementor_library',
315
- 'nopaging' => true,
316
- 'posts_per_page' => '1',
317
- 'orderby' => 'date',
318
- 'order' => 'DESC',
319
- 'suppress_filters' => true,
320
- );
321
-
322
- $query = new WP_Query( $args );
323
-
324
- $last_template_added = $query->posts[0];
325
- //get template id
326
- $template_id = $last_template_added->ID;
327
-
328
- wp_reset_query();
329
- wp_reset_postdata();
330
-
331
- //page content
332
- $page_content = $last_template_added->post_content;
333
- //meta fields
334
- $elementor_data_meta = get_post_meta( $template_id, '_elementor_data' );
335
- $elementor_ver_meta = get_post_meta( $template_id, '_elementor_version' );
336
- $elementor_edit_mode_meta = get_post_meta( $template_id, '_elementor_edit_mode' );
337
- $elementor_css_meta = get_post_meta( $template_id, '_elementor_css' );
338
-
339
- $elementor_metas = array(
340
- '_elementor_data' => ! empty( $elementor_data_meta[0] ) ? wp_slash( $elementor_data_meta[0] ) : '',
341
- '_elementor_version' => ! empty( $elementor_ver_meta[0] ) ? $elementor_ver_meta[0] : '',
342
- '_elementor_edit_mode' => ! empty( $elementor_edit_mode_meta[0] ) ? $elementor_edit_mode_meta[0] : '',
343
- '_elementor_css' => $elementor_css_meta,
344
- );
345
-
346
- // Create post object
347
- $new_template_page = array(
348
- 'post_type' => 'page',
349
- 'post_title' => $_POST['template_name'],
350
- 'post_status' => 'publish',
351
- 'post_content' => $page_content,
352
- 'meta_input' => $elementor_metas,
353
- );
354
-
355
- $current_theme = wp_get_theme();
356
- switch ( $current_theme->get_template() ) {
357
- case 'hestia-pro':
358
- case 'hestia':
359
- $new_template_page['page_template'] = 'page-templates/template-pagebuilder-full-width.php';
360
- break;
361
- case 'zerif-lite':
362
- case 'zerif-pro':
363
- $new_template_page['page_template'] = 'template-fullwidth-no-title.php';
364
- break;
365
- }
366
-
367
- $post_id = wp_insert_post( $new_template_page );
368
-
369
- $redirect_url = add_query_arg( array(
370
- 'post' => $post_id,
371
- 'action' => 'elementor',
372
- ), admin_url( 'post.php' ) );
373
-
374
- return ( $redirect_url );
375
-
376
- die();
377
- }
378
-
379
- /**
380
- * Options array for the Orbit Fox module.
381
- *
382
- * @return array
383
- */
384
- public function options() {
385
- return array();
386
- }
387
-
388
- /**
389
- * Generate action button html.
390
- *
391
- * @param string $slug plugin slug.
392
- *
393
- * @return string
394
- */
395
- public function get_button_html( $slug ) {
396
- $button = '';
397
- $state = $this->check_plugin_state( $slug );
398
- if ( ! empty( $slug ) ) {
399
- switch ( $state ) {
400
- case 'install':
401
- $nonce = wp_nonce_url(
402
- add_query_arg(
403
- array(
404
- 'action' => 'install-plugin',
405
- 'from' => 'import',
406
- 'plugin' => $slug,
407
- ),
408
- network_admin_url( 'update.php' )
409
- ),
410
- 'install-plugin_' . $slug
411
- );
412
- $button .= '<a data-slug="' . $slug . '" class="install-now obfx-install-plugin button button-primary" href="' . esc_url( $nonce ) . '" data-name="' . $slug . '" aria-label="Install ' . $slug . '">' . __( 'Install and activate', 'themeisle-companion' ) . '</a>';
413
- break;
414
- case 'activate':
415
- $plugin_link_suffix = $slug . '/' . $slug . '.php';
416
- $nonce = add_query_arg(
417
- array(
418
- 'action' => 'activate',
419
- 'plugin' => rawurlencode( $plugin_link_suffix ),
420
- '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $plugin_link_suffix ),
421
- ), network_admin_url( 'plugins.php' )
422
- );
423
- $button .= '<a data-slug="' . $slug . '" class="activate-now button button-primary" href="' . esc_url( $nonce ) . '" aria-label="Activate ' . $slug . '">' . __( 'Activate', 'themeisle-companion' ) . '</a>';
424
- break;
425
- }// End switch().
426
- }// End if().
427
- return $button;
428
- }
429
-
430
- /**
431
- * Check plugin state.
432
- *
433
- * @param string $slug plugin slug.
434
- *
435
- * @return bool
436
- */
437
- public function check_plugin_state( $slug ) {
438
- if ( file_exists( WP_CONTENT_DIR . '/plugins/' . $slug . '/' . $slug . '.php' ) || file_exists( WP_CONTENT_DIR . '/plugins/' . $slug . '/index.php' ) ) {
439
- require_once( ABSPATH . 'wp-admin' . '/includes/plugin.php' );
440
- $needs = ( is_plugin_active( $slug . '/' . $slug . '.php' ) ||
441
- is_plugin_active( $slug . '/index.php' ) ) ?
442
- 'deactivate' : 'activate';
443
-
444
- return $needs;
445
- } else {
446
- return 'install';
447
- }
448
- }
449
-
450
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/template-directory/js/script.js DELETED
@@ -1,221 +0,0 @@
1
- /* global importer_endpoint, console */
2
-
3
- /**
4
- * Template Directory Customizer Admin Dashboard Script
5
- *
6
- * This handles the template directory.
7
- *
8
- * @since 1.0.0
9
- * @package obfx_modules/template-directory/js
10
- *
11
- * @author ThemeIsle
12
- */
13
-
14
- var obfx_template_directory = function ( $ ) {
15
- 'use strict';
16
-
17
- $(
18
- function () {
19
-
20
- // Handle import click.
21
- $( '.wp-full-overlay-header' ).on(
22
- 'click', '.obfx-import-template', function () {
23
- $( this ).addClass( 'obfx-import-queue updating-message obfx-updating' ).html( '' );
24
- $( '.obfx-template-preview .close-full-overlay, .obfx-next-prev' ).remove();
25
- var template_url = $( this ).data( 'template-file' );
26
- var template_name = $( this ).data( 'template-title' );
27
- if ( $( '.active .obfx-installable' ).length || $( '.active .obfx-activate' ).length ) {
28
- checkAndInstallPlugins();
29
- } else {
30
- $.ajax(
31
- {
32
- url: importer_endpoint.url,
33
- beforeSend: function ( xhr ) {
34
- $( '.obfx-import-queue' ).addClass( 'obfx-updating' ).html( '' );
35
- xhr.setRequestHeader( 'X-WP-Nonce', importer_endpoint.nonce );
36
- },
37
- // async: false,
38
- data: {
39
- template_url: template_url,
40
- template_name: template_name
41
- },
42
- type: 'POST',
43
- success: function ( data ) {
44
- $( '.obfx-updating' ).replaceWith( '<span class="obfx-done-import"><i class="dashicons-yes dashicons"></i></span>' );
45
- location.href = data;
46
- },
47
- error: function ( error ) {
48
- console.error( error );
49
- },
50
- complete: function() {
51
- $( '.obfx-updating' ).replaceWith( '<span class="obfx-done-import"><i class="dashicons-yes dashicons"></i></span>' );
52
- }
53
- }, 'json'
54
- );
55
- }
56
- }
57
- );
58
-
59
- function checkAndInstallPlugins() {
60
- var installable = $( '.active .obfx-installable' );
61
- var toActivate = $( '.active .obfx-activate' );
62
- if ( installable.length || toActivate.length ) {
63
-
64
- $( installable ).each(
65
- function () {
66
- var plugin = $( this );
67
- $( plugin ).removeClass( 'obfx-installable' ).addClass( 'obfx-installing' );
68
- $( plugin ).find( 'span.dashicons' ).replaceWith( '<span class="dashicons dashicons-update" style="-webkit-animation: rotation 2s infinite linear; animation: rotation 2s infinite linear; color: #ffb227 "></span>' );
69
- var slug = $( this ).find( '.obfx-install-plugin' ).attr( 'data-slug' );
70
- wp.updates.installPlugin(
71
- {
72
- slug: slug,
73
- success: function ( response ) {
74
- activatePlugin( response.activateUrl, plugin );
75
- }
76
- }
77
- );
78
- }
79
- );
80
-
81
- $( toActivate ).each(
82
- function () {
83
- var plugin = $( this );
84
- var activateUrl = $( plugin ).find( '.activate-now' ).attr( 'href' );
85
- if (typeof activateUrl !== 'undefined') {
86
- activatePlugin( activateUrl, plugin );
87
- }
88
- }
89
- );
90
- }
91
- }
92
-
93
- function activatePlugin( activationUrl, plugin ) {
94
- $.ajax(
95
- {
96
- type: 'GET',
97
- url: activationUrl,
98
- beforeSend: function() {
99
- $( plugin ).removeClass( 'obfx-activate' ).addClass( 'obfx-installing' );
100
- $( plugin ).find( 'span.dashicons' ).replaceWith( '<span class="dashicons dashicons-update" style="-webkit-animation: rotation 2s infinite linear; animation: rotation 2s infinite linear; color: #ffb227 "></span>' );
101
- },
102
- success: function () {
103
- $( plugin ).find( '.dashicons' ).replaceWith( '<span class="dashicons dashicons-yes" style="color: #34a85e"></span>' );
104
- $( plugin ).removeClass( 'obfx-installing' );
105
- },
106
- complete: function() {
107
- if ( $( '.active .obfx-installing' ).length === 0 ) {
108
- $( '.obfx-import-queue' ).trigger( 'click' );
109
- }
110
- }
111
- }
112
- );
113
- }
114
-
115
- // Handle sidebar collapse in preview.
116
- $( '.obfx-template-preview' ).on(
117
- 'click', '.collapse-sidebar', function () {
118
- event.preventDefault();
119
- var overlay = $( '.obfx-template-preview' );
120
- if ( overlay.hasClass( 'expanded' ) ) {
121
- overlay.removeClass( 'expanded' );
122
- overlay.addClass( 'collapsed' );
123
- return false;
124
- }
125
-
126
- if ( overlay.hasClass( 'collapsed' ) ) {
127
- overlay.removeClass( 'collapsed' );
128
- overlay.addClass( 'expanded' );
129
- return false;
130
- }
131
- }
132
- );
133
-
134
- // Handle responsive buttons.
135
- $( '.obfx-responsive-preview' ).on(
136
- 'click', 'button', function () {
137
- $( '.obfx-template-preview' ).removeClass( 'preview-mobile preview-tablet preview-desktop' );
138
- var deviceClass = 'preview-' + $( this ).data( 'device' );
139
- $( '.obfx-responsive-preview button' ).each(
140
- function () {
141
- $( this ).attr( 'aria-pressed', 'false' );
142
- $( this ).removeClass( 'active' );
143
- }
144
- );
145
-
146
- $( '.obfx-responsive-preview' ).removeClass( $( this ).attr( 'class' ).split( ' ' ).pop() );
147
- $( '.obfx-template-preview' ).addClass( deviceClass );
148
- $( this ).addClass( 'active' );
149
- }
150
- );
151
-
152
- // Hide preview.
153
- $( '.close-full-overlay' ).on(
154
- 'click', function () {
155
- $( '.obfx-template-preview .obfx-theme-info.active' ).removeClass( 'active' );
156
- $( '.obfx-template-preview' ).hide();
157
- $( '.obfx-template-frame' ).attr( 'src', '' );
158
- }
159
- );
160
-
161
- // Open preview routine.
162
- $( '.obfx-preview-template' ).on(
163
- 'click', function () {
164
- var templateSlug = $( this ).data( 'template-slug' );
165
- var previewUrl = $( this ).data( 'demo-url' );
166
- $( '.obfx-template-frame' ).attr( 'src', previewUrl );
167
- $( '.obfx-theme-info.' + templateSlug ).addClass( 'active' );
168
- setupImportButton();
169
- $( '.obfx-template-preview' ).fadeIn();
170
- }
171
- );
172
-
173
- // Handle left-right navigation between templates.
174
- $( '.obfx-next-prev .next-theme' ).on(
175
- 'click', function () {
176
- var active = $( '.obfx-theme-info.active' ).removeClass( 'active' );
177
- if ( active.next() && active.next().length ) {
178
- active.next().addClass( 'active' );
179
- } else {
180
- active.siblings( ':first' ).addClass( 'active' );
181
- }
182
- changePreviewSource();
183
- setupImportButton();
184
- }
185
- );
186
- $( '.obfx-next-prev .previous-theme' ).on(
187
- 'click', function () {
188
- var active = $( '.obfx-theme-info.active' ).removeClass( 'active' );
189
- if ( active.prev() && active.prev().length ) {
190
- active.prev().addClass( 'active' );
191
- } else {
192
- active.siblings( ':last' ).addClass( 'active' );
193
- }
194
- changePreviewSource();
195
- setupImportButton();
196
- }
197
- );
198
-
199
- // Change preview source.
200
- function changePreviewSource() {
201
- var previewUrl = $( '.obfx-theme-info.active' ).data( 'demo-url' );
202
- $( '.obfx-template-frame' ).attr( 'src', previewUrl );
203
- }
204
-
205
- function setupImportButton() {
206
- var installable = $( '.active .obfx-installable' );
207
- if ( installable.length > 0 ) {
208
- $( '.wp-full-overlay-header .obfx-import-template' ).text( 'Install and Import' );
209
- } else {
210
- $( '.wp-full-overlay-header .obfx-import-template' ).text( 'Import' );
211
- }
212
- var activeTheme = $( '.obfx-theme-info.active' );
213
- var button = $( '.wp-full-overlay-header .obfx-import-template' );
214
- $( button ).attr( 'data-template-file', $( activeTheme ).data( 'template-file' ) );
215
- $( button ).attr( 'data-template-title', $( activeTheme ).data( 'template-title' ) );
216
- }
217
- }
218
- );
219
- };
220
-
221
- obfx_template_directory( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/template-directory/views/template-directory-page-tpl.php DELETED
@@ -1,128 +0,0 @@
1
- <?php
2
- /**
3
- * The View for Rendering the Template Directory Main Dashboard Page.
4
- *
5
- * @link https://themeisle.com
6
- * @since 2.0.0
7
- *
8
- * @package Orbit_Fox_Modules
9
- * @subpackage Orbit_Fox_Modules/template-directory
10
- * @codeCoverageIgnore
11
- */
12
-
13
- $preview_url = add_query_arg( 'obfx_templates', '', home_url() ); // Define query arg for custom endpoint.
14
-
15
- $html = '';
16
-
17
- if ( is_array( $templates_array ) ) {
18
- $html .= '<div class="obfx-template-dir wrap">';
19
- $html .= '<h1 class="wp-heading-inline">' . __( 'Orbit Fox Template Directory', 'themeisle-companion' ) . '</h1>';
20
- $html .= '<div class="obfx-template-browser">';
21
-
22
- foreach ( $templates_array as $template => $properties ) {
23
- $html .= '<div class="obfx-template">';
24
- $html .= '<div class="more-details obfx-preview-template" data-demo-url="' . esc_url( $properties['demo_url'] ) . '" data-template-slug="' . esc_attr( $template ) . '" ><span>' . __( 'More Details', 'themeisle-companion' ) . '</span></div>';
25
- $html .= '<div class="obfx-template-screenshot">';
26
- $html .= '<img src="' . esc_url( $properties['screenshot'] ) . '" alt="' . esc_html( $properties['title'] ) . '" >';
27
- $html .= '</div>'; // .obfx-template-screenshot
28
- $html .= '<h2 class="template-name template-header">' . esc_html( $properties['title'] ) . '</h2>';
29
- $html .= '<div class="obfx-template-actions">';
30
-
31
- if ( ! empty( $properties['demo_url'] ) ) {
32
- $html .= '<a class="button obfx-preview-template" data-demo-url="' . esc_url( $properties['demo_url'] ) . '" data-template-slug="' . esc_attr( $template ) . '" >' . __( 'Preview', 'themeisle-companion' ) . '</a>';
33
- }
34
- $html .= '</div>'; // .obfx-template-actions
35
- $html .= '</div>'; // .obfx-template
36
- }
37
- $html .= '</div>'; // .obfx-template-browser
38
- $html .= '</div>'; // .obfx-template-dir
39
- $html .= '<div class="wp-clearfix clearfix"></div>';
40
- }// End if().
41
-
42
- echo $html;
43
- ?>
44
-
45
- <div class="obfx-template-preview theme-install-overlay wp-full-overlay expanded" style="display: none;">
46
- <div class="wp-full-overlay-sidebar">
47
- <div class="wp-full-overlay-header">
48
- <button class="close-full-overlay"><span class="screen-reader-text">Close</span></button>
49
- <div class="obfx-next-prev">
50
- <button class="previous-theme"><span class="screen-reader-text">Previous</span></button>
51
- <button class="next-theme"><span class="screen-reader-text">Next</span></button>
52
- </div>
53
- <span class="obfx-import-template button button-primary">Import</span>
54
- </div>
55
- <div class="wp-full-overlay-sidebar-content">
56
- <?php
57
- foreach ( $templates_array as $template => $properties ) {
58
- ?>
59
- <div class="install-theme-info obfx-theme-info <?php echo esc_attr( $template ); ?>"
60
- data-demo-url="<?php echo esc_url( $properties['demo_url'] ); ?>"
61
- data-template-file="<?php echo esc_url( $properties['import_file'] ); ?>"
62
- data-template-title="<?php echo esc_html( $properties['title'] ); ?>">
63
- <h3 class="theme-name"><?php echo esc_html( $properties['title'] ); ?></h3>
64
- <img class="theme-screenshot" src="<?php echo esc_url( $properties['screenshot'] ); ?>"
65
- alt="<?php echo esc_html( $properties['title'] ); ?>">
66
- <div class="theme-details">
67
- <?php echo esc_html( $properties['description'] ); ?>
68
- </div>
69
- <?php
70
- if ( ! empty( $properties['required_plugins'] ) && is_array( $properties['required_plugins'] ) ) {
71
- ?>
72
- <div class="obfx-required-plugins">
73
- <p>Required Plugins</p>
74
- <?php
75
- foreach ( $properties['required_plugins'] as $plugin_slug => $details ) {
76
- if ( $this->check_plugin_state( $plugin_slug ) === 'install' ) {
77
- echo '<div class="obfx-installable plugin-card-' . esc_attr( $plugin_slug ) . '">';
78
- echo '<span class="dashicons dashicons-no-alt"></span>';
79
- echo $details['title'];
80
- echo $this->get_button_html( $plugin_slug );
81
- echo '</div>';
82
- } elseif ( $this->check_plugin_state( $plugin_slug ) === 'activate' ) {
83
- echo '<div class="obfx-activate plugin-card-' . esc_attr( $plugin_slug ) . '">';
84
- echo '<span class="dashicons dashicons-admin-plugins" style="color: #ffb227;"></span>';
85
- echo $details['title'];
86
- echo $this->get_button_html( $plugin_slug );
87
- echo '</div>';
88
- } else {
89
- echo '<div class="obfx-installed plugin-card-' . esc_attr( $plugin_slug ) . '">';
90
- echo '<span class="dashicons dashicons-yes" style="color: #34a85e"></span>';
91
- echo $details['title'];
92
- echo '</div>';
93
- }
94
- }
95
- ?>
96
- </div>
97
- <?php
98
- }
99
- ?>
100
- </div><!-- /.install-theme-info -->
101
- <?php } ?>
102
- </div>
103
-
104
- <div class="wp-full-overlay-footer">
105
- <button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="Collapse Sidebar">
106
- <span class="collapse-sidebar-arrow"></span>
107
- <span class="collapse-sidebar-label"><?php echo __( 'Collapse', 'themeisle-companion' ); ?></span>
108
- </button>
109
- <div class="devices-wrapper">
110
- <div class="devices obfx-responsive-preview">
111
- <button type="button" class="preview-desktop active" aria-pressed="true" data-device="desktop">
112
- <span class="screen-reader-text">Enter desktop preview mode</span>
113
- </button>
114
- <button type="button" class="preview-tablet" aria-pressed="false" data-device="tablet">
115
- <span class="screen-reader-text">Enter tablet preview mode</span>
116
- </button>
117
- <button type="button" class="preview-mobile" aria-pressed="false" data-device="mobile">
118
- <span class="screen-reader-text">Enter mobile preview mode</span>
119
- </button>
120
- </div>
121
- </div>
122
-
123
- </div>
124
- </div>
125
- <div class="wp-full-overlay-main obfx-main-preview">
126
- <iframe src="" title="Preview" class="obfx-template-frame"></iframe>
127
- </div>
128
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
obfx_modules/template-directory/views/template-directory-render-template-tpl.php DELETED
@@ -1,13 +0,0 @@
1
- <?php
2
- /**
3
- * The View for Rendering the Template Directory Main Dashboard Page.
4
- *
5
- * @link https://themeisle.com
6
- * @since 2.0.0
7
- *
8
- * @package Orbit_Fox_Modules
9
- * @subpackage Orbit_Fox_Modules/template-directory
10
- * @codeCoverageIgnore
11
- */
12
-
13
- die();
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.md CHANGED
@@ -1,252 +1,68 @@
1
- # Orbit Fox Companion #
2
- **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle), [codeinwp](https://profiles.wordpress.org/codeinwp), [rodicaelena](https://profiles.wordpress.org/rodicaelena), [baicusandrei](https://profiles.wordpress.org/baicusandrei)
3
- **Tags:** widget, admin, widgets, sharing, reporting, sections, themes, stock photos, custom icons, icons, menu icons, stock
4
- **Requires at least:** 3.0
5
- **Tested up to:** 4.9
6
- **Requires PHP:** 5.3
7
- **Stable tag:** trunk
8
- **License:** GPLv2 or later
9
- **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
- **Enhance your website with extra functionality through modules like:** social media share buttons & icons, reporting, analytics(upcoming), security(upcoming) and caching(upcoming).
 
 
 
 
 
12
 
13
- ## Description ##
 
 
 
 
14
 
15
- Extend your theme functionality with <a href="https://themeisle.com/plugins/orbit-fox-companion/" rel="nofollow">Orbit Fox Companion</a> with various modules like Social Media Share Buttons & Icons, reporting, custom menu-icons and free stock featured images.
 
 
 
 
16
 
17
- Orbit Fox is a user-centred plugin with an easy-to-use admin panel. One of the most important features is that modules will only be loaded if they meet two conditions. If they are needed and if they are compatible with your existing themes and plugins. This will cut down on the unnecessary bloating of your website.
18
 
19
- **Why should I use this with Zerif/Hestia themes:**
 
20
 
21
- - By using it along with our themes you gain access to a lot of useful widgets like **Testimonials**, **Our Focus**, **About Us** and more other.
 
 
 
22
 
 
 
 
23
 
24
- **Why use our custom icons module:**
 
 
 
25
 
26
- - Choose from a large variety of custom icons.
 
27
 
28
- - No coding needed, you can leverage the power of our dropdown icons selector and choose the right icon for your menu.
29
 
 
30
 
31
- **Why use our sharing module:**
32
 
33
- - It's easy to use
34
 
35
- - Enable sharing networks right from your admin dashboard and choose on what kind of devices you would like to show them.
36
 
37
- - It’s fully customizable: You can easily optimise button location for according to the device your visitors will use.
 
 
 
 
 
38
 
 
 
39
 
40
- **Why use our custom Elementor addons module:**
41
-
42
- - We offer new widgets to add more value to the content you can create within Elementor page builder.
43
-
44
- - Pricing Table Widget to easily create pricing layouts.
45
-
46
- - Services Widget to easily create pricing layouts.
47
-
48
- - Post Grid Widget to easily list your Posts / Products / any other post types in a grid.
49
-
50
-
51
- **Why use our custom Beaver Builder addons module:**
52
-
53
- - We offer new widgets to add more value to the content you can create within the Beaver Builder page builder.
54
-
55
- - Pricing Table Widget to easily create pricing layouts.
56
-
57
- - Services Widget to easily create pricing layouts.
58
-
59
- - Post Grid Widget to easily list your Posts / Products / any other post types in a grid.
60
-
61
-
62
- **Why use our Template Directory:**
63
-
64
- - One-click import for awesome page templates.
65
-
66
- - Elementor templates will be added frequently for you to use creatively.
67
-
68
- Choose from more than 20+ social networks to share with full control for every device that your visitors use.
69
-
70
- The sharing options can be positioned for the maximum effect according to whether the visitor is using a mobile device or desktop. Best of all they can be switched on/off from your WordPress instance.
71
-
72
-
73
-
74
- We've also built some fantastic <a href="http://themeisle.com/wordpress-themes/free/" rel="nofollow" target="_blank">free themes</a> that work well with Orbit Fox Companion, check them out.
75
-
76
- **Features:**
77
-
78
- - Template Directory
79
- - Elementor Addons and Widgets
80
- - Beaver Builder Widgets
81
- - Sharing module
82
- - Menu icons module
83
- - Free stock photos module
84
- - More widgets and sections for Hestia Theme
85
- - More widgets and sections for Zerif Theme
86
-
87
-
88
-
89
-
90
- ## Frequently Asked Questions ##
91
-
92
- ### How I can get support for this plugin ? ###
93
-
94
- You can learn more about Orbit Fox Companion and ask for help by <a href="https://themeisle.com/contact/" >visiting ThemeIsle website</a>.
95
-
96
- ### What can I do with this plugin ###
97
-
98
- This plugin extends the features of your themes by adding numerous widgets if you are using Zerif and Hestia themes and some modules for sharing and reporting for general use.
99
-
100
-
101
- ## Installation ##
102
-
103
- Activating the Orbit Fox Companion plugin is just like any other plugin. If you've uploaded the plugin package to your server already, skip to step 5 below:
104
-
105
- 1. In your WordPress admin, go to **Plugins &gt; Add New**
106
- 2. In the Search field type "Orbit Fox"
107
- 3. Under "Orbit Fox Companion" click the **Install Now** link
108
- 4. Once the process is complete, click the **Activate Plugin** link
109
- 5. Now, you're able to use Orbit fox and setup the modules you need. These can be found at **Tools &gt; Orbit Fox Companion**
110
- 6. Make the changes desired, then click the **Save changes** button at the bottom
111
-
112
-
113
- ## Screenshots ##
114
-
115
- 1. Screenshot 1. How you can enable/disable modules
116
- 2. Screenshot 2. How the sharing module is looking
117
- 3. Screenshot 3. How reports module is looking
118
-
119
- ## Changelog ##
120
- ### 2.2.6 - 2017-12-19 ###
121
-
122
- * Added new Beaver Builder Widgets Module - Pricing table widget, Services widget, Posts Grid widget.
123
- * Better user experience for the template directory.
124
- * More native design for the template directory.
125
- * Added three free new templates to the template directory - Path, Mocha and Ascend.
126
- * Fixed bug with the Elementor Pricing Table widget button link.
127
- * Fixed php notice given by the Elementor Posts Grid widget.
128
- * Removed the useless Stats module.
129
-
130
-
131
- ### 2.2.5 - 2017-12-11 ###
132
-
133
- * Better UX for CC0 images import module.
134
- * Improved Elementor Services Widget.
135
- * Added new templates to the template directory.
136
-
137
-
138
- ### 2.2.4 - 2017-12-04 ###
139
-
140
- * Fixed issue with menu icons module loading.
141
-
142
-
143
- ### 2.2.3 - 2017-11-27 ###
144
-
145
- * [Hestia] Fixed issue with Team member section not opening external links in a new tab
146
- * [Hestia] Fixed alignment issues with the front page sections
147
-
148
-
149
- ### 2.2.2 - 2017-11-24 ###
150
-
151
- * Renamed flickr api util file.
152
- * Fixed issue with template directory preview plugin install modal.
153
-
154
-
155
- ### 2.2.1 - 2017-11-24 ###
156
-
157
- * Fixed module loading for Elementor widgets module.
158
-
159
-
160
- ### 2.2.0 - 2017-11-23 ###
161
-
162
- * - Added new Elementor Widgets module;
163
- * - Added new Template Directory module;
164
- * - Bug fixes for the Photos Import Module;
165
- * - Bug fixes for the Social Sharing module backend interface;
166
- * - Moved Orbit Fox Companion out of Tools Menu;
167
-
168
-
169
- ### 2.1.1 - 2017-11-16 ###
170
-
171
- * Adds compatibility with WordPress 4.9.
172
-
173
-
174
- ### 2.1.0 - 2017-11-08 ###
175
-
176
- * Adds custom icons menu module.
177
- * Adds free stock images integration with mystock.photos .
178
-
179
-
180
- ### 2.0.11 - 2017-10-19 ###
181
-
182
- * Fixed alignment issue for titles in Hestia
183
-
184
-
185
- ### 2.0.10 - 2017-10-18 ###
186
-
187
- * Added selective refresh options for the Show/Hide frontpage controls in Hestia
188
- * Make external links open in new tab for the frontpage sections in Hestia
189
- * Added some new filters to control the number of items per row appear in the Features and Testimonials Frontpage section - http://docs.themeisle.com/article/669-how-to-add-4-feature-items-on-a-line-in-hestia
190
-
191
-
192
- ### 2.0.9 - 2017-10-17 ###
193
-
194
- * Enhanced layout for Hestia sections.
195
-
196
-
197
- ### 2.0.8 - 2017-10-11 ###
198
-
199
- * Fixed bug with URL protocols filter priority.
200
- * Fixed bug with icons background styled by URL address.
201
-
202
-
203
- ### 2.0.7 - 2017-10-02 ###
204
-
205
- * New improved options for frontpage sections ordering/disabling in Hestia
206
-
207
-
208
- ### 2.0.6 - 2017-09-19 ###
209
-
210
- * Added selective refresh for titles options in the frontpage sections in Hestia
211
-
212
-
213
- ### 2.0.5 - 2017-09-12 ###
214
-
215
- * Added new Ribbon and Clients Bar sections in Hestia
216
-
217
-
218
- ### 2.0.4 - 2017-09-11 ###
219
-
220
- * Adds PHP minimum requirement.
221
- * Fix for admin styles loading screen.
222
-
223
-
224
- ### 2.0.3 - 2017-08-24 ###
225
-
226
- * Improved compatibility with the new Hestia version.
227
-
228
-
229
- ### 2.0.2 - 2017-08-16 ###
230
-
231
- * Fix accordion not opening to display save buttons for modules
232
-
233
-
234
- ### 2.0.1 - 2017-08-14 ###
235
-
236
- * Fixed issues with grey icons in Hestia.
237
- * Fixed Recommended Actions flags in customizer.
238
-
239
-
240
-
241
- ### 1.0.3 ###
242
-
243
- * New widgets for Rhea child theme
244
- * Improved front page selection mechanism for Hestia
245
-
246
- ### 1.0.1 ###
247
-
248
- * Changed tested up to
249
-
250
- ### 1.0.0 ###
251
-
252
- * First version of the plugin
1
+ # Orbit Fox
2
+ [![Build Status](https://travis-ci.org/Codeinwp/orbit-fox.svg?branch=master)](https://travis-ci.org/Codeinwp/orbit-fox)
3
+ [![Code Climate](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/gpa.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox)
4
+ [![Issue Count](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/issue_count.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox)
5
+ [![Test Coverage](https://codeclimate.com/github/Codeinwp/orbit-fox/badges/coverage.svg)](https://codeclimate.com/github/Codeinwp/orbit-fox/coverage)
 
 
 
 
6
 
7
+ - **Author URI:** http://themeisle.com
8
+ - **Requires at least:** 3.5
9
+ - **Tested up to:** 4.8
10
+ - **Stable tag:** trunk
11
+ - **License:** GPLv2 or later
12
+ - **License URI:** http://www.gnu.org/licenses/gpl-2.0.html
13
 
14
+ ## Description
15
+ > Orbit Fox is a plugin for WordPress that provides an abstraction layer on top of which you can
16
+ write modules to extend its functionality. The plugin provides some predefined workflows and
17
+ methods that work automagically. This means that you can focus more on the logic of your module
18
+ and less on the loading and display of data or files.
19
 
20
+ ### Goals
21
+ 1. **Provide a framework like environment for writing modules:**
22
+
23
+ Have a predefined set of rules and workflows that work out of the box. This should simplify
24
+ the way a developer interacts with data, views or files.
25
 
26
+ 2. **Accessibility:**
27
 
28
+ Modules should be easy to write and deploy, also allow for loading of modules from third party
29
+ developers.
30
 
31
+ ### Specifications
32
+ Have a plugin that can be extended with modules bundled or built by third party developers inside
33
+ their own plugins. The modules must have an abstract class that defines the implemented methods
34
+ required and utility methods that simplify the module development.
35
 
36
+ ## Installation
37
+ 1. Put the `orbit-fox` folder inside WordPress plugins folder.
38
+ 2. Activate via the Plugins WordPress Dashboard.
39
 
40
+ ## Features
41
+ - Easy extensability via modules
42
+ - Support for third party modules
43
+ - Reusable and Utility Classes for faster development
44
 
45
+ ## Development
46
+ [Module development guidelines](docs/MODULE.md)
47
 
48
+ ## Docs
49
 
50
+ [Read the Project Documentation](https://docs.google.com/a/vertistudio.com/document/d/1fFepVs4if5rEmMqA8TiHUFp2WPnkUCW6JZohnsSNtKE/edit?usp=sharing)
51
 
52
+ ## Frequently Asked Questions
53
 
54
+ // TODO
55
 
56
+ ## Change Log
57
 
58
+ **v.1.0.0a**
59
+ - Basic structure and module loading workflow.
60
+ - Support for 3rd party modules
61
+ - Render Helper
62
+ - Model Helper
63
+ - Automagic classes
64
 
65
+ ### Contributors
66
+ **Bogdan Preda** -- bogdan.themeisle.com
67
 
68
+ **Marius Cristea** -- marius.cristea@vertistudio.com
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -36,35 +36,6 @@ Orbit Fox is a user-centred plugin with an easy-to-use admin panel. One of the m
36
 
37
  - It’s fully customizable: You can easily optimise button location for according to the device your visitors will use.
38
 
39
-
40
- **Why use our custom Elementor addons module:**
41
-
42
- - We offer new widgets to add more value to the content you can create within Elementor page builder.
43
-
44
- - Pricing Table Widget to easily create pricing layouts.
45
-
46
- - Services Widget to easily create pricing layouts.
47
-
48
- - Post Grid Widget to easily list your Posts / Products / any other post types in a grid.
49
-
50
-
51
- **Why use our custom Beaver Builder addons module:**
52
-
53
- - We offer new widgets to add more value to the content you can create within the Beaver Builder page builder.
54
-
55
- - Pricing Table Widget to easily create pricing layouts.
56
-
57
- - Services Widget to easily create pricing layouts.
58
-
59
- - Post Grid Widget to easily list your Posts / Products / any other post types in a grid.
60
-
61
-
62
- **Why use our Template Directory:**
63
-
64
- - One-click import for awesome page templates.
65
-
66
- - Elementor templates will be added frequently for you to use creatively.
67
-
68
  Choose from more than 20+ social networks to share with full control for every device that your visitors use.
69
 
70
  The sharing options can be positioned for the maximum effect according to whether the visitor is using a mobile device or desktop. Best of all they can be switched on/off from your WordPress instance.
@@ -75,10 +46,8 @@ We've also built some fantastic <a href="http://themeisle.com/wordpress-themes/f
75
 
76
  **Features:**
77
 
78
- - Template Directory
79
- - Elementor Addons and Widgets
80
- - Beaver Builder Widgets
81
  - Sharing module
 
82
  - Menu icons module
83
  - Free stock photos module
84
  - More widgets and sections for Hestia Theme
@@ -117,60 +86,6 @@ Activating the Orbit Fox Companion plugin is just like any other plugin. If you'
117
  3. Screenshot 3. How reports module is looking
118
 
119
  == Changelog ==
120
- = 2.2.6 - 2017-12-19 =
121
-
122
- * Added new Beaver Builder Widgets Module - Pricing table widget, Services widget, Posts Grid widget.
123
- * Better user experience for the template directory.
124
- * More native design for the template directory.
125
- * Added three free new templates to the template directory - Path, Mocha and Ascend.
126
- * Fixed bug with the Elementor Pricing Table widget button link.
127
- * Fixed php notice given by the Elementor Posts Grid widget.
128
- * Removed the useless Stats module.
129
-
130
-
131
- = 2.2.5 - 2017-12-11 =
132
-
133
- * Better UX for CC0 images import module.
134
- * Improved Elementor Services Widget.
135
- * Added new templates to the template directory.
136
-
137
-
138
- = 2.2.4 - 2017-12-04 =
139
-
140
- * Fixed issue with menu icons module loading.
141
-
142
-
143
- = 2.2.3 - 2017-11-27 =
144
-
145
- * [Hestia] Fixed issue with Team member section not opening external links in a new tab
146
- * [Hestia] Fixed alignment issues with the front page sections
147
-
148
-
149
- = 2.2.2 - 2017-11-24 =
150
-
151
- * Renamed flickr api util file.
152
- * Fixed issue with template directory preview plugin install modal.
153
-
154
-
155
- = 2.2.1 - 2017-11-24 =
156
-
157
- * Fixed module loading for Elementor widgets module.
158
-
159
-
160
- = 2.2.0 - 2017-11-23 =
161
-
162
- * - Added new Elementor Widgets module;
163
- * - Added new Template Directory module;
164
- * - Bug fixes for the Photos Import Module;
165
- * - Bug fixes for the Social Sharing module backend interface;
166
- * - Moved Orbit Fox Companion out of Tools Menu;
167
-
168
-
169
- = 2.1.1 - 2017-11-16 =
170
-
171
- * Adds compatibility with WordPress 4.9.
172
-
173
-
174
  = 2.1.0 - 2017-11-08 =
175
 
176
  * Adds custom icons menu module.
36
 
37
  - It’s fully customizable: You can easily optimise button location for according to the device your visitors will use.
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  Choose from more than 20+ social networks to share with full control for every device that your visitors use.
40
 
41
  The sharing options can be positioned for the maximum effect according to whether the visitor is using a mobile device or desktop. Best of all they can be switched on/off from your WordPress instance.
46
 
47
  **Features:**
48
 
 
 
 
49
  - Sharing module
50
+ - Reporting module
51
  - Menu icons module
52
  - Free stock photos module
53
  - More widgets and sections for Hestia Theme
86
  3. Screenshot 3. How reports module is looking
87
 
88
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  = 2.1.0 - 2017-11-08 =
90
 
91
  * Adds custom icons menu module.
themeisle-companion.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: Orbit Fox Companion
16
  * Plugin URI: https://themeisle.com/plugins/orbit-fox-companion
17
  * Description: Enhances ThemeIsle's themes with extra functionality.
18
- * Version: 2.2.6
19
  * Author: Themeisle
20
  * Author URI: https://themeisle.com
21
  * License: GPL-2.0+
15
  * Plugin Name: Orbit Fox Companion
16
  * Plugin URI: https://themeisle.com/plugins/orbit-fox-companion
17
  * Description: Enhances ThemeIsle's themes with extra functionality.
18
+ * Version: 2.1.0
19
  * Author: Themeisle
20
  * Author URI: https://themeisle.com
21
  * License: GPL-2.0+
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInitcc4113211865496a6dd00b6fc775b602::getLoader();
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php CHANGED
@@ -60,7 +60,7 @@ if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
60
  /**
61
  * @var array $allowed_authors The allowed authors.
62
  */
63
- private $allowed_authors = array( 'proteusthemes.com', 'anarieldesign.com', 'prothemedesign.com', 'cssigniter.com' );
64
  /**
65
  * @var bool $requires_license Either user needs to activate it with license.
66
  */
60
  /**
61
  * @var array $allowed_authors The allowed authors.
62
  */
63
+ private $allowed_authors = array( 'proteusthemes.com', 'anarieldesign.com', 'prothemedesign.com' );
64
  /**
65
  * @var bool $requires_license Either user needs to activate it with license.
66
  */
vendor/codeinwp/themeisle-sdk/load.php CHANGED
@@ -11,7 +11,7 @@
11
  */
12
 
13
  // Current SDK version and path.
14
- $themeisle_sdk_version = '1.9.2';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
11
  */
12
 
13
  // Current SDK version and path.
14
+ $themeisle_sdk_version = '1.9.1';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInit2950a8d436437719e363bc4bb2cf7a75
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequire2950a8d436437719e363bc4bb2cf7a75($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequire2950a8d436437719e363bc4bb2cf7a75($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInitcc4113211865496a6dd00b6fc775b602
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInitcc4113211865496a6dd00b6fc775b602', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInitcc4113211865496a6dd00b6fc775b602', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequirecc4113211865496a6dd00b6fc775b602($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequirecc4113211865496a6dd00b6fc775b602($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
vendor/composer/installed.json CHANGED
@@ -6,15 +6,15 @@
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
- "reference": "1933233168091b9e72df9df60b234b7650d6b00b"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/1933233168091b9e72df9df60b234b7650d6b00b",
14
- "reference": "1933233168091b9e72df9df60b234b7650d6b00b",
15
  "shasum": ""
16
  },
17
- "time": "2017-11-23 13:26:34",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
+ "reference": "a05ab89594381a935573300f0aafdae8c28cefe5"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/a05ab89594381a935573300f0aafdae8c28cefe5",
14
+ "reference": "a05ab89594381a935573300f0aafdae8c28cefe5",
15
  "shasum": ""
16
  },
17
+ "time": "2017-11-13 10:52:46",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {