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

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