PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.66
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.66
1.2.74 1.2.73 1.2.72 1.2.71 1.2.70 1.2.69 1.2.68 1.2.67 1.2.66 1.2.65 1.2.64 1.2.63 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 All 174 releases
userswp / vendor / ayecode / wp-ayecode-ui / includes / ayecode-ui-settings.php

ayecode-ui-settings.php in UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP 1.2.66, at vendor/ayecode/wp-ayecode-ui/includes/ayecode-ui-settings.php

3,418 lines 133.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * A class for adjusting AyeCode UI settings on WordPress
4 *
5 * This class can be added to any plugin or theme and will add a settings screen to WordPress to control Bootstrap settings.
6 *
7 * @link https://github.com/AyeCode/wp-ayecode-ui
8 *
9 * @internal This file should not be edited directly but pulled from the github repo above.
10 */
11
12 /**
13 * Bail if we are not in WP.
14 */
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 /**
20 * Only add if the class does not already exist.
21 */
22 if ( ! class_exists( 'AyeCode_UI_Settings' ) ) {
23
24 /**
25 * A Class to be able to change settings for Font Awesome.
26 *
27 * Class AyeCode_UI_Settings
28 * @ver 1.0.0
29 * @todo decide how to implement textdomain
30 */
31 class AyeCode_UI_Settings {
32
33 /**
34 * Class version version.
35 *
36 * @var string
37 */
38 public $version = '0.2.50';
39
40 /**
41 * Class textdomain.
42 *
43 * @var string
44 */
45 public $textdomain = 'aui';
46
47 /**
48 * Latest version of Bootstrap at time of publish published.
49 *
50 * @var string
51 */
52 public $latest = "5.2.2";
53
54 /**
55 * Current version of select2 being used.
56 *
57 * @var string
58 */
59 public $select2_version = "4.0.11";
60
61 /**
62 * The title.
63 *
64 * @var string
65 */
66 public $name = 'AyeCode UI';
67
68 /**
69 * The relative url to the assets.
70 *
71 * @var string
72 */
73 public $url = '';
74
75 /**
76 * Holds the settings values.
77 *
78 * @var array
79 */
80 private $settings;
81
82 /**
83 * AyeCode_UI_Settings instance.
84 *
85 * @access private
86 * @since 1.0.0
87 * @var AyeCode_UI_Settings There can be only one!
88 */
89 private static $instance = null;
90
91
92 /**
93 * Main AyeCode_UI_Settings Instance.
94 *
95 * Ensures only one instance of AyeCode_UI_Settings is loaded or can be loaded.
96 *
97 * @since 1.0.0
98 * @static
99 * @return AyeCode_UI_Settings - Main instance.
100 */
101 public static function instance() {
102 if ( ! isset( self::$instance ) && ! ( self::$instance instanceof AyeCode_UI_Settings ) ) {
103
104 self::$instance = new AyeCode_UI_Settings;
105
106 add_action( 'init', array( self::$instance, 'init' ) ); // set settings
107
108 if ( is_admin() ) {
109 add_action( 'admin_menu', array( self::$instance, 'menu_item' ) );
110 add_action( 'admin_init', array( self::$instance, 'register_settings' ) );
111
112 // Maybe show example page
113 add_action( 'template_redirect', array( self::$instance,'maybe_show_examples' ) );
114
115 if ( defined( 'BLOCKSTRAP_VERSION' ) ) {
116 add_filter( 'sd_aui_colors', array( self::$instance,'sd_aui_colors' ), 10, 3 );
117 }
118 }
119
120 add_action( 'customize_register', array( self::$instance, 'customizer_settings' ));
121
122 do_action( 'ayecode_ui_settings_loaded' );
123 }
124
125 return self::$instance;
126 }
127
128 /**
129 * Add custom colors to the color selector.
130 *
131 * @param $theme_colors
132 * @param $include_outlines
133 * @param $include_branding
134 *
135 * @return mixed
136 */
137 public function sd_aui_colors( $theme_colors, $include_outlines, $include_branding ){
138
139
140 $setting = wp_get_global_settings();
141
142 if(!empty($setting['color']['palette']['custom'])){
143 foreach($setting['color']['palette']['custom'] as $color){
144 $theme_colors[$color['slug']] = esc_attr($color['name']);
145 }
146 }
147
148 return $theme_colors;
149 }
150
151 /**
152 * Setup some constants.
153 */
154 public function constants(){
155 define( 'AUI_PRIMARY_COLOR_ORIGINAL', "#1e73be" );
156 define( 'AUI_SECONDARY_COLOR_ORIGINAL', '#6c757d' );
157 define( 'AUI_INFO_COLOR_ORIGINAL', '#17a2b8' );
158 define( 'AUI_WARNING_COLOR_ORIGINAL', '#ffc107' );
159 define( 'AUI_DANGER_COLOR_ORIGINAL', '#dc3545' );
160 define( 'AUI_SUCCESS_COLOR_ORIGINAL', '#44c553' );
161 define( 'AUI_LIGHT_COLOR_ORIGINAL', '#f8f9fa' );
162 define( 'AUI_DARK_COLOR_ORIGINAL', '#343a40' );
163 define( 'AUI_WHITE_COLOR_ORIGINAL', '#fff' );
164 define( 'AUI_PURPLE_COLOR_ORIGINAL', '#ad6edd' );
165 define( 'AUI_SALMON_COLOR_ORIGINAL', '#ff977a' );
166 define( 'AUI_CYAN_COLOR_ORIGINAL', '#35bdff' );
167 define( 'AUI_GRAY_COLOR_ORIGINAL', '#ced4da' );
168 define( 'AUI_INDIGO_COLOR_ORIGINAL', '#502c6c' );
169 define( 'AUI_ORANGE_COLOR_ORIGINAL', '#orange' );
170 define( 'AUI_BLACK_COLOR_ORIGINAL', '#000' );
171
172 if ( ! defined( 'AUI_PRIMARY_COLOR' ) ) {
173 define( 'AUI_PRIMARY_COLOR', AUI_PRIMARY_COLOR_ORIGINAL );
174 }
175 if ( ! defined( 'AUI_SECONDARY_COLOR' ) ) {
176 define( 'AUI_SECONDARY_COLOR', AUI_SECONDARY_COLOR_ORIGINAL );
177 }
178 if ( ! defined( 'AUI_INFO_COLOR' ) ) {
179 define( 'AUI_INFO_COLOR', AUI_INFO_COLOR_ORIGINAL );
180 }
181 if ( ! defined( 'AUI_WARNING_COLOR' ) ) {
182 define( 'AUI_WARNING_COLOR', AUI_WARNING_COLOR_ORIGINAL );
183 }
184 if ( ! defined( 'AUI_DANGER_COLOR' ) ) {
185 define( 'AUI_DANGER_COLOR', AUI_DANGER_COLOR_ORIGINAL );
186 }
187 if ( ! defined( 'AUI_SUCCESS_COLOR' ) ) {
188 define( 'AUI_SUCCESS_COLOR', AUI_SUCCESS_COLOR_ORIGINAL );
189 }
190 if ( ! defined( 'AUI_LIGHT_COLOR' ) ) {
191 define( 'AUI_LIGHT_COLOR', AUI_LIGHT_COLOR_ORIGINAL );
192 }
193 if ( ! defined( 'AUI_DARK_COLOR' ) ) {
194 define( 'AUI_DARK_COLOR', AUI_DARK_COLOR_ORIGINAL );
195 }
196 if ( ! defined( 'AUI_WHITE_COLOR' ) ) {
197 define( 'AUI_WHITE_COLOR', AUI_WHITE_COLOR_ORIGINAL );
198 }
199 if ( ! defined( 'AUI_PURPLE_COLOR' ) ) {
200 define( 'AUI_PURPLE_COLOR', AUI_PURPLE_COLOR_ORIGINAL );
201 }
202 if ( ! defined( 'AUI_SALMON_COLOR' ) ) {
203 define( 'AUI_SALMON_COLOR', AUI_SALMON_COLOR_ORIGINAL );
204 }
205 if ( ! defined( 'AUI_CYAN_COLOR' ) ) {
206 define( 'AUI_CYAN_COLOR', AUI_CYAN_COLOR_ORIGINAL );
207 }
208 if ( ! defined( 'AUI_GRAY_COLOR' ) ) {
209 define( 'AUI_GRAY_COLOR', AUI_GRAY_COLOR_ORIGINAL );
210 }
211 if ( ! defined( 'AUI_INDIGO_COLOR' ) ) {
212 define( 'AUI_INDIGO_COLOR', AUI_INDIGO_COLOR_ORIGINAL );
213 }
214 if ( ! defined( 'AUI_ORANGE_COLOR' ) ) {
215 define( 'AUI_ORANGE_COLOR', AUI_ORANGE_COLOR_ORIGINAL );
216 }
217 if ( ! defined( 'AUI_BLACK_COLOR' ) ) {
218 define( 'AUI_BLACK_COLOR', AUI_BLACK_COLOR_ORIGINAL );
219 }
220
221 }
222
223 public static function get_colors( $original = false){
224
225 if ( ! defined( 'AUI_PRIMARY_COLOR' ) ) {
226 return array();
227 }
228 if ( $original ) {
229 return array(
230 'primary' => AUI_PRIMARY_COLOR_ORIGINAL,
231 'secondary' => AUI_SECONDARY_COLOR_ORIGINAL,
232 'info' => AUI_INFO_COLOR_ORIGINAL,
233 'warning' => AUI_WARNING_COLOR_ORIGINAL,
234 'danger' => AUI_DANGER_COLOR_ORIGINAL,
235 'success' => AUI_SUCCESS_COLOR_ORIGINAL,
236 'light' => AUI_LIGHT_COLOR_ORIGINAL,
237 'dark' => AUI_DARK_COLOR_ORIGINAL,
238 'white' => AUI_WHITE_COLOR_ORIGINAL,
239 'purple' => AUI_PURPLE_COLOR_ORIGINAL,
240 'salmon' => AUI_SALMON_COLOR_ORIGINAL,
241 'cyan' => AUI_CYAN_COLOR_ORIGINAL,
242 'gray' => AUI_GRAY_COLOR_ORIGINAL,
243 'indigo' => AUI_INDIGO_COLOR_ORIGINAL,
244 'orange' => AUI_ORANGE_COLOR_ORIGINAL,
245 'black' => AUI_BLACK_COLOR_ORIGINAL,
246 );
247 }
248
249 return array(
250 'primary' => AUI_PRIMARY_COLOR,
251 'secondary' => AUI_SECONDARY_COLOR,
252 'info' => AUI_INFO_COLOR,
253 'warning' => AUI_WARNING_COLOR,
254 'danger' => AUI_DANGER_COLOR,
255 'success' => AUI_SUCCESS_COLOR,
256 'light' => AUI_LIGHT_COLOR,
257 'dark' => AUI_DARK_COLOR,
258 'white' => AUI_WHITE_COLOR,
259 'purple' => AUI_PURPLE_COLOR,
260 'salmon' => AUI_SALMON_COLOR,
261 'cyan' => AUI_CYAN_COLOR,
262 'gray' => AUI_GRAY_COLOR,
263 'indigo' => AUI_INDIGO_COLOR,
264 'orange' => AUI_ORANGE_COLOR,
265 'black' => AUI_BLACK_COLOR,
266 );
267 }
268
269 /**
270 * Add admin body class to show when BS5 is active.
271 *
272 * @param $classes
273 *
274 * @return mixed
275 */
276 public function add_bs5_admin_body_class( $classes = '' ) {
277 $classes .= ' aui_bs5';
278
279 return $classes;
280 }
281
282 /**
283 * Add a body class to show when BS5 is active.
284 *
285 * @param $classes
286 *
287 * @return mixed
288 */
289 public function add_bs5_body_class( $classes ) {
290 $classes[] = 'aui_bs5';
291
292 return $classes;
293 }
294
295 /**
296 * Initiate the settings and add the required action hooks.
297 */
298 public function init() {
299 global $aui_bs5;
300
301 // Maybe fix settings
302 if ( ! empty( $_REQUEST['aui-fix-admin'] ) && !empty($_REQUEST['nonce']) && wp_verify_nonce( $_REQUEST['nonce'], "aui-fix-admin" ) ) {
303 $db_settings = get_option( 'ayecode-ui-settings' );
304 if ( ! empty( $db_settings ) ) {
305 $db_settings['css_backend'] = 'compatibility';
306 $db_settings['js_backend'] = 'core-popper';
307 update_option( 'ayecode-ui-settings', $db_settings );
308 wp_safe_redirect(admin_url("options-general.php?page=ayecode-ui-settings&updated=true"));
309 }
310 }
311
312 $this->constants();
313 $this->settings = $this->get_settings();
314 $this->url = $this->get_url();
315
316 // define the version
317 $aui_bs5 = $this->settings['bs_ver'] === '5';
318
319 if ( $aui_bs5 ) {
320 include_once( dirname( __FILE__ ) . '/inc/bs-conversion.php' );
321 add_filter( 'admin_body_class', array( $this, 'add_bs5_admin_body_class' ), 99, 1 );
322 add_filter( 'body_class', array( $this, 'add_bs5_body_class' ) );
323 }
324
325 /**
326 * Maybe load CSS
327 *
328 * We load super early in case there is a theme version that might change the colors
329 */
330 if ( $this->settings['css'] ) {
331 $priority = $this->is_bs3_compat() ? 100 : 1;
332 $priority = $aui_bs5 ? 10 : $priority;
333 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_style' ), $priority );
334 }
335 if ( $this->settings['css_backend'] && $this->load_admin_scripts() ) {
336 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_style' ), 1 );
337 }
338
339 // maybe load JS
340 if ( $this->settings['js'] ) {
341 $priority = $this->is_bs3_compat() ? 100 : 1;
342 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), $priority );
343 }
344 if ( $this->settings['js_backend'] && $this->load_admin_scripts() ) {
345 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 1 );
346 }
347
348 // Maybe set the HTML font size
349 if ( $this->settings['html_font_size'] ) {
350 add_action( 'wp_footer', array( $this, 'html_font_size' ), 10 );
351 }
352
353 // Maybe show backend style error
354 if( $this->settings['css_backend'] != 'compatibility' || $this->settings['js_backend'] != 'core-popper' ){
355 add_action( 'admin_notices', array( $this, 'show_admin_style_notice' ) );
356 }
357
358 }
359
360 /**
361 * Show admin notice if backend scripts not loaded.
362 */
363 public function show_admin_style_notice(){
364 $fix_url = admin_url("options-general.php?page=ayecode-ui-settings&aui-fix-admin=true&nonce=".wp_create_nonce('aui-fix-admin'));
365 $button = '<a href="'.esc_url($fix_url).'" class="button-primary">Fix Now</a>';
366 $message = __( '<b>Style Issue:</b> AyeCode UI is disable or set wrong.')." " .$button;
367 echo '<div class="notice notice-error aui-settings-error-notice"><p>'. wp_kses_post( $message ).'</p></div>';
368 }
369
370 /**
371 * Check if we should load the admin scripts or not.
372 *
373 * @return bool
374 */
375 public function load_admin_scripts(){
376 $result = true;
377
378 // check if specifically disabled
379 if(!empty($this->settings['disable_admin'])){
380 $url_parts = explode("\n",$this->settings['disable_admin']);
381 foreach($url_parts as $part){
382 if( strpos($_SERVER['REQUEST_URI'], trim($part)) !== false ){
383 return false; // return early, no point checking further
384 }
385 }
386 }
387
388 return $result;
389 }
390
391 /**
392 * Add a html font size to the footer.
393 */
394 public function html_font_size(){
395 $this->settings = $this->get_settings();
396 echo "<style>html{font-size:".absint($this->settings['html_font_size'])."px;}</style>";
397 }
398
399 /**
400 * Check if the current admin screen should load scripts.
401 *
402 * @return bool
403 */
404 public function is_aui_screen() {
405 $load = false;
406
407 // Check if we should load or not
408 if ( is_admin() ) {
409 // Only enable on set pages
410 $aui_screens = array(
411 'page',
412 'post',
413 'settings_page_ayecode-ui-settings',
414 'appearance_page_gutenberg-widgets',
415 'widgets',
416 'ayecode-ui-settings',
417 'site-editor'
418 );
419
420 $screen_ids = apply_filters( 'aui_screen_ids', $aui_screens );
421 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : array();
422
423 // Check if we are on a AUI screen
424 if ( $screen && in_array( $screen->id, $screen_ids ) ) {
425 $load = true;
426 }
427
428 // Load for widget previews in WP 5.8
429 if ( ! empty( $_REQUEST['legacy-widget-preview'] ) ) {
430 $load = true;
431 }
432 }
433
434 return apply_filters( 'aui_load_on_admin' , $load );
435 }
436
437 /**
438 * Check if the current theme is a block theme.
439 *
440 * @return bool
441 */
442 public static function is_block_theme() {
443 if ( function_exists( 'wp_is_block_theme' && wp_is_block_theme() ) ) {
444 return true;
445 }
446
447 return false;
448 }
449
450 /**
451 * Adds the styles.
452 */
453 public function enqueue_style() {
454 global $aui_bs5;
455
456 $load_fse = false;
457
458 if ( is_admin() && ! $this->is_aui_screen() ) {
459 // Don't add wp-admin scripts if not requested to.
460 } else {
461 $css_setting = current_action() == 'wp_enqueue_scripts' ? 'css' : 'css_backend';
462 $rtl = is_rtl() && ! $aui_bs5 ? '-rtl' : '';
463 $bs_ver = $this->settings['bs_ver'] == '5' ? '-v5' : '';
464
465 if ( $this->settings[ $css_setting ] ) {
466 $compatibility = $this->settings[$css_setting]=='core' ? false : true;
467 $url = $this->settings[$css_setting]=='core' ? $this->url.'assets'.$bs_ver.'/css/ayecode-ui'.$rtl.'.css' : $this->url.'assets'.$bs_ver.'/css/ayecode-ui-compatibility'.$rtl.'.css';
468
469 wp_register_style( 'ayecode-ui', $url, array(), $this->version );
470 wp_enqueue_style( 'ayecode-ui' );
471
472 if ( is_admin() && ( !empty($_REQUEST['postType']) || self::is_block_editor() ) && ( defined( 'BLOCKSTRAP_VERSION' ) || defined( 'AUI_FSE' ) ) ) {
473 $url = $this->url.'assets'.$bs_ver.'/css/ayecode-ui-fse.css';
474 wp_register_style( 'ayecode-ui-fse', $url, array(), $this->version );
475 wp_enqueue_style( 'ayecode-ui-fse' );
476 $load_fse = true;
477 }
478
479 // flatpickr
480 wp_register_style( 'flatpickr', $this->url.'assets'.$bs_ver.'/css/flatpickr.min.css', array(), $this->version );
481
482 // fix some wp-admin issues
483 if(is_admin()){
484 $custom_css = "
485 body:not(.editor-styles-wrapper){
486 background-color: #f1f1f1;
487 font-family: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif;
488 font-size:13px;
489 }
490 a {
491 color: #0073aa;
492 text-decoration: underline;
493 }
494 label {
495 display: initial;
496 margin-bottom: 0;
497 }
498 input, select {
499 margin: 1px;
500 line-height: initial;
501 }
502 th, td, div, h2 {
503 box-sizing: content-box;
504 }
505 h1, h2, h3, h4, h5, h6 {
506 display: block;
507 font-weight: 600;
508 }
509 h2,h3 {
510 font-size: 1.3em;
511 margin: 1em 0
512 }
513 .blocks-widgets-container .bsui *{
514 box-sizing: border-box;
515 }
516 .bs-tooltip-top .arrow{
517 margin-left:0px;
518 }
519 .custom-switch input[type=checkbox]{
520 display:none;
521 }
522 ";
523
524 // @todo, remove once fixed :: fix for this bug https://github.com/WordPress/gutenberg/issues/14377
525 $custom_css .= "
526 .edit-post-sidebar input[type=color].components-text-control__input{
527 padding: 0;
528 }
529 ";
530 wp_add_inline_style( 'ayecode-ui', $custom_css );
531 }
532
533 // custom changes
534 if ( $load_fse ) {
535 wp_add_inline_style( 'ayecode-ui-fse', self::custom_css($compatibility, true) );
536 }else{
537 wp_add_inline_style( 'ayecode-ui', self::custom_css($compatibility) );
538 }
539 }
540 }
541 }
542
543 /**
544 * Get inline script used if bootstrap enqueued
545 *
546 * If this remains small then its best to use this than to add another JS file.
547 */
548 public function inline_script() {
549 global $aui_bs5;
550 // Flatpickr calendar locale
551 $flatpickr_locale = self::flatpickr_locale();
552
553 ob_start();
554 if ( $aui_bs5 ) {
555 include_once( dirname( __FILE__ ) . '/inc/bs5-js.php' );
556 }else{
557 include_once( dirname( __FILE__ ) . '/inc/bs4-js.php' );
558 }
559
560 $output = ob_get_clean();
561
562 /*
563 * We only add the <script> tags for code highlighting, so we strip them from the output.
564 */
565 return str_replace( array(
566 '<script>',
567 '</script>'
568 ), '', self::minify_js($output) );
569 }
570
571
572 /**
573 * JS to help with conflict issues with other plugins and themes using bootstrap v3.
574 *
575 * @TODO we may need this when other conflicts arrise.
576 * @return mixed
577 */
578 public static function bs3_compat_js() {
579 ob_start();
580 ?>
581 <script>
582 <?php if( defined( 'FUSION_BUILDER_VERSION' ) ){ ?>
583 /* With Avada builder */
584
585 <?php } ?>
586 </script>
587 <?php
588 return str_replace( array(
589 '<script>',
590 '</script>'
591 ), '', ob_get_clean());
592 }
593
594 /**
595 * Get inline script used if bootstrap file browser enqueued.
596 *
597 * If this remains small then its best to use this than to add another JS file.
598 */
599 public function inline_script_file_browser(){
600 ob_start();
601 ?>
602 <script>
603 // run on doc ready
604 jQuery(document).ready(function () {
605 bsCustomFileInput.init();
606 });
607 </script>
608 <?php
609 $output = ob_get_clean();
610
611 /*
612 * We only add the <script> tags for code highlighting, so we strip them from the output.
613 */
614 return str_replace( array(
615 '<script>',
616 '</script>'
617 ), '', $output );
618 }
619
620 /**
621 * Adds the Font Awesome JS.
622 */
623 public function enqueue_scripts() {
624 if( is_admin() && !$this->is_aui_screen()){
625 // Don't add wp-admin scripts if not requested to.
626 } else {
627 $js_setting = current_action() == 'wp_enqueue_scripts' ? 'js' : 'js_backend';
628
629 $bs_ver = $this->settings['bs_ver'] == '5' ? '-v5' : '';
630
631 // select2
632 wp_register_script( 'select2', $this->url . 'assets/js/select2.min.js', array( 'jquery' ), $this->select2_version );
633
634 // flatpickr
635 wp_register_script( 'flatpickr', $this->url . 'assets/js/flatpickr.min.js', array(), $this->version );
636
637 // iconpicker
638 if ( defined( 'FAS_ICONPICKER_JS_URL' ) ) {
639 wp_register_script( 'iconpicker', FAS_ICONPICKER_JS_URL, array(), $this->version );
640 }else{
641 wp_register_script( 'iconpicker', $this->url . 'assets/js/fa-iconpicker.min.js', array(), $this->version );
642 }
643
644 // Bootstrap file browser
645 wp_register_script( 'aui-custom-file-input', $url = $this->url . 'assets/js/bs-custom-file-input.min.js', array( 'jquery' ), $this->select2_version );
646 wp_add_inline_script( 'aui-custom-file-input', $this->inline_script_file_browser() );
647
648 $load_inline = false;
649
650 // Load select2 only when required.
651 if ( $this->force_load_select2() ) {
652 $dependency = array( 'select2', 'jquery' );
653 } else {
654 $dependency = array( 'jquery' );
655 }
656
657 if ( $this->settings[ $js_setting ] == 'core-popper' ) {
658 // Bootstrap bundle
659 $url = $this->url . 'assets' . $bs_ver . '/js/bootstrap.bundle.min.js';
660 wp_register_script( 'bootstrap-js-bundle', $url, $dependency, $this->version, $this->is_bs3_compat() );
661
662 // If in admin then add to footer for compatibility.
663 is_admin() ? wp_enqueue_script( 'bootstrap-js-bundle', '', null, null, true ) : wp_enqueue_script( 'bootstrap-js-bundle' );
664
665 $script = $this->inline_script();
666 wp_add_inline_script( 'bootstrap-js-bundle', $script );
667 } elseif ( $this->settings[ $js_setting ] == 'popper' ) {
668 $url = $this->url . 'assets/js/popper.min.js'; // @todo we need to update this to bs5
669 wp_register_script( 'bootstrap-js-popper', $url, $dependency, $this->version );
670 wp_enqueue_script( 'bootstrap-js-popper' );
671 $load_inline = true;
672 } else {
673 $load_inline = true;
674 }
675
676 // Load needed inline scripts by faking the loading of a script if the main script is not being loaded
677 if ( $load_inline ) {
678 wp_register_script( 'bootstrap-dummy', '', $dependency );
679 wp_enqueue_script( 'bootstrap-dummy' );
680
681 $script = $this->inline_script();
682 wp_add_inline_script( 'bootstrap-dummy', $script );
683 }
684 }
685 }
686
687 /**
688 * Enqueue select2 if called.
689 *
690 * @since 0.2.29
691 */
692 public function force_load_select2() {
693 global $aui_select2_enqueued;
694
695 $conditional_select2 = apply_filters( 'aui_is_conditional_select2', true );
696
697 if ( $conditional_select2 !== true ) {
698 return true;
699 }
700
701 $load = is_admin() && ! $aui_select2_enqueued;
702
703 return apply_filters( 'aui_force_load_select2', $load );
704 }
705
706 /**
707 * Enqueue select2 if called.
708 *
709 * @since 0.2.29
710 */
711 public function enqueue_select2() {
712 wp_enqueue_script( 'select2' );
713 }
714
715 /**
716 * Enqueue flatpickr if called.
717 */
718 public function enqueue_flatpickr(){
719 wp_enqueue_style( 'flatpickr' );
720 wp_enqueue_script( 'flatpickr' );
721 }
722
723 /**
724 * Enqueue iconpicker if called.
725 */
726 public function enqueue_iconpicker(){
727 wp_enqueue_style( 'iconpicker' );
728 wp_enqueue_script( 'iconpicker' );
729 }
730
731 /**
732 * Get the url path to the current folder.
733 *
734 * This can be called very early, hence the need for the dynamic way of getting the URL.
735 *
736 * @since 0.2.31 changed to support edge cases like bitnami containers.
737 * @return string
738 */
739 public function get_url() {
740 $content_dir = wp_normalize_path( untrailingslashit( WP_CONTENT_DIR ) );
741 $content_url = untrailingslashit( WP_CONTENT_URL );
742
743 // maybe Replace http:// to https://.
744 if ( strpos( $content_url, 'http://' ) === 0 && strpos( plugins_url(), 'https://' ) === 0 ) {
745 $content_url = str_replace( 'http://', 'https://', $content_url );
746 }
747
748 // First find where in the path our content directory starts
749 $content_basename = basename($content_dir);
750 $file_dir = str_replace( "/includes", "", wp_normalize_path( dirname( __FILE__ ) ) );
751
752 // Find the relative path by matching from content directory name
753 $after_content = substr($file_dir, strpos($file_dir, '/' . $content_basename . '/') + strlen('/' . $content_basename . '/'));
754
755 // Build URL using WP_CONTENT_URL and the relative path
756 $url = trailingslashit($content_url) . $after_content;
757
758 // some hosts end up with /wp-content/wp-content/
759 $url = str_replace( '/wp-content/wp-content/', '/wp-content/', $url );
760
761 return trailingslashit($url);
762 }
763
764 /**
765 * Get the url path to the current folder.
766 * @todo remove
767 * @return string
768 */
769 public function get_url_old() {
770
771 $url = '';
772 // check if we are inside a plugin
773 $file_dir = str_replace( "/includes","", wp_normalize_path( dirname( __FILE__ ) ) );
774
775 // add check in-case user has changed wp-content dir name.
776 $wp_content_folder_name = basename(WP_CONTENT_DIR);
777 $dir_parts = explode("/$wp_content_folder_name/",$file_dir);
778 $url_parts = explode("/$wp_content_folder_name/",plugins_url());
779
780 if(!empty($url_parts[0]) && !empty($dir_parts[1])){
781 $url = trailingslashit( $url_parts[0]."/$wp_content_folder_name/".$dir_parts[1] );
782 }
783
784 return $url;
785 }
786
787 /**
788 * Register the database settings with WordPress.
789 */
790 public function register_settings() {
791 register_setting( 'ayecode-ui-settings', 'ayecode-ui-settings' );
792 }
793
794 /**
795 * Add the WordPress settings menu item.
796 * @since 1.0.10 Calling function name direct will fail theme check so we don't.
797 */
798 public function menu_item() {
799 $menu_function = 'add' . '_' . 'options' . '_' . 'page'; // won't pass theme check if function name present in theme
800 call_user_func( $menu_function, $this->name, $this->name, 'manage_options', 'ayecode-ui-settings', array(
801 $this,
802 'settings_page'
803 ) );
804 }
805
806 /**
807 * Get a list of themes and their default JS settings.
808 *
809 * @return array
810 */
811 public function theme_js_settings(){
812 return array(
813 'ayetheme' => 'popper',
814 'listimia' => 'required',
815 'listimia_backend' => 'core-popper',
816 //'avada' => 'required', // removed as we now add compatibility
817 );
818 }
819
820 /**
821 * Get the date the site was installed.
822 *
823 * @return false|string
824 */
825 public function get_site_install_date() {
826 global $wpdb; // This gives you access to the WordPress database object
827
828 // Prepare the SQL query to get the oldest registration date
829 $query = "SELECT MIN(user_registered) AS oldest_registration_date FROM {$wpdb->users}";
830
831 // Execute the query
832 $date = $wpdb->get_var( $query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
833
834 return $date ? $date : false;
835 }
836
837 /**
838 * Show admin notice if backend scripts not loaded.
839 */
840 public function show_admin_version_notice(){
841 $fix_url = admin_url("options-general.php?page=ayecode-ui-settings" );
842 $button = '<a href="'.esc_url($fix_url).'" class="button-primary">View Settings</a>';
843 $message = __( '<b>Style Issue:</b> AyeCode UI has changed its default version from v4 to v5, if you notice unwanted style changes, please revert to v4 (saving the settings page will remove this notice)')." " .$button;
844 echo '<div class="notice notice-error aui-settings-error-notice"><p>'. wp_kses_post( $message ).'</p></div>';
845 }
846
847 /**
848 * Get the current Font Awesome output settings.
849 *
850 * @return array The array of settings.
851 */
852 public function get_settings() {
853 $db_settings = get_option( 'ayecode-ui-settings' );
854
855 // Maybe show default version notice
856 if ( empty( $db_settings ) ) {
857 $site_install_date = new DateTime( self::get_site_install_date() );
858 $switch_over_date = new DateTime( "2024-02-01" );
859
860 if ( $site_install_date < $switch_over_date ) {
861 add_action( 'admin_notices', array( $this, 'show_admin_version_notice' ) );
862 }
863 }
864
865 $js_default = 'core-popper';
866 $js_default_backend = $js_default;
867
868 // maybe set defaults (if no settings set)
869 if(empty($db_settings)){
870 $active_theme = strtolower( get_template() ); // active parent theme.
871 $theme_js_settings = self::theme_js_settings();
872 if(isset($theme_js_settings[$active_theme])){
873 $js_default = $theme_js_settings[$active_theme];
874 $js_default_backend = isset($theme_js_settings[$active_theme."_backend"]) ? $theme_js_settings[$active_theme."_backend"] : $js_default;
875 }
876 }
877
878 /**
879 * Filter the default settings.
880 */
881 $defaults = apply_filters( 'ayecode-ui-default-settings', array(
882 'css' => 'compatibility', // core, compatibility
883 'js' => $js_default, // js to load, core-popper, popper
884 'html_font_size' => '16', // js to load, core-popper, popper
885 'css_backend' => 'compatibility', // core, compatibility
886 'js_backend' => $js_default_backend, // js to load, core-popper, popper
887 'disable_admin' => '', // URL snippets to disable loading on admin
888 'bs_ver' => '5', // The default bootstrap version to sue by default
889 ), $db_settings );
890
891 $settings = wp_parse_args( $db_settings, $defaults );
892
893 /**
894 * Filter the Bootstrap settings.
895 *
896 * @todo if we add this filer people might use it and then it defeats the purpose of this class :/
897 */
898 return $this->settings = apply_filters( 'ayecode-ui-settings', $settings, $db_settings, $defaults );
899 }
900
901
902 /**
903 * The settings page html output.
904 */
905 public function settings_page() {
906 if ( ! current_user_can( 'manage_options' ) ) {
907 wp_die( esc_attr__( 'You do not have sufficient permissions to access this page.', 'ayecode-connect' ) );
908 }
909 $overrides = apply_filters( 'ayecode-ui-settings', array(), array(), array() );
910
911 ?>
912 <div class="wrap">
913 <h1><?php echo esc_attr( $this->name ); ?></h1>
914 <p><?php echo esc_html( apply_filters( 'ayecode-ui-settings-message', __("Here you can adjust settings if you are having compatibility issues.", 'ayecode-connect' ) ) );?></p>
915 <form method="post" action="options.php">
916 <?php
917 settings_fields( 'ayecode-ui-settings' );
918 do_settings_sections( 'ayecode-ui-settings' );
919 ?>
920
921 <h2><?php esc_html_e( 'BootStrap Version', 'ayecode-connect' ); ?></h2>
922 <p><?php echo esc_html( apply_filters( 'ayecode-ui-version-settings-message', __("V5 is recommended, however if you have another plugin installed using v4, you may need to use v4 also.", 'ayecode-connect' ) ) );?></p>
923 <div class="bsui"><?php
924 if ( ! empty( $overrides ) ) {
925 echo aui()->alert(array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
926 'type'=> 'info',
927 'content'=> esc_attr__("Some options are disabled as your current theme is overriding them.", 'ayecode-connect' )
928 ));
929 }
930 ?>
931 </div>
932 <table class="form-table wpbs-table-version-settings">
933 <tr valign="top">
934 <th scope="row"><label for="wpbs-css"><?php esc_html_e( 'Version', 'ayecode-connect' ); ?></label></th>
935 <td>
936 <select name="ayecode-ui-settings[bs_ver]" id="wpbs-css" <?php echo !empty($overrides['bs_ver']) ? 'disabled' : ''; ?>>
937 <option value="5" <?php selected( $this->settings['bs_ver'], '5' ); ?>><?php esc_html_e( 'v5 (recommended)', 'ayecode-connect' ); ?></option>
938 <option value="4" <?php selected( $this->settings['bs_ver'], '4' ); ?>><?php esc_html_e( 'v4 (legacy)', 'ayecode-connect' ); ?></option>
939 </select>
940 </td>
941 </tr>
942 </table>
943
944 <h2><?php esc_html_e( 'Frontend', 'ayecode-connect' ); ?></h2>
945 <table class="form-table wpbs-table-settings">
946 <tr valign="top">
947 <th scope="row"><label for="wpbs-css"><?php esc_html_e( 'Load CSS', 'ayecode-connect' ); ?></label></th>
948 <td>
949 <select name="ayecode-ui-settings[css]" id="wpbs-css" <?php echo !empty($overrides['css']) ? 'disabled' : ''; ?>>
950 <option value="compatibility" <?php selected( $this->settings['css'], 'compatibility' ); ?>><?php esc_html_e( 'Compatibility Mode (default)', 'ayecode-connect' ); ?></option>
951 <option value="core" <?php selected( $this->settings['css'], 'core' ); ?>><?php esc_html_e( 'Full Mode', 'ayecode-connect' ); ?></option>
952 <option value="" <?php selected( $this->settings['css'], '' ); ?>><?php esc_html_e( 'Disabled', 'ayecode-connect' ); ?></option>
953 </select>
954 </td>
955 </tr>
956
957 <tr valign="top">
958 <th scope="row"><label for="wpbs-js"><?php esc_html_e( 'Load JS', 'ayecode-connect' ); ?></label></th>
959 <td>
960 <select name="ayecode-ui-settings[js]" id="wpbs-js" <?php echo !empty($overrides['js']) ? 'disabled' : ''; ?>>
961 <option value="core-popper" <?php selected( $this->settings['js'], 'core-popper' ); ?>><?php esc_html_e( 'Core + Popper (default)', 'ayecode-connect' ); ?></option>
962 <option value="popper" <?php selected( $this->settings['js'], 'popper' ); ?>><?php esc_html_e( 'Popper', 'ayecode-connect' ); ?></option>
963 <option value="required" <?php selected( $this->settings['js'], 'required' ); ?>><?php esc_html_e( 'Required functions only', 'ayecode-connect' ); ?></option>
964 <option value="" <?php selected( $this->settings['js'], '' ); ?>><?php esc_html_e( 'Disabled (not recommended)', 'ayecode-connect' ); ?></option>
965 </select>
966 </td>
967 </tr>
968
969 <tr valign="top">
970 <th scope="row"><label for="wpbs-font_size"><?php esc_html_e( 'HTML Font Size (px)', 'ayecode-connect' ); ?></label></th>
971 <td>
972 <input type="number" name="ayecode-ui-settings[html_font_size]" id="wpbs-font_size" value="<?php echo absint( $this->settings['html_font_size']); ?>" placeholder="16" <?php echo !empty($overrides['html_font_size']) ? 'disabled' : ''; ?> />
973 <p class="description" ><?php esc_html_e("Our font sizing is rem (responsive based) here you can set the html font size in-case your theme is setting it too low.", 'ayecode-connect' );?></p>
974 </td>
975 </tr>
976
977 </table>
978
979 <h2><?php esc_html_e( 'Backend', 'ayecode-connect' ); ?> (wp-admin)</h2>
980 <table class="form-table wpbs-table-settings">
981 <tr valign="top">
982 <th scope="row"><label for="wpbs-css-admin"><?php esc_html_e( 'Load CSS', 'ayecode-connect' ); ?></label></th>
983 <td>
984 <select name="ayecode-ui-settings[css_backend]" id="wpbs-css-admin" <?php echo !empty($overrides['css_backend']) ? 'disabled' : ''; ?>>
985 <option value="compatibility" <?php selected( $this->settings['css_backend'], 'compatibility' ); ?>><?php esc_html_e( 'Compatibility Mode (default)', 'ayecode-connect' ); ?></option>
986 <option value="core" <?php selected( $this->settings['css_backend'], 'core' ); ?>><?php esc_html_e( 'Full Mode (will cause style issues)', 'ayecode-connect' ); ?></option>
987 <option value="" <?php selected( $this->settings['css_backend'], '' ); ?>><?php esc_html_e( 'Disabled', 'ayecode-connect' ); ?></option>
988 </select>
989 </td>
990 </tr>
991
992 <tr valign="top">
993 <th scope="row"><label for="wpbs-js-admin"><?php esc_html_e( 'Load JS', 'ayecode-connect' ); ?></label></th>
994 <td>
995 <select name="ayecode-ui-settings[js_backend]" id="wpbs-js-admin" <?php echo !empty($overrides['js_backend']) ? 'disabled' : ''; ?>>
996 <option value="core-popper" <?php selected( $this->settings['js_backend'], 'core-popper' ); ?>><?php esc_html_e( 'Core + Popper (default)', 'ayecode-connect' ); ?></option>
997 <option value="popper" <?php selected( $this->settings['js_backend'], 'popper' ); ?>><?php esc_html_e( 'Popper', 'ayecode-connect' ); ?></option>
998 <option value="required" <?php selected( $this->settings['js_backend'], 'required' ); ?>><?php esc_html_e( 'Required functions only', 'ayecode-connect' ); ?></option>
999 <option value="" <?php selected( $this->settings['js_backend'], '' ); ?>><?php esc_html_e( 'Disabled (not recommended)', 'ayecode-connect' ); ?></option>
1000 </select>
1001 </td>
1002 </tr>
1003
1004 <tr valign="top">
1005 <th scope="row"><label for="wpbs-disable-admin"><?php esc_html_e( 'Disable load on URL', 'ayecode-connect' ); ?></label></th>
1006 <td>
1007 <p><?php esc_html_e( 'If you have backend conflict you can enter a partial URL argument that will disable the loading of AUI on those pages. Add each argument on a new line.', 'ayecode-connect' ); ?></p>
1008 <textarea name="ayecode-ui-settings[disable_admin]" rows="10" cols="50" id="wpbs-disable-admin" class="large-text code" spellcheck="false" placeholder="myplugin.php &#10;action=go"><?php echo esc_textarea( $this->settings['disable_admin'] );?></textarea>
1009 </td>
1010 </tr>
1011 </table>
1012
1013 <?php
1014 submit_button();
1015 ?>
1016 </form>
1017 <div id="wpbs-version" data-aui-source="<?php echo esc_attr( $this->get_load_source() ); ?>"><?php echo esc_html( $this->version ); ?></div>
1018 </div>
1019 <?php
1020 }
1021
1022 public function get_load_source(){
1023 $file = str_replace( array( "/", "\\" ), "/", realpath( __FILE__ ) );
1024 $plugins_dir = str_replace( array( "/", "\\" ), "/", realpath( WP_PLUGIN_DIR ) );
1025
1026 // Find source plugin/theme of SD
1027 $source = array();
1028 if ( strpos( $file, $plugins_dir ) !== false ) {
1029 $source = explode( "/", plugin_basename( $file ) );
1030 } else if ( function_exists( 'get_theme_root' ) ) {
1031 $themes_dir = str_replace( array( "/", "\\" ), "/", realpath( get_theme_root() ) );
1032
1033 if ( strpos( $file, $themes_dir ) !== false ) {
1034 $source = explode( "/", ltrim( str_replace( $themes_dir, "", $file ), "/" ) );
1035 }
1036 }
1037
1038 return isset($source[0]) ? esc_attr($source[0]) : '';
1039 }
1040
1041 public function customizer_settings($wp_customize){
1042 $wp_customize->add_section('aui_settings', array(
1043 'title' => __('AyeCode UI', 'ayecode-connect' ),
1044 'priority' => 120,
1045 ));
1046
1047 // =============================
1048 // = Color Picker =
1049 // =============================
1050 $wp_customize->add_setting('aui_options[color_primary]', array(
1051 'default' => AUI_PRIMARY_COLOR,
1052 'sanitize_callback' => 'sanitize_hex_color',
1053 'capability' => 'edit_theme_options',
1054 'type' => 'option',
1055 'transport' => 'refresh',
1056 ));
1057 $wp_customize->add_control( new WP_Customize_Color_Control($wp_customize, 'color_primary', array(
1058 'label' => __('Primary Color', 'ayecode-connect' ),
1059 'section' => 'aui_settings',
1060 'settings' => 'aui_options[color_primary]',
1061 )));
1062
1063 $wp_customize->add_setting('aui_options[color_secondary]', array(
1064 'default' => '#6c757d',
1065 'sanitize_callback' => 'sanitize_hex_color',
1066 'capability' => 'edit_theme_options',
1067 'type' => 'option',
1068 'transport' => 'refresh',
1069 ));
1070 $wp_customize->add_control( new WP_Customize_Color_Control($wp_customize, 'color_secondary', array(
1071 'label' => __('Secondary Color', 'ayecode-connect' ),
1072 'section' => 'aui_settings',
1073 'settings' => 'aui_options[color_secondary]',
1074 )));
1075 }
1076
1077 /**
1078 * CSS to help with conflict issues with other plugins and themes using bootstrap v3.
1079 *
1080 * @return mixed
1081 */
1082 public static function bs3_compat_css() {
1083 ob_start();
1084 ?>
1085 <style>
1086 /* Bootstrap 3 compatibility */
1087 body.modal-open .modal-backdrop.show:not(.in) {opacity:0.5;}
1088 body.modal-open .modal.show:not(.in) {opacity:1;z-index: 99999}
1089 body.modal-open .modal.show:not(.in) .modal-content {box-shadow: none;}
1090 body.modal-open .modal.show:not(.in) .modal-dialog {transform: initial;}
1091
1092 body.modal-open .modal.bsui .modal-dialog{left: auto;}
1093
1094 .collapse.show:not(.in){display: inherit;}
1095 .fade.show{opacity: 1;}
1096
1097 <?php if( defined( 'SVQ_THEME_VERSION' ) ){ ?>
1098 /* KLEO theme specific */
1099 .kleo-main-header .navbar-collapse.collapse.show:not(.in){display: block !important;}
1100 <?php } ?>
1101
1102 <?php if( defined( 'FUSION_BUILDER_VERSION' ) ){ ?>
1103 /* With Avada builder */
1104 body.modal-open .modal.in {opacity:1;z-index: 99999}
1105 body.modal-open .modal.bsui.in .modal-content {box-shadow: none;}
1106 .bsui .collapse.in{display: inherit;}
1107 .bsui .collapse.in.row.show{display: flex;}
1108 .bsui .collapse.in.row:not(.show){display: none;}
1109
1110 <?php } ?>
1111 </style>
1112 <?php
1113 return str_replace( array(
1114 '<style>',
1115 '</style>'
1116 ), '', self::minify_css( ob_get_clean() ) );
1117 }
1118
1119 public static function custom_css( $compatibility = true, $is_fse = false ) {
1120 global $aui_bs5;
1121
1122 $colors = array();
1123
1124 if ( defined( 'BLOCKSTRAP_VERSION' ) ) {
1125 $setting = wp_get_global_settings();
1126
1127 if ( ! empty( $setting['color']['palette']['theme'] ) ) {
1128 foreach ( $setting['color']['palette']['theme'] as $color ) {
1129 $colors[$color['slug']] = esc_attr( $color['color'] );
1130 }
1131 }
1132
1133 if ( ! empty( $setting['color']['palette']['custom'] ) ) {
1134 foreach ( $setting['color']['palette']['custom'] as $color ) {
1135 $colors[$color['slug']] = esc_attr( $color['color'] );
1136 }
1137 }
1138 } else {
1139 $settings = get_option( 'aui_options' );
1140
1141 $colors = array(
1142 'primary' => ! empty( $settings['color_primary'] ) ? $settings['color_primary'] : AUI_PRIMARY_COLOR,
1143 'secondary' => ! empty( $settings['color_secondary'] ) ? $settings['color_secondary'] : AUI_SECONDARY_COLOR
1144 );
1145 }
1146
1147 ob_start();
1148 ?><style><?php
1149 // BS v3 compat
1150 if( self::is_bs3_compat() ){
1151 echo self::bs3_compat_css(); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1152 }
1153
1154 //$is_fse = false;
1155 //if ( is_admin() && ( !empty($_REQUEST['postType']) || self::is_block_editor() ) && ( defined( 'BLOCKSTRAP_VERSION' ) || defined( 'AUI_FSE' ) ) ) {
1156 //$is_fse = true;
1157 //}
1158
1159 $custom_front = ! is_admin() ? true : apply_filters('ayecode_ui_custom_front', false );
1160 $custom_admin = $is_fse || self::is_preview() ? true : apply_filters('ayecode_ui_custom_admin', false );
1161 $bs_custom_css = apply_filters( 'ayecode_ui_bs_custom_css', $custom_admin || $custom_front );
1162 //$bs_custom_css = true; // Force true to fix any color issue.
1163
1164 $colors_css = '';
1165 if ( ! empty( $colors ) && $bs_custom_css ) {
1166 $d_colors = self::get_colors(true);
1167
1168 foreach ( $colors as $key => $color ) {
1169 if ( ( empty( $d_colors[$key]) || $d_colors[$key] != $color) || $is_fse ) {
1170 $var = $is_fse ? "var(--wp--preset--color--$key)" : $color;
1171 $compat = $is_fse ? '.editor-styles-wrapper' : $compatibility;
1172
1173 $colors_css .= $aui_bs5 ? self::css_overwrite_bs5( $key,$var, $compat, $color ) : self::css_overwrite( $key, $var, $compat, $color );
1174 }
1175 }
1176 }
1177
1178 if ( $colors_css ) {
1179 echo $colors_css; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1180 }
1181
1182 // Set admin bar z-index lower when modal is open.
1183 echo ' body.modal-open #wpadminbar{z-index:999}.embed-responsive-16by9 .fluid-width-video-wrapper{padding:0 !important;position:initial}';
1184
1185 if ( is_admin() ) {
1186 echo ' body.modal-open #adminmenuwrap{z-index:999} body.modal-open #wpadminbar{z-index:1025}';
1187 }
1188
1189 $custom_css = '';
1190
1191 if ( $aui_bs5 && defined( 'BLOCKSTRAP_VERSION' ) && $bs_custom_css ) {
1192 $css = '';
1193 $theme_settings = wp_get_global_styles();
1194
1195 // Font face
1196 if( !empty( $theme_settings['typography']['fontFamily'] ) ){
1197 $t_fontface = str_replace( array('var:preset|','font-family|'), array('--wp--preset--','font-family--'), $theme_settings['typography']['fontFamily'] ); //var(--wp--preset--font-family--poppins)
1198 $css .= '--bs-body-font-family: ' . esc_attr($t_fontface) . ';';
1199 }
1200
1201 // font size
1202 if( !empty( $theme_settings['typography']['fontSize'] ) ){
1203 $css .= '--bs-body-font-size: ' . esc_attr( $theme_settings['typography']['fontSize'] ) . ' ;';
1204 }
1205
1206 // line height
1207 if( !empty( $theme_settings['typography']['lineHeight'] ) ){
1208 $css .= '--bs-body-line-height: ' . esc_attr( $theme_settings['typography']['lineHeight'] ) . ';';
1209 }
1210
1211
1212 // font weight
1213 if( !empty( $theme_settings['typography']['fontWeight'] ) ){
1214 $css .= '--bs-body-font-weight: ' . esc_attr( $theme_settings['typography']['fontWeight'] ) . ';';
1215 }
1216
1217 // Background
1218 if( !empty( $theme_settings['color']['background'] ) ){
1219 $css .= '--bs-body-bg: ' . esc_attr( $theme_settings['color']['background'] ) . ';';
1220 }
1221
1222 // Background Gradient
1223 if( !empty( $theme_settings['color']['gradient'] ) ){
1224 $css .= 'background: ' . esc_attr( $theme_settings['color']['gradient'] ) . ';';
1225 }
1226
1227 // Background Gradient
1228 if( !empty( $theme_settings['color']['gradient'] ) ){
1229 $css .= 'background: ' . esc_attr( $theme_settings['color']['gradient'] ) . ';';
1230 }
1231
1232 // text color
1233 if( !empty( $theme_settings['color']['text'] ) ){
1234 $css .= '--bs-body-color: ' . esc_attr( $theme_settings['color']['text'] ) . ';';
1235 }
1236
1237
1238 // link colors
1239 if( !empty( $theme_settings['elements']['link']['color']['text'] ) ){
1240 $css .= '--bs-link-color: ' . esc_attr( $theme_settings['elements']['link']['color']['text'] ) . ';';
1241 }
1242 if( !empty( $theme_settings['elements']['link'][':hover']['color']['text'] ) ){
1243 $css .= '--bs-link-hover-color: ' . esc_attr( $theme_settings['elements']['link'][':hover']['color']['text'] ) . ';';
1244 }
1245
1246 if($css){
1247 $custom_css .= $is_fse ? 'body.editor-styles-wrapper{' . esc_attr( $css ) . '}' : 'body{' . esc_attr( $css ) . '}';
1248 }
1249
1250 $bep = $is_fse ? 'body.editor-styles-wrapper ' : '';
1251
1252 // Headings
1253 $headings_css = '';
1254 if( !empty( $theme_settings['elements']['heading']['color']['text'] ) ){
1255 $headings_css .= "color: " . esc_attr( $theme_settings['elements']['heading']['color']['text'] ) . ";";
1256 }
1257
1258 // heading background
1259 if( !empty( $theme_settings['elements']['heading']['color']['background'] ) ){
1260 $headings_css .= 'background: ' . esc_attr( $theme_settings['elements']['heading']['color']['background'] ) . ';';
1261 }
1262
1263 // heading font family
1264 if( !empty( $theme_settings['elements']['heading']['typography']['fontFamily'] ) ){
1265 $headings_css .= 'font-family: ' . esc_attr( $theme_settings['elements']['heading']['typography']['fontFamily'] ) . ';';
1266 }
1267
1268 if( $headings_css ){
1269 $custom_css .= "$bep h1,$bep h2,$bep h3, $bep h4,$bep h5,$bep h6{ " . esc_attr( $headings_css ) . "}";
1270 }
1271
1272 $hs = array('h1','h2','h3','h4','h5','h6');
1273
1274 foreach($hs as $hn){
1275 $h_css = '';
1276 if( !empty( $theme_settings['elements'][$hn]['color']['text'] ) ){
1277 $h_css .= 'color: ' . esc_attr( $theme_settings['elements'][$hn]['color']['text'] ) . ';';
1278 }
1279
1280 if( !empty( $theme_settings['elements'][$hn]['typography']['fontSize'] ) ){
1281 $h_css .= 'font-size: ' . esc_attr( $theme_settings['elements'][$hn]['typography']['fontSize'] ) . ';';
1282 }
1283
1284 if( !empty( $theme_settings['elements'][$hn]['typography']['fontFamily'] ) ){
1285 $h_css .= 'font-family: ' . esc_attr( $theme_settings['elements'][$hn]['typography']['fontFamily'] ) . ';';
1286 }
1287
1288 if($h_css){
1289 $custom_css .= esc_attr( $bep . $hn ) . '{'.esc_attr( $h_css ).'}';
1290 }
1291 }
1292 }
1293
1294 if ( $custom_css ) {
1295 echo $custom_css; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1296 }
1297
1298 // Pagination on Hello Elementor theme.
1299 if ( function_exists( 'hello_elementor_setup' ) ) {
1300 echo '.aui-nav-links .pagination{justify-content:inherit}';
1301 }
1302
1303 // Astra theme - when woocommerce active they add compatibility CSS which breaks select2 in modals
1304 if( defined('ASTRA_THEME_VERSION')){
1305 echo '.woocommerce-js.modal-open .select2-container .select2-dropdown, .woocommerce-js.modal-open .select2-container .select2-search__field, .woocommerce-page.modal-open .select2-container .select2-dropdown, .woocommerce-page.modal-open .select2-container .select2-search__field{z-index: 1056;}';
1306 }
1307
1308 ?></style><?php
1309 $custom_css = ob_get_clean();
1310
1311 /*
1312 * We only add the <script> tags for code highlighting, so we strip them from the output.
1313 */
1314 return str_replace( array(
1315 '<style>',
1316 '</style>'
1317 ), '', self::minify_css( $custom_css ) );
1318 }
1319
1320 /**
1321 * Check if we should add booststrap 3 compatibility changes.
1322 *
1323 * @return bool
1324 */
1325 public static function is_bs3_compat(){
1326 return defined('AYECODE_UI_BS3_COMPAT') || defined('SVQ_THEME_VERSION') || defined('FUSION_BUILDER_VERSION');
1327 }
1328
1329 public static function hex_to_rgb( $hex ) {
1330 // Remove '#' if present
1331 $hex = str_replace( '#', '', $hex );
1332
1333 // Check if input is RGB
1334 if ( strpos( $hex, 'rgba(' ) === 0 || strpos( $hex, 'rgb(' ) === 0 ) {
1335 $_rgb = explode( ',', str_replace( array( 'rgba(', 'rgb(', ')' ), '', $hex ) );
1336
1337 $rgb = ( isset( $_rgb[0] ) ? (int) trim( $_rgb[0] ) : '0' ) . ',';
1338 $rgb .= ( isset( $_rgb[1] ) ? (int) trim( $_rgb[1] ) : '0' ) . ',';
1339 $rgb .= ( isset( $_rgb[2] ) ? (int) trim( $_rgb[2] ) : '0' );
1340
1341 return $rgb;
1342 }
1343
1344 // Convert 3-digit hex to 6-digit hex
1345 if ( strlen( $hex ) == 3 ) {
1346 $hex = str_repeat( substr( $hex, 0, 1 ), 2 ) . str_repeat( substr( $hex, 1, 1 ), 2 ) . str_repeat( substr( $hex, 2, 1 ), 2 );
1347 }
1348
1349 // Convert hex to RGB
1350 $r = hexdec( substr( $hex, 0, 2 ) );
1351 $g = hexdec( substr( $hex, 2, 2 ) );
1352 $b = hexdec( substr( $hex, 4, 2 ) );
1353
1354 // Return RGB values as an array
1355 return $r . ',' . $g . ',' . $b;
1356 }
1357
1358 /**
1359 * Build the CSS to overwrite a bootstrap color variable.
1360 *
1361 * @param $type
1362 * @param $color_code
1363 * @param $compatibility
1364 *
1365 * @return string
1366 */
1367 public static function css_overwrite_bs5($type,$color_code,$compatibility, $hex = '' ){
1368 global $aui_bs5;
1369
1370 $is_var = false;
1371 $is_custom = strpos($type, 'custom-') !== false ? true : false;
1372 if(!$color_code){return '';}
1373 if(strpos($color_code, 'var') !== false){
1374 //if(!sanitize_hex_color($color_code)){
1375 $color_code = esc_attr($color_code);
1376 $is_var = true;
1377 // $color_code = "rgba($color_code, 0.5)";
1378 // echo '###1'.$color_code.'###';//exit;
1379 }
1380
1381 // echo '@@@'.$color_code.'==='.self::hex_to_rgb($color_code);exit;
1382
1383 if(!$color_code){return '';}
1384
1385 $rgb = self::hex_to_rgb($hex);
1386
1387 if($compatibility===true || $compatibility===1){
1388 $compatibility = '.bsui';
1389 }elseif(!$compatibility){
1390 $compatibility = '';
1391 }else{
1392 $compatibility = esc_attr($compatibility);
1393 }
1394
1395 $prefix = $compatibility ? $compatibility . " " : "";
1396
1397
1398 $output = '';
1399
1400 // echo '####'.$color_code;exit;
1401
1402 $type = sanitize_html_class($type);
1403
1404 /**
1405 * c = color, b = background color, o = border-color, f = fill
1406 */
1407 $selectors = array(
1408 ".btn-{$type}" => array( 'b', 'o' ),
1409 ".btn-{$type}.disabled" => array( 'b', 'o' ),
1410 ".btn-{$type}:disabled" => array( 'b', 'o' ),
1411 ".btn-outline-{$type}" => array( 'c', 'o' ),
1412 ".btn-outline-{$type}:hover" => array( 'b', 'o' ),
1413 ".btn-outline-{$type}:not(:disabled):not(.disabled).active" => array( 'b', 'o' ),
1414 ".btn-outline-{$type}:not(:disabled):not(.disabled):active" => array( 'b', 'o' ),
1415 ".show>.btn-outline-{$type}.dropdown-toggle" => array( 'b', 'o' ),
1416 ".badge-{$type}" => array( 'b' ),
1417 ".alert-{$type}" => array( 'b', 'o' ),
1418 ".bg-{$type}" => array( 'b', 'f' ),
1419 ".btn-link.btn-{$type}" => array( 'c' ),
1420 ".text-{$type}" => array( 'c' ),
1421 );
1422
1423 if ( $aui_bs5 ) {
1424 unset($selectors[".alert-{$type}" ]);
1425 }
1426
1427 if ( $type == 'primary' ) {
1428 $selectors = $selectors + array(
1429 'a' => array( 'c' ),
1430 '.btn-link' => array( 'c' ),
1431 '.dropdown-item.active' => array( 'b' ),
1432 '.custom-control-input:checked~.custom-control-label::before' => array(
1433 'b',
1434 'o'
1435 ),
1436 '.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before' => array(
1437 'b',
1438 'o'
1439 ),
1440 '.nav-pills .nav-link.active' => array( 'b' ),
1441 '.nav-pills .show>.nav-link' => array( 'b' ),
1442 '.page-link' => array( 'c' ),
1443 '.page-item.active .page-link' => array(
1444 'b',
1445 'o'
1446 ),
1447 '.progress-bar' => array( 'b' ),
1448 '.list-group-item.active' => array(
1449 'b',
1450 'o'
1451 ),
1452 '.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array( 'b' ),
1453 );
1454 }
1455
1456
1457
1458 // link
1459 if ( $type === 'primary' ) {
1460 $output .= 'html body {--bs-link-hover-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .75); --bs-link-color: var(--bs-'.esc_attr($type).'); }';
1461 $output .= $prefix . ' .breadcrumb{--bs-breadcrumb-item-active-color: '.esc_attr($color_code).'; }';
1462 $output .= $prefix . ' .navbar { --bs-nav-link-hover-color: '.esc_attr($color_code).'; --bs-navbar-hover-color: '.esc_attr($color_code).'; --bs-navbar-active-color: '.esc_attr($color_code).'; }';
1463
1464 $output .= $prefix . ' a{color: var(--bs-'.esc_attr($type).');}';
1465 $output .= $prefix . ' .text-primary{color: var(--bs-'.esc_attr($type).') !important;}';
1466
1467 // dropdown
1468 $output .= $prefix . ' .dropdown-menu{--bs-dropdown-link-hover-color: var(--bs-'.esc_attr($type).'); --bs-dropdown-link-active-color: var(--bs-'.esc_attr($type).');}';
1469
1470 // pagination
1471 $output .= $prefix . ' .pagination{--bs-pagination-hover-color: var(--bs-'.esc_attr($type).'); --bs-pagination-active-bg: var(--bs-'.esc_attr($type).');}';
1472
1473 } else if ( $aui_bs5 ) {
1474 $output .= $prefix . ' .text-' . sanitize_key( $type ) . '{color: var(--bs-' . sanitize_key( $type ) . ') !important;}';
1475 }
1476
1477 $output .= $prefix . ' .link-'.esc_attr($type).' {color: var(--bs-'.esc_attr($type).'-rgb) !important;}';
1478 $output .= $prefix . ' .link-'.esc_attr($type).':hover {color: rgba(var(--bs-'.esc_attr($type).'-rgb), .8) !important;}';
1479
1480 // buttons
1481 $output .= $prefix . ' .btn-'.esc_attr($type).'{';
1482 $output .= '
1483 --bs-btn-bg: '.esc_attr($color_code).';
1484 --bs-btn-border-color: '.esc_attr($color_code).';
1485 --bs-btn-hover-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1486 --bs-btn-hover-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1487 --bs-btn-focus-shadow-rgb: --bs-'.esc_attr($type).'-rgb;
1488 --bs-btn-active-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1489 --bs-btn-active-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1490 --bs-btn-active-shadow: unset;
1491 --bs-btn-disabled-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .5);
1492 --bs-btn-disabled-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .1);
1493 ';
1494 // $output .= '
1495 // --bs-btn-color: #fff;
1496 // --bs-btn-hover-color: #fff;
1497 // --bs-btn-active-color: #fff;
1498 // --bs-btn-disabled-color: #fff;
1499 // ';
1500 $output .= '}';
1501
1502 // buttons outline
1503 $output .= $prefix . ' .btn-outline-'.esc_attr($type).'{';
1504 $output .= '
1505 --bs-btn-color: '.esc_attr($color_code).';
1506 --bs-btn-border-color: '.esc_attr($color_code).';
1507 --bs-btn-hover-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1508 --bs-btn-hover-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1509 --bs-btn-focus-shadow-rgb: --bs-'.esc_attr($type).'-rgb;
1510 --bs-btn-active-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1511 --bs-btn-active-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .9);
1512 --bs-btn-active-shadow: unset;
1513 --bs-btn-disabled-bg: rgba(var(--bs-'.esc_attr($type).'-rgb), .5);
1514 --bs-btn-disabled-border-color: rgba(var(--bs-'.esc_attr($type).'-rgb), .1);
1515 ';
1516 // $output .= '
1517 // --bs-btn-color: #fff;
1518 // --bs-btn-hover-color: #fff;
1519 // --bs-btn-active-color: #fff;
1520 // --bs-btn-disabled-color: #fff;
1521 // ';
1522 $output .= '}';
1523
1524 // button hover
1525 $output .= $prefix . ' .btn-'.esc_attr($type).':hover{';
1526 $output .= '
1527 box-shadow: 0 0.25rem 0.25rem 0.125rem rgb(var(--bs-'.esc_attr($type).'-rgb), .1), 0 0.375rem 0.75rem -0.125rem rgb(var(--bs-'.esc_attr($type).'-rgb) , .4);
1528 }
1529 ';
1530
1531 if ( $aui_bs5 ) {
1532 // translucent primary
1533 if ( $type == 'primary' ) {
1534 $output .= $prefix . ' .btn-translucent-primary{color:rgb(var(--bs-primary-rgb));}';
1535 $output .= $prefix . ' .btn-translucent-primary:hover,' . $prefix . ' .btn-translucent-primary:focus,' . $prefix . ' .btn-translucent-primary.focus{background-color: rgb(var(--bs-primary-rgb));}';
1536 }
1537
1538 // $output .= $is_var ? 'html body {--bs-'.esc_attr($type).'-rgb: '.$color_code.'; }' : 'html body {--bs-'.esc_attr($type).'-rgb: '.self::hex_to_rgb($color_code).'; }';
1539 $output .= 'html body {--bs-'.esc_attr($type).': '.esc_attr($color_code).'; }';
1540 $output .= 'html body {--bs-'.esc_attr($type).'-rgb: '.$rgb.'; }';
1541 }
1542
1543
1544 if ( $is_custom ) {
1545
1546 // echo '###'.$type;exit;
1547
1548 // build rules into each type
1549 foreach($selectors as $selector => $types){
1550 $selector = $compatibility ? $compatibility . " ".$selector : $selector;
1551 $types = array_combine($types,$types);
1552 if(isset($types['c'])){$color[] = $selector;}
1553 if(isset($types['b'])){$background[] = $selector;}
1554 if(isset($types['o'])){$border[] = $selector;}
1555 if(isset($types['f'])){$fill[] = $selector;}
1556 }
1557
1558 // // build rules into each type
1559 // foreach($important_selectors as $selector => $types){
1560 // $selector = $compatibility ? $compatibility . " ".$selector : $selector;
1561 // $types = array_combine($types,$types);
1562 // if(isset($types['c'])){$color_i[] = $selector;}
1563 // if(isset($types['b'])){$background_i[] = $selector;}
1564 // if(isset($types['o'])){$border_i[] = $selector;}
1565 // if(isset($types['f'])){$fill_i[] = $selector;}
1566 // }
1567
1568 // add any color rules
1569 if(!empty($color)){
1570 $output .= implode(",",$color) . "{color: $color_code;} ";
1571 }
1572 if(!empty($color_i)){
1573 $output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1574 }
1575
1576 // add any background color rules
1577 if(!empty($background)){
1578 $output .= implode(",",$background) . "{background-color: $color_code;} ";
1579 }
1580 if(!empty($background_i)){
1581 $output .= $aui_bs5 ? '' : implode(",",$background_i) . "{background-color: $color_code !important;} ";
1582 // $output .= implode(",",$background_i) . "{background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;} ";
1583 }
1584
1585 // add any border color rules
1586 if(!empty($border)){
1587 $output .= implode(",",$border) . "{border-color: $color_code;} ";
1588 }
1589 if(!empty($border_i)){
1590 $output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1591 }
1592
1593 // add any fill color rules
1594 if(!empty($fill)){
1595 $output .= implode(",",$fill) . "{fill: $color_code;} ";
1596 }
1597 if(!empty($fill_i)){
1598 $output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1599 }
1600
1601 }
1602
1603
1604
1605
1606 $transition = $is_var ? 'transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,filter 0.15s ease-in-out;' : '';
1607 // darken
1608 $darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,"-0.075");
1609 $darker_10 = $is_var ? $color_code.';filter:brightness(0.9)' : self::css_hex_lighten_darken($color_code,"-0.10");
1610 $darker_125 = $is_var ? $color_code.';filter:brightness(0.875)' : self::css_hex_lighten_darken($color_code,"-0.125");
1611 $darker_40 = $is_var ? $color_code.';filter:brightness(0.6)' : self::css_hex_lighten_darken($color_code,"-0.4");
1612
1613 // lighten
1614 $lighten_25 = $is_var ? $color_code.';filter:brightness(1.25)' :self::css_hex_lighten_darken($color_code,"0.25");
1615
1616 // opacity see https://css-tricks.com/8-digit-hex-codes/
1617 $op_25 = $color_code."40"; // 25% opacity
1618
1619
1620 // button states
1621 $output .= $is_var ? $prefix ." .btn-{$type}{{$transition }} " : '';
1622 $output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: ".$darker_075."; border-color: ".$darker_10.";} ";
1623 // $output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: #000; border-color: #000;} ";
1624 $output .= $prefix ." .btn-outline-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-{$type}.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1625 $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active, $prefix .btn-{$type}:not(:disabled):not(.disabled).active, .show>$prefix .btn-{$type}.dropdown-toggle{background-color: ".$darker_10."; border-color: ".$darker_125.";} ";
1626 $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-{$type}.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
1627 $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled):focus {box-shadow: 0 0.25rem 0.25rem 0.125rem rgba(var(--bs-{$type}-rgb), 0.1), 0 0.375rem 0.75rem -0.125rem rgba(var(--bs-{$type}-rgb), 0.4);} ";
1628
1629 // text
1630 // $output .= $prefix .".xxx, .text-{$type} {color: var(--bs-".esc_attr($type).");} ";
1631
1632
1633 // if ( $type == 'primary' ) {
1634 // // dropdown's
1635 // $output .= $prefix . " .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
1636 //
1637 // // input states
1638 // $output .= $prefix . " .form-control:focus{border-color: " . $lighten_25 . ";box-shadow: 0 0 0 0.2rem $op_25;} ";
1639 //
1640 // // page link
1641 // $output .= $prefix . " .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1642 // }
1643
1644 // alerts
1645 if ( $aui_bs5 ) {
1646 // $output .= $is_var ? '' : $prefix ." .alert-{$type} {background-color: ".$color_code."20; border-color: ".$color_code."30;color:$darker_40} ";
1647 $output .= $prefix ." .alert-{$type} {--bs-alert-bg: rgba(var(--bs-{$type}-rgb), .1 ) !important;--bs-alert-border-color: rgba(var(--bs-{$type}-rgb), .25 ) !important;--bs-alert-color: rgba(var(--bs-{$type}-rgb), 1 ) !important;} ";
1648 }
1649
1650 return $output;
1651 }
1652
1653 /**
1654 * Build the CSS to overwrite a bootstrap color variable.
1655 *
1656 * @param $type
1657 * @param $color_code
1658 * @param $compatibility
1659 *
1660 * @return string
1661 */
1662 public static function css_overwrite($type,$color_code,$compatibility, $hex = '' ){
1663 global $aui_bs5;
1664
1665 $is_var = false;
1666 if(!$color_code){return '';}
1667 if(strpos($color_code, 'var') !== false){
1668 //if(!sanitize_hex_color($color_code)){
1669 $color_code = esc_attr($color_code);
1670 $is_var = true;
1671 // $color_code = "rgba($color_code, 0.5)";
1672 // echo '###1'.$color_code.'###';//exit;
1673 }
1674
1675 // echo '@@@'.$color_code.'==='.self::hex_to_rgb($color_code);exit;
1676
1677 if(!$color_code){return '';}
1678
1679 $rgb = self::hex_to_rgb($hex);
1680
1681 if($compatibility===true || $compatibility===1){
1682 $compatibility = '.bsui';
1683 }elseif(!$compatibility){
1684 $compatibility = '';
1685 }else{
1686 $compatibility = esc_attr($compatibility);
1687 }
1688
1689
1690
1691 // echo '####'.$color_code;exit;
1692
1693 $type = sanitize_html_class($type);
1694
1695 /**
1696 * c = color, b = background color, o = border-color, f = fill
1697 */
1698 $selectors = array(
1699 ".btn-{$type}" => array( 'b', 'o' ),
1700 ".btn-{$type}.disabled" => array( 'b', 'o' ),
1701 ".btn-{$type}:disabled" => array( 'b', 'o' ),
1702 ".btn-outline-{$type}" => array( 'c', 'o' ),
1703 ".btn-outline-{$type}:hover" => array( 'b', 'o' ),
1704 ".btn-outline-{$type}:not(:disabled):not(.disabled).active" => array( 'b', 'o' ),
1705 ".btn-outline-{$type}:not(:disabled):not(.disabled):active" => array( 'b', 'o' ),
1706 ".show>.btn-outline-{$type}.dropdown-toggle" => array( 'b', 'o' ),
1707 ".badge-{$type}" => array( 'b' ),
1708 ".alert-{$type}" => array( 'b', 'o' ),
1709 ".bg-{$type}" => array( 'b', 'f' ),
1710 ".btn-link.btn-{$type}" => array( 'c' ),
1711 );
1712
1713 if ( $aui_bs5 ) {
1714 unset($selectors[".alert-{$type}" ]);
1715 }
1716
1717 if ( $type == 'primary' ) {
1718 $selectors = $selectors + array(
1719 'a' => array( 'c' ),
1720 '.btn-link' => array( 'c' ),
1721 '.dropdown-item.active' => array( 'b' ),
1722 '.custom-control-input:checked~.custom-control-label::before' => array(
1723 'b',
1724 'o'
1725 ),
1726 '.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before' => array(
1727 'b',
1728 'o'
1729 ),
1730 '.nav-pills .nav-link.active' => array( 'b' ),
1731 '.nav-pills .show>.nav-link' => array( 'b' ),
1732 '.page-link' => array( 'c' ),
1733 '.page-item.active .page-link' => array(
1734 'b',
1735 'o'
1736 ),
1737 '.progress-bar' => array( 'b' ),
1738 '.list-group-item.active' => array(
1739 'b',
1740 'o'
1741 ),
1742 '.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array( 'b' ),
1743 // '.custom-range::-webkit-slider-thumb' => array('b'), // these break the inline rules...
1744 // '.custom-range::-moz-range-thumb' => array('b'),
1745 // '.custom-range::-ms-thumb' => array('b'),
1746 );
1747 }
1748
1749 $important_selectors = array(
1750 ".bg-{$type}" => array('b','f'),
1751 ".border-{$type}" => array('o'),
1752 ".text-{$type}" => array('c'),
1753 );
1754
1755 $color = array();
1756 $color_i = array();
1757 $background = array();
1758 $background_i = array();
1759 $border = array();
1760 $border_i = array();
1761 $fill = array();
1762 $fill_i = array();
1763
1764 $output = '';
1765
1766 if ( $aui_bs5 ) {
1767 // $output .= $is_var ? 'html body {--bs-'.esc_attr($type).'-rgb: '.$color_code.'; }' : 'html body {--bs-'.esc_attr($type).'-rgb: '.self::hex_to_rgb($color_code).'; }';
1768 $output .= 'html body {--bs-'.esc_attr($type).'-rgb: '.$rgb.'; }';
1769 }
1770
1771 // build rules into each type
1772 foreach($selectors as $selector => $types){
1773 $selector = $compatibility ? $compatibility . " ".$selector : $selector;
1774 $types = array_combine($types,$types);
1775 if(isset($types['c'])){$color[] = $selector;}
1776 if(isset($types['b'])){$background[] = $selector;}
1777 if(isset($types['o'])){$border[] = $selector;}
1778 if(isset($types['f'])){$fill[] = $selector;}
1779 }
1780
1781 // build rules into each type
1782 foreach($important_selectors as $selector => $types){
1783 $selector = $compatibility ? $compatibility . " ".$selector : $selector;
1784 $types = array_combine($types,$types);
1785 if(isset($types['c'])){$color_i[] = $selector;}
1786 if(isset($types['b'])){$background_i[] = $selector;}
1787 if(isset($types['o'])){$border_i[] = $selector;}
1788 if(isset($types['f'])){$fill_i[] = $selector;}
1789 }
1790
1791 // add any color rules
1792 if(!empty($color)){
1793 $output .= implode(",",$color) . "{color: $color_code;} ";
1794 }
1795 if(!empty($color_i)){
1796 $output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1797 }
1798
1799 // add any background color rules
1800 if(!empty($background)){
1801 $output .= implode(",",$background) . "{background-color: $color_code;} ";
1802 }
1803 if(!empty($background_i)){
1804 $output .= $aui_bs5 ? '' : implode(",",$background_i) . "{background-color: $color_code !important;} ";
1805 // $output .= implode(",",$background_i) . "{background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;} ";
1806 }
1807
1808 // add any border color rules
1809 if(!empty($border)){
1810 $output .= implode(",",$border) . "{border-color: $color_code;} ";
1811 }
1812 if(!empty($border_i)){
1813 $output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1814 }
1815
1816 // add any fill color rules
1817 if(!empty($fill)){
1818 $output .= implode(",",$fill) . "{fill: $color_code;} ";
1819 }
1820 if(!empty($fill_i)){
1821 $output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1822 }
1823
1824
1825 $prefix = $compatibility ? $compatibility . " " : "";
1826
1827 $transition = $is_var ? 'transition: color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,filter 0.15s ease-in-out;' : '';
1828 // darken
1829 $darker_075 = $is_var ? $color_code.';filter:brightness(0.925)' : self::css_hex_lighten_darken($color_code,"-0.075");
1830 $darker_10 = $is_var ? $color_code.';filter:brightness(0.9)' : self::css_hex_lighten_darken($color_code,"-0.10");
1831 $darker_125 = $is_var ? $color_code.';filter:brightness(0.875)' : self::css_hex_lighten_darken($color_code,"-0.125");
1832 $darker_40 = $is_var ? $color_code.';filter:brightness(0.6)' : self::css_hex_lighten_darken($color_code,"-0.4");
1833
1834 // lighten
1835 $lighten_25 = $is_var ? $color_code.';filter:brightness(1.25)' :self::css_hex_lighten_darken($color_code,"0.25");
1836
1837 // opacity see https://css-tricks.com/8-digit-hex-codes/
1838 $op_25 = $color_code."40"; // 25% opacity
1839
1840
1841 // button states
1842 $output .= $is_var ? $prefix ." .btn-{$type}{{$transition }} " : '';
1843 $output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: ".$darker_075."; border-color: ".$darker_10.";} ";
1844 // $output .= $prefix ." .btn-{$type}:hover, $prefix .btn-{$type}:focus, $prefix .btn-{$type}.focus{background-color: #000; border-color: #000;} ";
1845 $output .= $prefix ." .btn-outline-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-{$type}.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1846 $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active, $prefix .btn-{$type}:not(:disabled):not(.disabled).active, .show>$prefix .btn-{$type}.dropdown-toggle{background-color: ".$darker_10."; border-color: ".$darker_125.";} ";
1847 $output .= $prefix ." .btn-{$type}:not(:disabled):not(.disabled):active:focus, $prefix .btn-{$type}:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-{$type}.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
1848
1849 if ( $type == 'primary' ) {
1850 // dropdown's
1851 $output .= $prefix . " .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
1852
1853 // input states
1854 $output .= $prefix . " .form-control:focus{border-color: " . $lighten_25 . ";box-shadow: 0 0 0 0.2rem $op_25;} ";
1855
1856 // page link
1857 $output .= $prefix . " .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
1858 }
1859
1860 // alerts
1861 if ( $aui_bs5 ) {
1862 // $output .= $is_var ? '' : $prefix ." .alert-{$type} {background-color: ".$color_code."20; border-color: ".$color_code."30;color:$darker_40} ";
1863 $output .= $prefix ." .alert-{$type} {--bs-alert-bg: rgba(var(--bs-{$type}-rgb), .1 ) !important;--bs-alert-border-color: rgba(var(--bs-{$type}-rgb), .25 ) !important;--bs-alert-color: rgba(var(--bs-{$type}-rgb), 1 ) !important;} ";
1864 }
1865
1866 return $output;
1867 }
1868
1869 /**
1870 *
1871 * @deprecated 0.1.76 Use css_overwrite()
1872 *
1873 * @param $color_code
1874 * @param $compatibility
1875 * @param $use_variable
1876 *
1877 * @return string
1878 */
1879 public static function css_primary($color_code,$compatibility, $use_variable = false){
1880
1881 if(!$use_variable){
1882 $color_code = sanitize_hex_color($color_code);
1883 if(!$color_code){return '';}
1884 }
1885
1886 /**
1887 * c = color, b = background color, o = border-color, f = fill
1888 */
1889 $selectors = array(
1890 'a' => array('c'),
1891 '.btn-primary' => array('b','o'),
1892 '.btn-primary.disabled' => array('b','o'),
1893 '.btn-primary:disabled' => array('b','o'),
1894 '.btn-outline-primary' => array('c','o'),
1895 '.btn-outline-primary:hover' => array('b','o'),
1896 '.btn-outline-primary:not(:disabled):not(.disabled).active' => array('b','o'),
1897 '.btn-outline-primary:not(:disabled):not(.disabled):active' => array('b','o'),
1898 '.show>.btn-outline-primary.dropdown-toggle' => array('b','o'),
1899 '.btn-link' => array('c'),
1900 '.dropdown-item.active' => array('b'),
1901 '.custom-control-input:checked~.custom-control-label::before' => array('b','o'),
1902 '.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before' => array('b','o'),
1903 // '.custom-range::-webkit-slider-thumb' => array('b'), // these break the inline rules...
1904 // '.custom-range::-moz-range-thumb' => array('b'),
1905 // '.custom-range::-ms-thumb' => array('b'),
1906 '.nav-pills .nav-link.active' => array('b'),
1907 '.nav-pills .show>.nav-link' => array('b'),
1908 '.page-link' => array('c'),
1909 '.page-item.active .page-link' => array('b','o'),
1910 '.badge-primary' => array('b'),
1911 '.alert-primary' => array('b','o'),
1912 '.progress-bar' => array('b'),
1913 '.list-group-item.active' => array('b','o'),
1914 '.bg-primary' => array('b','f'),
1915 '.btn-link.btn-primary' => array('c'),
1916 '.select2-container .select2-results__option--highlighted.select2-results__option[aria-selected=true]' => array('b'),
1917 );
1918
1919 $important_selectors = array(
1920 '.bg-primary' => array('b','f'),
1921 '.border-primary' => array('o'),
1922 '.text-primary' => array('c'),
1923 );
1924
1925 $color = array();
1926 $color_i = array();
1927 $background = array();
1928 $background_i = array();
1929 $border = array();
1930 $border_i = array();
1931 $fill = array();
1932 $fill_i = array();
1933
1934 $output = '';
1935
1936 // build rules into each type
1937 foreach($selectors as $selector => $types){
1938 $selector = $compatibility ? ".bsui ".$selector : $selector;
1939 $types = array_combine($types,$types);
1940 if(isset($types['c'])){$color[] = $selector;}
1941 if(isset($types['b'])){$background[] = $selector;}
1942 if(isset($types['o'])){$border[] = $selector;}
1943 if(isset($types['f'])){$fill[] = $selector;}
1944 }
1945
1946 // build rules into each type
1947 foreach($important_selectors as $selector => $types){
1948 $selector = $compatibility ? ".bsui ".$selector : $selector;
1949 $types = array_combine($types,$types);
1950 if(isset($types['c'])){$color_i[] = $selector;}
1951 if(isset($types['b'])){$background_i[] = $selector;}
1952 if(isset($types['o'])){$border_i[] = $selector;}
1953 if(isset($types['f'])){$fill_i[] = $selector;}
1954 }
1955
1956 // add any color rules
1957 if(!empty($color)){
1958 $output .= implode(",",$color) . "{color: $color_code;} ";
1959 }
1960 if(!empty($color_i)){
1961 $output .= implode(",",$color_i) . "{color: $color_code !important;} ";
1962 }
1963
1964 // add any background color rules
1965 if(!empty($background)){
1966 $output .= implode(",",$background) . "{background-color: $color_code;} ";
1967 }
1968 if(!empty($background_i)){
1969 $output .= implode(",",$background_i) . "{background-color: $color_code !important;} ";
1970 }
1971
1972 // add any border color rules
1973 if(!empty($border)){
1974 $output .= implode(",",$border) . "{border-color: $color_code;} ";
1975 }
1976 if(!empty($border_i)){
1977 $output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
1978 }
1979
1980 // add any fill color rules
1981 if(!empty($fill)){
1982 $output .= implode(",",$fill) . "{fill: $color_code;} ";
1983 }
1984 if(!empty($fill_i)){
1985 $output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
1986 }
1987
1988
1989 $prefix = $compatibility ? ".bsui " : "";
1990
1991 // darken
1992 $darker_075 = self::css_hex_lighten_darken($color_code,"-0.075");
1993 $darker_10 = self::css_hex_lighten_darken($color_code,"-0.10");
1994 $darker_125 = self::css_hex_lighten_darken($color_code,"-0.125");
1995
1996 // lighten
1997 $lighten_25 = self::css_hex_lighten_darken($color_code,"0.25");
1998
1999 // opacity see https://css-tricks.com/8-digit-hex-codes/
2000 $op_25 = $color_code."40"; // 25% opacity
2001
2002
2003 // button states
2004 $output .= $prefix ." .btn-primary:hover, $prefix .btn-primary:focus, $prefix .btn-primary.focus{background-color: ".$darker_075."; border-color: ".$darker_10.";} ";
2005 $output .= $prefix ." .btn-outline-primary:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-primary.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2006 $output .= $prefix ." .btn-primary:not(:disabled):not(.disabled):active, $prefix .btn-primary:not(:disabled):not(.disabled).active, .show>$prefix .btn-primary.dropdown-toggle{background-color: ".$darker_10."; border-color: ".$darker_125.";} ";
2007 $output .= $prefix ." .btn-primary:not(:disabled):not(.disabled):active:focus, $prefix .btn-primary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-primary.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
2008
2009
2010 // dropdown's
2011 $output .= $prefix ." .dropdown-item.active, $prefix .dropdown-item:active{background-color: $color_code;} ";
2012
2013
2014 // input states
2015 $output .= $prefix ." .form-control:focus{border-color: ".$lighten_25.";box-shadow: 0 0 0 0.2rem $op_25;} ";
2016
2017 // page link
2018 $output .= $prefix ." .page-link:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2019
2020 return $output;
2021 }
2022
2023 /**
2024 *
2025 * @deprecated 0.1.76 Use css_overwrite()
2026 *
2027 * @param $color_code
2028 * @param $compatibility
2029 *
2030 * @return string
2031 */
2032 public static function css_secondary($color_code,$compatibility){;
2033 $color_code = sanitize_hex_color($color_code);
2034 if(!$color_code){return '';}
2035 /**
2036 * c = color, b = background color, o = border-color, f = fill
2037 */
2038 $selectors = array(
2039 '.btn-secondary' => array('b','o'),
2040 '.btn-secondary.disabled' => array('b','o'),
2041 '.btn-secondary:disabled' => array('b','o'),
2042 '.btn-outline-secondary' => array('c','o'),
2043 '.btn-outline-secondary:hover' => array('b','o'),
2044 '.btn-outline-secondary.disabled' => array('c'),
2045 '.btn-outline-secondary:disabled' => array('c'),
2046 '.btn-outline-secondary:not(:disabled):not(.disabled):active' => array('b','o'),
2047 '.btn-outline-secondary:not(:disabled):not(.disabled).active' => array('b','o'),
2048 '.btn-outline-secondary.dropdown-toggle' => array('b','o'),
2049 '.badge-secondary' => array('b'),
2050 '.alert-secondary' => array('b','o'),
2051 '.btn-link.btn-secondary' => array('c'),
2052 );
2053
2054 $important_selectors = array(
2055 '.bg-secondary' => array('b','f'),
2056 '.border-secondary' => array('o'),
2057 '.text-secondary' => array('c'),
2058 );
2059
2060 $color = array();
2061 $color_i = array();
2062 $background = array();
2063 $background_i = array();
2064 $border = array();
2065 $border_i = array();
2066 $fill = array();
2067 $fill_i = array();
2068
2069 $output = '';
2070
2071 // build rules into each type
2072 foreach($selectors as $selector => $types){
2073 $selector = $compatibility ? ".bsui ".$selector : $selector;
2074 $types = array_combine($types,$types);
2075 if(isset($types['c'])){$color[] = $selector;}
2076 if(isset($types['b'])){$background[] = $selector;}
2077 if(isset($types['o'])){$border[] = $selector;}
2078 if(isset($types['f'])){$fill[] = $selector;}
2079 }
2080
2081 // build rules into each type
2082 foreach($important_selectors as $selector => $types){
2083 $selector = $compatibility ? ".bsui ".$selector : $selector;
2084 $types = array_combine($types,$types);
2085 if(isset($types['c'])){$color_i[] = $selector;}
2086 if(isset($types['b'])){$background_i[] = $selector;}
2087 if(isset($types['o'])){$border_i[] = $selector;}
2088 if(isset($types['f'])){$fill_i[] = $selector;}
2089 }
2090
2091 // add any color rules
2092 if(!empty($color)){
2093 $output .= implode(",",$color) . "{color: $color_code;} ";
2094 }
2095 if(!empty($color_i)){
2096 $output .= implode(",",$color_i) . "{color: $color_code !important;} ";
2097 }
2098
2099 // add any background color rules
2100 if(!empty($background)){
2101 $output .= implode(",",$background) . "{background-color: $color_code;} ";
2102 }
2103 if(!empty($background_i)){
2104 $output .= implode(",",$background_i) . "{background-color: $color_code !important;} ";
2105 }
2106
2107 // add any border color rules
2108 if(!empty($border)){
2109 $output .= implode(",",$border) . "{border-color: $color_code;} ";
2110 }
2111 if(!empty($border_i)){
2112 $output .= implode(",",$border_i) . "{border-color: $color_code !important;} ";
2113 }
2114
2115 // add any fill color rules
2116 if(!empty($fill)){
2117 $output .= implode(",",$fill) . "{fill: $color_code;} ";
2118 }
2119 if(!empty($fill_i)){
2120 $output .= implode(",",$fill_i) . "{fill: $color_code !important;} ";
2121 }
2122
2123
2124 $prefix = $compatibility ? ".bsui " : "";
2125
2126 // darken
2127 $darker_075 = self::css_hex_lighten_darken($color_code,"-0.075");
2128 $darker_10 = self::css_hex_lighten_darken($color_code,"-0.10");
2129 $darker_125 = self::css_hex_lighten_darken($color_code,"-0.125");
2130
2131 // lighten
2132 $lighten_25 = self::css_hex_lighten_darken($color_code,"0.25");
2133
2134 // opacity see https://css-tricks.com/8-digit-hex-codes/
2135 $op_25 = $color_code."40"; // 25% opacity
2136
2137
2138 // button states
2139 $output .= $prefix ." .btn-secondary:hover{background-color: ".$darker_075."; border-color: ".$darker_10.";} ";
2140 $output .= $prefix ." .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, $prefix .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-outline-secondary.dropdown-toggle:focus{box-shadow: 0 0 0 0.2rem $op_25;} ";
2141 $output .= $prefix ." .btn-secondary:not(:disabled):not(.disabled):active, $prefix .btn-secondary:not(:disabled):not(.disabled).active, .show>$prefix .btn-secondary.dropdown-toggle{background-color: ".$darker_10."; border-color: ".$darker_125.";} ";
2142 $output .= $prefix ." .btn-secondary:not(:disabled):not(.disabled):active:focus, $prefix .btn-secondary:not(:disabled):not(.disabled).active:focus, .show>$prefix .btn-secondary.dropdown-toggle:focus {box-shadow: 0 0 0 0.2rem $op_25;} ";
2143
2144
2145 return $output;
2146 }
2147
2148 /**
2149 * Increases or decreases the brightness of a color by a percentage of the current brightness.
2150 *
2151 * @param string $hexCode Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
2152 * @param float $adjustPercent A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
2153 *
2154 * @return string
2155 */
2156 public static function css_hex_lighten_darken($hexCode, $adjustPercent) {
2157 $hexCode = ltrim($hexCode, '#');
2158
2159 if ( strpos( $hexCode, 'rgba(' ) !== false || strpos( $hexCode, 'rgb(' ) !== false ) {
2160 return $hexCode;
2161 }
2162
2163 if (strlen($hexCode) == 3) {
2164 $hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
2165 }
2166
2167 $hexCode = array_map('hexdec', str_split($hexCode, 2));
2168
2169 foreach ($hexCode as & $color) {
2170 $adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
2171 $adjustAmount = ceil($adjustableLimit * $adjustPercent);
2172
2173 $color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
2174 }
2175
2176 return '#' . implode($hexCode);
2177 }
2178
2179 /**
2180 * Check if we should display examples.
2181 */
2182 public function maybe_show_examples(){
2183 if(current_user_can('manage_options') && isset($_REQUEST['preview-aui'])){
2184 echo "<head>";
2185 wp_head();
2186 echo "</head>";
2187 echo "<body>";
2188 echo $this->get_examples(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2189 echo "</body>";
2190 exit;
2191 }
2192 }
2193
2194 /**
2195 * Get developer examples.
2196 *
2197 * @return string
2198 */
2199 public function get_examples(){
2200 $output = '';
2201
2202
2203 // open form
2204 $output .= "<form class='p-5 m-5 border rounded'>";
2205
2206 // input example
2207 $output .= aui()->input(array(
2208 'type' => 'text',
2209 'id' => 'text-example',
2210 'name' => 'text-example',
2211 'placeholder' => 'text placeholder',
2212 'title' => 'Text input example',
2213 'value' => '',
2214 'required' => false,
2215 'help_text' => 'help text',
2216 'label' => 'Text input example label'
2217 ));
2218
2219 // input example
2220 $output .= aui()->input(array(
2221 'type' => 'url',
2222 'id' => 'text-example2',
2223 'name' => 'text-example',
2224 'placeholder' => 'url placeholder',
2225 'title' => 'Text input example',
2226 'value' => '',
2227 'required' => false,
2228 'help_text' => 'help text',
2229 'label' => 'Text input example label'
2230 ));
2231
2232 // checkbox example
2233 $output .= aui()->input(array(
2234 'type' => 'checkbox',
2235 'id' => 'checkbox-example',
2236 'name' => 'checkbox-example',
2237 'placeholder' => 'checkbox-example',
2238 'title' => 'Checkbox example',
2239 'value' => '1',
2240 'checked' => true,
2241 'required' => false,
2242 'help_text' => 'help text',
2243 'label' => 'Checkbox checked'
2244 ));
2245
2246 // checkbox example
2247 $output .= aui()->input(array(
2248 'type' => 'checkbox',
2249 'id' => 'checkbox-example2',
2250 'name' => 'checkbox-example2',
2251 'placeholder' => 'checkbox-example',
2252 'title' => 'Checkbox example',
2253 'value' => '1',
2254 'checked' => false,
2255 'required' => false,
2256 'help_text' => 'help text',
2257 'label' => 'Checkbox un-checked'
2258 ));
2259
2260 // switch example
2261 $output .= aui()->input(array(
2262 'type' => 'checkbox',
2263 'id' => 'switch-example',
2264 'name' => 'switch-example',
2265 'placeholder' => 'checkbox-example',
2266 'title' => 'Switch example',
2267 'value' => '1',
2268 'checked' => true,
2269 'switch' => true,
2270 'required' => false,
2271 'help_text' => 'help text',
2272 'label' => 'Switch on'
2273 ));
2274
2275 // switch example
2276 $output .= aui()->input(array(
2277 'type' => 'checkbox',
2278 'id' => 'switch-example2',
2279 'name' => 'switch-example2',
2280 'placeholder' => 'checkbox-example',
2281 'title' => 'Switch example',
2282 'value' => '1',
2283 'checked' => false,
2284 'switch' => true,
2285 'required' => false,
2286 'help_text' => 'help text',
2287 'label' => 'Switch off'
2288 ));
2289
2290 // close form
2291 $output .= "</form>";
2292
2293 return $output;
2294 }
2295
2296 /**
2297 * Calendar params.
2298 *
2299 * @since 0.1.44
2300 *
2301 * @return array Calendar params.
2302 */
2303 public static function calendar_params() {
2304 $params = array(
2305 'month_long_1' => __( 'January', 'ayecode-connect' ),
2306 'month_long_2' => __( 'February', 'ayecode-connect' ),
2307 'month_long_3' => __( 'March', 'ayecode-connect' ),
2308 'month_long_4' => __( 'April', 'ayecode-connect' ),
2309 'month_long_5' => __( 'May', 'ayecode-connect' ),
2310 'month_long_6' => __( 'June', 'ayecode-connect' ),
2311 'month_long_7' => __( 'July', 'ayecode-connect' ),
2312 'month_long_8' => __( 'August', 'ayecode-connect' ),
2313 'month_long_9' => __( 'September', 'ayecode-connect' ),
2314 'month_long_10' => __( 'October', 'ayecode-connect' ),
2315 'month_long_11' => __( 'November', 'ayecode-connect' ),
2316 'month_long_12' => __( 'December', 'ayecode-connect' ),
2317 'month_s_1' => _x( 'Jan', 'January abbreviation', 'ayecode-connect' ),
2318 'month_s_2' => _x( 'Feb', 'February abbreviation', 'ayecode-connect' ),
2319 'month_s_3' => _x( 'Mar', 'March abbreviation', 'ayecode-connect' ),
2320 'month_s_4' => _x( 'Apr', 'April abbreviation', 'ayecode-connect' ),
2321 'month_s_5' => _x( 'May', 'May abbreviation', 'ayecode-connect' ),
2322 'month_s_6' => _x( 'Jun', 'June abbreviation', 'ayecode-connect' ),
2323 'month_s_7' => _x( 'Jul', 'July abbreviation', 'ayecode-connect' ),
2324 'month_s_8' => _x( 'Aug', 'August abbreviation', 'ayecode-connect' ),
2325 'month_s_9' => _x( 'Sep', 'September abbreviation', 'ayecode-connect' ),
2326 'month_s_10' => _x( 'Oct', 'October abbreviation', 'ayecode-connect' ),
2327 'month_s_11' => _x( 'Nov', 'November abbreviation', 'ayecode-connect' ),
2328 'month_s_12' => _x( 'Dec', 'December abbreviation', 'ayecode-connect' ),
2329 'day_s1_1' => _x( 'S', 'Sunday initial', 'ayecode-connect' ),
2330 'day_s1_2' => _x( 'M', 'Monday initial', 'ayecode-connect' ),
2331 'day_s1_3' => _x( 'T', 'Tuesday initial', 'ayecode-connect' ),
2332 'day_s1_4' => _x( 'W', 'Wednesday initial', 'ayecode-connect' ),
2333 'day_s1_5' => _x( 'T', 'Friday initial', 'ayecode-connect' ),
2334 'day_s1_6' => _x( 'F', 'Thursday initial', 'ayecode-connect' ),
2335 'day_s1_7' => _x( 'S', 'Saturday initial', 'ayecode-connect' ),
2336 'day_s2_1' => __( 'Su', 'ayecode-connect' ),
2337 'day_s2_2' => __( 'Mo', 'ayecode-connect' ),
2338 'day_s2_3' => __( 'Tu', 'ayecode-connect' ),
2339 'day_s2_4' => __( 'We', 'ayecode-connect' ),
2340 'day_s2_5' => __( 'Th', 'ayecode-connect' ),
2341 'day_s2_6' => __( 'Fr', 'ayecode-connect' ),
2342 'day_s2_7' => __( 'Sa', 'ayecode-connect' ),
2343 'day_s3_1' => __( 'Sun', 'ayecode-connect' ),
2344 'day_s3_2' => __( 'Mon', 'ayecode-connect' ),
2345 'day_s3_3' => __( 'Tue', 'ayecode-connect' ),
2346 'day_s3_4' => __( 'Wed', 'ayecode-connect' ),
2347 'day_s3_5' => __( 'Thu', 'ayecode-connect' ),
2348 'day_s3_6' => __( 'Fri', 'ayecode-connect' ),
2349 'day_s3_7' => __( 'Sat', 'ayecode-connect' ),
2350 'day_s5_1' => __( 'Sunday', 'ayecode-connect' ),
2351 'day_s5_2' => __( 'Monday', 'ayecode-connect' ),
2352 'day_s5_3' => __( 'Tuesday', 'ayecode-connect' ),
2353 'day_s5_4' => __( 'Wednesday', 'ayecode-connect' ),
2354 'day_s5_5' => __( 'Thursday', 'ayecode-connect' ),
2355 'day_s5_6' => __( 'Friday', 'ayecode-connect' ),
2356 'day_s5_7' => __( 'Saturday', 'ayecode-connect' ),
2357 'am_lower' => __( 'am', 'ayecode-connect' ),
2358 'pm_lower' => __( 'pm', 'ayecode-connect' ),
2359 'am_upper' => __( 'AM', 'ayecode-connect' ),
2360 'pm_upper' => __( 'PM', 'ayecode-connect' ),
2361 'firstDayOfWeek' => (int) get_option( 'start_of_week' ),
2362 'time_24hr' => false,
2363 'year' => __( 'Year', 'ayecode-connect' ),
2364 'hour' => __( 'Hour', 'ayecode-connect' ),
2365 'minute' => __( 'Minute', 'ayecode-connect' ),
2366 'weekAbbreviation' => __( 'Wk', 'ayecode-connect' ),
2367 'rangeSeparator' => __( ' to ', 'ayecode-connect' ),
2368 'scrollTitle' => __( 'Scroll to increment', 'ayecode-connect' ),
2369 'toggleTitle' => __( 'Click to toggle', 'ayecode-connect' )
2370 );
2371
2372 return apply_filters( 'ayecode_ui_calendar_params', $params );
2373 }
2374
2375 /**
2376 * Flatpickr calendar localize.
2377 *
2378 * @since 0.1.44
2379 *
2380 * @return string Calendar locale.
2381 */
2382 public static function flatpickr_locale() {
2383 $params = self::calendar_params();
2384
2385 if ( is_string( $params ) ) {
2386 $params = html_entity_decode( $params, ENT_QUOTES, 'UTF-8' );
2387 } else {
2388 foreach ( (array) $params as $key => $value ) {
2389 if ( ! is_scalar( $value ) ) {
2390 continue;
2391 }
2392
2393 $params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2394 }
2395 }
2396
2397 $day_s3 = array();
2398 $day_s5 = array();
2399
2400 for ( $i = 1; $i <= 7; $i ++ ) {
2401 $day_s3[] = addslashes( $params[ 'day_s3_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2402 $day_s5[] = addslashes( $params[ 'day_s3_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2403 }
2404
2405 $month_s = array();
2406 $month_long = array();
2407
2408 for ( $i = 1; $i <= 12; $i ++ ) {
2409 $month_s[] = addslashes( $params[ 'month_s_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2410 $month_long[] = addslashes( $params[ 'month_long_' . $i ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
2411 }
2412
2413 ob_start();
2414 if ( 0 ) { ?><script><?php } ?>
2415 {
2416 weekdays: {
2417 shorthand: ['<?php echo implode( "','", $day_s3 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2418 longhand: ['<?php echo implode( "','", $day_s5 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2419 },
2420 months: {
2421 shorthand: ['<?php echo implode( "','", $month_s ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2422 longhand: ['<?php echo implode( "','", $month_long ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>'],
2423 },
2424 daysInMonth: [31,28,31,30,31,30,31,31,30,31,30,31],
2425 firstDayOfWeek: <?php echo (int) $params[ 'firstDayOfWeek' ]; ?>,
2426 ordinal: function (nth) {
2427 var s = nth % 100;
2428 if (s > 3 && s < 21)
2429 return "th";
2430 switch (s % 10) {
2431 case 1:
2432 return "st";
2433 case 2:
2434 return "nd";
2435 case 3:
2436 return "rd";
2437 default:
2438 return "th";
2439 }
2440 },
2441 rangeSeparator: '<?php echo esc_attr( $params[ 'rangeSeparator' ] ); ?>',
2442 weekAbbreviation: '<?php echo esc_attr( $params[ 'weekAbbreviation' ] ); ?>',
2443 scrollTitle: '<?php echo esc_attr( $params[ 'scrollTitle' ] ); ?>',
2444 toggleTitle: '<?php echo esc_attr( $params[ 'toggleTitle' ] ); ?>',
2445 amPM: ['<?php echo esc_attr( $params[ 'am_upper' ] ); ?>','<?php echo esc_attr( $params[ 'pm_upper' ] ); ?>'],
2446 yearAriaLabel: '<?php echo esc_attr( $params[ 'year' ] ); ?>',
2447 hourAriaLabel: '<?php echo esc_attr( $params[ 'hour' ] ); ?>',
2448 minuteAriaLabel: '<?php echo esc_attr( $params[ 'minute' ] ); ?>',
2449 time_24hr: <?php echo ( $params[ 'time_24hr' ] ? 'true' : 'false' ) ; ?>
2450 }
2451 <?php if ( 0 ) { ?></script><?php } ?>
2452 <?php
2453 $locale = ob_get_clean();
2454
2455 return apply_filters( 'ayecode_ui_flatpickr_locale', trim( $locale ) );
2456 }
2457
2458 /**
2459 * Select2 JS params.
2460 *
2461 * @since 0.1.44
2462 *
2463 * @return array Select2 JS params.
2464 */
2465 public static function select2_params() {
2466 $params = array(
2467 'i18n_select_state_text' => esc_attr__( 'Select an option&hellip;', 'ayecode-connect' ),
2468 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'ayecode-connect' ),
2469 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'ayecode-connect' ),
2470 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'ayecode-connect' ),
2471 'i18n_input_too_short_n' => _x( 'Please enter %item% or more characters', 'enhanced select', 'ayecode-connect' ),
2472 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'ayecode-connect' ),
2473 'i18n_input_too_long_n' => _x( 'Please delete %item% characters', 'enhanced select', 'ayecode-connect' ),
2474 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'ayecode-connect' ),
2475 'i18n_selection_too_long_n' => _x( 'You can only select %item% items', 'enhanced select', 'ayecode-connect' ),
2476 'i18n_load_more' => _x( 'Loading more results&hellip;', 'enhanced select', 'ayecode-connect' ),
2477 'i18n_searching' => _x( 'Searching&hellip;', 'enhanced select', 'ayecode-connect' )
2478 );
2479
2480 return apply_filters( 'ayecode_ui_select2_params', $params );
2481 }
2482
2483 /**
2484 * Select2 JS localize.
2485 *
2486 * @since 0.1.44
2487 *
2488 * @return string Select2 JS locale.
2489 */
2490 public static function select2_locale() {
2491 $params = self::select2_params();
2492
2493 foreach ( (array) $params as $key => $value ) {
2494 if ( ! is_scalar( $value ) ) {
2495 continue;
2496 }
2497
2498 $params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2499 }
2500
2501 $locale = json_encode( $params );
2502
2503 return apply_filters( 'ayecode_ui_select2_locale', trim( $locale ) );
2504 }
2505
2506 /**
2507 * Time ago JS localize.
2508 *
2509 * @since 0.1.47
2510 *
2511 * @return string Time ago JS locale.
2512 */
2513 public static function timeago_locale() {
2514 $params = array(
2515 'prefix_ago' => '',
2516 'suffix_ago' => ' ' . _x( 'ago', 'time ago', 'ayecode-connect' ),
2517 'prefix_after' => _x( 'after', 'time ago', 'ayecode-connect' ) . ' ',
2518 'suffix_after' => '',
2519 'seconds' => _x( 'less than a minute', 'time ago', 'ayecode-connect' ),
2520 'minute' => _x( 'about a minute', 'time ago', 'ayecode-connect' ),
2521 'minutes' => _x( '%d minutes', 'time ago', 'ayecode-connect' ),
2522 'hour' => _x( 'about an hour', 'time ago', 'ayecode-connect' ),
2523 'hours' => _x( 'about %d hours', 'time ago', 'ayecode-connect' ),
2524 'day' => _x( 'a day', 'time ago', 'ayecode-connect' ),
2525 'days' => _x( '%d days', 'time ago', 'ayecode-connect' ),
2526 'month' => _x( 'about a month', 'time ago', 'ayecode-connect' ),
2527 'months' => _x( '%d months', 'time ago', 'ayecode-connect' ),
2528 'year' => _x( 'about a year', 'time ago', 'ayecode-connect' ),
2529 'years' => _x( '%d years', 'time ago', 'ayecode-connect' ),
2530 );
2531
2532 $params = apply_filters( 'ayecode_ui_timeago_params', $params );
2533
2534 foreach ( (array) $params as $key => $value ) {
2535 if ( ! is_scalar( $value ) ) {
2536 continue;
2537 }
2538
2539 $params[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
2540 }
2541
2542 $locale = json_encode( $params );
2543
2544 return apply_filters( 'ayecode_ui_timeago_locale', trim( $locale ) );
2545 }
2546
2547 /**
2548 * JavaScript Minifier
2549 *
2550 * @param $input
2551 *
2552 * @return mixed
2553 */
2554 public static function minify_js($input) {
2555 if(trim($input) === "") return $input;
2556 return preg_replace(
2557 array(
2558 // Remove comment(s)
2559 '#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#',
2560 // Remove white-space(s) outside the string and regex
2561 '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s',
2562 // Remove the last semicolon
2563 '#;+\}#',
2564 // Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}`
2565 '#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i',
2566 // --ibid. From `foo['bar']` to `foo.bar`
2567 '#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i'
2568 ),
2569 array(
2570 '$1',
2571 '$1$2',
2572 '}',
2573 '$1$3',
2574 '$1.$3'
2575 ),
2576 $input);
2577 }
2578
2579 /**
2580 * Minify CSS
2581 *
2582 * @param $input
2583 *
2584 * @return mixed
2585 */
2586 public static function minify_css($input) {
2587 if(trim($input) === "") return $input;
2588 return preg_replace(
2589 array(
2590 // Remove comment(s)
2591 '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')|\/\*(?!\!)(?>.*?\*\/)|^\s*|\s*$#s',
2592 // Remove unused white-space(s)
2593 '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/))|\s*+;\s*+(})\s*+|\s*+([*$~^|]?+=|[{};,>~]|\s(?![0-9\.])|!important\b)\s*+|([[(:])\s++|\s++([])])|\s++(:)\s*+(?!(?>[^{}"\']++|"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')*+{)|^\s++|\s++\z|(\s)\s+#si',
2594 // Replace `0(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)` with `0`
2595 '#(?<=[\s:])(0)(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)#si',
2596 // Replace `:0 0 0 0` with `:0`
2597 '#:(0\s+0|0\s+0\s+0\s+0)(?=[;\}]|\!important)#i',
2598 // Replace `background-position:0` with `background-position:0 0`
2599 '#(background-position):0(?=[;\}])#si',
2600 // Replace `0.6` with `.6`, but only when preceded by `:`, `,`, `-` or a white-space
2601 '#(?<=[\s:,\-])0+\.(\d+)#s',
2602 // Minify string value
2603 '#(\/\*(?>.*?\*\/))|(?<!content\:)([\'"])([a-z_][a-z0-9\-_]*?)\2(?=[\s\{\}\];,])#si',
2604 '#(\/\*(?>.*?\*\/))|(\burl\()([\'"])([^\s]+?)\3(\))#si',
2605 // Minify HEX color code
2606 '#(?<=[\s:,\-]\#)([a-f0-6]+)\1([a-f0-6]+)\2([a-f0-6]+)\3#i',
2607 // Replace `(border|outline):none` with `(border|outline):0`
2608 '#(?<=[\{;])(border|outline):none(?=[;\}\!])#',
2609 // Remove empty selector(s)
2610 '#(\/\*(?>.*?\*\/))|(^|[\{\}])(?:[^\s\{\}]+)\{\}#s'
2611 ),
2612 array(
2613 '$1',
2614 '$1$2$3$4$5$6$7',
2615 '$1',
2616 ':0',
2617 '$1:0 0',
2618 '.$1',
2619 '$1$3',
2620 '$1$2$4$5',
2621 '$1$2$3',
2622 '$1:0',
2623 '$1$2'
2624 ),
2625 $input);
2626 }
2627
2628 /**
2629 * Get the conditional fields JavaScript.
2630 *
2631 * @return mixed
2632 */
2633 public function conditional_fields_js() {
2634 ob_start();
2635 ?>
2636 <script>
2637 /**
2638 * Conditional Fields
2639 */
2640 var aui_cf_field_rules = [], aui_cf_field_key_rules = {}, aui_cf_field_default_values = {};
2641
2642 jQuery(function($) {
2643 aui_cf_field_init_rules($);
2644 });
2645
2646 /**
2647 * Conditional fields init.
2648 */
2649 function aui_cf_field_init_rules($) {
2650 if (!$('[data-has-rule]').length) {
2651 return;
2652 }
2653 $('input.select2-search__field,.aui-cf-ignore-rule').attr('data-ignore-rule','');
2654 $('[data-rule-key]').on('change keypress keyup gdclear', 'input, textarea', function() {
2655 if (!$(this).hasClass('select2-search__field')) {
2656 aui_cf_field_apply_rules($(this));
2657 }
2658 });
2659
2660 $('[data-rule-key]').on('change change.select2 gdclear', 'select', function() {
2661 aui_cf_field_apply_rules($(this));
2662 });
2663
2664 aui_cf_field_setup_rules($);
2665 }
2666
2667 /**
2668 * Setup conditional field rules.
2669 */
2670 function aui_cf_field_setup_rules($) {
2671 var aui_cf_field_keys = [];
2672
2673 $('[data-rule-key]').each(function() {
2674 var key = $(this).data('rule-key'), irule = parseInt($(this).data('has-rule'));
2675 if (key) {
2676 aui_cf_field_keys.push(key);
2677 }
2678
2679 var parse_conds = {};
2680 if ($(this).data('rule-fie-0')) {
2681 $(this).find('input,select,textarea').each(function() {
2682 if ($(this).attr('required') || $(this).attr('oninvalid')) {
2683 $(this).addClass('aui-cf-req');
2684 if ($(this).attr('required')) {
2685 $(this).attr('data-rule-req', true);
2686 }
2687 if ($(this).attr('oninvalid')) {
2688 $(this).attr('data-rule-oninvalid', $(this).attr('oninvalid'));
2689 }
2690 }
2691 });
2692 for (var i = 0; i < irule; i++) {
2693 var field = $(this).data('rule-fie-' + i);
2694 if (typeof parse_conds[i] === 'undefined') {
2695 parse_conds[i] = {};
2696 }
2697 parse_conds[i]['action'] = $(this).data('rule-act-' + i);
2698 parse_conds[i]['field'] = $(this).data('rule-fie-' + i);
2699 parse_conds[i]['condition'] = $(this).data('rule-con-' + i);
2700 parse_conds[i]['value'] = $(this).data('rule-val-' + i);
2701 }
2702
2703 $.each(parse_conds, function(j, data) {
2704 var item = {
2705 'field': {
2706 key: key,
2707 action: data.action,
2708 field: data.field,
2709 condition: data.condition,
2710 value: data.value,
2711 rule: {
2712 key: key,
2713 action: data.action,
2714 condition: data.condition,
2715 value: data.value
2716 }
2717 }
2718 };
2719 aui_cf_field_rules.push(item);
2720 });
2721 }
2722 aui_cf_field_default_values[$(this).data('rule-key')] = aui_cf_field_get_default_value($(this));
2723 });
2724
2725 $.each(aui_cf_field_keys, function(i, fkey) {
2726 aui_cf_field_key_rules[fkey] = aui_cf_field_get_children(fkey);
2727 });
2728
2729 $('[data-rule-key]:visible').each(function() {
2730 var conds = aui_cf_field_key_rules[$(this).data('rule-key')];
2731 if (conds && conds.length) {
2732 var $main_el = $(this), el = aui_cf_field_get_element($main_el);
2733 if ($(el).length) {
2734 aui_cf_field_apply_rules($(el));
2735 }
2736 }
2737 });
2738 }
2739
2740 /**
2741 * Apply conditional field rules.
2742 */
2743 function aui_cf_field_apply_rules($el) {
2744 if (!$el.parents('[data-rule-key]').length) {
2745 return;
2746 }
2747
2748 if ($el.data('no-rule')) {
2749 return;
2750 }
2751
2752 var key = $el.parents('[data-rule-key]').data('rule-key');
2753 var conditions = aui_cf_field_key_rules[key];
2754 if (typeof conditions === 'undefined') {
2755 return;
2756 }
2757 var field_type = aui_cf_field_get_type($el.parents('[data-rule-key]')), current_value = aui_cf_field_get_value($el);
2758 var $keys = {}, $keys_values = {}, $key_rules = {};
2759
2760 jQuery.each(conditions, function(index, condition) {
2761 if (typeof $keys_values[condition.key] == 'undefined') {
2762 $keys_values[condition.key] = [];
2763 $key_rules[condition.key] = {}
2764 }
2765
2766 $keys_values[condition.key].push(condition.value);
2767 $key_rules[condition.key] = condition;
2768 });
2769
2770 jQuery.each(conditions, function(index, condition) {
2771 if (typeof $keys[condition.key] == 'undefined') {
2772 $keys[condition.key] = {};
2773 }
2774
2775 if (condition.condition === 'empty') {
2776 var field_value = Array.isArray(current_value) ? current_value.join('') : current_value;
2777 if (!field_value || field_value === '') {
2778 $keys[condition.key][index] = true;
2779 } else {
2780 $keys[condition.key][index] = false;
2781 }
2782 } else if (condition.condition === 'not empty') {
2783 var field_value = Array.isArray(current_value) ? current_value.join('') : current_value;
2784 if (field_value && field_value !== '') {
2785 $keys[condition.key][index] = true;
2786 } else {
2787 $keys[condition.key][index] = false;
2788 }
2789 } else if (condition.condition === 'equals to') {
2790 var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2791 if (((condition.value && condition.value == condition.value) || (condition.value === field_value)) && aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2792 $keys[condition.key][index] = true;
2793 } else {
2794 $keys[condition.key][index] = false;
2795 }
2796 } else if (condition.condition === 'not equals') {
2797 var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2798 if (jQuery.isNumeric(condition.value) && parseInt(field_value) !== parseInt(condition.value) && field_value && !aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2799 $keys[condition.key][index] = true;
2800 } else if (condition.value != field_value && !aui_cf_field_in_array(field_value, $keys_values[condition.key])) {
2801 $keys[condition.key][index] = true;
2802 } else {
2803 $keys[condition.key][index] = false;
2804 }
2805 } else if (condition.condition === 'greater than') {
2806 var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2807 if (jQuery.isNumeric(condition.value) && parseInt(field_value) > parseInt(condition.value)) {
2808 $keys[condition.key][index] = true;
2809 } else {
2810 $keys[condition.key][index] = false;
2811 }
2812 } else if (condition.condition === 'less than') {
2813 var field_value = (Array.isArray(current_value) && current_value.length === 1) ? current_value[0] : current_value;
2814 if (jQuery.isNumeric(condition.value) && parseInt(field_value) < parseInt(condition.value)) {
2815 $keys[condition.key][index] = true;
2816 } else {
2817 $keys[condition.key][index] = false;
2818 }
2819 } else if (condition.condition === 'contains') {
2820 var avalues = condition.value;
2821 if (!Array.isArray(avalues)) {
2822 if (jQuery.isNumeric(avalues)) {
2823 avalues = [avalues];
2824 } else {
2825 avalues = avalues.split(",");
2826 }
2827 }
2828 switch (field_type) {
2829 case 'multiselect':
2830 var found = false;
2831 for (var key in avalues) {
2832 var svalue = jQuery.isNumeric(avalues[key]) ? avalues[key] : (avalues[key]).trim();
2833 if (!found && current_value && ((!Array.isArray(current_value) && current_value.indexOf(svalue) >= 0) || (Array.isArray(current_value) && aui_cf_field_in_array(svalue, current_value)))) {
2834 found = true;
2835 }
2836 }
2837
2838 if (found) {
2839 $keys[condition.key][index] = true;
2840 } else {
2841 $keys[condition.key][index] = false;
2842 }
2843 break;
2844 case 'checkbox':
2845 if (current_value && ((!Array.isArray(current_value) && current_value.indexOf(condition.value) >= 0) || (Array.isArray(current_value) && aui_cf_field_in_array(condition.value, current_value)))) {
2846 $keys[condition.key][index] = true;
2847 } else {
2848 $keys[condition.key][index] = false;
2849 }
2850 break;
2851 default:
2852 if (typeof $keys[condition.key][index] === 'undefined') {
2853 if (current_value && current_value.indexOf(condition.value) >= 0 && aui_cf_field_in_array(current_value, $keys_values[condition.key], false, true)) {
2854 $keys[condition.key][index] = true;
2855 } else {
2856 $keys[condition.key][index] = false;
2857 }
2858 }
2859 break;
2860 }
2861 }
2862 });
2863
2864 jQuery.each($keys, function(index, field) {
2865 if (aui_cf_field_in_array(true, field)) {
2866 aui_cf_field_apply_action($el, $key_rules[index], true);
2867 } else {
2868 aui_cf_field_apply_action($el, $key_rules[index], false);
2869 }
2870 });
2871
2872 /* Trigger field change */
2873 if ($keys.length) {
2874 $el.trigger('aui_cf_field_on_change');
2875 }
2876 }
2877
2878 /**
2879 * Get the field element.
2880 */
2881 function aui_cf_field_get_element($el) {
2882 var el = $el.find('input,textarea,select').not('[data-ignore-rule]'), type = aui_cf_field_get_type($el);
2883 if (type && window._aui_cf_field_elements && typeof window._aui_cf_field_elements == 'object' && typeof window._aui_cf_field_elements[type] != 'undefined') {
2884 el = window._aui_cf_field_elements[type];
2885 }
2886 return el;
2887 }
2888
2889 /**
2890 * Get the field type.
2891 */
2892 function aui_cf_field_get_type($el) {
2893 return $el.data('rule-type');
2894 }
2895
2896 /**
2897 * Get the field value.
2898 */
2899 function aui_cf_field_get_value($el) {
2900 var current_value = $el.val();
2901
2902 if ($el.is(':checkbox')) {
2903 current_value = '';
2904 if ($el.parents('[data-rule-key]').find('input:checked').not('[data-ignore-rule]').length > 1) {
2905 $el.parents('[data-rule-key]').find('input:checked').not('[data-ignore-rule]').each(function() {
2906 current_value = current_value + jQuery(this).val() + ' ';
2907 });
2908 } else {
2909 if ($el.parents('[data-rule-key]').find('input:checked').not('[data-ignore-rule]').length >= 1) {
2910 current_value = $el.parents('[data-rule-key]').find('input:checked').not('[data-ignore-rule]').val();
2911 }
2912 }
2913 }
2914
2915 if ($el.is(':radio')) {
2916 current_value = $el.parents('[data-rule-key]').find('input[type=radio]:checked').not('[data-ignore-rule]').val();
2917 }
2918
2919 return current_value;
2920 }
2921
2922 /**
2923 * Get the field default value.
2924 */
2925 function aui_cf_field_get_default_value($el) {
2926 var value = '', type = aui_cf_field_get_type($el);
2927
2928 switch (type) {
2929 case 'text':
2930 case 'number':
2931 case 'date':
2932 case 'textarea':
2933 case 'select':
2934 value = $el.find('input:text,input[type="number"],textarea,select').not('[data-ignore-rule]').val();
2935 break;
2936 case 'phone':
2937 case 'email':
2938 case 'color':
2939 case 'url':
2940 case 'hidden':
2941 case 'password':
2942 case 'file':
2943 value = $el.find('input[type="' + type + '"]').not('[data-ignore-rule]').val();
2944 break;
2945 case 'multiselect':
2946 value = $el.find('select').not('[data-ignore-rule]').val();
2947 break;
2948 case 'radio':
2949 if ($el.find('input[type="radio"]:checked').not('[data-ignore-rule]').length >= 1) {
2950 value = $el.find('input[type="radio"]:checked').not('[data-ignore-rule]').val();
2951 }
2952 break;
2953 case 'checkbox':
2954 if ($el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').length >= 1) {
2955 if ($el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').length > 1) {
2956 var values = [];
2957 values.push(value);
2958 $el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').each(function() {
2959 values.push(jQuery(this).val());
2960 });
2961 value = values;
2962 } else {
2963 value = $el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').val();
2964 }
2965 }
2966 break;
2967 default:
2968 if (window._aui_cf_field_default_values && typeof window._aui_cf_field_default_values == 'object' && typeof window._aui_cf_field_default_values[type] != 'undefined') {
2969 value = window._aui_cf_field_default_values[type];
2970 }
2971 break;
2972 }
2973 return {
2974 type: type,
2975 value: value
2976 };
2977 }
2978
2979 /**
2980 * Reset field default value.
2981 */
2982 function aui_cf_field_reset_default_value($el, bHide, setVal) {
2983 if (!($el && $el.length)) {
2984 return;
2985 }
2986 var type = aui_cf_field_get_type($el), key = $el.data('rule-key'), field = aui_cf_field_default_values[key];
2987 if (typeof setVal === 'undefined' || (typeof setVal !== 'undefined' && setVal === null)) {
2988 setVal = field.value;
2989 }
2990
2991 switch (type) {
2992 case 'text':
2993 case 'number':
2994 case 'date':
2995 case 'textarea':
2996 $el.find('input:text,input[type="number"],textarea').not('[data-ignore-rule]').val(setVal);
2997 break;
2998 case 'phone':
2999 case 'email':
3000 case 'color':
3001 case 'url':
3002 case 'hidden':
3003 case 'password':
3004 case 'file':
3005 $el.find('input[type="' + type + '"]:not("[data-ignore-rule]")').val(setVal);
3006 break;
3007 case 'select':
3008 var $elSelect = $el.find('select').not('[data-ignore-rule]');
3009 $elSelect.find('option').prop('selected', false);
3010 $elSelect.val(setVal);
3011 $elSelect.trigger('change');
3012 break;
3013 case 'multiselect':
3014 var $elSelect = $el.find('select').not('[data-ignore-rule]');
3015 $elSelect.find('option').prop('selected', false);
3016 if ((typeof setVal === 'object' || typeof setVal === 'array') && !setVal.length && $elSelect.find('option:first').text() == '') {
3017 $elSelect.find('option:first').remove(); // Clear first option to show placeholder.
3018 }
3019 if (typeof setVal === 'string') {
3020 $elSelect.val(setVal);
3021 } else {
3022 jQuery.each(setVal, function(i, v) {
3023 $elSelect.find('option[value="' + v + '"]').prop('selected', true);
3024 });
3025 }
3026 $elSelect.trigger('change');
3027 break;
3028 case 'checkbox':
3029 if ($el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').length >= 1) {
3030 $el.find('input[type="checkbox"]:checked').not('[data-ignore-rule]').prop('checked', false).removeAttr('checked');
3031 }
3032 if (Array.isArray(setVal)) {
3033 jQuery.each(setVal, function(i, v) {
3034 $el.find('input[type="checkbox"][value="' + v + '"]').not('[data-ignore-rule]').prop('checked', true);
3035 });
3036 } else {
3037 $el.find('input[type="checkbox"][value="' + setVal + '"]').not('[data-ignore-rule]').prop('checked', true);
3038 }
3039 break;
3040 case 'radio':
3041 setTimeout(function() {
3042 if ($el.find('input[type="radio"]:checked').not('[data-ignore-rule]').length >= 1) {
3043 $el.find('input[type="radio"]:checked').not('[data-ignore-rule]').prop('checked', false).removeAttr('checked');
3044 }
3045 $el.find('input[type="radio"][value="' + setVal + '"]').not('[data-ignore-rule]').prop('checked', true);
3046 }, 100);
3047 break;
3048 default:
3049 jQuery(document.body).trigger('aui_cf_field_reset_default_value', type, $el, field);
3050 break;
3051 }
3052
3053 if (!$el.hasClass('aui-cf-field-has-changed')) {
3054 var el = aui_cf_field_get_element($el);
3055 if (type === 'radio' || type === 'checkbox') {
3056 el = el.find(':checked');
3057 }
3058 if (el) {
3059 el.trigger('change');
3060 $el.addClass('aui-cf-field-has-changed');
3061 }
3062 }
3063 }
3064
3065 /**
3066 * Get the field children.
3067 */
3068 function aui_cf_field_get_children(field_key) {
3069 var rules = [];
3070 jQuery.each(aui_cf_field_rules, function(j, rule) {
3071 if (rule.field.field === field_key) {
3072 rules.push(rule.field.rule);
3073 }
3074 });
3075 return rules;
3076 }
3077
3078 /**
3079 * Check in array field value.
3080 */
3081 function aui_cf_field_in_array(find, item, exact, match) {
3082 var found = false, key;
3083 exact = !!exact;
3084
3085 for (key in item) {
3086 if ((exact && item[key] === find) || (!exact && item[key] == find) || (match && (typeof find === 'string' || typeof find === 'number') && (typeof item[key] === 'string' || typeof item[key] === 'number') && find.length && find.indexOf(item[key]) >= 0)) {
3087 found = true;
3088 break;
3089 }
3090 }
3091 return found;
3092 }
3093
3094 /**
3095 * App the field condition action.
3096 */
3097 function aui_cf_field_apply_action($el, rule, isTrue) {
3098 var $destEl = jQuery('[data-rule-key="' + rule.key + '"]'), $inputEl = (rule.key && $destEl.find('[name="' + rule.key + '"]').length) ? $destEl.find('[name="' + rule.key + '"]') : null;
3099
3100 if (rule.action === 'show' && isTrue) {
3101 if ($destEl.is(':hidden') && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3102 aui_cf_field_reset_default_value($destEl);
3103 }
3104 aui_cf_field_show_element($destEl);
3105 } else if (rule.action === 'show' && !isTrue) {
3106 if ((!$destEl.is(':hidden') || ($destEl.is(':hidden') && ($destEl.hasClass('aui-cf-force-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')) || ($destEl.closest('.aui-cf-use-parent').length && $destEl.closest('.aui-cf-use-parent').is(':hidden'))))) && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3107 var _setVal = $destEl.hasClass('aui-cf-force-empty') || ($inputEl && $inputEl.hasClass('aui-cf-force-empty')) ? '' : null;
3108 aui_cf_field_reset_default_value($destEl, true, _setVal);
3109 }
3110 aui_cf_field_hide_element($destEl);
3111 } else if (rule.action === 'hide' && isTrue) {
3112 if ((!$destEl.is(':hidden') || ($destEl.is(':hidden') && ($destEl.hasClass('aui-cf-force-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')) || ($destEl.closest('.aui-cf-use-parent').length && $destEl.closest('.aui-cf-use-parent').is(':hidden'))))) && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3113 var _setVal = $destEl.hasClass('aui-cf-force-empty') || ($inputEl && $inputEl.hasClass('aui-cf-force-empty')) ? '' : null;
3114 aui_cf_field_reset_default_value($destEl, true, _setVal);
3115 }
3116 aui_cf_field_hide_element($destEl);
3117 } else if (rule.action === 'hide' && !isTrue) {
3118 if ($destEl.is(':hidden') && !($destEl.hasClass('aui-cf-skip-reset') || ($inputEl && $inputEl.hasClass('aui-cf-skip-reset')))) {
3119 aui_cf_field_reset_default_value($destEl);
3120 }
3121 aui_cf_field_show_element($destEl);
3122 }
3123 return $el.removeClass('aui-cf-field-has-changed');
3124 }
3125
3126 /**
3127 * Show field element.
3128 */
3129 function aui_cf_field_show_element($el) {
3130 $el.removeClass('d-none').show();
3131
3132 $el.find('.aui-cf-req').each(function() {
3133 if (jQuery(this).data('rule-req')) {
3134 jQuery(this).removeAttr('required').prop('required', true);
3135 }
3136 if (jQuery(this).data('rule-oninvalid')) {
3137 jQuery(this).removeAttr('oninvalid').attr('oninvalid', jQuery(this).data('rule-oninvalid'));
3138 }
3139 });
3140
3141 if (window && window.navigator.userAgent.indexOf("MSIE") !== -1) {
3142 $el.css({
3143 "visibility": "visible"
3144 });
3145 }
3146 }
3147
3148 /**
3149 * Hide field element.
3150 */
3151 function aui_cf_field_hide_element($el) {
3152 $el.addClass('d-none').hide();
3153
3154 $el.find('.aui-cf-req').each(function() {
3155 if (jQuery(this).data('rule-req')) {
3156 jQuery(this).removeAttr('required');
3157 }
3158 if (jQuery(this).data('rule-oninvalid')) {
3159 jQuery(this).removeAttr('oninvalid');
3160 }
3161 });
3162
3163 if (window && window.navigator.userAgent.indexOf("MSIE") !== -1) {
3164 $el.css({
3165 "visibility": "hidden"
3166 });
3167 }
3168 }
3169 <?php do_action( 'aui_conditional_fields_js', $this ); ?>
3170 </script>
3171 <?php
3172 $output = ob_get_clean();
3173
3174 return str_replace( array( '<script>', '</script>' ), '', self::minify_js( $output ) );
3175 }
3176
3177 /**
3178 * Check if block editor page.
3179 *
3180 * @since 0.2.27
3181 *
3182 * @return bool
3183 */
3184 public static function is_block_editor() {
3185 if ( is_admin() ) {
3186 $current_screen = function_exists( 'get_current_screen' ) ? get_current_screen() : array();
3187
3188 if ( ! empty( $current_screen ) && $current_screen->is_block_editor() ) {
3189 return true;
3190 }
3191 }
3192
3193 return false;
3194 }
3195
3196 /**
3197 * Checks if the current call is a ajax call to get the block content.
3198 *
3199 * This can be used in your widget to return different content as the block content.
3200 *
3201 * @since 0.2.27
3202 *
3203 * @return bool
3204 */
3205 public static function is_block_content_call() {
3206 $result = false;
3207 if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
3208 $result = true;
3209 }
3210
3211 return $result;
3212 }
3213
3214 /**
3215 * Tests if the current output is inside a Divi preview.
3216 *
3217 * @since 0.2.27
3218 *
3219 * @return bool
3220 */
3221 public static function is_divi_preview() {
3222 $result = false;
3223 if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
3224 $result = true;
3225 }
3226
3227 return $result;
3228 }
3229
3230 /**
3231 * Tests if the current output is inside a elementor preview.
3232 *
3233 *
3234 * @since 0.2.27
3235 *
3236 * @return bool
3237 */
3238 public static function is_elementor_preview() {
3239 $result = false;
3240 if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
3241 $result = true;
3242 }
3243
3244 return $result;
3245 }
3246
3247 /**
3248 * Tests if the current output is inside a Beaver builder preview.
3249 *
3250 * @since 0.2.27
3251 *
3252 * @return bool
3253 */
3254 public static function is_beaver_preview() {
3255 $result = false;
3256 if ( isset( $_REQUEST['fl_builder'] ) ) {
3257 $result = true;
3258 }
3259
3260 return $result;
3261 }
3262
3263 /**
3264 * Tests if the current output is inside a siteorigin builder preview.
3265 *
3266 * @since 0.2.27
3267 *
3268 * @return bool
3269 */
3270 public static function is_siteorigin_preview() {
3271 $result = false;
3272 if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
3273 $result = true;
3274 }
3275
3276 return $result;
3277 }
3278
3279 /**
3280 * Tests if the current output is inside a cornerstone builder preview.
3281 *
3282 * @since 0.2.27
3283 *
3284 * @return bool
3285 */
3286 public static function is_cornerstone_preview() {
3287 $result = false;
3288 if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
3289 $result = true;
3290 }
3291
3292 return $result;
3293 }
3294
3295 /**
3296 * Tests if the current output is inside a fusion builder preview.
3297 *
3298 * @return bool
3299 *@since 1.1.0
3300 */
3301 public static function is_fusion_preview() {
3302 $result = false;
3303 if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
3304 $result = true;
3305 }
3306
3307 return $result;
3308 }
3309
3310 /**
3311 * Tests if the current output is inside a Oxygen builder preview.
3312 *
3313 * @return bool
3314 *@since 1.0.18
3315 */
3316 public static function is_oxygen_preview() {
3317 $result = false;
3318 if ( ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) ) {
3319 $result = true;
3320 }
3321
3322 return $result;
3323 }
3324
3325 /**
3326 * Check for Kallyas theme Zion builder preview.
3327 *
3328 * @since 0.2.27
3329 *
3330 * @return bool
3331 */
3332 public static function is_kallyas_zion_preview() {
3333 $result = false;
3334
3335 if ( function_exists( 'znhg_kallyas_theme_config' ) && ! empty( $_REQUEST['zn_pb_edit'] ) ) {
3336 $result = true;
3337 }
3338
3339 return $result;
3340 }
3341
3342 /**
3343 * Check for Bricks theme builder preview.
3344 *
3345 * @since 0.2.27
3346 *
3347 * @return bool
3348 */
3349 public static function is_bricks_preview() {
3350 $result = false;
3351
3352 if ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || bricks_is_builder_call() ) ) {
3353 $result = true;
3354 }
3355
3356 return $result;
3357 }
3358
3359 /**
3360 * Check for Breakdance builder preview.
3361 *
3362 * @since 0.2.42
3363 *
3364 * @return bool True when preview page otherwise false.
3365 */
3366 public static function is_breakdance_preview() {
3367 return ( \function_exists( 'Breakdance\\isRequestFromBuilderIframe' ) && ( \Breakdance\isRequestFromBuilderIframe() || \Breakdance\isRequestFromBuilderSsr() ) );
3368 }
3369
3370 /**
3371 * General function to check if we are in a preview situation.
3372 *
3373 * @since 0.2.27
3374 *
3375 * @return bool
3376 */
3377 public static function is_preview() {
3378 $preview = false;
3379
3380 if ( self::is_block_editor() ) {
3381 return true;
3382 }
3383
3384 if( self::is_block_content_call() ) {
3385 $preview = true;
3386 } elseif ( self::is_divi_preview() ) {
3387 $preview = true;
3388 } elseif ( self::is_elementor_preview() ) {
3389 $preview = true;
3390 } elseif ( self::is_beaver_preview() ) {
3391 $preview = true;
3392 } elseif ( self::is_siteorigin_preview() ) {
3393 $preview = true;
3394 } elseif ( self::is_cornerstone_preview() ) {
3395 $preview = true;
3396 } elseif ( self::is_fusion_preview() ) {
3397 $preview = true;
3398 } elseif ( self::is_oxygen_preview() ) {
3399 $preview = true;
3400 } elseif( self::is_kallyas_zion_preview() ) {
3401 $preview = true;
3402 } elseif( self::is_bricks_preview() ) {
3403 $preview = true;
3404 } elseif( self::is_breakdance_preview() ) {
3405 $preview = true;
3406 }
3407
3408 return $preview;
3409 }
3410 }
3411
3412 global $ayecode_ui_settings;
3413
3414 /**
3415 * Run the class if found.
3416 */
3417 $ayecode_ui_settings = AyeCode_UI_Settings::instance();
3418 }