Unyson - Version 2.4.1

Version Description

  • Fixed #742, #731, #728, #726, Shortcodes#29
  • Fixed: addable-popup option type wasn't saved in Customizer
Download this release

Release Info

Developer Unyson
Plugin Icon 128x128 Unyson
Version 2.4.1
Comparing to
See all releases

Code changes from version 2.4.0 to 2.4.1

framework/core/components/backend.php CHANGED
@@ -328,6 +328,7 @@ final class _FW_Component_Backend {
328
  'done' => __( 'Done', 'fw' ),
329
  'ah_sorry' => __( 'Ah, Sorry', 'fw' ),
330
  'save' => __( 'Save', 'fw' ),
 
331
  ),
332
  ) );
333
  }
328
  'done' => __( 'Done', 'fw' ),
329
  'ah_sorry' => __( 'Ah, Sorry', 'fw' ),
330
  'save' => __( 'Save', 'fw' ),
331
+ 'reset' => __( 'Reset', 'fw' ),
332
  ),
333
  ) );
334
  }
framework/core/components/extensions/manager/views/extension.php CHANGED
@@ -60,7 +60,7 @@ if (!$installed_data && !$is_compatible) {
60
  <img height="128" src="<?php echo esc_attr($thumbnail) ?>" class="fw-extensions-list-item-thumbnail" alt="Thumbnail"/>
61
  </div>
62
  <div class="fw-extension-list-item-table-cell cell-2">
63
- <h3 class="fw-extensions-list-item-title"><?php
64
  if ($is_active && ($extension_link = fw()->extensions->get($name)->_get_link())) {
65
  echo fw_html_tag('a', array('href' => $extension_link), $title);
66
  } else {
60
  <img height="128" src="<?php echo esc_attr($thumbnail) ?>" class="fw-extensions-list-item-thumbnail" alt="Thumbnail"/>
61
  </div>
62
  <div class="fw-extension-list-item-table-cell cell-2">
63
+ <h3 class="fw-extensions-list-item-title"<?php if ($is_active): ?> title="v<?php echo esc_attr(fw()->extensions->get($name)->manifest->get_version()) ?>"<?php endif; ?>><?php
64
  if ($is_active && ($extension_link = fw()->extensions->get($name)->_get_link())) {
65
  echo fw_html_tag('a', array('href' => $extension_link), $title);
66
  } else {
framework/helpers/general.php CHANGED
@@ -919,11 +919,27 @@ function fw_get_options_values_from_input(array $options, $input_array = null) {
919
  }
920
 
921
  /**
922
- * 'abc[def][xyz]' -> 'abc/def/xyz'
923
- * 'abc[def][xyz][]' -> 'abc/def/xyz'
 
924
  */
925
- function fw_html_attr_name_to_array_multi_key($attr_name) {
926
- $attr_name = str_replace('[]', '', $attr_name);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
927
  $attr_name = str_replace('][', '/', $attr_name);
928
  $attr_name = str_replace('[', '/', $attr_name);
929
  $attr_name = str_replace(']', '', $attr_name);
919
  }
920
 
921
  /**
922
+ * @param $attr_name
923
+ * @param bool $set_mode
924
+ * @return mixed
925
  */
926
+ function fw_html_attr_name_to_array_multi_key($attr_name, $set_mode = false) {
927
+ if ($set_mode) {
928
+ /**
929
+ * The key will be used to set value in array
930
+ * 'hello[world][]' -> 'hello/world/'
931
+ * $array['hello']['world'][] = $value;
932
+ */
933
+ $attr_name = str_replace('[]', '/', $attr_name);
934
+ } else {
935
+ /**
936
+ * The key will be used to get value from array
937
+ * 'hello[world][]' -> 'hello/world'
938
+ * $value = $array['hello']['world'];
939
+ */
940
+ $attr_name = str_replace('[]', '', $attr_name);
941
+ }
942
+
943
  $attr_name = str_replace('][', '/', $attr_name);
944
  $attr_name = str_replace('[', '/', $attr_name);
945
  $attr_name = str_replace(']', '', $attr_name);
framework/includes/customizer/class--fw-customizer-setting-option.php CHANGED
@@ -22,7 +22,7 @@ class _FW_Customizer_Setting_Option extends WP_Customize_Setting {
22
 
23
  foreach ($value as $var) {
24
  fw_aks(
25
- fw_html_attr_name_to_array_multi_key($var['name']),
26
  $var['value'],
27
  $POST
28
  );
22
 
23
  foreach ($value as $var) {
24
  fw_aks(
25
+ fw_html_attr_name_to_array_multi_key($var['name'], true),
26
  $var['value'],
27
  $POST
28
  );
framework/includes/option-types/addable-box/class-fw-option-type-addable-box.php CHANGED
@@ -94,7 +94,7 @@ class FW_Option_Type_Addable_Box extends FW_Option_Type
94
  {
95
  $box_options = array();
96
 
97
- fw_collect_options( $box_options, $options, array(
98
  'limit_option_types' => false,
99
  'limit_container_types' => array('group'), // Use only groups and options
100
  'limit_level' => 1,
94
  {
95
  $box_options = array();
96
 
97
+ fw_collect_options( $box_options, $option['box-options'], array(
98
  'limit_option_types' => false,
99
  'limit_container_types' => array('group'), // Use only groups and options
100
  'limit_level' => 1,
framework/includes/option-types/addable-box/static/css/styles.css CHANGED
@@ -5,6 +5,14 @@
5
  .fw-option-type-addable-box > .fw-option-boxes.ui-sortable > .fw-option-box > .fw-postbox > h3.hndle {
6
  cursor: move !important; /* to rewrite .fw-postbox h3.hndle */
7
  word-break: break-all; /* if box text is too long, do not move controls outside box */
 
 
 
 
 
 
 
 
8
  }
9
 
10
  #wpbody-content .fw-option-type-addable-box .metabox-holder {
@@ -24,20 +32,31 @@
24
  vertical-align: middle;
25
  }
26
 
 
 
 
 
27
 
28
  /* Controls */
29
 
 
30
  .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-html-after-title {
31
- float: right;
32
- position: relative; /* fix .handlediv::before padding that goes on top of the content from .fw-html-after-title */
33
- padding-right: 3px;
 
 
 
 
 
 
34
  }
35
 
36
- .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-option-box-controls .fw-option-box-control {
37
  text-decoration: none;
38
  }
39
 
40
- .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-option-box-controls .fw-option-box-control-wrapper {
41
  color: #cccccc;
42
  }
43
 
5
  .fw-option-type-addable-box > .fw-option-boxes.ui-sortable > .fw-option-box > .fw-postbox > h3.hndle {
6
  cursor: move !important; /* to rewrite .fw-postbox h3.hndle */
7
  word-break: break-all; /* if box text is too long, do not move controls outside box */
8
+ position: relative;
9
+ }
10
+
11
+ .fw-option-type-addable-box > .fw-option-boxes.ui-sortable > .fw-option-box > .fw-postbox > h3.hndle > span {
12
+ overflow: hidden;
13
+ white-space: nowrap;
14
+ max-width: 100%;
15
+ display: block;
16
  }
17
 
18
  #wpbody-content .fw-option-type-addable-box .metabox-holder {
32
  vertical-align: middle;
33
  }
34
 
35
+ .fw-option-type-addable-box .fw-backend-option-design-customizer {
36
+ padding: 15px;
37
+ }
38
+
39
 
40
  /* Controls */
41
 
42
+
43
  .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-html-after-title {
44
+ position: absolute;
45
+ top: 0;
46
+ right: 27px;
47
+ display: block;
48
+ height: 100%;
49
+ background-color: #FFF;
50
+ box-sizing: border-box;
51
+ padding: 0 3px;
52
+ padding-top: inherit;
53
  }
54
 
55
+ .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-html-after-title .fw-option-box-controls .fw-option-box-control {
56
  text-decoration: none;
57
  }
58
 
59
+ .fw-option-type-addable-box > .fw-option-boxes > .fw-option-box h3.hndle .fw-html-after-title .fw-option-box-controls .fw-option-box-control-wrapper {
60
  color: #cccccc;
61
  }
62
 
framework/includes/option-types/addable-popup/class-fw-option-type-addable-popup.php CHANGED
@@ -110,7 +110,7 @@ class FW_Option_Type_Addable_Popup extends FW_Option_Type
110
 
111
  $values = array_map('json_decode', $input_value, array_fill(0, count($input_value), true));
112
 
113
- if($option['limit']){
114
  $values= array_slice($values, 0 , $option['limit']);
115
  }
116
 
110
 
111
  $values = array_map('json_decode', $input_value, array_fill(0, count($input_value), true));
112
 
113
+ if ($option['limit']) {
114
  $values= array_slice($values, 0 , $option['limit']);
115
  }
116
 
framework/includes/option-types/addable-popup/views/view.php CHANGED
@@ -21,7 +21,7 @@ $increment_placeholder = '###-addable-popup-increment-'. fw_rand_md5() .'-###';
21
  <div class="item default">
22
  <div class="input-wrapper">
23
  <?php echo fw()->backend->option_type('hidden')->render('', array('value' => '[]'), array(
24
- 'id_prefix' => $data['id_prefix'] . $id . '-' . $increment_placeholder . '-',
25
  'name_prefix' => $data['name_prefix'] . '[' . $id . ']',
26
  ));?>
27
  </div>
21
  <div class="item default">
22
  <div class="input-wrapper">
23
  <?php echo fw()->backend->option_type('hidden')->render('', array('value' => '[]'), array(
24
+ 'id_prefix' => $data['id_prefix'] . $id . '-' . $increment_placeholder,
25
  'name_prefix' => $data['name_prefix'] . '[' . $id . ']',
26
  ));?>
27
  </div>
framework/includes/option-types/multi-select/static/js/scripts.js CHANGED
@@ -1,60 +1,69 @@
1
- function fw_option_multi_select_initialize(item) {
2
- var population = item.attr('data-population');
3
- var source = item.attr('data-source');
4
- var limit = parseInt(item.attr('data-limit'));
5
- var xhr;
6
-
7
- item.selectize({
8
- maxItems: ( limit > 0 ) ? limit : null,
9
- delimiter: '/*/',
10
- valueField: 'val',
11
- labelField: 'title',
12
- searchField: 'title',
13
- options: JSON.parse(item.attr('data-options')),
14
- create: false,
15
- onType: function (value) {
16
- if (population == 'array') {
17
- return;
18
- }
19
 
20
- if (value.length < 2) {
21
- return;
22
- }
 
 
 
 
 
 
 
 
 
23
 
24
- this.load(function (callback) {
25
- xhr && xhr.abort();
26
-
27
- var data = {
28
- action: 'admin_action_get_ajax_response',
29
- data: {
30
- string: value,
31
- type: population,
32
- names: source
33
- }
34
- };
35
-
36
- xhr = jQuery.post(
37
- ajaxurl,
38
- data,
39
- function (response) {
40
- callback(response.data)
41
- }
42
- )
43
- });
44
 
45
- }
46
- });
47
- }
48
 
49
- jQuery(document).ready(function () {
50
- fwEvents.on('fw:options:init', function (data) {
 
 
 
 
 
 
51
 
52
- var obj = data.$elements.find('.fw-option-type-multi-select:not(.initialized)');
 
 
 
 
 
 
 
53
 
54
- obj.each(function () {
55
- fw_option_multi_select_initialize(jQuery(this));
56
  });
 
 
 
 
 
 
 
 
57
 
58
- obj.addClass('initialized');
 
 
 
 
 
 
 
 
 
 
59
  });
60
- });
1
+ (function ($) {
2
+ var fw_option_multi_select_initialize = function(item) {
3
+ var population = item.attr('data-population');
4
+ var source = item.attr('data-source');
5
+ var limit = parseInt(item.attr('data-limit'));
6
+ var xhr;
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
+ item.selectize({
9
+ maxItems: ( limit > 0 ) ? limit : null,
10
+ delimiter: '/*/',
11
+ valueField: 'val',
12
+ labelField: 'title',
13
+ searchField: 'title',
14
+ options: JSON.parse(item.attr('data-options')),
15
+ create: false,
16
+ onType: function (value) {
17
+ if (population == 'array') {
18
+ return;
19
+ }
20
 
21
+ if (value.length < 2) {
22
+ return;
23
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
+ this.load(function (callback) {
26
+ xhr && xhr.abort();
 
27
 
28
+ var data = {
29
+ action: 'admin_action_get_ajax_response',
30
+ data: {
31
+ string: value,
32
+ type: population,
33
+ names: source
34
+ }
35
+ };
36
 
37
+ xhr = $.post(
38
+ ajaxurl,
39
+ data,
40
+ function (response) {
41
+ callback(response.data)
42
+ }
43
+ )
44
+ });
45
 
46
+ }
 
47
  });
48
+ };
49
+
50
+ fwEvents.on('fw:options:init', function (data) {
51
+ data.$elements
52
+ .find('.fw-option-type-multi-select:not(.initialized)')
53
+ .each(function () {
54
+ fw_option_multi_select_initialize($(this));
55
+ });
56
 
57
+ /*
58
+ * WARNING:
59
+ *
60
+ * data.$elements.find is intentionally looked up twice instead of cached
61
+ * this is done because when fw_option_multi_select_initialize is called
62
+ * the selectize plugin inserts an element which copies the
63
+ * `fw-option-type-multi-select` class, thus making the cache invalid.
64
+ */
65
+ data.$elements
66
+ .find('.fw-option-type-multi-select:not(.initialized)')
67
+ .addClass('initialized');
68
  });
69
+ })(jQuery);
framework/includes/option-types/range-slider/class-fw-option-type-range-slider.php CHANGED
@@ -107,7 +107,7 @@ class FW_Option_Type_Range_Slider extends FW_Option_Type {
107
  return $option['value'];
108
  } else {
109
  $input_values = ( isset( $option['properties']['values'] ) && is_array( $option['properties']['values'] ) ) ? explode( ';',
110
- $input_value ) : array_map( 'intval', explode( ';', $input_value ) );
111
 
112
  return array(
113
  'from' => $input_values[0],
107
  return $option['value'];
108
  } else {
109
  $input_values = ( isset( $option['properties']['values'] ) && is_array( $option['properties']['values'] ) ) ? explode( ';',
110
+ $input_value ) : array_map( 'floatval', explode( ';', $input_value ) );
111
 
112
  return array(
113
  'from' => $input_values[0],
framework/includes/option-types/slider/class-fw-option-type-slider.php CHANGED
@@ -94,7 +94,7 @@ class FW_Option_Type_Slider extends FW_Option_Type {
94
  if (is_null($input_value)) {
95
  return $option['value'];
96
  } else {
97
- return intval($input_value);
98
  }
99
  }
100
 
94
  if (is_null($input_value)) {
95
  return $option['value'];
96
  } else {
97
+ return floatval($input_value);
98
  }
99
  }
100
 
framework/manifest.php CHANGED
@@ -4,4 +4,4 @@ $manifest = array();
4
 
5
  $manifest['name'] = __('Unyson', 'fw');
6
 
7
- $manifest['version'] = '2.4.0';
4
 
5
  $manifest['name'] = __('Unyson', 'fw');
6
 
7
+ $manifest['version'] = '2.4.1';
framework/static/css/backend-options.css CHANGED
@@ -838,6 +838,10 @@ body.rtl .fw-backend-option-design-default > .fw-backend-option-desc > .fw-inner
838
  }
839
 
840
 
 
 
 
 
841
  .fw-backend-option-design-customizer > .fw-backend-option-desc {
842
  padding-bottom: 6px;
843
  }
838
  }
839
 
840
 
841
+ .fw-backend-option-design-customizer {
842
+ padding: 5px 0 10px;
843
+ }
844
+
845
  .fw-backend-option-design-customizer > .fw-backend-option-desc {
846
  padding-bottom: 6px;
847
  }
framework/static/js/fw.js CHANGED
@@ -914,7 +914,9 @@ fw.getQueryString = function(name) {
914
  onSubmit: function(e) {
915
  e.preventDefault();
916
 
917
- fw.loading.show(fwLoadingId);
 
 
918
 
919
  jQuery.ajax({
920
  url: ajaxurl,
@@ -927,7 +929,7 @@ fw.getQueryString = function(name) {
927
  ].join('&'),
928
  dataType: 'json',
929
  success: _.bind(function (response, status, xhr) {
930
- fw.loading.hide(fwLoadingId);
931
 
932
  if (!response.success) {
933
  /**
@@ -945,7 +947,55 @@ fw.getQueryString = function(name) {
945
  this.model.frame.modal.$el.find('.media-modal-close').trigger('click');
946
  }, this),
947
  error: function (xhr, status, error) {
948
- fw.loading.hide(fwLoadingId);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
949
 
950
  /**
951
  * do not replace html here
@@ -984,12 +1034,12 @@ fw.getQueryString = function(name) {
984
  initializeFrame: function() {
985
  fw.Modal.prototype.initializeFrame.call(this);
986
 
987
- var modal = this;
 
 
 
988
 
989
- this.frame.once('ready', function() {
990
- modal.frame.$el.removeClass('hide-toolbar');
991
- modal.frame.modal.$el.addClass('fw-options-modal');
992
- });
993
 
994
  this.frame.on('content:create:main', function () {
995
  modal.frame.toolbar.set(
@@ -1008,6 +1058,14 @@ fw.getQueryString = function(name) {
1008
  */
1009
  modal.content.$el.find('input[type="submit"].hidden-submit').trigger('click');
1010
  }
 
 
 
 
 
 
 
 
1011
  }
1012
  ]
1013
  })
914
  onSubmit: function(e) {
915
  e.preventDefault();
916
 
917
+ var loadingId = fwLoadingId +':submit';
918
+
919
+ fw.loading.show(loadingId);
920
 
921
  jQuery.ajax({
922
  url: ajaxurl,
929
  ].join('&'),
930
  dataType: 'json',
931
  success: _.bind(function (response, status, xhr) {
932
+ fw.loading.hide(loadingId);
933
 
934
  if (!response.success) {
935
  /**
947
  this.model.frame.modal.$el.find('.media-modal-close').trigger('click');
948
  }, this),
949
  error: function (xhr, status, error) {
950
+ fw.loading.hide(loadingId);
951
+
952
+ /**
953
+ * do not replace html here
954
+ * user completed the form with data and wants to submit data
955
+ * do not delete all his work
956
+ */
957
+ alert(status +': '+ error.message);
958
+ }
959
+ });
960
+ },
961
+ resetValues: function() {
962
+ var loadingId = fwLoadingId +':reset';
963
+
964
+ fw.loading.show(loadingId);
965
+
966
+ jQuery.ajax({
967
+ url: ajaxurl,
968
+ type: 'POST',
969
+ data: [
970
+ 'action=fw_backend_options_get_values',
971
+ 'options='+ encodeURIComponent(JSON.stringify(this.model.get('options'))),
972
+ 'name_prefix=fw_edit_options_modal'
973
+ ].join('&'),
974
+ dataType: 'json',
975
+ success: _.bind(function (response, status, xhr) {
976
+ fw.loading.hide(loadingId);
977
+
978
+ if (!response.success) {
979
+ /**
980
+ * do not replace html here
981
+ * user completed the form with data and wants to submit data
982
+ * do not delete all his work
983
+ */
984
+ alert('Error: '+ response.data.message);
985
+ return;
986
+ }
987
+
988
+ this.model.set('values', response.data.values);
989
+
990
+ // make sure on the above open, the html 'change' will be fired
991
+ this.model.set('html', '', {
992
+ silent: true // right now we don't need modal reRender, only when the open above
993
+ });
994
+
995
+ this.model.open();
996
+ }, this),
997
+ error: function (xhr, status, error) {
998
+ fw.loading.hide(loadingId);
999
 
1000
  /**
1001
  * do not replace html here
1034
  initializeFrame: function() {
1035
  fw.Modal.prototype.initializeFrame.call(this);
1036
 
1037
+ this.frame.once('ready', _.bind(function() {
1038
+ this.frame.$el.removeClass('hide-toolbar');
1039
+ this.frame.modal.$el.addClass('fw-options-modal');
1040
+ }, this));
1041
 
1042
+ var modal = this;
 
 
 
1043
 
1044
  this.frame.on('content:create:main', function () {
1045
  modal.frame.toolbar.set(
1058
  */
1059
  modal.content.$el.find('input[type="submit"].hidden-submit').trigger('click');
1060
  }
1061
+ },
1062
+ {
1063
+ style: '',
1064
+ text: _fw_localized.l10n.reset,
1065
+ priority: -1,
1066
+ click: function () {
1067
+ modal.content.resetValues();
1068
+ }
1069
  }
1070
  ]
1071
  })
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: unyson, themefusecom
3
  Tags: page builder, cms, grid, layout, responsive, back up, backup, db backup, dump, migrate, schedule, search engine optimization, seo, media, slideshow, shortcode, slide, slideshare, slideshow, google sitemaps, sitemaps, analytics, google analytics, calendar, event, events, google maps, learning, lessons, sidebars, breadcrumbs, review, portfolio, framework
4
  Requires at least: 4.0.0
5
  Tested up to: 4.2
6
- Stable tag: 2.4.0
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -82,9 +82,13 @@ Yes; Unyson will work with any theme.
82
 
83
  == Changelog ==
84
 
 
 
 
 
85
  = 2.4.0 =
86
  * Created "Container Types" and container type `popup` [#615](https://github.com/ThemeFuse/Unyson/issues/615)
87
- * Created the `fw_collect_options()` function
88
  * Added Unycon font icon. Demo `http://{your-host}/wp-content/plugins/unyson/framework/static/libs/unycon/demo/`
89
  * Minor fixes
90
 
3
  Tags: page builder, cms, grid, layout, responsive, back up, backup, db backup, dump, migrate, schedule, search engine optimization, seo, media, slideshow, shortcode, slide, slideshare, slideshow, google sitemaps, sitemaps, analytics, google analytics, calendar, event, events, google maps, learning, lessons, sidebars, breadcrumbs, review, portfolio, framework
4
  Requires at least: 4.0.0
5
  Tested up to: 4.2
6
+ Stable tag: 2.4.1
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
82
 
83
  == Changelog ==
84
 
85
+ = 2.4.1 =
86
+ * Fixed [#742](https://github.com/ThemeFuse/Unyson/issues/742), [#731](https://github.com/ThemeFuse/Unyson/issues/731), [#728](https://github.com/ThemeFuse/Unyson/issues/728), [#726](https://github.com/ThemeFuse/Unyson/issues/726), [Shortcodes#29](https://github.com/ThemeFuse/Unyson-Shortcodes-Extension/issues/29)
87
+ * Fixed: `addable-popup` option type wasn't saved in Customizer
88
+
89
  = 2.4.0 =
90
  * Created "Container Types" and container type `popup` [#615](https://github.com/ThemeFuse/Unyson/issues/615)
91
+ * Created the `fw_collect_options()` function [#740](https://github.com/ThemeFuse/Unyson/issues/740)
92
  * Added Unycon font icon. Demo `http://{your-host}/wp-content/plugins/unyson/framework/static/libs/unycon/demo/`
93
  * Minor fixes
94
 
unyson.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Unyson
4
  * Plugin URI: http://unyson.themefuse.com/
5
  * Description: A free drag & drop framework that comes with a bunch of built in extensions that will help you develop premium themes fast & easy.
6
- * Version: 2.4.0
7
  * Author: ThemeFuse
8
  * Author URI: http://themefuse.com
9
  * License: GPL2+
3
  * Plugin Name: Unyson
4
  * Plugin URI: http://unyson.themefuse.com/
5
  * Description: A free drag & drop framework that comes with a bunch of built in extensions that will help you develop premium themes fast & easy.
6
+ * Version: 2.4.1
7
  * Author: ThemeFuse
8
  * Author URI: http://themefuse.com
9
  * License: GPL2+