PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.63
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.63
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.63, at vendor/ayecode/wp-ayecode-ui/includes/ayecode-ui-settings.php

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