@@ -12,737 +12,737 @@ |
||
| 12 | 12 | |
| 13 | 13 | if ( ! class_exists( 'Redux_Enqueue', false ) ) { |
| 14 | 14 | |
| 15 | - /** |
|
| 16 | - * Class Redux_Enqueue |
|
| 17 | - */ |
|
| 18 | - class Redux_Enqueue extends Redux_Class { |
|
| 19 | - |
|
| 20 | - /** |
|
| 21 | - * Data to localize. |
|
| 22 | - * |
|
| 23 | - * @var array |
|
| 24 | - */ |
|
| 25 | - public array $localize_data = array(); |
|
| 26 | - |
|
| 27 | - /** |
|
| 28 | - * Min string for .min files. |
|
| 29 | - * |
|
| 30 | - * @var string |
|
| 31 | - */ |
|
| 32 | - private string $min = ''; |
|
| 33 | - |
|
| 34 | - /** |
|
| 35 | - * Timestamp for file versions. |
|
| 36 | - * |
|
| 37 | - * @var string |
|
| 38 | - */ |
|
| 39 | - private string $timestamp = ''; |
|
| 40 | - |
|
| 41 | - /** |
|
| 42 | - * Localize data required for the repeater extension. |
|
| 43 | - * |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - private array $repeater_data = array(); |
|
| 47 | - |
|
| 48 | - /** |
|
| 49 | - * Redux_Enqueue constructor. |
|
| 50 | - * |
|
| 51 | - * @param object $redux ReduxFramework pointer. |
|
| 52 | - */ |
|
| 53 | - public function __construct( $redux ) { |
|
| 54 | - parent::__construct( $redux ); |
|
| 55 | - |
|
| 56 | - // Enqueue the admin page CSS and JS. |
|
| 57 | - if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 58 | - add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 ); |
|
| 59 | - } |
|
| 60 | - |
|
| 61 | - add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 ); |
|
| 62 | - |
|
| 63 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 64 | - do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this ); |
|
| 65 | - |
|
| 66 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | - do_action( 'redux/enqueue/construct', $this ); |
|
| 68 | - |
|
| 69 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 70 | - do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' ); |
|
| 71 | - |
|
| 72 | - //if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended |
|
| 73 | - // add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 ); |
|
| 74 | - //} |
|
| 75 | - |
|
| 76 | - //add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 ); |
|
| 77 | - } |
|
| 78 | - |
|
| 79 | - /** |
|
| 80 | - * Scripts to enqueue on the frontend |
|
| 81 | - */ |
|
| 82 | - public function frontend_init() { |
|
| 83 | - $core = $this->core(); |
|
| 84 | - |
|
| 85 | - if ( $core->args['elusive_frontend'] ) { |
|
| 86 | - Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 87 | - } |
|
| 88 | - |
|
| 89 | - if ( $core->args['fontawesome_frontend'] ) { |
|
| 90 | - Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 91 | - } |
|
| 92 | - } |
|
| 93 | - |
|
| 94 | - /** |
|
| 95 | - * Class init functions. |
|
| 96 | - */ |
|
| 97 | - public function init() { |
|
| 98 | - $core = $this->core(); |
|
| 99 | - |
|
| 100 | - Redux_Functions::$parent = $core; |
|
| 101 | - |
|
| 102 | - $this->min = Redux_Functions::is_min(); |
|
| 103 | - |
|
| 104 | - $this->timestamp = Redux_Core::$version; |
|
| 105 | - if ( $core->args['dev_mode'] ) { |
|
| 106 | - $this->timestamp .= '.' . time(); |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - $this->register_styles( $core ); |
|
| 110 | - $this->register_scripts(); |
|
| 111 | - |
|
| 112 | - add_thickbox(); |
|
| 113 | - |
|
| 114 | - $this->enqueue_fields( $core ); |
|
| 115 | - |
|
| 116 | - add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) ); |
|
| 117 | - |
|
| 118 | - $this->set_localized_data( $core ); |
|
| 119 | - |
|
| 120 | - /** |
|
| 121 | - * Action 'redux/page/{opt_name}/enqueue' |
|
| 122 | - */ |
|
| 123 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 124 | - do_action( "redux/page/{$core->args['opt_name']}/enqueue" ); |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - /** |
|
| 128 | - * Register all core framework styles. |
|
| 129 | - * |
|
| 130 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 131 | - */ |
|
| 132 | - private function register_styles( ReduxFramework $core ) { |
|
| 133 | - |
|
| 134 | - /** |
|
| 135 | - * Redux Admin CSS |
|
| 136 | - */ |
|
| 137 | - if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit |
|
| 138 | - $color_scheme = get_user_option( 'admin_color' ); |
|
| 139 | - } elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) { |
|
| 140 | - $color_scheme = 'classic'; |
|
| 141 | - } else { |
|
| 142 | - $color_scheme = $core->args['admin_theme']; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) { |
|
| 146 | - $color_scheme = 'fresh'; |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - $css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css"; |
|
| 150 | - |
|
| 151 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 152 | - $css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css ); |
|
| 153 | - |
|
| 154 | - wp_register_style( |
|
| 155 | - 'redux-admin-theme', |
|
| 156 | - $css, |
|
| 157 | - array(), |
|
| 158 | - $this->timestamp |
|
| 159 | - ); |
|
| 160 | - |
|
| 161 | - wp_enqueue_style( |
|
| 162 | - 'redux-admin-css', |
|
| 163 | - Redux_Core::$url . "assets/css/redux-admin$this->min.css", |
|
| 164 | - array( 'redux-admin-theme' ), |
|
| 165 | - $this->timestamp |
|
| 166 | - ); |
|
| 167 | - |
|
| 168 | - /** |
|
| 169 | - * Redux Fields CSS |
|
| 170 | - */ |
|
| 171 | - if ( ! $core->args['dev_mode'] ) { |
|
| 172 | - wp_enqueue_style( |
|
| 173 | - 'redux-fields', |
|
| 174 | - Redux_Core::$url . 'assets/css/redux-fields.min.css', |
|
| 175 | - array(), |
|
| 176 | - $this->timestamp |
|
| 177 | - ); |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - /** |
|
| 181 | - * Select2 CSS |
|
| 182 | - */ |
|
| 183 | - wp_enqueue_style( |
|
| 184 | - 'select2-css', |
|
| 185 | - Redux_Core::$url . 'assets/css/vendor/select2.min.css', |
|
| 186 | - array(), |
|
| 187 | - '4.1.0' |
|
| 188 | - ); |
|
| 189 | - |
|
| 190 | - /** |
|
| 191 | - * Spectrum CSS |
|
| 192 | - */ |
|
| 193 | - wp_register_style( |
|
| 194 | - 'redux-spectrum-css', |
|
| 195 | - Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css", |
|
| 196 | - array(), |
|
| 197 | - '1.3.3' |
|
| 198 | - ); |
|
| 199 | - |
|
| 200 | - /** |
|
| 201 | - * Elusive Icon CSS |
|
| 202 | - */ |
|
| 203 | - Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 204 | - |
|
| 205 | - /** |
|
| 206 | - * Font Awesome for Social Profiles and Icon Select |
|
| 207 | - */ |
|
| 208 | - Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 209 | - |
|
| 210 | - /** |
|
| 211 | - * QTip CSS |
|
| 212 | - */ |
|
| 213 | - wp_enqueue_style( |
|
| 214 | - 'qtip', |
|
| 215 | - Redux_Core::$url . "assets/css/vendor/qtip$this->min.css", |
|
| 216 | - array(), |
|
| 217 | - '3.0.3' |
|
| 218 | - ); |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * JQuery UI CSS |
|
| 222 | - */ |
|
| 223 | - wp_enqueue_style( |
|
| 224 | - 'jquery-ui', |
|
| 225 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 226 | - apply_filters( |
|
| 227 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 228 | - "redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css", |
|
| 229 | - Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css' |
|
| 230 | - ), |
|
| 231 | - array(), |
|
| 232 | - $this->timestamp |
|
| 233 | - ); |
|
| 234 | - |
|
| 235 | - /** |
|
| 236 | - * Iris CSS |
|
| 237 | - */ |
|
| 238 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 239 | - |
|
| 240 | - if ( $core->args['dev_mode'] ) { |
|
| 241 | - |
|
| 242 | - /** |
|
| 243 | - * Media CSS |
|
| 244 | - */ |
|
| 245 | - wp_enqueue_style( |
|
| 246 | - 'redux-field-media', |
|
| 247 | - Redux_Core::$url . 'assets/css/media.css', |
|
| 248 | - array(), |
|
| 249 | - $this->timestamp |
|
| 250 | - ); |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - /** |
|
| 254 | - * RTL CSS |
|
| 255 | - */ |
|
| 256 | - if ( is_rtl() ) { |
|
| 257 | - wp_enqueue_style( |
|
| 258 | - 'redux-rtl', |
|
| 259 | - Redux_Core::$url . 'assets/css/rtl.css', |
|
| 260 | - array(), |
|
| 261 | - $this->timestamp |
|
| 262 | - ); |
|
| 263 | - } |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - /** |
|
| 267 | - * Register all core framework scripts. |
|
| 268 | - */ |
|
| 269 | - private function register_scripts() { |
|
| 270 | - // ***************************************************************** |
|
| 271 | - // JQuery / JQuery UI JS |
|
| 272 | - // ***************************************************************** |
|
| 273 | - wp_enqueue_script( 'jquery' ); |
|
| 274 | - wp_enqueue_script( 'jquery-ui-core' ); |
|
| 275 | - wp_enqueue_script( 'jquery-ui-dialog' ); |
|
| 276 | - |
|
| 277 | - /** |
|
| 278 | - * Select2 Sortable JS |
|
| 279 | - */ |
|
| 280 | - wp_register_script( |
|
| 281 | - 'redux-select2-sortable', |
|
| 282 | - Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js', |
|
| 283 | - array( 'jquery', 'jquery-ui-sortable' ), |
|
| 284 | - $this->timestamp, |
|
| 285 | - true |
|
| 286 | - ); |
|
| 287 | - |
|
| 288 | - /** |
|
| 289 | - * Select2 |
|
| 290 | - */ |
|
| 291 | - wp_enqueue_script( |
|
| 292 | - 'select2-js', |
|
| 293 | - Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`', |
|
| 294 | - array( 'jquery', 'redux-select2-sortable' ), |
|
| 295 | - '4.1.0', |
|
| 296 | - true |
|
| 297 | - ); |
|
| 298 | - |
|
| 299 | - /** |
|
| 300 | - * QTip JS |
|
| 301 | - */ |
|
| 302 | - wp_enqueue_script( |
|
| 303 | - 'qtip', |
|
| 304 | - Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js', |
|
| 305 | - array( 'jquery' ), |
|
| 306 | - '3.0.3', |
|
| 307 | - true |
|
| 308 | - ); |
|
| 309 | - |
|
| 310 | - /** |
|
| 311 | - * Iris alpha color picker |
|
| 312 | - */ |
|
| 313 | - if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) { |
|
| 314 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 315 | - |
|
| 316 | - wp_register_script( |
|
| 317 | - 'redux-wp-color-picker-alpha', |
|
| 318 | - Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js', |
|
| 319 | - array( 'jquery', 'wp-color-picker' ), |
|
| 320 | - '3.0.0', |
|
| 321 | - true |
|
| 322 | - ); |
|
| 323 | - } |
|
| 324 | - |
|
| 325 | - /** |
|
| 326 | - * Block UI (used by Custom Fonts and Color Schemes). |
|
| 327 | - */ |
|
| 328 | - wp_register_script( |
|
| 329 | - 'redux-block-ui', |
|
| 330 | - Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js', |
|
| 331 | - array( 'jquery' ), |
|
| 332 | - '2.70.0', |
|
| 333 | - true |
|
| 334 | - ); |
|
| 335 | - |
|
| 336 | - /** |
|
| 337 | - * Spectrum JS |
|
| 338 | - */ |
|
| 339 | - wp_register_script( |
|
| 340 | - 'redux-spectrum-js', |
|
| 341 | - Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js', |
|
| 342 | - array( 'jquery' ), |
|
| 343 | - '1.3.3', |
|
| 344 | - true |
|
| 345 | - ); |
|
| 346 | - |
|
| 347 | - /** |
|
| 348 | - * Vendor JS |
|
| 349 | - */ |
|
| 350 | - wp_register_script( |
|
| 351 | - 'redux-vendor', |
|
| 352 | - Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js', |
|
| 353 | - array( 'jquery' ), |
|
| 354 | - $this->timestamp, |
|
| 355 | - true |
|
| 356 | - ); |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Redux JS |
|
| 360 | - */ |
|
| 361 | - wp_register_script( |
|
| 362 | - 'redux-js', |
|
| 363 | - Redux_Core::$url . 'assets/js/redux' . $this->min . '.js', |
|
| 364 | - array( 'jquery', 'redux-vendor' ), |
|
| 365 | - $this->timestamp, |
|
| 366 | - true |
|
| 367 | - ); |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - /** |
|
| 371 | - * Enqueue fields that are in use. |
|
| 372 | - * |
|
| 373 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 374 | - * @param array $field Field array. |
|
| 375 | - */ |
|
| 376 | - public function enqueue_field( ReduxFramework $core, array $field ) { |
|
| 377 | - if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) { |
|
| 378 | - $field_type = str_replace( '_', '-', $field['type'] ); |
|
| 379 | - $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php"; |
|
| 380 | - |
|
| 381 | - // Shim for v3 extension class names. |
|
| 382 | - if ( ! file_exists( $core_path ) ) { |
|
| 383 | - $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php"; |
|
| 384 | - } |
|
| 385 | - |
|
| 386 | - $filter_path = $core_path; |
|
| 387 | - |
|
| 388 | - /** |
|
| 389 | - * Field class file |
|
| 390 | - * filter 'redux/{opt_name}/field/class/{field.type}' |
|
| 391 | - * |
|
| 392 | - * @param string $filter_path Field class file path |
|
| 393 | - * @param array $field Field config data |
|
| 394 | - */ |
|
| 395 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 396 | - $class_file = apply_filters( |
|
| 397 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 398 | - "redux/{$core->args['opt_name']}/field/class/{$field['type']}", |
|
| 399 | - $filter_path, |
|
| 400 | - $field |
|
| 401 | - ); |
|
| 402 | - |
|
| 403 | - $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 404 | - |
|
| 405 | - if ( $class_file ) { |
|
| 406 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 407 | - if ( false === $field_class ) { |
|
| 408 | - if ( file_exists( $class_file ) ) { |
|
| 409 | - require_once $class_file; |
|
| 410 | - |
|
| 411 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 412 | - } else { |
|
| 413 | - return; |
|
| 414 | - } |
|
| 415 | - } |
|
| 416 | - |
|
| 417 | - if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
|
| 418 | - if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | - $core->options[ $field['id'] ] = ''; |
|
| 420 | - } |
|
| 421 | - |
|
| 422 | - $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 423 | - |
|
| 424 | - // Move dev_mode check to a new if/then block. |
|
| 425 | - if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
|
| 426 | - $the_field->enqueue(); |
|
| 427 | - } |
|
| 428 | - |
|
| 429 | - if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) { |
|
| 430 | - $the_field->always_enqueue(); |
|
| 431 | - } |
|
| 432 | - |
|
| 433 | - if ( method_exists( $field_class, 'localize' ) ) { |
|
| 434 | - $the_field->localize( $field ); |
|
| 435 | - |
|
| 436 | - if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | - $this->localize_data[ $field['type'] ] = array(); |
|
| 438 | - } |
|
| 439 | - |
|
| 440 | - $localize_data = $the_field->localize( $field ); |
|
| 441 | - |
|
| 442 | - $shims = array( 'repeater' ); |
|
| 443 | - |
|
| 444 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 445 | - $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
|
| 446 | - |
|
| 447 | - if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
|
| 448 | - $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 449 | - } |
|
| 450 | - |
|
| 451 | - $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 452 | - } |
|
| 453 | - |
|
| 454 | - unset( $the_field ); |
|
| 455 | - } |
|
| 456 | - } |
|
| 457 | - } |
|
| 458 | - } |
|
| 459 | - |
|
| 460 | - /** |
|
| 461 | - * Enqueue field files. |
|
| 462 | - * |
|
| 463 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 464 | - */ |
|
| 465 | - private function enqueue_fields( ReduxFramework $core ) { |
|
| 466 | - foreach ( $core->sections as $section ) { |
|
| 467 | - if ( isset( $section['fields'] ) ) { |
|
| 468 | - foreach ( $section['fields'] as $field ) { |
|
| 469 | - $this->enqueue_field( $core, $field ); |
|
| 470 | - } |
|
| 471 | - } |
|
| 472 | - } |
|
| 473 | - } |
|
| 474 | - |
|
| 475 | - /** |
|
| 476 | - * Build a localized array from field functions, if any. |
|
| 477 | - * |
|
| 478 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 479 | - * @param string $type Field type. |
|
| 480 | - */ |
|
| 481 | - private function build_local_array( ReduxFramework $core, string $type ) { |
|
| 482 | - if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 483 | - $the_total = 0; |
|
| 484 | - $messages = array(); |
|
| 485 | - |
|
| 486 | - foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 487 | - if ( is_array( $msg ) && ! empty( $msg ) ) { |
|
| 488 | - $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 489 | - |
|
| 490 | - if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | - $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - ++$messages[ $msg['section_id'] ]['total']; |
|
| 495 | - ++$the_total; |
|
| 496 | - } |
|
| 497 | - } |
|
| 498 | - |
|
| 499 | - $this->localize_data[ $type ] = array( |
|
| 500 | - 'total' => $the_total, |
|
| 501 | - "$type" => $messages, |
|
| 502 | - ); |
|
| 503 | - |
|
| 504 | - unset( $core->transients['notices'][ $type ] ); |
|
| 505 | - } |
|
| 506 | - } |
|
| 507 | - |
|
| 508 | - /** |
|
| 509 | - * Compile panel errors and wearings for a localized array. |
|
| 510 | - */ |
|
| 511 | - public function get_warnings_and_errors_array() { |
|
| 512 | - $core = $this->core(); |
|
| 513 | - |
|
| 514 | - $this->build_local_array( $core, 'errors' ); |
|
| 515 | - $this->build_local_array( $core, 'warnings' ); |
|
| 516 | - $this->build_local_array( $core, 'sanitize' ); |
|
| 517 | - |
|
| 518 | - if ( empty( $core->transients['notices'] ) ) { |
|
| 519 | - if ( isset( $core->transients['notices'] ) ) { |
|
| 520 | - unset( $core->transients['notices'] ); |
|
| 521 | - } |
|
| 522 | - } |
|
| 523 | - } |
|
| 524 | - |
|
| 525 | - /** |
|
| 526 | - * Commit localized data to global array. |
|
| 527 | - * |
|
| 528 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 529 | - */ |
|
| 530 | - private function set_localized_data( ReduxFramework $core ) { |
|
| 531 | - if ( ! empty( $core->args['last_tab'] ) ) { |
|
| 532 | - $this->localize_data['last_tab'] = $core->args['last_tab']; |
|
| 533 | - } |
|
| 534 | - |
|
| 535 | - $this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' ); |
|
| 536 | - |
|
| 537 | - $this->localize_data['font_weights'] = $this->args['font_weights']; |
|
| 538 | - |
|
| 539 | - $this->localize_data['required'] = Redux_Core::$required; |
|
| 540 | - $this->repeater_data['fonts'] = Redux_Core::$fonts; |
|
| 541 | - |
|
| 542 | - if ( ! isset( $this->repeater_data['opt_names'] ) ) { |
|
| 543 | - $this->repeater_data['opt_names'] = array(); |
|
| 544 | - } |
|
| 545 | - |
|
| 546 | - $this->repeater_data['opt_names'][] = $core->args['opt_name']; |
|
| 547 | - $this->repeater_data['folds'] = array(); |
|
| 548 | - $this->localize_data['required_child'] = Redux_Core::$required_child; |
|
| 549 | - $this->localize_data['fields'] = $core->fields; |
|
| 550 | - |
|
| 551 | - if ( isset( Redux_Core::$font_groups['google'] ) ) { |
|
| 552 | - $this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google']; |
|
| 553 | - } |
|
| 554 | - |
|
| 555 | - if ( isset( Redux_Core::$font_groups['std'] ) ) { |
|
| 556 | - $this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std']; |
|
| 557 | - } |
|
| 558 | - |
|
| 559 | - if ( isset( Redux_Core::$font_groups['customfonts'] ) ) { |
|
| 560 | - $this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts']; |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) { |
|
| 564 | - $this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts']; |
|
| 565 | - } |
|
| 566 | - |
|
| 567 | - $this->localize_data['folds'] = Redux_Core::$folds; |
|
| 568 | - |
|
| 569 | - // Make sure the children are all hidden properly. |
|
| 570 | - foreach ( $core->fields as $key => $value ) { |
|
| 571 | - if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) { |
|
| 572 | - foreach ( $value as $k => $v ) { |
|
| 573 | - if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
|
| 574 | - Redux_Core::$fields_hidden[] = $k; |
|
| 575 | - Redux_Core::$folds[ $k ] = 'hide'; |
|
| 576 | - } |
|
| 577 | - } |
|
| 578 | - } |
|
| 579 | - } |
|
| 580 | - |
|
| 581 | - $this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden; |
|
| 582 | - $this->localize_data['options'] = $core->options; |
|
| 583 | - $this->localize_data['defaults'] = $core->options_defaults; |
|
| 584 | - |
|
| 585 | - /** |
|
| 586 | - * Save pending string |
|
| 587 | - * filter 'redux/{opt_name}/localize/save_pending' |
|
| 588 | - * |
|
| 589 | - * @param string $msg Save_pending string |
|
| 590 | - */ |
|
| 591 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 592 | - $save_pending = apply_filters( |
|
| 593 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 594 | - "redux/{$core->args['opt_name']}/localize/save_pending", |
|
| 595 | - esc_html__( |
|
| 596 | - 'You have changes that are not saved. Would you like to save them now?', |
|
| 597 | - 'redux-framework' |
|
| 598 | - ) |
|
| 599 | - ); |
|
| 600 | - |
|
| 601 | - /** |
|
| 602 | - * Reset all string |
|
| 603 | - * filter 'redux/{opt_name}/localize/reset' |
|
| 604 | - * |
|
| 605 | - * @param string $msg Reset all string. |
|
| 606 | - */ |
|
| 607 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 608 | - $reset_all = apply_filters( |
|
| 609 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 610 | - "redux/{$core->args['opt_name']}/localize/reset", |
|
| 611 | - esc_html__( |
|
| 612 | - 'Are you sure? Resetting will lose all custom values.', |
|
| 613 | - 'redux-framework' |
|
| 614 | - ) |
|
| 615 | - ); |
|
| 616 | - |
|
| 617 | - /** |
|
| 618 | - * Reset section string |
|
| 619 | - * filter 'redux/{opt_name}/localize/reset_section' |
|
| 620 | - * |
|
| 621 | - * @param string $msg Reset section string. |
|
| 622 | - */ |
|
| 623 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 624 | - $reset_section = apply_filters( |
|
| 625 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 626 | - "redux/{$core->args['opt_name']}/localize/reset_section", |
|
| 627 | - esc_html__( |
|
| 628 | - 'Are you sure? Resetting will lose all custom values in this section.', |
|
| 629 | - 'redux-framework' |
|
| 630 | - ) |
|
| 631 | - ); |
|
| 632 | - |
|
| 633 | - /** |
|
| 634 | - * Preset confirm string |
|
| 635 | - * filter 'redux/{opt_name}/localize/preset' |
|
| 636 | - * |
|
| 637 | - * @param string $msg Preset confirm string. |
|
| 638 | - */ |
|
| 639 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 640 | - $preset_confirm = apply_filters( |
|
| 641 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 642 | - "redux/{$core->args['opt_name']}/localize/preset", |
|
| 643 | - esc_html__( |
|
| 644 | - 'Your current options will be replaced with the values of this preset. Would you like to proceed?', |
|
| 645 | - 'redux-framework' |
|
| 646 | - ) |
|
| 647 | - ); |
|
| 648 | - |
|
| 649 | - /** |
|
| 650 | - * Import confirm string |
|
| 651 | - * filter 'redux/{opt_name}/localize/import |
|
| 652 | - * |
|
| 653 | - * @param string $msg Import confirm string. |
|
| 654 | - */ |
|
| 655 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 656 | - $import_confirm = apply_filters( |
|
| 657 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 658 | - "redux/{$core->args['opt_name']}/localize/import", |
|
| 659 | - esc_html__( |
|
| 660 | - 'Your current options will be replaced with the values of this import. Would you like to proceed?', |
|
| 661 | - 'redux-framework' |
|
| 662 | - ) |
|
| 663 | - ); |
|
| 664 | - |
|
| 665 | - global $pagenow; |
|
| 666 | - |
|
| 667 | - $this->localize_data['args'] = array( |
|
| 668 | - 'dev_mode' => $core->args['dev_mode'], |
|
| 669 | - 'save_pending' => $save_pending, |
|
| 670 | - 'reset_confirm' => $reset_all, |
|
| 671 | - 'reset_section_confirm' => $reset_section, |
|
| 672 | - 'preset_confirm' => $preset_confirm, |
|
| 673 | - 'import_section_confirm' => $import_confirm, |
|
| 674 | - 'please_wait' => esc_html__( 'Please Wait', 'redux-framework' ), |
|
| 675 | - 'opt_name' => $core->args['opt_name'], |
|
| 676 | - 'flyout_submenus' => $core->args['flyout_submenus'] ?? false, |
|
| 677 | - 'search' => $core->args['search'] ?? true, |
|
| 678 | - 'slug' => $core->args['page_slug'], |
|
| 679 | - 'hints' => $core->args['hints'], |
|
| 680 | - 'disable_save_warn' => $core->args['disable_save_warn'], |
|
| 681 | - 'class' => $core->args['class'], |
|
| 682 | - 'ajax_save' => $core->args['ajax_save'], |
|
| 683 | - 'menu_search' => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=', |
|
| 684 | - ); |
|
| 685 | - |
|
| 686 | - $this->localize_data['ajax'] = array( |
|
| 687 | - 'console' => esc_html__( |
|
| 688 | - 'There was an error saving. Here is the result of your action:', |
|
| 689 | - 'redux-framework' |
|
| 690 | - ), |
|
| 691 | - 'alert' => esc_html__( |
|
| 692 | - 'There was a problem with your action. Please try again or reload the page.', |
|
| 693 | - 'redux-framework' |
|
| 694 | - ), |
|
| 695 | - ); |
|
| 696 | - |
|
| 697 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | - $this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data ); |
|
| 699 | - |
|
| 700 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 701 | - $this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data ); |
|
| 702 | - |
|
| 703 | - $this->get_warnings_and_errors_array(); |
|
| 704 | - |
|
| 705 | - if ( ! isset( $core->repeater_data ) ) { |
|
| 706 | - $core->repeater_data = array(); |
|
| 707 | - } |
|
| 708 | - $core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 709 | - $this->repeater_data, |
|
| 710 | - $core->repeater_data |
|
| 711 | - ); |
|
| 712 | - |
|
| 713 | - if ( ! isset( $core->localize_data ) ) { |
|
| 714 | - $core->localize_data = array(); |
|
| 715 | - } |
|
| 716 | - $core->localize_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 717 | - $this->localize_data, |
|
| 718 | - $core->localize_data |
|
| 719 | - ); |
|
| 720 | - |
|
| 721 | - // Shim for extension compatibility. |
|
| 722 | - if ( Redux::$extension_compatibility ) { |
|
| 723 | - $this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 724 | - $this->repeater_data, |
|
| 725 | - $core->localize_data |
|
| 726 | - ); |
|
| 727 | - } |
|
| 728 | - |
|
| 729 | - wp_localize_script( |
|
| 730 | - 'redux-js', |
|
| 731 | - 'redux', |
|
| 732 | - $this->repeater_data |
|
| 733 | - ); |
|
| 734 | - |
|
| 735 | - wp_localize_script( |
|
| 736 | - 'redux-js', |
|
| 737 | - 'redux_' . str_replace( '-', '_', $core->args['opt_name'] ), |
|
| 738 | - $this->localize_data |
|
| 739 | - ); |
|
| 740 | - |
|
| 741 | - wp_enqueue_script( 'redux-js' ); // Enqueue the JS now. |
|
| 742 | - } |
|
| 743 | - } |
|
| 15 | + /** |
|
| 16 | + * Class Redux_Enqueue |
|
| 17 | + */ |
|
| 18 | + class Redux_Enqueue extends Redux_Class { |
|
| 19 | + |
|
| 20 | + /** |
|
| 21 | + * Data to localize. |
|
| 22 | + * |
|
| 23 | + * @var array |
|
| 24 | + */ |
|
| 25 | + public array $localize_data = array(); |
|
| 26 | + |
|
| 27 | + /** |
|
| 28 | + * Min string for .min files. |
|
| 29 | + * |
|
| 30 | + * @var string |
|
| 31 | + */ |
|
| 32 | + private string $min = ''; |
|
| 33 | + |
|
| 34 | + /** |
|
| 35 | + * Timestamp for file versions. |
|
| 36 | + * |
|
| 37 | + * @var string |
|
| 38 | + */ |
|
| 39 | + private string $timestamp = ''; |
|
| 40 | + |
|
| 41 | + /** |
|
| 42 | + * Localize data required for the repeater extension. |
|
| 43 | + * |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + private array $repeater_data = array(); |
|
| 47 | + |
|
| 48 | + /** |
|
| 49 | + * Redux_Enqueue constructor. |
|
| 50 | + * |
|
| 51 | + * @param object $redux ReduxFramework pointer. |
|
| 52 | + */ |
|
| 53 | + public function __construct( $redux ) { |
|
| 54 | + parent::__construct( $redux ); |
|
| 55 | + |
|
| 56 | + // Enqueue the admin page CSS and JS. |
|
| 57 | + if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 58 | + add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 ); |
|
| 59 | + } |
|
| 60 | + |
|
| 61 | + add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 ); |
|
| 62 | + |
|
| 63 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 64 | + do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this ); |
|
| 65 | + |
|
| 66 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | + do_action( 'redux/enqueue/construct', $this ); |
|
| 68 | + |
|
| 69 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 70 | + do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' ); |
|
| 71 | + |
|
| 72 | + //if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended |
|
| 73 | + // add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 ); |
|
| 74 | + //} |
|
| 75 | + |
|
| 76 | + //add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 ); |
|
| 77 | + } |
|
| 78 | + |
|
| 79 | + /** |
|
| 80 | + * Scripts to enqueue on the frontend |
|
| 81 | + */ |
|
| 82 | + public function frontend_init() { |
|
| 83 | + $core = $this->core(); |
|
| 84 | + |
|
| 85 | + if ( $core->args['elusive_frontend'] ) { |
|
| 86 | + Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 87 | + } |
|
| 88 | + |
|
| 89 | + if ( $core->args['fontawesome_frontend'] ) { |
|
| 90 | + Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 91 | + } |
|
| 92 | + } |
|
| 93 | + |
|
| 94 | + /** |
|
| 95 | + * Class init functions. |
|
| 96 | + */ |
|
| 97 | + public function init() { |
|
| 98 | + $core = $this->core(); |
|
| 99 | + |
|
| 100 | + Redux_Functions::$parent = $core; |
|
| 101 | + |
|
| 102 | + $this->min = Redux_Functions::is_min(); |
|
| 103 | + |
|
| 104 | + $this->timestamp = Redux_Core::$version; |
|
| 105 | + if ( $core->args['dev_mode'] ) { |
|
| 106 | + $this->timestamp .= '.' . time(); |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + $this->register_styles( $core ); |
|
| 110 | + $this->register_scripts(); |
|
| 111 | + |
|
| 112 | + add_thickbox(); |
|
| 113 | + |
|
| 114 | + $this->enqueue_fields( $core ); |
|
| 115 | + |
|
| 116 | + add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) ); |
|
| 117 | + |
|
| 118 | + $this->set_localized_data( $core ); |
|
| 119 | + |
|
| 120 | + /** |
|
| 121 | + * Action 'redux/page/{opt_name}/enqueue' |
|
| 122 | + */ |
|
| 123 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 124 | + do_action( "redux/page/{$core->args['opt_name']}/enqueue" ); |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + /** |
|
| 128 | + * Register all core framework styles. |
|
| 129 | + * |
|
| 130 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 131 | + */ |
|
| 132 | + private function register_styles( ReduxFramework $core ) { |
|
| 133 | + |
|
| 134 | + /** |
|
| 135 | + * Redux Admin CSS |
|
| 136 | + */ |
|
| 137 | + if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit |
|
| 138 | + $color_scheme = get_user_option( 'admin_color' ); |
|
| 139 | + } elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) { |
|
| 140 | + $color_scheme = 'classic'; |
|
| 141 | + } else { |
|
| 142 | + $color_scheme = $core->args['admin_theme']; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) { |
|
| 146 | + $color_scheme = 'fresh'; |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + $css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css"; |
|
| 150 | + |
|
| 151 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 152 | + $css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css ); |
|
| 153 | + |
|
| 154 | + wp_register_style( |
|
| 155 | + 'redux-admin-theme', |
|
| 156 | + $css, |
|
| 157 | + array(), |
|
| 158 | + $this->timestamp |
|
| 159 | + ); |
|
| 160 | + |
|
| 161 | + wp_enqueue_style( |
|
| 162 | + 'redux-admin-css', |
|
| 163 | + Redux_Core::$url . "assets/css/redux-admin$this->min.css", |
|
| 164 | + array( 'redux-admin-theme' ), |
|
| 165 | + $this->timestamp |
|
| 166 | + ); |
|
| 167 | + |
|
| 168 | + /** |
|
| 169 | + * Redux Fields CSS |
|
| 170 | + */ |
|
| 171 | + if ( ! $core->args['dev_mode'] ) { |
|
| 172 | + wp_enqueue_style( |
|
| 173 | + 'redux-fields', |
|
| 174 | + Redux_Core::$url . 'assets/css/redux-fields.min.css', |
|
| 175 | + array(), |
|
| 176 | + $this->timestamp |
|
| 177 | + ); |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + /** |
|
| 181 | + * Select2 CSS |
|
| 182 | + */ |
|
| 183 | + wp_enqueue_style( |
|
| 184 | + 'select2-css', |
|
| 185 | + Redux_Core::$url . 'assets/css/vendor/select2.min.css', |
|
| 186 | + array(), |
|
| 187 | + '4.1.0' |
|
| 188 | + ); |
|
| 189 | + |
|
| 190 | + /** |
|
| 191 | + * Spectrum CSS |
|
| 192 | + */ |
|
| 193 | + wp_register_style( |
|
| 194 | + 'redux-spectrum-css', |
|
| 195 | + Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css", |
|
| 196 | + array(), |
|
| 197 | + '1.3.3' |
|
| 198 | + ); |
|
| 199 | + |
|
| 200 | + /** |
|
| 201 | + * Elusive Icon CSS |
|
| 202 | + */ |
|
| 203 | + Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 204 | + |
|
| 205 | + /** |
|
| 206 | + * Font Awesome for Social Profiles and Icon Select |
|
| 207 | + */ |
|
| 208 | + Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 209 | + |
|
| 210 | + /** |
|
| 211 | + * QTip CSS |
|
| 212 | + */ |
|
| 213 | + wp_enqueue_style( |
|
| 214 | + 'qtip', |
|
| 215 | + Redux_Core::$url . "assets/css/vendor/qtip$this->min.css", |
|
| 216 | + array(), |
|
| 217 | + '3.0.3' |
|
| 218 | + ); |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * JQuery UI CSS |
|
| 222 | + */ |
|
| 223 | + wp_enqueue_style( |
|
| 224 | + 'jquery-ui', |
|
| 225 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 226 | + apply_filters( |
|
| 227 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 228 | + "redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css", |
|
| 229 | + Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css' |
|
| 230 | + ), |
|
| 231 | + array(), |
|
| 232 | + $this->timestamp |
|
| 233 | + ); |
|
| 234 | + |
|
| 235 | + /** |
|
| 236 | + * Iris CSS |
|
| 237 | + */ |
|
| 238 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 239 | + |
|
| 240 | + if ( $core->args['dev_mode'] ) { |
|
| 241 | + |
|
| 242 | + /** |
|
| 243 | + * Media CSS |
|
| 244 | + */ |
|
| 245 | + wp_enqueue_style( |
|
| 246 | + 'redux-field-media', |
|
| 247 | + Redux_Core::$url . 'assets/css/media.css', |
|
| 248 | + array(), |
|
| 249 | + $this->timestamp |
|
| 250 | + ); |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + /** |
|
| 254 | + * RTL CSS |
|
| 255 | + */ |
|
| 256 | + if ( is_rtl() ) { |
|
| 257 | + wp_enqueue_style( |
|
| 258 | + 'redux-rtl', |
|
| 259 | + Redux_Core::$url . 'assets/css/rtl.css', |
|
| 260 | + array(), |
|
| 261 | + $this->timestamp |
|
| 262 | + ); |
|
| 263 | + } |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + /** |
|
| 267 | + * Register all core framework scripts. |
|
| 268 | + */ |
|
| 269 | + private function register_scripts() { |
|
| 270 | + // ***************************************************************** |
|
| 271 | + // JQuery / JQuery UI JS |
|
| 272 | + // ***************************************************************** |
|
| 273 | + wp_enqueue_script( 'jquery' ); |
|
| 274 | + wp_enqueue_script( 'jquery-ui-core' ); |
|
| 275 | + wp_enqueue_script( 'jquery-ui-dialog' ); |
|
| 276 | + |
|
| 277 | + /** |
|
| 278 | + * Select2 Sortable JS |
|
| 279 | + */ |
|
| 280 | + wp_register_script( |
|
| 281 | + 'redux-select2-sortable', |
|
| 282 | + Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js', |
|
| 283 | + array( 'jquery', 'jquery-ui-sortable' ), |
|
| 284 | + $this->timestamp, |
|
| 285 | + true |
|
| 286 | + ); |
|
| 287 | + |
|
| 288 | + /** |
|
| 289 | + * Select2 |
|
| 290 | + */ |
|
| 291 | + wp_enqueue_script( |
|
| 292 | + 'select2-js', |
|
| 293 | + Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`', |
|
| 294 | + array( 'jquery', 'redux-select2-sortable' ), |
|
| 295 | + '4.1.0', |
|
| 296 | + true |
|
| 297 | + ); |
|
| 298 | + |
|
| 299 | + /** |
|
| 300 | + * QTip JS |
|
| 301 | + */ |
|
| 302 | + wp_enqueue_script( |
|
| 303 | + 'qtip', |
|
| 304 | + Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js', |
|
| 305 | + array( 'jquery' ), |
|
| 306 | + '3.0.3', |
|
| 307 | + true |
|
| 308 | + ); |
|
| 309 | + |
|
| 310 | + /** |
|
| 311 | + * Iris alpha color picker |
|
| 312 | + */ |
|
| 313 | + if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) { |
|
| 314 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 315 | + |
|
| 316 | + wp_register_script( |
|
| 317 | + 'redux-wp-color-picker-alpha', |
|
| 318 | + Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js', |
|
| 319 | + array( 'jquery', 'wp-color-picker' ), |
|
| 320 | + '3.0.0', |
|
| 321 | + true |
|
| 322 | + ); |
|
| 323 | + } |
|
| 324 | + |
|
| 325 | + /** |
|
| 326 | + * Block UI (used by Custom Fonts and Color Schemes). |
|
| 327 | + */ |
|
| 328 | + wp_register_script( |
|
| 329 | + 'redux-block-ui', |
|
| 330 | + Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js', |
|
| 331 | + array( 'jquery' ), |
|
| 332 | + '2.70.0', |
|
| 333 | + true |
|
| 334 | + ); |
|
| 335 | + |
|
| 336 | + /** |
|
| 337 | + * Spectrum JS |
|
| 338 | + */ |
|
| 339 | + wp_register_script( |
|
| 340 | + 'redux-spectrum-js', |
|
| 341 | + Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js', |
|
| 342 | + array( 'jquery' ), |
|
| 343 | + '1.3.3', |
|
| 344 | + true |
|
| 345 | + ); |
|
| 346 | + |
|
| 347 | + /** |
|
| 348 | + * Vendor JS |
|
| 349 | + */ |
|
| 350 | + wp_register_script( |
|
| 351 | + 'redux-vendor', |
|
| 352 | + Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js', |
|
| 353 | + array( 'jquery' ), |
|
| 354 | + $this->timestamp, |
|
| 355 | + true |
|
| 356 | + ); |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Redux JS |
|
| 360 | + */ |
|
| 361 | + wp_register_script( |
|
| 362 | + 'redux-js', |
|
| 363 | + Redux_Core::$url . 'assets/js/redux' . $this->min . '.js', |
|
| 364 | + array( 'jquery', 'redux-vendor' ), |
|
| 365 | + $this->timestamp, |
|
| 366 | + true |
|
| 367 | + ); |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + /** |
|
| 371 | + * Enqueue fields that are in use. |
|
| 372 | + * |
|
| 373 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 374 | + * @param array $field Field array. |
|
| 375 | + */ |
|
| 376 | + public function enqueue_field( ReduxFramework $core, array $field ) { |
|
| 377 | + if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) { |
|
| 378 | + $field_type = str_replace( '_', '-', $field['type'] ); |
|
| 379 | + $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php"; |
|
| 380 | + |
|
| 381 | + // Shim for v3 extension class names. |
|
| 382 | + if ( ! file_exists( $core_path ) ) { |
|
| 383 | + $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php"; |
|
| 384 | + } |
|
| 385 | + |
|
| 386 | + $filter_path = $core_path; |
|
| 387 | + |
|
| 388 | + /** |
|
| 389 | + * Field class file |
|
| 390 | + * filter 'redux/{opt_name}/field/class/{field.type}' |
|
| 391 | + * |
|
| 392 | + * @param string $filter_path Field class file path |
|
| 393 | + * @param array $field Field config data |
|
| 394 | + */ |
|
| 395 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 396 | + $class_file = apply_filters( |
|
| 397 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 398 | + "redux/{$core->args['opt_name']}/field/class/{$field['type']}", |
|
| 399 | + $filter_path, |
|
| 400 | + $field |
|
| 401 | + ); |
|
| 402 | + |
|
| 403 | + $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 404 | + |
|
| 405 | + if ( $class_file ) { |
|
| 406 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 407 | + if ( false === $field_class ) { |
|
| 408 | + if ( file_exists( $class_file ) ) { |
|
| 409 | + require_once $class_file; |
|
| 410 | + |
|
| 411 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 412 | + } else { |
|
| 413 | + return; |
|
| 414 | + } |
|
| 415 | + } |
|
| 416 | + |
|
| 417 | + if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
|
| 418 | + if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | + $core->options[ $field['id'] ] = ''; |
|
| 420 | + } |
|
| 421 | + |
|
| 422 | + $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 423 | + |
|
| 424 | + // Move dev_mode check to a new if/then block. |
|
| 425 | + if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
|
| 426 | + $the_field->enqueue(); |
|
| 427 | + } |
|
| 428 | + |
|
| 429 | + if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) { |
|
| 430 | + $the_field->always_enqueue(); |
|
| 431 | + } |
|
| 432 | + |
|
| 433 | + if ( method_exists( $field_class, 'localize' ) ) { |
|
| 434 | + $the_field->localize( $field ); |
|
| 435 | + |
|
| 436 | + if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | + $this->localize_data[ $field['type'] ] = array(); |
|
| 438 | + } |
|
| 439 | + |
|
| 440 | + $localize_data = $the_field->localize( $field ); |
|
| 441 | + |
|
| 442 | + $shims = array( 'repeater' ); |
|
| 443 | + |
|
| 444 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 445 | + $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
|
| 446 | + |
|
| 447 | + if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
|
| 448 | + $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 449 | + } |
|
| 450 | + |
|
| 451 | + $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 452 | + } |
|
| 453 | + |
|
| 454 | + unset( $the_field ); |
|
| 455 | + } |
|
| 456 | + } |
|
| 457 | + } |
|
| 458 | + } |
|
| 459 | + |
|
| 460 | + /** |
|
| 461 | + * Enqueue field files. |
|
| 462 | + * |
|
| 463 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 464 | + */ |
|
| 465 | + private function enqueue_fields( ReduxFramework $core ) { |
|
| 466 | + foreach ( $core->sections as $section ) { |
|
| 467 | + if ( isset( $section['fields'] ) ) { |
|
| 468 | + foreach ( $section['fields'] as $field ) { |
|
| 469 | + $this->enqueue_field( $core, $field ); |
|
| 470 | + } |
|
| 471 | + } |
|
| 472 | + } |
|
| 473 | + } |
|
| 474 | + |
|
| 475 | + /** |
|
| 476 | + * Build a localized array from field functions, if any. |
|
| 477 | + * |
|
| 478 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 479 | + * @param string $type Field type. |
|
| 480 | + */ |
|
| 481 | + private function build_local_array( ReduxFramework $core, string $type ) { |
|
| 482 | + if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 483 | + $the_total = 0; |
|
| 484 | + $messages = array(); |
|
| 485 | + |
|
| 486 | + foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 487 | + if ( is_array( $msg ) && ! empty( $msg ) ) { |
|
| 488 | + $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 489 | + |
|
| 490 | + if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | + $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + ++$messages[ $msg['section_id'] ]['total']; |
|
| 495 | + ++$the_total; |
|
| 496 | + } |
|
| 497 | + } |
|
| 498 | + |
|
| 499 | + $this->localize_data[ $type ] = array( |
|
| 500 | + 'total' => $the_total, |
|
| 501 | + "$type" => $messages, |
|
| 502 | + ); |
|
| 503 | + |
|
| 504 | + unset( $core->transients['notices'][ $type ] ); |
|
| 505 | + } |
|
| 506 | + } |
|
| 507 | + |
|
| 508 | + /** |
|
| 509 | + * Compile panel errors and wearings for a localized array. |
|
| 510 | + */ |
|
| 511 | + public function get_warnings_and_errors_array() { |
|
| 512 | + $core = $this->core(); |
|
| 513 | + |
|
| 514 | + $this->build_local_array( $core, 'errors' ); |
|
| 515 | + $this->build_local_array( $core, 'warnings' ); |
|
| 516 | + $this->build_local_array( $core, 'sanitize' ); |
|
| 517 | + |
|
| 518 | + if ( empty( $core->transients['notices'] ) ) { |
|
| 519 | + if ( isset( $core->transients['notices'] ) ) { |
|
| 520 | + unset( $core->transients['notices'] ); |
|
| 521 | + } |
|
| 522 | + } |
|
| 523 | + } |
|
| 524 | + |
|
| 525 | + /** |
|
| 526 | + * Commit localized data to global array. |
|
| 527 | + * |
|
| 528 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 529 | + */ |
|
| 530 | + private function set_localized_data( ReduxFramework $core ) { |
|
| 531 | + if ( ! empty( $core->args['last_tab'] ) ) { |
|
| 532 | + $this->localize_data['last_tab'] = $core->args['last_tab']; |
|
| 533 | + } |
|
| 534 | + |
|
| 535 | + $this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' ); |
|
| 536 | + |
|
| 537 | + $this->localize_data['font_weights'] = $this->args['font_weights']; |
|
| 538 | + |
|
| 539 | + $this->localize_data['required'] = Redux_Core::$required; |
|
| 540 | + $this->repeater_data['fonts'] = Redux_Core::$fonts; |
|
| 541 | + |
|
| 542 | + if ( ! isset( $this->repeater_data['opt_names'] ) ) { |
|
| 543 | + $this->repeater_data['opt_names'] = array(); |
|
| 544 | + } |
|
| 545 | + |
|
| 546 | + $this->repeater_data['opt_names'][] = $core->args['opt_name']; |
|
| 547 | + $this->repeater_data['folds'] = array(); |
|
| 548 | + $this->localize_data['required_child'] = Redux_Core::$required_child; |
|
| 549 | + $this->localize_data['fields'] = $core->fields; |
|
| 550 | + |
|
| 551 | + if ( isset( Redux_Core::$font_groups['google'] ) ) { |
|
| 552 | + $this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google']; |
|
| 553 | + } |
|
| 554 | + |
|
| 555 | + if ( isset( Redux_Core::$font_groups['std'] ) ) { |
|
| 556 | + $this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std']; |
|
| 557 | + } |
|
| 558 | + |
|
| 559 | + if ( isset( Redux_Core::$font_groups['customfonts'] ) ) { |
|
| 560 | + $this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts']; |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) { |
|
| 564 | + $this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts']; |
|
| 565 | + } |
|
| 566 | + |
|
| 567 | + $this->localize_data['folds'] = Redux_Core::$folds; |
|
| 568 | + |
|
| 569 | + // Make sure the children are all hidden properly. |
|
| 570 | + foreach ( $core->fields as $key => $value ) { |
|
| 571 | + if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) { |
|
| 572 | + foreach ( $value as $k => $v ) { |
|
| 573 | + if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
|
| 574 | + Redux_Core::$fields_hidden[] = $k; |
|
| 575 | + Redux_Core::$folds[ $k ] = 'hide'; |
|
| 576 | + } |
|
| 577 | + } |
|
| 578 | + } |
|
| 579 | + } |
|
| 580 | + |
|
| 581 | + $this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden; |
|
| 582 | + $this->localize_data['options'] = $core->options; |
|
| 583 | + $this->localize_data['defaults'] = $core->options_defaults; |
|
| 584 | + |
|
| 585 | + /** |
|
| 586 | + * Save pending string |
|
| 587 | + * filter 'redux/{opt_name}/localize/save_pending' |
|
| 588 | + * |
|
| 589 | + * @param string $msg Save_pending string |
|
| 590 | + */ |
|
| 591 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 592 | + $save_pending = apply_filters( |
|
| 593 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 594 | + "redux/{$core->args['opt_name']}/localize/save_pending", |
|
| 595 | + esc_html__( |
|
| 596 | + 'You have changes that are not saved. Would you like to save them now?', |
|
| 597 | + 'redux-framework' |
|
| 598 | + ) |
|
| 599 | + ); |
|
| 600 | + |
|
| 601 | + /** |
|
| 602 | + * Reset all string |
|
| 603 | + * filter 'redux/{opt_name}/localize/reset' |
|
| 604 | + * |
|
| 605 | + * @param string $msg Reset all string. |
|
| 606 | + */ |
|
| 607 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 608 | + $reset_all = apply_filters( |
|
| 609 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 610 | + "redux/{$core->args['opt_name']}/localize/reset", |
|
| 611 | + esc_html__( |
|
| 612 | + 'Are you sure? Resetting will lose all custom values.', |
|
| 613 | + 'redux-framework' |
|
| 614 | + ) |
|
| 615 | + ); |
|
| 616 | + |
|
| 617 | + /** |
|
| 618 | + * Reset section string |
|
| 619 | + * filter 'redux/{opt_name}/localize/reset_section' |
|
| 620 | + * |
|
| 621 | + * @param string $msg Reset section string. |
|
| 622 | + */ |
|
| 623 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 624 | + $reset_section = apply_filters( |
|
| 625 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 626 | + "redux/{$core->args['opt_name']}/localize/reset_section", |
|
| 627 | + esc_html__( |
|
| 628 | + 'Are you sure? Resetting will lose all custom values in this section.', |
|
| 629 | + 'redux-framework' |
|
| 630 | + ) |
|
| 631 | + ); |
|
| 632 | + |
|
| 633 | + /** |
|
| 634 | + * Preset confirm string |
|
| 635 | + * filter 'redux/{opt_name}/localize/preset' |
|
| 636 | + * |
|
| 637 | + * @param string $msg Preset confirm string. |
|
| 638 | + */ |
|
| 639 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 640 | + $preset_confirm = apply_filters( |
|
| 641 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 642 | + "redux/{$core->args['opt_name']}/localize/preset", |
|
| 643 | + esc_html__( |
|
| 644 | + 'Your current options will be replaced with the values of this preset. Would you like to proceed?', |
|
| 645 | + 'redux-framework' |
|
| 646 | + ) |
|
| 647 | + ); |
|
| 648 | + |
|
| 649 | + /** |
|
| 650 | + * Import confirm string |
|
| 651 | + * filter 'redux/{opt_name}/localize/import |
|
| 652 | + * |
|
| 653 | + * @param string $msg Import confirm string. |
|
| 654 | + */ |
|
| 655 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 656 | + $import_confirm = apply_filters( |
|
| 657 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 658 | + "redux/{$core->args['opt_name']}/localize/import", |
|
| 659 | + esc_html__( |
|
| 660 | + 'Your current options will be replaced with the values of this import. Would you like to proceed?', |
|
| 661 | + 'redux-framework' |
|
| 662 | + ) |
|
| 663 | + ); |
|
| 664 | + |
|
| 665 | + global $pagenow; |
|
| 666 | + |
|
| 667 | + $this->localize_data['args'] = array( |
|
| 668 | + 'dev_mode' => $core->args['dev_mode'], |
|
| 669 | + 'save_pending' => $save_pending, |
|
| 670 | + 'reset_confirm' => $reset_all, |
|
| 671 | + 'reset_section_confirm' => $reset_section, |
|
| 672 | + 'preset_confirm' => $preset_confirm, |
|
| 673 | + 'import_section_confirm' => $import_confirm, |
|
| 674 | + 'please_wait' => esc_html__( 'Please Wait', 'redux-framework' ), |
|
| 675 | + 'opt_name' => $core->args['opt_name'], |
|
| 676 | + 'flyout_submenus' => $core->args['flyout_submenus'] ?? false, |
|
| 677 | + 'search' => $core->args['search'] ?? true, |
|
| 678 | + 'slug' => $core->args['page_slug'], |
|
| 679 | + 'hints' => $core->args['hints'], |
|
| 680 | + 'disable_save_warn' => $core->args['disable_save_warn'], |
|
| 681 | + 'class' => $core->args['class'], |
|
| 682 | + 'ajax_save' => $core->args['ajax_save'], |
|
| 683 | + 'menu_search' => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=', |
|
| 684 | + ); |
|
| 685 | + |
|
| 686 | + $this->localize_data['ajax'] = array( |
|
| 687 | + 'console' => esc_html__( |
|
| 688 | + 'There was an error saving. Here is the result of your action:', |
|
| 689 | + 'redux-framework' |
|
| 690 | + ), |
|
| 691 | + 'alert' => esc_html__( |
|
| 692 | + 'There was a problem with your action. Please try again or reload the page.', |
|
| 693 | + 'redux-framework' |
|
| 694 | + ), |
|
| 695 | + ); |
|
| 696 | + |
|
| 697 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | + $this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data ); |
|
| 699 | + |
|
| 700 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 701 | + $this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data ); |
|
| 702 | + |
|
| 703 | + $this->get_warnings_and_errors_array(); |
|
| 704 | + |
|
| 705 | + if ( ! isset( $core->repeater_data ) ) { |
|
| 706 | + $core->repeater_data = array(); |
|
| 707 | + } |
|
| 708 | + $core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 709 | + $this->repeater_data, |
|
| 710 | + $core->repeater_data |
|
| 711 | + ); |
|
| 712 | + |
|
| 713 | + if ( ! isset( $core->localize_data ) ) { |
|
| 714 | + $core->localize_data = array(); |
|
| 715 | + } |
|
| 716 | + $core->localize_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 717 | + $this->localize_data, |
|
| 718 | + $core->localize_data |
|
| 719 | + ); |
|
| 720 | + |
|
| 721 | + // Shim for extension compatibility. |
|
| 722 | + if ( Redux::$extension_compatibility ) { |
|
| 723 | + $this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 724 | + $this->repeater_data, |
|
| 725 | + $core->localize_data |
|
| 726 | + ); |
|
| 727 | + } |
|
| 728 | + |
|
| 729 | + wp_localize_script( |
|
| 730 | + 'redux-js', |
|
| 731 | + 'redux', |
|
| 732 | + $this->repeater_data |
|
| 733 | + ); |
|
| 734 | + |
|
| 735 | + wp_localize_script( |
|
| 736 | + 'redux-js', |
|
| 737 | + 'redux_' . str_replace( '-', '_', $core->args['opt_name'] ), |
|
| 738 | + $this->localize_data |
|
| 739 | + ); |
|
| 740 | + |
|
| 741 | + wp_enqueue_script( 'redux-js' ); // Enqueue the JS now. |
|
| 742 | + } |
|
| 743 | + } |
|
| 744 | 744 | } |
| 745 | 745 | |
| 746 | 746 | if ( ! class_exists( 'reduxCoreEnqueue' ) ) { |
| 747 | - class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' ); |
|
| 747 | + class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' ); |
|
| 748 | 748 | } |
@@ -415,11 +415,11 @@ discard block |
||
| 415 | 415 | } |
| 416 | 416 | |
| 417 | 417 | if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
| 418 | - if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | - $core->options[ $field['id'] ] = ''; |
|
| 418 | + if ( ! isset( $core->options[$field['id']] ) ) { |
|
| 419 | + $core->options[$field['id']] = ''; |
|
| 420 | 420 | } |
| 421 | 421 | |
| 422 | - $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 422 | + $the_field = new $field_class( $field, $core->options[$field['id']], $core ); |
|
| 423 | 423 | |
| 424 | 424 | // Move dev_mode check to a new if/then block. |
| 425 | 425 | if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
@@ -433,8 +433,8 @@ discard block |
||
| 433 | 433 | if ( method_exists( $field_class, 'localize' ) ) { |
| 434 | 434 | $the_field->localize( $field ); |
| 435 | 435 | |
| 436 | - if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | - $this->localize_data[ $field['type'] ] = array(); |
|
| 436 | + if ( ! isset( $this->localize_data[$field['type']] ) ) { |
|
| 437 | + $this->localize_data[$field['type']] = array(); |
|
| 438 | 438 | } |
| 439 | 439 | |
| 440 | 440 | $localize_data = $the_field->localize( $field ); |
@@ -445,10 +445,10 @@ discard block |
||
| 445 | 445 | $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
| 446 | 446 | |
| 447 | 447 | if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
| 448 | - $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 448 | + $this->repeater_data[$field['type']][$field['id']] = $localize_data; |
|
| 449 | 449 | } |
| 450 | 450 | |
| 451 | - $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 451 | + $this->localize_data[$field['type']][$field['id']] = $localize_data; |
|
| 452 | 452 | } |
| 453 | 453 | |
| 454 | 454 | unset( $the_field ); |
@@ -479,29 +479,29 @@ discard block |
||
| 479 | 479 | * @param string $type Field type. |
| 480 | 480 | */ |
| 481 | 481 | private function build_local_array( ReduxFramework $core, string $type ) { |
| 482 | - if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 482 | + if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][$type] ) ) { |
|
| 483 | 483 | $the_total = 0; |
| 484 | 484 | $messages = array(); |
| 485 | 485 | |
| 486 | - foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 486 | + foreach ( $core->transients['notices'][$type] as $msg ) { |
|
| 487 | 487 | if ( is_array( $msg ) && ! empty( $msg ) ) { |
| 488 | - $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 488 | + $messages[$msg['section_id']][$type][] = $msg; |
|
| 489 | 489 | |
| 490 | - if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | - $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 490 | + if ( ! isset( $messages[$msg['section_id']]['total'] ) ) { |
|
| 491 | + $messages[$msg['section_id']]['total'] = 0; |
|
| 492 | 492 | } |
| 493 | 493 | |
| 494 | - ++$messages[ $msg['section_id'] ]['total']; |
|
| 494 | + ++$messages[$msg['section_id']]['total']; |
|
| 495 | 495 | ++$the_total; |
| 496 | 496 | } |
| 497 | 497 | } |
| 498 | 498 | |
| 499 | - $this->localize_data[ $type ] = array( |
|
| 499 | + $this->localize_data[$type] = array( |
|
| 500 | 500 | 'total' => $the_total, |
| 501 | 501 | "$type" => $messages, |
| 502 | 502 | ); |
| 503 | 503 | |
| 504 | - unset( $core->transients['notices'][ $type ] ); |
|
| 504 | + unset( $core->transients['notices'][$type] ); |
|
| 505 | 505 | } |
| 506 | 506 | } |
| 507 | 507 | |
@@ -572,7 +572,7 @@ discard block |
||
| 572 | 572 | foreach ( $value as $k => $v ) { |
| 573 | 573 | if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
| 574 | 574 | Redux_Core::$fields_hidden[] = $k; |
| 575 | - Redux_Core::$folds[ $k ] = 'hide'; |
|
| 575 | + Redux_Core::$folds[$k] = 'hide'; |
|
| 576 | 576 | } |
| 577 | 577 | } |
| 578 | 578 | } |
@@ -79,13 +79,13 @@ discard block |
||
| 79 | 79 | |
| 80 | 80 | if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
| 81 | 81 | if ( is_array( $field['color_alpha'] ) ) { |
| 82 | - $value = $field['color_alpha'][ $index ] ?? false; |
|
| 82 | + $value = $field['color_alpha'][$index] ?? false; |
|
| 83 | 83 | } else { |
| 84 | 84 | $value = $field['color_alpha']; |
| 85 | 85 | } |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | - return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 88 | + return 'data-alpha-enabled="' . ( bool ) esc_attr( $value ) . '"'; |
|
| 89 | 89 | } |
| 90 | 90 | |
| 91 | 91 | /** |
@@ -112,10 +112,10 @@ discard block |
||
| 112 | 112 | |
| 113 | 113 | $k = key( $params ); |
| 114 | 114 | |
| 115 | - if ( ! isset( $result[ $k ] ) ) { |
|
| 115 | + if ( ! isset( $result[$k] ) ) { |
|
| 116 | 116 | $result += $params; |
| 117 | - } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | - $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 117 | + } elseif ( is_array( $result[$k] ) && is_array( $params[$k] ) ) { |
|
| 118 | + $result[$k] = self::array_merge_recursive_distinct( $result[$k], $params[$k] ); |
|
| 119 | 119 | } |
| 120 | 120 | } |
| 121 | 121 | |
@@ -139,12 +139,12 @@ discard block |
||
| 139 | 139 | |
| 140 | 140 | foreach ( $array2 as $key => $value ) { |
| 141 | 141 | |
| 142 | - if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | - } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 142 | + if ( is_array( $value ) && isset( $merged[$key] ) && is_array( $merged[$key] ) ) { |
|
| 143 | + $merged[$key] = self::array_merge_recursive_distinct( $merged[$key], $value ); |
|
| 144 | + } elseif ( is_numeric( $key ) && isset( $merged[$key] ) ) { |
|
| 145 | 145 | $merged[] = $value; |
| 146 | 146 | } else { |
| 147 | - $merged[ $key ] = $value; |
|
| 147 | + $merged[$key] = $value; |
|
| 148 | 148 | } |
| 149 | 149 | } |
| 150 | 150 | |
@@ -168,20 +168,20 @@ discard block |
||
| 168 | 168 | $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
| 169 | 169 | |
| 170 | 170 | if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
| 171 | - if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | - Redux_Core::$callers[ $opt_name ] = array(); |
|
| 171 | + if ( ! isset( Redux_Core::$callers[$opt_name] ) ) { |
|
| 172 | + Redux_Core::$callers[$opt_name] = array(); |
|
| 173 | 173 | } |
| 174 | 174 | |
| 175 | 175 | if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
| 176 | 176 | return; |
| 177 | 177 | } |
| 178 | 178 | |
| 179 | - if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | - Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 179 | + if ( ! in_array( $caller, Redux_Core::$callers[$opt_name], true ) ) { |
|
| 180 | + Redux_Core::$callers[$opt_name][] = $caller; |
|
| 181 | 181 | } |
| 182 | 182 | |
| 183 | - if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | - self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 183 | + if ( ! empty( self::$args[$opt_name]['callers'] ) && ! in_array( $caller, self::$args[$opt_name]['callers'], true ) ) { |
|
| 184 | + self::$args[$opt_name]['callers'][] = $caller; |
|
| 185 | 185 | } |
| 186 | 186 | } |
| 187 | 187 | } |
@@ -362,13 +362,13 @@ discard block |
||
| 362 | 362 | 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
| 363 | 363 | 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
| 364 | 364 | ); |
| 365 | - $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 365 | + $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | 366 | |
| 367 | 367 | if ( count( $theme_paths ) > 1 ) { |
| 368 | 368 | $key = array_search( $theme_path, $theme_paths, true ); |
| 369 | 369 | |
| 370 | 370 | if ( false !== $key ) { |
| 371 | - unset( $theme_paths[ $key ] ); |
|
| 371 | + unset( $theme_paths[$key] ); |
|
| 372 | 372 | } |
| 373 | 373 | |
| 374 | 374 | $theme_paths_end = end( $theme_paths ); |
@@ -397,10 +397,10 @@ discard block |
||
| 397 | 397 | $result = $b; |
| 398 | 398 | |
| 399 | 399 | foreach ( $a as $k => &$v ) { |
| 400 | - if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | - $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 400 | + if ( is_array( $v ) && isset( $result[$k] ) ) { |
|
| 401 | + $result[$k] = self::nested_wp_parse_args( $v, $result[$k] ); |
|
| 402 | 402 | } else { |
| 403 | - $result[ $k ] = $v; |
|
| 403 | + $result[$k] = $v; |
|
| 404 | 404 | } |
| 405 | 405 | } |
| 406 | 406 | |
@@ -13,476 +13,476 @@ |
||
| 13 | 13 | // Don't duplicate me! |
| 14 | 14 | if ( ! class_exists( 'Redux_Functions_Ex', false ) ) { |
| 15 | 15 | |
| 16 | - /** |
|
| 17 | - * Redux Functions Class |
|
| 18 | - * A Class of useful functions that can/should be shared among all Redux files. |
|
| 19 | - * |
|
| 20 | - * @since 3.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Functions_Ex { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * What is this for? |
|
| 26 | - * |
|
| 27 | - * @var array |
|
| 28 | - */ |
|
| 29 | - public static $args; |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Enqueue Font Awesome. |
|
| 33 | - * |
|
| 34 | - * @return void |
|
| 35 | - */ |
|
| 36 | - public static function enqueue_font_awesome() { |
|
| 37 | - wp_enqueue_style( |
|
| 38 | - 'font-awesome', |
|
| 39 | - Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css', |
|
| 40 | - array(), |
|
| 41 | - '6.5.2' |
|
| 42 | - ); |
|
| 43 | - |
|
| 44 | - wp_enqueue_style( |
|
| 45 | - 'font-awesome-4-shims', |
|
| 46 | - Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css', |
|
| 47 | - array(), |
|
| 48 | - '6.5.2' |
|
| 49 | - ); |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * Enqueue Elusive Font. |
|
| 54 | - * |
|
| 55 | - * @return void |
|
| 56 | - */ |
|
| 57 | - public static function enqueue_elusive_font() { |
|
| 58 | - wp_enqueue_style( |
|
| 59 | - 'redux-elusive-icon', |
|
| 60 | - Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css', |
|
| 61 | - array(), |
|
| 62 | - '2.0.0' |
|
| 63 | - ); |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - /** |
|
| 67 | - * Output alpha data tag for Iris alpha color picker, if enabled. |
|
| 68 | - * |
|
| 69 | - * @param array $data Data array. |
|
| 70 | - * |
|
| 71 | - * @return string |
|
| 72 | - */ |
|
| 73 | - public static function output_alpha_data( array $data ): string { |
|
| 74 | - $index = null; |
|
| 75 | - |
|
| 76 | - extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract |
|
| 77 | - |
|
| 78 | - $value = false; |
|
| 79 | - |
|
| 80 | - if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
|
| 81 | - if ( is_array( $field['color_alpha'] ) ) { |
|
| 82 | - $value = $field['color_alpha'][ $index ] ?? false; |
|
| 83 | - } else { |
|
| 84 | - $value = $field['color_alpha']; |
|
| 85 | - } |
|
| 86 | - } |
|
| 87 | - |
|
| 88 | - return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - /** |
|
| 92 | - * Parses the string into variables without the max_input_vars limitation. |
|
| 93 | - * |
|
| 94 | - * @param string $str String of data. |
|
| 95 | - * |
|
| 96 | - * @return array|false $result |
|
| 97 | - * @since 3.5.7.11 |
|
| 98 | - * @author harunbasic |
|
| 99 | - * @access private |
|
| 100 | - */ |
|
| 101 | - public static function parse_str( string $str ) { |
|
| 102 | - if ( '' === $str ) { |
|
| 103 | - return false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - $result = array(); |
|
| 107 | - $pairs = explode( '&', $str ); |
|
| 108 | - |
|
| 109 | - foreach ( $pairs as $pair ) { |
|
| 110 | - // use the original parse_str() on each element. |
|
| 111 | - parse_str( $pair, $params ); |
|
| 112 | - |
|
| 113 | - $k = key( $params ); |
|
| 114 | - |
|
| 115 | - if ( ! isset( $result[ $k ] ) ) { |
|
| 116 | - $result += $params; |
|
| 117 | - } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | - $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 119 | - } |
|
| 120 | - } |
|
| 121 | - |
|
| 122 | - return $result; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. |
|
| 127 | - * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 |
|
| 128 | - * |
|
| 129 | - * @param array $array1 array one. |
|
| 130 | - * @param array $array2 array two. |
|
| 131 | - * |
|
| 132 | - * @return array $merged |
|
| 133 | - * @since 3.5.7.11 |
|
| 134 | - * @author harunbasic |
|
| 135 | - * @access private |
|
| 136 | - */ |
|
| 137 | - public static function array_merge_recursive_distinct( array $array1, array $array2 ): array { |
|
| 138 | - $merged = $array1; |
|
| 139 | - |
|
| 140 | - foreach ( $array2 as $key => $value ) { |
|
| 141 | - |
|
| 142 | - if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | - } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 145 | - $merged[] = $value; |
|
| 146 | - } else { |
|
| 147 | - $merged[ $key ] = $value; |
|
| 148 | - } |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - return $merged; |
|
| 152 | - } |
|
| 153 | - |
|
| 154 | - /** |
|
| 155 | - * Records calling function. |
|
| 156 | - * |
|
| 157 | - * @param string $opt_name Panel opt_name. |
|
| 158 | - */ |
|
| 159 | - public static function record_caller( string $opt_name = '' ) { |
|
| 160 | - global $pagenow; |
|
| 161 | - |
|
| 162 | - // phpcs:ignore WordPress.Security.NonceVerification |
|
| 163 | - if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) { |
|
| 164 | - return; |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 168 | - $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
|
| 169 | - |
|
| 170 | - if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
|
| 171 | - if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | - Redux_Core::$callers[ $opt_name ] = array(); |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
|
| 176 | - return; |
|
| 177 | - } |
|
| 178 | - |
|
| 179 | - if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | - Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | - self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 185 | - } |
|
| 186 | - } |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - /** |
|
| 190 | - * Normalize path. |
|
| 191 | - * |
|
| 192 | - * @param string $path Path to normalize. |
|
| 193 | - * |
|
| 194 | - * @return string|string[]|null |
|
| 195 | - */ |
|
| 196 | - public static function wp_normalize_path( string $path = '' ) { |
|
| 197 | - if ( function_exists( 'wp_normalize_path' ) ) { |
|
| 198 | - $path = wp_normalize_path( $path ); |
|
| 199 | - } else { |
|
| 200 | - // Shim for pre WP 3.9. |
|
| 201 | - $path = str_replace( '\\', '/', $path ); |
|
| 202 | - $path = preg_replace( '|(?<=.)/+|', '/', $path ); |
|
| 203 | - |
|
| 204 | - if ( ':' === substr( $path, 1, 1 ) ) { |
|
| 205 | - $path = ucfirst( $path ); |
|
| 206 | - } |
|
| 207 | - } |
|
| 208 | - |
|
| 209 | - return $path; |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - /** |
|
| 213 | - * Action to add generator tag to page HEAD. |
|
| 214 | - */ |
|
| 215 | - public static function generator() { |
|
| 216 | - add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) ); |
|
| 217 | - } |
|
| 218 | - |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * Callback for wp_head hook to add meta tag. |
|
| 222 | - */ |
|
| 223 | - public static function meta_tag() { |
|
| 224 | - echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />'; |
|
| 225 | - } |
|
| 226 | - |
|
| 227 | - /** |
|
| 228 | - * Run URL through a ssl check. |
|
| 229 | - * |
|
| 230 | - * @param string $url URL to check. |
|
| 231 | - * |
|
| 232 | - * @return string |
|
| 233 | - */ |
|
| 234 | - public static function verify_url_protocol( string $url ): string { |
|
| 235 | - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 236 | - $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://'; |
|
| 237 | - |
|
| 238 | - if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 239 | - $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 240 | - if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) { |
|
| 241 | - $url = str_replace( $protocol, $new_protocol, $url ); |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - return $url; |
|
| 246 | - } |
|
| 247 | - |
|
| 248 | - /** |
|
| 249 | - * Check s. |
|
| 250 | - * |
|
| 251 | - * @access public |
|
| 252 | - * @return bool |
|
| 253 | - * @since 4.0.0 |
|
| 254 | - */ |
|
| 255 | - public static function s(): bool { |
|
| 256 | - if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 257 | - $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 258 | - |
|
| 259 | - if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) { |
|
| 260 | - return true; |
|
| 261 | - } |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - return false; |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - /** |
|
| 268 | - * Is file in theme. |
|
| 269 | - * |
|
| 270 | - * @param string $file File to check. |
|
| 271 | - * |
|
| 272 | - * @return bool |
|
| 273 | - */ |
|
| 274 | - public static function file_in_theme( string $file ): bool { |
|
| 275 | - $file_path = self::wp_normalize_path( dirname( $file ) ); |
|
| 276 | - |
|
| 277 | - if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) { |
|
| 278 | - return true; |
|
| 279 | - } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) { |
|
| 280 | - return true; |
|
| 281 | - } |
|
| 282 | - |
|
| 283 | - return false; |
|
| 284 | - } |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * Is Redux embedded inside a plugin? |
|
| 288 | - * |
|
| 289 | - * @param string $file File to check. |
|
| 290 | - * |
|
| 291 | - * @return array|bool |
|
| 292 | - */ |
|
| 293 | - public static function is_inside_plugin( string $file ) { |
|
| 294 | - $file = self::wp_normalize_path( $file ); |
|
| 295 | - $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) ); |
|
| 296 | - |
|
| 297 | - if ( self::file_in_theme( $file ) ) { |
|
| 298 | - return false; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - if ( $plugin_basename !== $file ) { |
|
| 302 | - $slug = explode( '/', $plugin_basename ); |
|
| 303 | - $slug = $slug[0]; |
|
| 304 | - |
|
| 305 | - return array( |
|
| 306 | - 'slug' => $slug, |
|
| 307 | - 'basename' => $plugin_basename, |
|
| 308 | - 'path' => $file, |
|
| 309 | - 'url' => self::verify_url_protocol( plugins_url( $plugin_basename ) ), |
|
| 310 | - 'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ), |
|
| 311 | - ); |
|
| 312 | - } |
|
| 313 | - |
|
| 314 | - return false; |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - /** |
|
| 318 | - * Is Redux embedded in a theme? |
|
| 319 | - * |
|
| 320 | - * @param string $file File to check. |
|
| 321 | - * |
|
| 322 | - * @return array|bool |
|
| 323 | - */ |
|
| 324 | - public static function is_inside_theme( string $file = '' ) { |
|
| 325 | - |
|
| 326 | - if ( ! self::file_in_theme( $file ) ) { |
|
| 327 | - return false; |
|
| 328 | - } |
|
| 329 | - |
|
| 330 | - $theme_paths = array( |
|
| 331 | - self::wp_normalize_path( get_template_directory() ) => get_template_directory_uri(), |
|
| 332 | - // parent. |
|
| 333 | - self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(), |
|
| 334 | - // child. |
|
| 335 | - ); |
|
| 336 | - |
|
| 337 | - $theme_paths = array_unique( $theme_paths ); |
|
| 338 | - $file_path = self::wp_normalize_path( $file ); |
|
| 339 | - |
|
| 340 | - $filename = explode( DIRECTORY_SEPARATOR, $file ); |
|
| 341 | - |
|
| 342 | - end( $filename ); |
|
| 343 | - |
|
| 344 | - $filename = prev( $filename ); |
|
| 345 | - |
|
| 346 | - foreach ( $theme_paths as $theme_path => $url ) { |
|
| 347 | - $real_path = self::wp_normalize_path( realpath( $theme_path ) ); |
|
| 348 | - |
|
| 349 | - if ( empty( $real_path ) ) { |
|
| 350 | - continue; |
|
| 351 | - } |
|
| 352 | - |
|
| 353 | - if ( strpos( $file_path, $real_path ) !== false ) { |
|
| 354 | - $slug = explode( '/', $theme_path ); |
|
| 355 | - $slug = end( $slug ); |
|
| 356 | - $relative_path = explode( $slug . '/', dirname( $file_path ) ); |
|
| 357 | - $relative_path = $relative_path[1]; |
|
| 358 | - $data = array( |
|
| 359 | - 'slug' => $slug, |
|
| 360 | - 'path' => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename, |
|
| 361 | - 'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename, |
|
| 362 | - 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
|
| 363 | - 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
|
| 364 | - ); |
|
| 365 | - $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | - |
|
| 367 | - if ( count( $theme_paths ) > 1 ) { |
|
| 368 | - $key = array_search( $theme_path, $theme_paths, true ); |
|
| 369 | - |
|
| 370 | - if ( false !== $key ) { |
|
| 371 | - unset( $theme_paths[ $key ] ); |
|
| 372 | - } |
|
| 373 | - |
|
| 374 | - $theme_paths_end = end( $theme_paths ); |
|
| 375 | - $parent_slug_end = explode( '/', $theme_paths_end ); |
|
| 376 | - $parent_slug_end = end( $parent_slug_end ); |
|
| 377 | - |
|
| 378 | - $data['parent_slug'] = $parent_slug_end; |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - return $data; |
|
| 382 | - } |
|
| 383 | - } |
|
| 384 | - |
|
| 385 | - return false; |
|
| 386 | - } |
|
| 387 | - |
|
| 388 | - /** |
|
| 389 | - * Used to merge two deep arrays. |
|
| 390 | - * |
|
| 391 | - * @param array $a First array to deeply merge. |
|
| 392 | - * @param array $b Second array to deeply merge. |
|
| 393 | - * |
|
| 394 | - * @return array - Deep merge of the two arrays. |
|
| 395 | - */ |
|
| 396 | - public static function nested_wp_parse_args( array &$a, array $b ): array { |
|
| 397 | - $result = $b; |
|
| 398 | - |
|
| 399 | - foreach ( $a as $k => &$v ) { |
|
| 400 | - if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | - $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 402 | - } else { |
|
| 403 | - $result[ $k ] = $v; |
|
| 404 | - } |
|
| 405 | - } |
|
| 406 | - |
|
| 407 | - return $result; |
|
| 408 | - } |
|
| 409 | - |
|
| 410 | - /** |
|
| 411 | - * AJAX callback key |
|
| 412 | - */ |
|
| 413 | - public static function hash_key(): string { |
|
| 414 | - $key = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url(); |
|
| 415 | - $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; |
|
| 416 | - |
|
| 417 | - return $key; |
|
| 418 | - } |
|
| 419 | - |
|
| 420 | - /** |
|
| 421 | - * Register a class path to be autoloaded. |
|
| 422 | - * Registers a namespace to be autoloaded from a given path, using the |
|
| 423 | - * WordPress/HM-style filenames (`class-{name}.php`). |
|
| 424 | - * |
|
| 425 | - * @link https://engineering.hmn.md/standards/style/php/#file-naming |
|
| 426 | - * |
|
| 427 | - * @param string $prefix Prefix to autoload from. |
|
| 428 | - * @param string $path Path to validate. |
|
| 429 | - */ |
|
| 430 | - public static function register_class_path( string $prefix = '', string $path = '' ) { |
|
| 431 | - if ( ! class_exists( 'Redux_Autoloader' ) ) { |
|
| 432 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' ); |
|
| 433 | - } |
|
| 434 | - |
|
| 435 | - $loader = new Redux_Autoloader( $prefix, $path ); |
|
| 436 | - |
|
| 437 | - spl_autoload_register( array( $loader, 'load' ) ); |
|
| 438 | - } |
|
| 439 | - |
|
| 440 | - /** |
|
| 441 | - * Check if a string starts with a string. |
|
| 442 | - * |
|
| 443 | - * @param string $haystack Full string. |
|
| 444 | - * @param string $needle String to check if it starts with. |
|
| 445 | - * |
|
| 446 | - * @return bool |
|
| 447 | - */ |
|
| 448 | - public static function string_starts_with( string $haystack, string $needle ): bool { |
|
| 449 | - $length = strlen( $needle ); |
|
| 450 | - |
|
| 451 | - return substr( $haystack, 0, $length ) === $needle; |
|
| 452 | - } |
|
| 453 | - |
|
| 454 | - /** |
|
| 455 | - * Check if a string ends with a string. |
|
| 456 | - * |
|
| 457 | - * @param string $haystack Full string. |
|
| 458 | - * @param string $needle String to check if it starts with. |
|
| 459 | - * |
|
| 460 | - * @return bool |
|
| 461 | - */ |
|
| 462 | - public static function string_ends_with( string $haystack, string $needle ): bool { |
|
| 463 | - $length = strlen( $needle ); |
|
| 464 | - |
|
| 465 | - if ( ! $length ) { |
|
| 466 | - return true; |
|
| 467 | - } |
|
| 468 | - |
|
| 469 | - return substr( $haystack, - $length ) === $needle; |
|
| 470 | - } |
|
| 471 | - |
|
| 472 | - /** |
|
| 473 | - * Is plugin active. |
|
| 474 | - * |
|
| 475 | - * @param string $name Plugin name. |
|
| 476 | - * |
|
| 477 | - * @return bool |
|
| 478 | - */ |
|
| 479 | - public static function is_plugin_active( string $name ): bool { |
|
| 480 | - // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- active_plugins is a WP hook. |
|
| 481 | - if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) { |
|
| 482 | - return true; |
|
| 483 | - } |
|
| 484 | - |
|
| 485 | - return false; |
|
| 486 | - } |
|
| 487 | - } |
|
| 16 | + /** |
|
| 17 | + * Redux Functions Class |
|
| 18 | + * A Class of useful functions that can/should be shared among all Redux files. |
|
| 19 | + * |
|
| 20 | + * @since 3.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Functions_Ex { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * What is this for? |
|
| 26 | + * |
|
| 27 | + * @var array |
|
| 28 | + */ |
|
| 29 | + public static $args; |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Enqueue Font Awesome. |
|
| 33 | + * |
|
| 34 | + * @return void |
|
| 35 | + */ |
|
| 36 | + public static function enqueue_font_awesome() { |
|
| 37 | + wp_enqueue_style( |
|
| 38 | + 'font-awesome', |
|
| 39 | + Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css', |
|
| 40 | + array(), |
|
| 41 | + '6.5.2' |
|
| 42 | + ); |
|
| 43 | + |
|
| 44 | + wp_enqueue_style( |
|
| 45 | + 'font-awesome-4-shims', |
|
| 46 | + Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css', |
|
| 47 | + array(), |
|
| 48 | + '6.5.2' |
|
| 49 | + ); |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * Enqueue Elusive Font. |
|
| 54 | + * |
|
| 55 | + * @return void |
|
| 56 | + */ |
|
| 57 | + public static function enqueue_elusive_font() { |
|
| 58 | + wp_enqueue_style( |
|
| 59 | + 'redux-elusive-icon', |
|
| 60 | + Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css', |
|
| 61 | + array(), |
|
| 62 | + '2.0.0' |
|
| 63 | + ); |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + /** |
|
| 67 | + * Output alpha data tag for Iris alpha color picker, if enabled. |
|
| 68 | + * |
|
| 69 | + * @param array $data Data array. |
|
| 70 | + * |
|
| 71 | + * @return string |
|
| 72 | + */ |
|
| 73 | + public static function output_alpha_data( array $data ): string { |
|
| 74 | + $index = null; |
|
| 75 | + |
|
| 76 | + extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract |
|
| 77 | + |
|
| 78 | + $value = false; |
|
| 79 | + |
|
| 80 | + if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
|
| 81 | + if ( is_array( $field['color_alpha'] ) ) { |
|
| 82 | + $value = $field['color_alpha'][ $index ] ?? false; |
|
| 83 | + } else { |
|
| 84 | + $value = $field['color_alpha']; |
|
| 85 | + } |
|
| 86 | + } |
|
| 87 | + |
|
| 88 | + return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + /** |
|
| 92 | + * Parses the string into variables without the max_input_vars limitation. |
|
| 93 | + * |
|
| 94 | + * @param string $str String of data. |
|
| 95 | + * |
|
| 96 | + * @return array|false $result |
|
| 97 | + * @since 3.5.7.11 |
|
| 98 | + * @author harunbasic |
|
| 99 | + * @access private |
|
| 100 | + */ |
|
| 101 | + public static function parse_str( string $str ) { |
|
| 102 | + if ( '' === $str ) { |
|
| 103 | + return false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + $result = array(); |
|
| 107 | + $pairs = explode( '&', $str ); |
|
| 108 | + |
|
| 109 | + foreach ( $pairs as $pair ) { |
|
| 110 | + // use the original parse_str() on each element. |
|
| 111 | + parse_str( $pair, $params ); |
|
| 112 | + |
|
| 113 | + $k = key( $params ); |
|
| 114 | + |
|
| 115 | + if ( ! isset( $result[ $k ] ) ) { |
|
| 116 | + $result += $params; |
|
| 117 | + } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | + $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 119 | + } |
|
| 120 | + } |
|
| 121 | + |
|
| 122 | + return $result; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. |
|
| 127 | + * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 |
|
| 128 | + * |
|
| 129 | + * @param array $array1 array one. |
|
| 130 | + * @param array $array2 array two. |
|
| 131 | + * |
|
| 132 | + * @return array $merged |
|
| 133 | + * @since 3.5.7.11 |
|
| 134 | + * @author harunbasic |
|
| 135 | + * @access private |
|
| 136 | + */ |
|
| 137 | + public static function array_merge_recursive_distinct( array $array1, array $array2 ): array { |
|
| 138 | + $merged = $array1; |
|
| 139 | + |
|
| 140 | + foreach ( $array2 as $key => $value ) { |
|
| 141 | + |
|
| 142 | + if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | + $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | + } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 145 | + $merged[] = $value; |
|
| 146 | + } else { |
|
| 147 | + $merged[ $key ] = $value; |
|
| 148 | + } |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + return $merged; |
|
| 152 | + } |
|
| 153 | + |
|
| 154 | + /** |
|
| 155 | + * Records calling function. |
|
| 156 | + * |
|
| 157 | + * @param string $opt_name Panel opt_name. |
|
| 158 | + */ |
|
| 159 | + public static function record_caller( string $opt_name = '' ) { |
|
| 160 | + global $pagenow; |
|
| 161 | + |
|
| 162 | + // phpcs:ignore WordPress.Security.NonceVerification |
|
| 163 | + if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) { |
|
| 164 | + return; |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 168 | + $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
|
| 169 | + |
|
| 170 | + if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
|
| 171 | + if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | + Redux_Core::$callers[ $opt_name ] = array(); |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
|
| 176 | + return; |
|
| 177 | + } |
|
| 178 | + |
|
| 179 | + if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | + Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | + self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 185 | + } |
|
| 186 | + } |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + /** |
|
| 190 | + * Normalize path. |
|
| 191 | + * |
|
| 192 | + * @param string $path Path to normalize. |
|
| 193 | + * |
|
| 194 | + * @return string|string[]|null |
|
| 195 | + */ |
|
| 196 | + public static function wp_normalize_path( string $path = '' ) { |
|
| 197 | + if ( function_exists( 'wp_normalize_path' ) ) { |
|
| 198 | + $path = wp_normalize_path( $path ); |
|
| 199 | + } else { |
|
| 200 | + // Shim for pre WP 3.9. |
|
| 201 | + $path = str_replace( '\\', '/', $path ); |
|
| 202 | + $path = preg_replace( '|(?<=.)/+|', '/', $path ); |
|
| 203 | + |
|
| 204 | + if ( ':' === substr( $path, 1, 1 ) ) { |
|
| 205 | + $path = ucfirst( $path ); |
|
| 206 | + } |
|
| 207 | + } |
|
| 208 | + |
|
| 209 | + return $path; |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + /** |
|
| 213 | + * Action to add generator tag to page HEAD. |
|
| 214 | + */ |
|
| 215 | + public static function generator() { |
|
| 216 | + add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) ); |
|
| 217 | + } |
|
| 218 | + |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * Callback for wp_head hook to add meta tag. |
|
| 222 | + */ |
|
| 223 | + public static function meta_tag() { |
|
| 224 | + echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />'; |
|
| 225 | + } |
|
| 226 | + |
|
| 227 | + /** |
|
| 228 | + * Run URL through a ssl check. |
|
| 229 | + * |
|
| 230 | + * @param string $url URL to check. |
|
| 231 | + * |
|
| 232 | + * @return string |
|
| 233 | + */ |
|
| 234 | + public static function verify_url_protocol( string $url ): string { |
|
| 235 | + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 236 | + $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://'; |
|
| 237 | + |
|
| 238 | + if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 239 | + $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 240 | + if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) { |
|
| 241 | + $url = str_replace( $protocol, $new_protocol, $url ); |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + return $url; |
|
| 246 | + } |
|
| 247 | + |
|
| 248 | + /** |
|
| 249 | + * Check s. |
|
| 250 | + * |
|
| 251 | + * @access public |
|
| 252 | + * @return bool |
|
| 253 | + * @since 4.0.0 |
|
| 254 | + */ |
|
| 255 | + public static function s(): bool { |
|
| 256 | + if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 257 | + $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 258 | + |
|
| 259 | + if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) { |
|
| 260 | + return true; |
|
| 261 | + } |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + return false; |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + /** |
|
| 268 | + * Is file in theme. |
|
| 269 | + * |
|
| 270 | + * @param string $file File to check. |
|
| 271 | + * |
|
| 272 | + * @return bool |
|
| 273 | + */ |
|
| 274 | + public static function file_in_theme( string $file ): bool { |
|
| 275 | + $file_path = self::wp_normalize_path( dirname( $file ) ); |
|
| 276 | + |
|
| 277 | + if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) { |
|
| 278 | + return true; |
|
| 279 | + } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) { |
|
| 280 | + return true; |
|
| 281 | + } |
|
| 282 | + |
|
| 283 | + return false; |
|
| 284 | + } |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * Is Redux embedded inside a plugin? |
|
| 288 | + * |
|
| 289 | + * @param string $file File to check. |
|
| 290 | + * |
|
| 291 | + * @return array|bool |
|
| 292 | + */ |
|
| 293 | + public static function is_inside_plugin( string $file ) { |
|
| 294 | + $file = self::wp_normalize_path( $file ); |
|
| 295 | + $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) ); |
|
| 296 | + |
|
| 297 | + if ( self::file_in_theme( $file ) ) { |
|
| 298 | + return false; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + if ( $plugin_basename !== $file ) { |
|
| 302 | + $slug = explode( '/', $plugin_basename ); |
|
| 303 | + $slug = $slug[0]; |
|
| 304 | + |
|
| 305 | + return array( |
|
| 306 | + 'slug' => $slug, |
|
| 307 | + 'basename' => $plugin_basename, |
|
| 308 | + 'path' => $file, |
|
| 309 | + 'url' => self::verify_url_protocol( plugins_url( $plugin_basename ) ), |
|
| 310 | + 'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ), |
|
| 311 | + ); |
|
| 312 | + } |
|
| 313 | + |
|
| 314 | + return false; |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + /** |
|
| 318 | + * Is Redux embedded in a theme? |
|
| 319 | + * |
|
| 320 | + * @param string $file File to check. |
|
| 321 | + * |
|
| 322 | + * @return array|bool |
|
| 323 | + */ |
|
| 324 | + public static function is_inside_theme( string $file = '' ) { |
|
| 325 | + |
|
| 326 | + if ( ! self::file_in_theme( $file ) ) { |
|
| 327 | + return false; |
|
| 328 | + } |
|
| 329 | + |
|
| 330 | + $theme_paths = array( |
|
| 331 | + self::wp_normalize_path( get_template_directory() ) => get_template_directory_uri(), |
|
| 332 | + // parent. |
|
| 333 | + self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(), |
|
| 334 | + // child. |
|
| 335 | + ); |
|
| 336 | + |
|
| 337 | + $theme_paths = array_unique( $theme_paths ); |
|
| 338 | + $file_path = self::wp_normalize_path( $file ); |
|
| 339 | + |
|
| 340 | + $filename = explode( DIRECTORY_SEPARATOR, $file ); |
|
| 341 | + |
|
| 342 | + end( $filename ); |
|
| 343 | + |
|
| 344 | + $filename = prev( $filename ); |
|
| 345 | + |
|
| 346 | + foreach ( $theme_paths as $theme_path => $url ) { |
|
| 347 | + $real_path = self::wp_normalize_path( realpath( $theme_path ) ); |
|
| 348 | + |
|
| 349 | + if ( empty( $real_path ) ) { |
|
| 350 | + continue; |
|
| 351 | + } |
|
| 352 | + |
|
| 353 | + if ( strpos( $file_path, $real_path ) !== false ) { |
|
| 354 | + $slug = explode( '/', $theme_path ); |
|
| 355 | + $slug = end( $slug ); |
|
| 356 | + $relative_path = explode( $slug . '/', dirname( $file_path ) ); |
|
| 357 | + $relative_path = $relative_path[1]; |
|
| 358 | + $data = array( |
|
| 359 | + 'slug' => $slug, |
|
| 360 | + 'path' => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename, |
|
| 361 | + 'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename, |
|
| 362 | + 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
|
| 363 | + 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
|
| 364 | + ); |
|
| 365 | + $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | + |
|
| 367 | + if ( count( $theme_paths ) > 1 ) { |
|
| 368 | + $key = array_search( $theme_path, $theme_paths, true ); |
|
| 369 | + |
|
| 370 | + if ( false !== $key ) { |
|
| 371 | + unset( $theme_paths[ $key ] ); |
|
| 372 | + } |
|
| 373 | + |
|
| 374 | + $theme_paths_end = end( $theme_paths ); |
|
| 375 | + $parent_slug_end = explode( '/', $theme_paths_end ); |
|
| 376 | + $parent_slug_end = end( $parent_slug_end ); |
|
| 377 | + |
|
| 378 | + $data['parent_slug'] = $parent_slug_end; |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + return $data; |
|
| 382 | + } |
|
| 383 | + } |
|
| 384 | + |
|
| 385 | + return false; |
|
| 386 | + } |
|
| 387 | + |
|
| 388 | + /** |
|
| 389 | + * Used to merge two deep arrays. |
|
| 390 | + * |
|
| 391 | + * @param array $a First array to deeply merge. |
|
| 392 | + * @param array $b Second array to deeply merge. |
|
| 393 | + * |
|
| 394 | + * @return array - Deep merge of the two arrays. |
|
| 395 | + */ |
|
| 396 | + public static function nested_wp_parse_args( array &$a, array $b ): array { |
|
| 397 | + $result = $b; |
|
| 398 | + |
|
| 399 | + foreach ( $a as $k => &$v ) { |
|
| 400 | + if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | + $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 402 | + } else { |
|
| 403 | + $result[ $k ] = $v; |
|
| 404 | + } |
|
| 405 | + } |
|
| 406 | + |
|
| 407 | + return $result; |
|
| 408 | + } |
|
| 409 | + |
|
| 410 | + /** |
|
| 411 | + * AJAX callback key |
|
| 412 | + */ |
|
| 413 | + public static function hash_key(): string { |
|
| 414 | + $key = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url(); |
|
| 415 | + $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; |
|
| 416 | + |
|
| 417 | + return $key; |
|
| 418 | + } |
|
| 419 | + |
|
| 420 | + /** |
|
| 421 | + * Register a class path to be autoloaded. |
|
| 422 | + * Registers a namespace to be autoloaded from a given path, using the |
|
| 423 | + * WordPress/HM-style filenames (`class-{name}.php`). |
|
| 424 | + * |
|
| 425 | + * @link https://engineering.hmn.md/standards/style/php/#file-naming |
|
| 426 | + * |
|
| 427 | + * @param string $prefix Prefix to autoload from. |
|
| 428 | + * @param string $path Path to validate. |
|
| 429 | + */ |
|
| 430 | + public static function register_class_path( string $prefix = '', string $path = '' ) { |
|
| 431 | + if ( ! class_exists( 'Redux_Autoloader' ) ) { |
|
| 432 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' ); |
|
| 433 | + } |
|
| 434 | + |
|
| 435 | + $loader = new Redux_Autoloader( $prefix, $path ); |
|
| 436 | + |
|
| 437 | + spl_autoload_register( array( $loader, 'load' ) ); |
|
| 438 | + } |
|
| 439 | + |
|
| 440 | + /** |
|
| 441 | + * Check if a string starts with a string. |
|
| 442 | + * |
|
| 443 | + * @param string $haystack Full string. |
|
| 444 | + * @param string $needle String to check if it starts with. |
|
| 445 | + * |
|
| 446 | + * @return bool |
|
| 447 | + */ |
|
| 448 | + public static function string_starts_with( string $haystack, string $needle ): bool { |
|
| 449 | + $length = strlen( $needle ); |
|
| 450 | + |
|
| 451 | + return substr( $haystack, 0, $length ) === $needle; |
|
| 452 | + } |
|
| 453 | + |
|
| 454 | + /** |
|
| 455 | + * Check if a string ends with a string. |
|
| 456 | + * |
|
| 457 | + * @param string $haystack Full string. |
|
| 458 | + * @param string $needle String to check if it starts with. |
|
| 459 | + * |
|
| 460 | + * @return bool |
|
| 461 | + */ |
|
| 462 | + public static function string_ends_with( string $haystack, string $needle ): bool { |
|
| 463 | + $length = strlen( $needle ); |
|
| 464 | + |
|
| 465 | + if ( ! $length ) { |
|
| 466 | + return true; |
|
| 467 | + } |
|
| 468 | + |
|
| 469 | + return substr( $haystack, - $length ) === $needle; |
|
| 470 | + } |
|
| 471 | + |
|
| 472 | + /** |
|
| 473 | + * Is plugin active. |
|
| 474 | + * |
|
| 475 | + * @param string $name Plugin name. |
|
| 476 | + * |
|
| 477 | + * @return bool |
|
| 478 | + */ |
|
| 479 | + public static function is_plugin_active( string $name ): bool { |
|
| 480 | + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- active_plugins is a WP hook. |
|
| 481 | + if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) { |
|
| 482 | + return true; |
|
| 483 | + } |
|
| 484 | + |
|
| 485 | + return false; |
|
| 486 | + } |
|
| 487 | + } |
|
| 488 | 488 | } |
@@ -11,620 +11,620 @@ |
||
| 11 | 11 | |
| 12 | 12 | if ( ! class_exists( 'Redux_Core', false ) ) { |
| 13 | 13 | |
| 14 | - /** |
|
| 15 | - * Class Redux_Core |
|
| 16 | - */ |
|
| 17 | - class Redux_Core { |
|
| 18 | - |
|
| 19 | - /** |
|
| 20 | - * Class instance. |
|
| 21 | - * |
|
| 22 | - * @var null|Redux_Core |
|
| 23 | - */ |
|
| 24 | - public static ?Redux_Core $instance = null; |
|
| 25 | - |
|
| 26 | - /** |
|
| 27 | - * Project version |
|
| 28 | - * |
|
| 29 | - * @var string |
|
| 30 | - */ |
|
| 31 | - public static string $version; |
|
| 32 | - |
|
| 33 | - /** |
|
| 34 | - * Project directory. |
|
| 35 | - * |
|
| 36 | - * @var string. |
|
| 37 | - */ |
|
| 38 | - public static string $dir; |
|
| 39 | - |
|
| 40 | - /** |
|
| 41 | - * Project URL. |
|
| 42 | - * |
|
| 43 | - * @var string. |
|
| 44 | - */ |
|
| 45 | - public static string $url; |
|
| 46 | - |
|
| 47 | - /** |
|
| 48 | - * Base directory path. |
|
| 49 | - * |
|
| 50 | - * @var string |
|
| 51 | - */ |
|
| 52 | - public static string $redux_path; |
|
| 53 | - |
|
| 54 | - /** |
|
| 55 | - * Absolute direction path to WordPress upload directory. |
|
| 56 | - * |
|
| 57 | - * @var string |
|
| 58 | - */ |
|
| 59 | - public static string $upload_dir = ''; |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * Full URL to WordPress upload directory. |
|
| 63 | - * |
|
| 64 | - * @var null|string |
|
| 65 | - */ |
|
| 66 | - public static ?string $upload_url = ''; |
|
| 67 | - |
|
| 68 | - /** |
|
| 69 | - * Set when Redux is run as a plugin. |
|
| 70 | - * |
|
| 71 | - * @var bool |
|
| 72 | - */ |
|
| 73 | - public static bool $is_plugin = true; |
|
| 74 | - |
|
| 75 | - /** |
|
| 76 | - * Indicated in_theme or in_plugin. |
|
| 77 | - * |
|
| 78 | - * @var string |
|
| 79 | - */ |
|
| 80 | - public static string $installed = ''; |
|
| 81 | - |
|
| 82 | - /** |
|
| 83 | - * Set when Redux is run as a plugin. |
|
| 84 | - * |
|
| 85 | - * @var bool |
|
| 86 | - */ |
|
| 87 | - public static bool $as_plugin = false; |
|
| 88 | - |
|
| 89 | - /** |
|
| 90 | - * Set when Redux is embedded within a theme. |
|
| 91 | - * |
|
| 92 | - * @var bool |
|
| 93 | - */ |
|
| 94 | - public static bool $in_theme = false; |
|
| 95 | - |
|
| 96 | - /** |
|
| 97 | - * Pointer to an updated Google fonts array. |
|
| 98 | - * |
|
| 99 | - * @var array|null |
|
| 100 | - */ |
|
| 101 | - public static ?array $updated_google_fonts = array(); |
|
| 102 | - |
|
| 103 | - /** |
|
| 104 | - * List of files calling Redux. |
|
| 105 | - * |
|
| 106 | - * @var array|null |
|
| 107 | - */ |
|
| 108 | - public static ?array $callers = array(); |
|
| 109 | - |
|
| 110 | - /** |
|
| 111 | - * Pointer to _SERVER global. |
|
| 112 | - * |
|
| 113 | - * @var array|null |
|
| 114 | - */ |
|
| 115 | - public static ?array $server = array(); |
|
| 116 | - |
|
| 117 | - /** |
|
| 118 | - * Field folding information for localization. |
|
| 119 | - * |
|
| 120 | - * @var null|array |
|
| 121 | - */ |
|
| 122 | - public static ?array $required = array(); |
|
| 123 | - |
|
| 124 | - /** |
|
| 125 | - * Field child-folding information for localization. |
|
| 126 | - * |
|
| 127 | - * @var null|array |
|
| 128 | - */ |
|
| 129 | - public static ?array $required_child = array(); |
|
| 130 | - |
|
| 131 | - /** |
|
| 132 | - * Array of fields to be folded. |
|
| 133 | - * |
|
| 134 | - * @var array|null |
|
| 135 | - */ |
|
| 136 | - public static ?array $folds = array(); |
|
| 137 | - |
|
| 138 | - /** |
|
| 139 | - * Array of fields that didn't pass the fold dependency test and are hidden. |
|
| 140 | - * |
|
| 141 | - * @var null|array |
|
| 142 | - */ |
|
| 143 | - public static ?array $fields_hidden = array(); |
|
| 144 | - |
|
| 145 | - /** |
|
| 146 | - * Values to generate google font CSS. |
|
| 147 | - * |
|
| 148 | - * @var null|array |
|
| 149 | - */ |
|
| 150 | - public static ?array $typography = array(); |
|
| 151 | - |
|
| 152 | - /** |
|
| 153 | - * Validation ran flag. |
|
| 154 | - * |
|
| 155 | - * @var bool |
|
| 156 | - */ |
|
| 157 | - public static bool $validation_ran = false; |
|
| 158 | - |
|
| 159 | - /** |
|
| 160 | - * No output flag. |
|
| 161 | - * |
|
| 162 | - * @var bool |
|
| 163 | - */ |
|
| 164 | - public static bool $no_output = false; |
|
| 165 | - |
|
| 166 | - /** |
|
| 167 | - * Array of fonts used by the panel for localization. |
|
| 168 | - * |
|
| 169 | - * @var null|array |
|
| 170 | - */ |
|
| 171 | - public static ?array $fonts = array(); |
|
| 172 | - |
|
| 173 | - /** |
|
| 174 | - * Array of Google fonts used by the panel for localization. |
|
| 175 | - * |
|
| 176 | - * @var null|array |
|
| 177 | - */ |
|
| 178 | - public static ?array $google_array = array(); |
|
| 179 | - |
|
| 180 | - /** |
|
| 181 | - * Array of various font groups used within the typography field. |
|
| 182 | - * |
|
| 183 | - * @var null|array |
|
| 184 | - */ |
|
| 185 | - public static ?array $font_groups = array(); |
|
| 186 | - |
|
| 187 | - /** |
|
| 188 | - * File system object used for I/O file operations. Done the WordPress way. |
|
| 189 | - * |
|
| 190 | - * @var null|object |
|
| 191 | - */ |
|
| 192 | - public static ?object $filesystem; |
|
| 193 | - |
|
| 194 | - /** |
|
| 195 | - * Pointer to the third party fixes class. |
|
| 196 | - * |
|
| 197 | - * @var Redux_ThirdParty_Fixes |
|
| 198 | - */ |
|
| 199 | - public static Redux_ThirdParty_Fixes $third_party_fixes; |
|
| 200 | - |
|
| 201 | - /** |
|
| 202 | - * Redux Welcome screen object. |
|
| 203 | - * |
|
| 204 | - * @var Redux_Welcome |
|
| 205 | - */ |
|
| 206 | - public static Redux_Welcome $welcome; |
|
| 207 | - |
|
| 208 | - /** |
|
| 209 | - * Creates instance of class. |
|
| 210 | - * |
|
| 211 | - * @return Redux_Core |
|
| 212 | - * @throws Exception Comment. |
|
| 213 | - */ |
|
| 214 | - public static function instance(): ?Redux_Core { |
|
| 215 | - if ( ! self::$instance ) { |
|
| 216 | - self::$instance = new self(); |
|
| 217 | - |
|
| 218 | - self::$instance->includes(); |
|
| 219 | - self::$instance->init(); |
|
| 220 | - self::$instance->hooks(); |
|
| 221 | - |
|
| 222 | - add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) ); |
|
| 223 | - } |
|
| 224 | - |
|
| 225 | - return self::$instance; |
|
| 226 | - } |
|
| 227 | - |
|
| 228 | - /** |
|
| 229 | - * Things to run after pluggable.php had loaded. |
|
| 230 | - */ |
|
| 231 | - public static function plugins_loaded() {} |
|
| 232 | - |
|
| 233 | - /** |
|
| 234 | - * Class init. |
|
| 235 | - */ |
|
| 236 | - private function init() { |
|
| 237 | - self::$server = array( |
|
| 238 | - 'SERVER_SOFTWARE' => '', |
|
| 239 | - 'REMOTE_ADDR' => Redux_Helpers::is_local_host() ? '127.0.0.1' : '', |
|
| 240 | - 'HTTP_USER_AGENT' => '', |
|
| 241 | - 'HTTP_HOST' => '', |
|
| 242 | - 'REQUEST_URI' => '', |
|
| 243 | - ); |
|
| 244 | - |
|
| 245 | - // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase |
|
| 246 | - if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) { |
|
| 247 | - self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ); |
|
| 248 | - } |
|
| 249 | - if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { |
|
| 250 | - self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); |
|
| 251 | - } |
|
| 252 | - if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { |
|
| 253 | - self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); |
|
| 254 | - } |
|
| 255 | - if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { |
|
| 256 | - self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ); |
|
| 257 | - } |
|
| 258 | - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { |
|
| 259 | - self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); |
|
| 260 | - } |
|
| 261 | - |
|
| 262 | - // phpcs:enable |
|
| 263 | - |
|
| 264 | - self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) ); |
|
| 265 | - |
|
| 266 | - Redux_Functions_Ex::generator(); |
|
| 267 | - |
|
| 268 | - if ( defined( 'REDUX_PLUGIN_FILE' ) ) { |
|
| 269 | - $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE ); |
|
| 270 | - } |
|
| 271 | - |
|
| 272 | - $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ ); |
|
| 273 | - |
|
| 274 | - if ( false !== $plugin_info ) { |
|
| 275 | - self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin'; |
|
| 276 | - self::$is_plugin = class_exists( 'Redux_Framework_Plugin' ); |
|
| 277 | - self::$as_plugin = true; |
|
| 278 | - self::$url = trailingslashit( dirname( $plugin_info['url'] ) ); |
|
| 279 | - } else { |
|
| 280 | - $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ ); |
|
| 281 | - if ( false !== $theme_info ) { |
|
| 282 | - self::$url = trailingslashit( dirname( $theme_info['url'] ) ); |
|
| 283 | - self::$in_theme = true; |
|
| 284 | - self::$installed = 'in_theme'; |
|
| 285 | - } |
|
| 286 | - } |
|
| 287 | - |
|
| 288 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 289 | - self::$url = apply_filters( 'redux/url', self::$url ); |
|
| 290 | - |
|
| 291 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 292 | - self::$dir = apply_filters( 'redux/dir', self::$dir ); |
|
| 293 | - |
|
| 294 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 295 | - self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin ); |
|
| 296 | - |
|
| 297 | - if ( ! function_exists( 'current_time' ) ) { |
|
| 298 | - require_once ABSPATH . '/wp-includes/functions.php'; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - $upload_dir = wp_upload_dir(); |
|
| 302 | - self::$upload_dir = $upload_dir['basedir'] . '/redux/'; |
|
| 303 | - self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' ); |
|
| 304 | - |
|
| 305 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | - self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir ); |
|
| 307 | - |
|
| 308 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 309 | - self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url ); |
|
| 310 | - } |
|
| 311 | - |
|
| 312 | - /** |
|
| 313 | - * Code to execute on a framework __construct. |
|
| 314 | - * |
|
| 315 | - * @param ReduxFramework $redux Pointer to ReduxFramework object. |
|
| 316 | - */ |
|
| 317 | - public static function core_construct( ReduxFramework $redux ) { |
|
| 318 | - self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux ); |
|
| 319 | - |
|
| 320 | - Redux_ThemeCheck::get_instance(); |
|
| 321 | - } |
|
| 322 | - |
|
| 323 | - /** |
|
| 324 | - * Autoregister run. |
|
| 325 | - * |
|
| 326 | - * @throws Exception Comment. |
|
| 327 | - */ |
|
| 328 | - private function includes() { |
|
| 329 | - if ( is_admin() ) { |
|
| 330 | - if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) { |
|
| 331 | - echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>'; |
|
| 332 | - } |
|
| 333 | - } |
|
| 334 | - |
|
| 335 | - require_once __DIR__ . '/inc/classes/class-redux-path.php'; |
|
| 336 | - require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php'; |
|
| 337 | - require_once __DIR__ . '/inc/classes/class-redux-helpers.php'; |
|
| 338 | - require_once __DIR__ . '/inc/classes/class-redux-instances.php'; |
|
| 339 | - |
|
| 340 | - Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' ); |
|
| 341 | - Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' ); |
|
| 342 | - |
|
| 343 | - spl_autoload_register( array( $this, 'register_classes' ) ); |
|
| 344 | - |
|
| 345 | - self::$welcome = new Redux_Welcome(); |
|
| 346 | - |
|
| 347 | - add_filter( 'debug_information', array( $this, 'add_debug_info' ) ); |
|
| 348 | - } |
|
| 349 | - |
|
| 350 | - /** |
|
| 351 | - * Add debug info for the WP Site Health screen. |
|
| 352 | - * |
|
| 353 | - * @param array $debug_info Debug data. |
|
| 354 | - * |
|
| 355 | - * @return array |
|
| 356 | - * @throws ReflectionException Exception. |
|
| 357 | - */ |
|
| 358 | - public function add_debug_info( array $debug_info ): array { |
|
| 359 | - |
|
| 360 | - // Get browser data. |
|
| 361 | - if ( ! class_exists( 'ReduxBrowser' ) ) { |
|
| 362 | - require_once self::$dir . 'inc/lib/browser.php'; |
|
| 363 | - } |
|
| 364 | - |
|
| 365 | - $browser = new ReduxBrowser(); |
|
| 366 | - |
|
| 367 | - $browser_data = array( |
|
| 368 | - 'Agent' => $browser->getUserAgent(), |
|
| 369 | - 'Browser' => $browser->getBrowser(), |
|
| 370 | - 'Version' => $browser->getVersion(), |
|
| 371 | - 'Platform' => $browser->getPlatform(), |
|
| 372 | - ); |
|
| 373 | - |
|
| 374 | - // Set Redux dir permission results to Site Health screen. |
|
| 375 | - $debug_info['wp-filesystem']['fields'][] = array( |
|
| 376 | - 'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ), |
|
| 377 | - 'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable', |
|
| 378 | - ); |
|
| 379 | - |
|
| 380 | - // Set Redux plugin results to Site Health screen. |
|
| 381 | - $debug_info['redux-framework'] = array( |
|
| 382 | - 'label' => esc_html__( 'Redux Framework', 'redux-framework' ), |
|
| 383 | - 'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ), |
|
| 384 | - 'fields' => array( |
|
| 385 | - 'version' => array( |
|
| 386 | - 'label' => esc_html__( 'Version', 'redux-framework' ), |
|
| 387 | - 'value' => self::$version, |
|
| 388 | - ), |
|
| 389 | - 'installation' => array( |
|
| 390 | - 'label' => esc_html__( 'Installation', 'redux-framework' ), |
|
| 391 | - 'value' => self::$installed, |
|
| 392 | - ), |
|
| 393 | - 'data directory' => array( |
|
| 394 | - 'label' => esc_html__( 'Data directory', 'redux-framework' ), |
|
| 395 | - 'value' => self::$dir, |
|
| 396 | - ), |
|
| 397 | - 'browser' => array( |
|
| 398 | - 'label' => esc_html__( 'Browser', 'redux-framework' ), |
|
| 399 | - 'value' => $browser_data, |
|
| 400 | - ), |
|
| 401 | - ), |
|
| 402 | - ); |
|
| 403 | - |
|
| 404 | - $redux = Redux::all_instances(); |
|
| 405 | - |
|
| 406 | - $extensions = array(); |
|
| 407 | - |
|
| 408 | - if ( ! empty( $redux ) && is_array( $redux ) ) { |
|
| 409 | - foreach ( $redux as $inst => $data ) { |
|
| 410 | - Redux::init( $inst ); |
|
| 411 | - |
|
| 412 | - $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) ); |
|
| 413 | - $args = $data->args; |
|
| 414 | - |
|
| 415 | - $ext = Redux::get_extensions( $inst ); |
|
| 416 | - if ( ! empty( $ext ) && is_array( $ext ) ) { |
|
| 417 | - ksort( $ext ); |
|
| 418 | - |
|
| 419 | - foreach ( $ext as $name => $arr ) { |
|
| 420 | - $ver = $arr['version']; |
|
| 421 | - |
|
| 422 | - $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
|
| 423 | - |
|
| 424 | - $extensions[ $ex ] = esc_html( $ver ); |
|
| 425 | - } |
|
| 426 | - } |
|
| 427 | - |
|
| 428 | - // Output Redux instances. |
|
| 429 | - $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 430 | - // translators: %s = Instance name. |
|
| 431 | - 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
|
| 432 | - // translators: %s = Instance name w/ HTML. |
|
| 433 | - 'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ), |
|
| 434 | - 'fields' => array( |
|
| 435 | - 'opt_name' => array( |
|
| 436 | - 'label' => esc_html( 'opt_name' ), |
|
| 437 | - 'value' => $args['opt_name'], |
|
| 438 | - ), |
|
| 439 | - 'global_variable' => array( |
|
| 440 | - 'label' => esc_html( 'global_variable' ), |
|
| 441 | - 'value' => $args['global_variable'], |
|
| 442 | - ), |
|
| 443 | - 'dev_mode' => array( |
|
| 444 | - 'label' => esc_html( 'dev_mode' ), |
|
| 445 | - 'value' => $args['dev_mode'] ? 'true' : 'false', |
|
| 446 | - ), |
|
| 447 | - 'ajax_save' => array( |
|
| 448 | - 'label' => esc_html( 'ajax_save' ), |
|
| 449 | - 'value' => $args['ajax_save'] ? 'true' : 'false', |
|
| 450 | - ), |
|
| 451 | - 'page_slug' => array( |
|
| 452 | - 'label' => esc_html( 'page_slug' ), |
|
| 453 | - 'value' => $args['page_slug'], |
|
| 454 | - ), |
|
| 455 | - 'page_permissions' => array( |
|
| 456 | - 'label' => esc_html( 'page_permissions' ), |
|
| 457 | - 'value' => $args['page_permissions'], |
|
| 458 | - ), |
|
| 459 | - 'menu_type' => array( |
|
| 460 | - 'label' => esc_html( 'menu_type' ), |
|
| 461 | - 'value' => $args['menu_type'], |
|
| 462 | - ), |
|
| 463 | - 'page_parent' => array( |
|
| 464 | - 'label' => esc_html( 'page_parent' ), |
|
| 465 | - 'value' => $args['page_parent'], |
|
| 466 | - ), |
|
| 467 | - 'compiler' => array( |
|
| 468 | - 'label' => esc_html( 'compiler' ), |
|
| 469 | - 'value' => $args['compiler'] ? 'true' : 'false', |
|
| 470 | - ), |
|
| 471 | - 'output' => array( |
|
| 472 | - 'label' => esc_html( 'output' ), |
|
| 473 | - 'value' => $args['output'] ? 'true' : 'false', |
|
| 474 | - ), |
|
| 475 | - 'output_tag' => array( |
|
| 476 | - 'label' => esc_html( 'output_tag' ), |
|
| 477 | - 'value' => $args['output_tag'] ? 'true' : 'false', |
|
| 478 | - ), |
|
| 479 | - 'templates_path' => array( |
|
| 480 | - 'label' => esc_html( 'templates_path' ), |
|
| 481 | - 'value' => $args['templates_path'], |
|
| 482 | - ), |
|
| 483 | - 'extensions' => array( |
|
| 484 | - 'label' => esc_html( 'extensions' ), |
|
| 485 | - 'value' => $extensions, |
|
| 486 | - ), |
|
| 487 | - ), |
|
| 488 | - ); |
|
| 489 | - } |
|
| 490 | - } |
|
| 491 | - |
|
| 492 | - return $debug_info; |
|
| 493 | - } |
|
| 494 | - |
|
| 495 | - /** |
|
| 496 | - * Register callback for autoload. |
|
| 497 | - * |
|
| 498 | - * @param string $class_name name of class. |
|
| 499 | - */ |
|
| 500 | - public function register_classes( string $class_name ) { |
|
| 501 | - $class_name_test = self::strtolower( $class_name ); |
|
| 502 | - |
|
| 503 | - if ( strpos( $class_name_test, 'redux' ) === false ) { |
|
| 504 | - return; |
|
| 505 | - } |
|
| 506 | - |
|
| 507 | - if ( ! class_exists( 'Redux_Functions_Ex' ) ) { |
|
| 508 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' ); |
|
| 509 | - } |
|
| 510 | - |
|
| 511 | - if ( ! class_exists( $class_name ) ) { |
|
| 512 | - // Backward compatibility for extensions sucks! |
|
| 513 | - if ( 'Redux_Instances' === $class_name ) { |
|
| 514 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' ); |
|
| 515 | - require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' ); |
|
| 516 | - |
|
| 517 | - return; |
|
| 518 | - } |
|
| 519 | - |
|
| 520 | - // Load Redux APIs. |
|
| 521 | - if ( 'Redux' === $class_name ) { |
|
| 522 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' ); |
|
| 523 | - |
|
| 524 | - return; |
|
| 525 | - } |
|
| 526 | - |
|
| 527 | - // Redux extra theme checks. |
|
| 528 | - if ( 'Redux_ThemeCheck' === $class_name ) { |
|
| 529 | - require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' ); |
|
| 530 | - |
|
| 531 | - return; |
|
| 532 | - } |
|
| 533 | - |
|
| 534 | - if ( 'Redux_Welcome' === $class_name ) { |
|
| 535 | - require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' ); |
|
| 536 | - |
|
| 537 | - return; |
|
| 538 | - } |
|
| 539 | - |
|
| 540 | - $mappings = array( |
|
| 541 | - 'ReduxFrameworkInstances' => 'Redux_Instances', |
|
| 542 | - 'reduxCorePanel' => 'Redux_Panel', |
|
| 543 | - 'reduxCoreEnqueue' => 'Redux_Enqueue', |
|
| 544 | - 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
|
| 545 | - ); |
|
| 546 | - $alias = false; |
|
| 547 | - if ( isset( $mappings[ $class_name ] ) ) { |
|
| 548 | - $alias = $class_name; |
|
| 549 | - $class_name = $mappings[ $class_name ]; |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - // Everything else. |
|
| 553 | - $file = 'class.' . $class_name_test . '.php'; |
|
| 554 | - |
|
| 555 | - $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 556 | - |
|
| 557 | - if ( ! file_exists( $class_path ) ) { |
|
| 558 | - $class_file_name = str_replace( '_', '-', $class_name ); |
|
| 559 | - $file = 'class-' . $class_name_test . '.php'; |
|
| 560 | - $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) { |
|
| 564 | - require_once $class_path; |
|
| 565 | - } |
|
| 566 | - if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) { |
|
| 567 | - class_alias( $class_name, $alias ); |
|
| 568 | - } |
|
| 569 | - } |
|
| 570 | - |
|
| 571 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 572 | - do_action( 'redux/core/includes', $this ); |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - /** |
|
| 576 | - * Hooks to run on instance creation. |
|
| 577 | - */ |
|
| 578 | - private function hooks() { |
|
| 579 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 580 | - do_action( 'redux/core/hooks', $this ); |
|
| 581 | - } |
|
| 582 | - |
|
| 583 | - /** |
|
| 584 | - * Action to run on WordPress heartbeat. |
|
| 585 | - * |
|
| 586 | - * @return bool |
|
| 587 | - */ |
|
| 588 | - public static function is_heartbeat(): bool { |
|
| 589 | - // Disregard WP AJAX 'heartbeat' call. Why waste resources? |
|
| 590 | - if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) { |
|
| 591 | - |
|
| 592 | - if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) { |
|
| 593 | - |
|
| 594 | - // Hook, for purists. |
|
| 595 | - if ( has_action( 'redux/ajax/heartbeat' ) ) { |
|
| 596 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 597 | - do_action( 'redux/ajax/heartbeat' ); |
|
| 598 | - } |
|
| 599 | - |
|
| 600 | - return true; |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - return false; |
|
| 604 | - } |
|
| 605 | - |
|
| 606 | - // Buh bye! |
|
| 607 | - return false; |
|
| 608 | - } |
|
| 609 | - |
|
| 610 | - /** |
|
| 611 | - * Helper method to check for mb_strtolower or to use the standard strtolower. |
|
| 612 | - * |
|
| 613 | - * @param string|null $str String to make lowercase. |
|
| 614 | - * |
|
| 615 | - * @return string|null |
|
| 616 | - */ |
|
| 617 | - public static function strtolower( ?string $str ): string { |
|
| 618 | - if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) { |
|
| 619 | - return mb_strtolower( $str, mb_detect_encoding( $str ) ); |
|
| 620 | - } else { |
|
| 621 | - return strtolower( $str ); |
|
| 622 | - } |
|
| 623 | - } |
|
| 624 | - } |
|
| 625 | - |
|
| 626 | - /* |
|
| 14 | + /** |
|
| 15 | + * Class Redux_Core |
|
| 16 | + */ |
|
| 17 | + class Redux_Core { |
|
| 18 | + |
|
| 19 | + /** |
|
| 20 | + * Class instance. |
|
| 21 | + * |
|
| 22 | + * @var null|Redux_Core |
|
| 23 | + */ |
|
| 24 | + public static ?Redux_Core $instance = null; |
|
| 25 | + |
|
| 26 | + /** |
|
| 27 | + * Project version |
|
| 28 | + * |
|
| 29 | + * @var string |
|
| 30 | + */ |
|
| 31 | + public static string $version; |
|
| 32 | + |
|
| 33 | + /** |
|
| 34 | + * Project directory. |
|
| 35 | + * |
|
| 36 | + * @var string. |
|
| 37 | + */ |
|
| 38 | + public static string $dir; |
|
| 39 | + |
|
| 40 | + /** |
|
| 41 | + * Project URL. |
|
| 42 | + * |
|
| 43 | + * @var string. |
|
| 44 | + */ |
|
| 45 | + public static string $url; |
|
| 46 | + |
|
| 47 | + /** |
|
| 48 | + * Base directory path. |
|
| 49 | + * |
|
| 50 | + * @var string |
|
| 51 | + */ |
|
| 52 | + public static string $redux_path; |
|
| 53 | + |
|
| 54 | + /** |
|
| 55 | + * Absolute direction path to WordPress upload directory. |
|
| 56 | + * |
|
| 57 | + * @var string |
|
| 58 | + */ |
|
| 59 | + public static string $upload_dir = ''; |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * Full URL to WordPress upload directory. |
|
| 63 | + * |
|
| 64 | + * @var null|string |
|
| 65 | + */ |
|
| 66 | + public static ?string $upload_url = ''; |
|
| 67 | + |
|
| 68 | + /** |
|
| 69 | + * Set when Redux is run as a plugin. |
|
| 70 | + * |
|
| 71 | + * @var bool |
|
| 72 | + */ |
|
| 73 | + public static bool $is_plugin = true; |
|
| 74 | + |
|
| 75 | + /** |
|
| 76 | + * Indicated in_theme or in_plugin. |
|
| 77 | + * |
|
| 78 | + * @var string |
|
| 79 | + */ |
|
| 80 | + public static string $installed = ''; |
|
| 81 | + |
|
| 82 | + /** |
|
| 83 | + * Set when Redux is run as a plugin. |
|
| 84 | + * |
|
| 85 | + * @var bool |
|
| 86 | + */ |
|
| 87 | + public static bool $as_plugin = false; |
|
| 88 | + |
|
| 89 | + /** |
|
| 90 | + * Set when Redux is embedded within a theme. |
|
| 91 | + * |
|
| 92 | + * @var bool |
|
| 93 | + */ |
|
| 94 | + public static bool $in_theme = false; |
|
| 95 | + |
|
| 96 | + /** |
|
| 97 | + * Pointer to an updated Google fonts array. |
|
| 98 | + * |
|
| 99 | + * @var array|null |
|
| 100 | + */ |
|
| 101 | + public static ?array $updated_google_fonts = array(); |
|
| 102 | + |
|
| 103 | + /** |
|
| 104 | + * List of files calling Redux. |
|
| 105 | + * |
|
| 106 | + * @var array|null |
|
| 107 | + */ |
|
| 108 | + public static ?array $callers = array(); |
|
| 109 | + |
|
| 110 | + /** |
|
| 111 | + * Pointer to _SERVER global. |
|
| 112 | + * |
|
| 113 | + * @var array|null |
|
| 114 | + */ |
|
| 115 | + public static ?array $server = array(); |
|
| 116 | + |
|
| 117 | + /** |
|
| 118 | + * Field folding information for localization. |
|
| 119 | + * |
|
| 120 | + * @var null|array |
|
| 121 | + */ |
|
| 122 | + public static ?array $required = array(); |
|
| 123 | + |
|
| 124 | + /** |
|
| 125 | + * Field child-folding information for localization. |
|
| 126 | + * |
|
| 127 | + * @var null|array |
|
| 128 | + */ |
|
| 129 | + public static ?array $required_child = array(); |
|
| 130 | + |
|
| 131 | + /** |
|
| 132 | + * Array of fields to be folded. |
|
| 133 | + * |
|
| 134 | + * @var array|null |
|
| 135 | + */ |
|
| 136 | + public static ?array $folds = array(); |
|
| 137 | + |
|
| 138 | + /** |
|
| 139 | + * Array of fields that didn't pass the fold dependency test and are hidden. |
|
| 140 | + * |
|
| 141 | + * @var null|array |
|
| 142 | + */ |
|
| 143 | + public static ?array $fields_hidden = array(); |
|
| 144 | + |
|
| 145 | + /** |
|
| 146 | + * Values to generate google font CSS. |
|
| 147 | + * |
|
| 148 | + * @var null|array |
|
| 149 | + */ |
|
| 150 | + public static ?array $typography = array(); |
|
| 151 | + |
|
| 152 | + /** |
|
| 153 | + * Validation ran flag. |
|
| 154 | + * |
|
| 155 | + * @var bool |
|
| 156 | + */ |
|
| 157 | + public static bool $validation_ran = false; |
|
| 158 | + |
|
| 159 | + /** |
|
| 160 | + * No output flag. |
|
| 161 | + * |
|
| 162 | + * @var bool |
|
| 163 | + */ |
|
| 164 | + public static bool $no_output = false; |
|
| 165 | + |
|
| 166 | + /** |
|
| 167 | + * Array of fonts used by the panel for localization. |
|
| 168 | + * |
|
| 169 | + * @var null|array |
|
| 170 | + */ |
|
| 171 | + public static ?array $fonts = array(); |
|
| 172 | + |
|
| 173 | + /** |
|
| 174 | + * Array of Google fonts used by the panel for localization. |
|
| 175 | + * |
|
| 176 | + * @var null|array |
|
| 177 | + */ |
|
| 178 | + public static ?array $google_array = array(); |
|
| 179 | + |
|
| 180 | + /** |
|
| 181 | + * Array of various font groups used within the typography field. |
|
| 182 | + * |
|
| 183 | + * @var null|array |
|
| 184 | + */ |
|
| 185 | + public static ?array $font_groups = array(); |
|
| 186 | + |
|
| 187 | + /** |
|
| 188 | + * File system object used for I/O file operations. Done the WordPress way. |
|
| 189 | + * |
|
| 190 | + * @var null|object |
|
| 191 | + */ |
|
| 192 | + public static ?object $filesystem; |
|
| 193 | + |
|
| 194 | + /** |
|
| 195 | + * Pointer to the third party fixes class. |
|
| 196 | + * |
|
| 197 | + * @var Redux_ThirdParty_Fixes |
|
| 198 | + */ |
|
| 199 | + public static Redux_ThirdParty_Fixes $third_party_fixes; |
|
| 200 | + |
|
| 201 | + /** |
|
| 202 | + * Redux Welcome screen object. |
|
| 203 | + * |
|
| 204 | + * @var Redux_Welcome |
|
| 205 | + */ |
|
| 206 | + public static Redux_Welcome $welcome; |
|
| 207 | + |
|
| 208 | + /** |
|
| 209 | + * Creates instance of class. |
|
| 210 | + * |
|
| 211 | + * @return Redux_Core |
|
| 212 | + * @throws Exception Comment. |
|
| 213 | + */ |
|
| 214 | + public static function instance(): ?Redux_Core { |
|
| 215 | + if ( ! self::$instance ) { |
|
| 216 | + self::$instance = new self(); |
|
| 217 | + |
|
| 218 | + self::$instance->includes(); |
|
| 219 | + self::$instance->init(); |
|
| 220 | + self::$instance->hooks(); |
|
| 221 | + |
|
| 222 | + add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) ); |
|
| 223 | + } |
|
| 224 | + |
|
| 225 | + return self::$instance; |
|
| 226 | + } |
|
| 227 | + |
|
| 228 | + /** |
|
| 229 | + * Things to run after pluggable.php had loaded. |
|
| 230 | + */ |
|
| 231 | + public static function plugins_loaded() {} |
|
| 232 | + |
|
| 233 | + /** |
|
| 234 | + * Class init. |
|
| 235 | + */ |
|
| 236 | + private function init() { |
|
| 237 | + self::$server = array( |
|
| 238 | + 'SERVER_SOFTWARE' => '', |
|
| 239 | + 'REMOTE_ADDR' => Redux_Helpers::is_local_host() ? '127.0.0.1' : '', |
|
| 240 | + 'HTTP_USER_AGENT' => '', |
|
| 241 | + 'HTTP_HOST' => '', |
|
| 242 | + 'REQUEST_URI' => '', |
|
| 243 | + ); |
|
| 244 | + |
|
| 245 | + // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase |
|
| 246 | + if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) { |
|
| 247 | + self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ); |
|
| 248 | + } |
|
| 249 | + if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { |
|
| 250 | + self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); |
|
| 251 | + } |
|
| 252 | + if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { |
|
| 253 | + self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); |
|
| 254 | + } |
|
| 255 | + if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { |
|
| 256 | + self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ); |
|
| 257 | + } |
|
| 258 | + if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { |
|
| 259 | + self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); |
|
| 260 | + } |
|
| 261 | + |
|
| 262 | + // phpcs:enable |
|
| 263 | + |
|
| 264 | + self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) ); |
|
| 265 | + |
|
| 266 | + Redux_Functions_Ex::generator(); |
|
| 267 | + |
|
| 268 | + if ( defined( 'REDUX_PLUGIN_FILE' ) ) { |
|
| 269 | + $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE ); |
|
| 270 | + } |
|
| 271 | + |
|
| 272 | + $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ ); |
|
| 273 | + |
|
| 274 | + if ( false !== $plugin_info ) { |
|
| 275 | + self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin'; |
|
| 276 | + self::$is_plugin = class_exists( 'Redux_Framework_Plugin' ); |
|
| 277 | + self::$as_plugin = true; |
|
| 278 | + self::$url = trailingslashit( dirname( $plugin_info['url'] ) ); |
|
| 279 | + } else { |
|
| 280 | + $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ ); |
|
| 281 | + if ( false !== $theme_info ) { |
|
| 282 | + self::$url = trailingslashit( dirname( $theme_info['url'] ) ); |
|
| 283 | + self::$in_theme = true; |
|
| 284 | + self::$installed = 'in_theme'; |
|
| 285 | + } |
|
| 286 | + } |
|
| 287 | + |
|
| 288 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 289 | + self::$url = apply_filters( 'redux/url', self::$url ); |
|
| 290 | + |
|
| 291 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 292 | + self::$dir = apply_filters( 'redux/dir', self::$dir ); |
|
| 293 | + |
|
| 294 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 295 | + self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin ); |
|
| 296 | + |
|
| 297 | + if ( ! function_exists( 'current_time' ) ) { |
|
| 298 | + require_once ABSPATH . '/wp-includes/functions.php'; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + $upload_dir = wp_upload_dir(); |
|
| 302 | + self::$upload_dir = $upload_dir['basedir'] . '/redux/'; |
|
| 303 | + self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' ); |
|
| 304 | + |
|
| 305 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | + self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir ); |
|
| 307 | + |
|
| 308 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 309 | + self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url ); |
|
| 310 | + } |
|
| 311 | + |
|
| 312 | + /** |
|
| 313 | + * Code to execute on a framework __construct. |
|
| 314 | + * |
|
| 315 | + * @param ReduxFramework $redux Pointer to ReduxFramework object. |
|
| 316 | + */ |
|
| 317 | + public static function core_construct( ReduxFramework $redux ) { |
|
| 318 | + self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux ); |
|
| 319 | + |
|
| 320 | + Redux_ThemeCheck::get_instance(); |
|
| 321 | + } |
|
| 322 | + |
|
| 323 | + /** |
|
| 324 | + * Autoregister run. |
|
| 325 | + * |
|
| 326 | + * @throws Exception Comment. |
|
| 327 | + */ |
|
| 328 | + private function includes() { |
|
| 329 | + if ( is_admin() ) { |
|
| 330 | + if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) { |
|
| 331 | + echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>'; |
|
| 332 | + } |
|
| 333 | + } |
|
| 334 | + |
|
| 335 | + require_once __DIR__ . '/inc/classes/class-redux-path.php'; |
|
| 336 | + require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php'; |
|
| 337 | + require_once __DIR__ . '/inc/classes/class-redux-helpers.php'; |
|
| 338 | + require_once __DIR__ . '/inc/classes/class-redux-instances.php'; |
|
| 339 | + |
|
| 340 | + Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' ); |
|
| 341 | + Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' ); |
|
| 342 | + |
|
| 343 | + spl_autoload_register( array( $this, 'register_classes' ) ); |
|
| 344 | + |
|
| 345 | + self::$welcome = new Redux_Welcome(); |
|
| 346 | + |
|
| 347 | + add_filter( 'debug_information', array( $this, 'add_debug_info' ) ); |
|
| 348 | + } |
|
| 349 | + |
|
| 350 | + /** |
|
| 351 | + * Add debug info for the WP Site Health screen. |
|
| 352 | + * |
|
| 353 | + * @param array $debug_info Debug data. |
|
| 354 | + * |
|
| 355 | + * @return array |
|
| 356 | + * @throws ReflectionException Exception. |
|
| 357 | + */ |
|
| 358 | + public function add_debug_info( array $debug_info ): array { |
|
| 359 | + |
|
| 360 | + // Get browser data. |
|
| 361 | + if ( ! class_exists( 'ReduxBrowser' ) ) { |
|
| 362 | + require_once self::$dir . 'inc/lib/browser.php'; |
|
| 363 | + } |
|
| 364 | + |
|
| 365 | + $browser = new ReduxBrowser(); |
|
| 366 | + |
|
| 367 | + $browser_data = array( |
|
| 368 | + 'Agent' => $browser->getUserAgent(), |
|
| 369 | + 'Browser' => $browser->getBrowser(), |
|
| 370 | + 'Version' => $browser->getVersion(), |
|
| 371 | + 'Platform' => $browser->getPlatform(), |
|
| 372 | + ); |
|
| 373 | + |
|
| 374 | + // Set Redux dir permission results to Site Health screen. |
|
| 375 | + $debug_info['wp-filesystem']['fields'][] = array( |
|
| 376 | + 'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ), |
|
| 377 | + 'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable', |
|
| 378 | + ); |
|
| 379 | + |
|
| 380 | + // Set Redux plugin results to Site Health screen. |
|
| 381 | + $debug_info['redux-framework'] = array( |
|
| 382 | + 'label' => esc_html__( 'Redux Framework', 'redux-framework' ), |
|
| 383 | + 'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ), |
|
| 384 | + 'fields' => array( |
|
| 385 | + 'version' => array( |
|
| 386 | + 'label' => esc_html__( 'Version', 'redux-framework' ), |
|
| 387 | + 'value' => self::$version, |
|
| 388 | + ), |
|
| 389 | + 'installation' => array( |
|
| 390 | + 'label' => esc_html__( 'Installation', 'redux-framework' ), |
|
| 391 | + 'value' => self::$installed, |
|
| 392 | + ), |
|
| 393 | + 'data directory' => array( |
|
| 394 | + 'label' => esc_html__( 'Data directory', 'redux-framework' ), |
|
| 395 | + 'value' => self::$dir, |
|
| 396 | + ), |
|
| 397 | + 'browser' => array( |
|
| 398 | + 'label' => esc_html__( 'Browser', 'redux-framework' ), |
|
| 399 | + 'value' => $browser_data, |
|
| 400 | + ), |
|
| 401 | + ), |
|
| 402 | + ); |
|
| 403 | + |
|
| 404 | + $redux = Redux::all_instances(); |
|
| 405 | + |
|
| 406 | + $extensions = array(); |
|
| 407 | + |
|
| 408 | + if ( ! empty( $redux ) && is_array( $redux ) ) { |
|
| 409 | + foreach ( $redux as $inst => $data ) { |
|
| 410 | + Redux::init( $inst ); |
|
| 411 | + |
|
| 412 | + $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) ); |
|
| 413 | + $args = $data->args; |
|
| 414 | + |
|
| 415 | + $ext = Redux::get_extensions( $inst ); |
|
| 416 | + if ( ! empty( $ext ) && is_array( $ext ) ) { |
|
| 417 | + ksort( $ext ); |
|
| 418 | + |
|
| 419 | + foreach ( $ext as $name => $arr ) { |
|
| 420 | + $ver = $arr['version']; |
|
| 421 | + |
|
| 422 | + $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
|
| 423 | + |
|
| 424 | + $extensions[ $ex ] = esc_html( $ver ); |
|
| 425 | + } |
|
| 426 | + } |
|
| 427 | + |
|
| 428 | + // Output Redux instances. |
|
| 429 | + $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 430 | + // translators: %s = Instance name. |
|
| 431 | + 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
|
| 432 | + // translators: %s = Instance name w/ HTML. |
|
| 433 | + 'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ), |
|
| 434 | + 'fields' => array( |
|
| 435 | + 'opt_name' => array( |
|
| 436 | + 'label' => esc_html( 'opt_name' ), |
|
| 437 | + 'value' => $args['opt_name'], |
|
| 438 | + ), |
|
| 439 | + 'global_variable' => array( |
|
| 440 | + 'label' => esc_html( 'global_variable' ), |
|
| 441 | + 'value' => $args['global_variable'], |
|
| 442 | + ), |
|
| 443 | + 'dev_mode' => array( |
|
| 444 | + 'label' => esc_html( 'dev_mode' ), |
|
| 445 | + 'value' => $args['dev_mode'] ? 'true' : 'false', |
|
| 446 | + ), |
|
| 447 | + 'ajax_save' => array( |
|
| 448 | + 'label' => esc_html( 'ajax_save' ), |
|
| 449 | + 'value' => $args['ajax_save'] ? 'true' : 'false', |
|
| 450 | + ), |
|
| 451 | + 'page_slug' => array( |
|
| 452 | + 'label' => esc_html( 'page_slug' ), |
|
| 453 | + 'value' => $args['page_slug'], |
|
| 454 | + ), |
|
| 455 | + 'page_permissions' => array( |
|
| 456 | + 'label' => esc_html( 'page_permissions' ), |
|
| 457 | + 'value' => $args['page_permissions'], |
|
| 458 | + ), |
|
| 459 | + 'menu_type' => array( |
|
| 460 | + 'label' => esc_html( 'menu_type' ), |
|
| 461 | + 'value' => $args['menu_type'], |
|
| 462 | + ), |
|
| 463 | + 'page_parent' => array( |
|
| 464 | + 'label' => esc_html( 'page_parent' ), |
|
| 465 | + 'value' => $args['page_parent'], |
|
| 466 | + ), |
|
| 467 | + 'compiler' => array( |
|
| 468 | + 'label' => esc_html( 'compiler' ), |
|
| 469 | + 'value' => $args['compiler'] ? 'true' : 'false', |
|
| 470 | + ), |
|
| 471 | + 'output' => array( |
|
| 472 | + 'label' => esc_html( 'output' ), |
|
| 473 | + 'value' => $args['output'] ? 'true' : 'false', |
|
| 474 | + ), |
|
| 475 | + 'output_tag' => array( |
|
| 476 | + 'label' => esc_html( 'output_tag' ), |
|
| 477 | + 'value' => $args['output_tag'] ? 'true' : 'false', |
|
| 478 | + ), |
|
| 479 | + 'templates_path' => array( |
|
| 480 | + 'label' => esc_html( 'templates_path' ), |
|
| 481 | + 'value' => $args['templates_path'], |
|
| 482 | + ), |
|
| 483 | + 'extensions' => array( |
|
| 484 | + 'label' => esc_html( 'extensions' ), |
|
| 485 | + 'value' => $extensions, |
|
| 486 | + ), |
|
| 487 | + ), |
|
| 488 | + ); |
|
| 489 | + } |
|
| 490 | + } |
|
| 491 | + |
|
| 492 | + return $debug_info; |
|
| 493 | + } |
|
| 494 | + |
|
| 495 | + /** |
|
| 496 | + * Register callback for autoload. |
|
| 497 | + * |
|
| 498 | + * @param string $class_name name of class. |
|
| 499 | + */ |
|
| 500 | + public function register_classes( string $class_name ) { |
|
| 501 | + $class_name_test = self::strtolower( $class_name ); |
|
| 502 | + |
|
| 503 | + if ( strpos( $class_name_test, 'redux' ) === false ) { |
|
| 504 | + return; |
|
| 505 | + } |
|
| 506 | + |
|
| 507 | + if ( ! class_exists( 'Redux_Functions_Ex' ) ) { |
|
| 508 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' ); |
|
| 509 | + } |
|
| 510 | + |
|
| 511 | + if ( ! class_exists( $class_name ) ) { |
|
| 512 | + // Backward compatibility for extensions sucks! |
|
| 513 | + if ( 'Redux_Instances' === $class_name ) { |
|
| 514 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' ); |
|
| 515 | + require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' ); |
|
| 516 | + |
|
| 517 | + return; |
|
| 518 | + } |
|
| 519 | + |
|
| 520 | + // Load Redux APIs. |
|
| 521 | + if ( 'Redux' === $class_name ) { |
|
| 522 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' ); |
|
| 523 | + |
|
| 524 | + return; |
|
| 525 | + } |
|
| 526 | + |
|
| 527 | + // Redux extra theme checks. |
|
| 528 | + if ( 'Redux_ThemeCheck' === $class_name ) { |
|
| 529 | + require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' ); |
|
| 530 | + |
|
| 531 | + return; |
|
| 532 | + } |
|
| 533 | + |
|
| 534 | + if ( 'Redux_Welcome' === $class_name ) { |
|
| 535 | + require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' ); |
|
| 536 | + |
|
| 537 | + return; |
|
| 538 | + } |
|
| 539 | + |
|
| 540 | + $mappings = array( |
|
| 541 | + 'ReduxFrameworkInstances' => 'Redux_Instances', |
|
| 542 | + 'reduxCorePanel' => 'Redux_Panel', |
|
| 543 | + 'reduxCoreEnqueue' => 'Redux_Enqueue', |
|
| 544 | + 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
|
| 545 | + ); |
|
| 546 | + $alias = false; |
|
| 547 | + if ( isset( $mappings[ $class_name ] ) ) { |
|
| 548 | + $alias = $class_name; |
|
| 549 | + $class_name = $mappings[ $class_name ]; |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + // Everything else. |
|
| 553 | + $file = 'class.' . $class_name_test . '.php'; |
|
| 554 | + |
|
| 555 | + $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 556 | + |
|
| 557 | + if ( ! file_exists( $class_path ) ) { |
|
| 558 | + $class_file_name = str_replace( '_', '-', $class_name ); |
|
| 559 | + $file = 'class-' . $class_name_test . '.php'; |
|
| 560 | + $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) { |
|
| 564 | + require_once $class_path; |
|
| 565 | + } |
|
| 566 | + if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) { |
|
| 567 | + class_alias( $class_name, $alias ); |
|
| 568 | + } |
|
| 569 | + } |
|
| 570 | + |
|
| 571 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 572 | + do_action( 'redux/core/includes', $this ); |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + /** |
|
| 576 | + * Hooks to run on instance creation. |
|
| 577 | + */ |
|
| 578 | + private function hooks() { |
|
| 579 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 580 | + do_action( 'redux/core/hooks', $this ); |
|
| 581 | + } |
|
| 582 | + |
|
| 583 | + /** |
|
| 584 | + * Action to run on WordPress heartbeat. |
|
| 585 | + * |
|
| 586 | + * @return bool |
|
| 587 | + */ |
|
| 588 | + public static function is_heartbeat(): bool { |
|
| 589 | + // Disregard WP AJAX 'heartbeat' call. Why waste resources? |
|
| 590 | + if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) { |
|
| 591 | + |
|
| 592 | + if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) { |
|
| 593 | + |
|
| 594 | + // Hook, for purists. |
|
| 595 | + if ( has_action( 'redux/ajax/heartbeat' ) ) { |
|
| 596 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 597 | + do_action( 'redux/ajax/heartbeat' ); |
|
| 598 | + } |
|
| 599 | + |
|
| 600 | + return true; |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + return false; |
|
| 604 | + } |
|
| 605 | + |
|
| 606 | + // Buh bye! |
|
| 607 | + return false; |
|
| 608 | + } |
|
| 609 | + |
|
| 610 | + /** |
|
| 611 | + * Helper method to check for mb_strtolower or to use the standard strtolower. |
|
| 612 | + * |
|
| 613 | + * @param string|null $str String to make lowercase. |
|
| 614 | + * |
|
| 615 | + * @return string|null |
|
| 616 | + */ |
|
| 617 | + public static function strtolower( ?string $str ): string { |
|
| 618 | + if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) { |
|
| 619 | + return mb_strtolower( $str, mb_detect_encoding( $str ) ); |
|
| 620 | + } else { |
|
| 621 | + return strtolower( $str ); |
|
| 622 | + } |
|
| 623 | + } |
|
| 624 | + } |
|
| 625 | + |
|
| 626 | + /* |
|
| 627 | 627 | * Backwards comparability alias |
| 628 | 628 | */ |
| 629 | - class_alias( 'Redux_Core', 'redux-core' ); |
|
| 629 | + class_alias( 'Redux_Core', 'redux-core' ); |
|
| 630 | 630 | } |
@@ -98,56 +98,56 @@ discard block |
||
| 98 | 98 | * |
| 99 | 99 | * @var array|null |
| 100 | 100 | */ |
| 101 | - public static ?array $updated_google_fonts = array(); |
|
| 101 | + public static ? array $updated_google_fonts = array(); |
|
| 102 | 102 | |
| 103 | 103 | /** |
| 104 | 104 | * List of files calling Redux. |
| 105 | 105 | * |
| 106 | 106 | * @var array|null |
| 107 | 107 | */ |
| 108 | - public static ?array $callers = array(); |
|
| 108 | + public static ? array $callers = array(); |
|
| 109 | 109 | |
| 110 | 110 | /** |
| 111 | 111 | * Pointer to _SERVER global. |
| 112 | 112 | * |
| 113 | 113 | * @var array|null |
| 114 | 114 | */ |
| 115 | - public static ?array $server = array(); |
|
| 115 | + public static ? array $server = array(); |
|
| 116 | 116 | |
| 117 | 117 | /** |
| 118 | 118 | * Field folding information for localization. |
| 119 | 119 | * |
| 120 | 120 | * @var null|array |
| 121 | 121 | */ |
| 122 | - public static ?array $required = array(); |
|
| 122 | + public static ? array $required = array(); |
|
| 123 | 123 | |
| 124 | 124 | /** |
| 125 | 125 | * Field child-folding information for localization. |
| 126 | 126 | * |
| 127 | 127 | * @var null|array |
| 128 | 128 | */ |
| 129 | - public static ?array $required_child = array(); |
|
| 129 | + public static ? array $required_child = array(); |
|
| 130 | 130 | |
| 131 | 131 | /** |
| 132 | 132 | * Array of fields to be folded. |
| 133 | 133 | * |
| 134 | 134 | * @var array|null |
| 135 | 135 | */ |
| 136 | - public static ?array $folds = array(); |
|
| 136 | + public static ? array $folds = array(); |
|
| 137 | 137 | |
| 138 | 138 | /** |
| 139 | 139 | * Array of fields that didn't pass the fold dependency test and are hidden. |
| 140 | 140 | * |
| 141 | 141 | * @var null|array |
| 142 | 142 | */ |
| 143 | - public static ?array $fields_hidden = array(); |
|
| 143 | + public static ? array $fields_hidden = array(); |
|
| 144 | 144 | |
| 145 | 145 | /** |
| 146 | 146 | * Values to generate google font CSS. |
| 147 | 147 | * |
| 148 | 148 | * @var null|array |
| 149 | 149 | */ |
| 150 | - public static ?array $typography = array(); |
|
| 150 | + public static ? array $typography = array(); |
|
| 151 | 151 | |
| 152 | 152 | /** |
| 153 | 153 | * Validation ran flag. |
@@ -168,21 +168,21 @@ discard block |
||
| 168 | 168 | * |
| 169 | 169 | * @var null|array |
| 170 | 170 | */ |
| 171 | - public static ?array $fonts = array(); |
|
| 171 | + public static ? array $fonts = array(); |
|
| 172 | 172 | |
| 173 | 173 | /** |
| 174 | 174 | * Array of Google fonts used by the panel for localization. |
| 175 | 175 | * |
| 176 | 176 | * @var null|array |
| 177 | 177 | */ |
| 178 | - public static ?array $google_array = array(); |
|
| 178 | + public static ? array $google_array = array(); |
|
| 179 | 179 | |
| 180 | 180 | /** |
| 181 | 181 | * Array of various font groups used within the typography field. |
| 182 | 182 | * |
| 183 | 183 | * @var null|array |
| 184 | 184 | */ |
| 185 | - public static ?array $font_groups = array(); |
|
| 185 | + public static ? array $font_groups = array(); |
|
| 186 | 186 | |
| 187 | 187 | /** |
| 188 | 188 | * File system object used for I/O file operations. Done the WordPress way. |
@@ -421,12 +421,12 @@ discard block |
||
| 421 | 421 | |
| 422 | 422 | $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
| 423 | 423 | |
| 424 | - $extensions[ $ex ] = esc_html( $ver ); |
|
| 424 | + $extensions[$ex] = esc_html( $ver ); |
|
| 425 | 425 | } |
| 426 | 426 | } |
| 427 | 427 | |
| 428 | 428 | // Output Redux instances. |
| 429 | - $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 429 | + $debug_info['redux-instance-' . $inst] = array( |
|
| 430 | 430 | // translators: %s = Instance name. |
| 431 | 431 | 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
| 432 | 432 | // translators: %s = Instance name w/ HTML. |
@@ -543,10 +543,10 @@ discard block |
||
| 543 | 543 | 'reduxCoreEnqueue' => 'Redux_Enqueue', |
| 544 | 544 | 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
| 545 | 545 | ); |
| 546 | - $alias = false; |
|
| 547 | - if ( isset( $mappings[ $class_name ] ) ) { |
|
| 546 | + $alias = false; |
|
| 547 | + if ( isset( $mappings[$class_name] ) ) { |
|
| 548 | 548 | $alias = $class_name; |
| 549 | - $class_name = $mappings[ $class_name ]; |
|
| 549 | + $class_name = $mappings[$class_name]; |
|
| 550 | 550 | } |
| 551 | 551 | |
| 552 | 552 | // Everything else. |
@@ -15,108 +15,108 @@ discard block |
||
| 15 | 15 | */ |
| 16 | 16 | class Redux_Customizer_Section extends WP_Customize_Section { |
| 17 | 17 | |
| 18 | - /** |
|
| 19 | - * Type of this section. |
|
| 20 | - * |
|
| 21 | - * @since 4.1.0 |
|
| 22 | - * @access public |
|
| 23 | - * @var string |
|
| 24 | - */ |
|
| 25 | - public $type = 'redux'; |
|
| 26 | - |
|
| 27 | - /** |
|
| 28 | - * Panel opt_name. |
|
| 29 | - * |
|
| 30 | - * @since 4.0.0 |
|
| 31 | - * @access public |
|
| 32 | - * @var string |
|
| 33 | - */ |
|
| 34 | - public $opt_name = ''; |
|
| 35 | - |
|
| 36 | - /** |
|
| 37 | - * Section array. |
|
| 38 | - * |
|
| 39 | - * @var array|mixed |
|
| 40 | - */ |
|
| 41 | - public $section = array(); |
|
| 42 | - |
|
| 43 | - /** |
|
| 44 | - * Section array. |
|
| 45 | - * |
|
| 46 | - * @var string |
|
| 47 | - */ |
|
| 48 | - public string $wp_ver; |
|
| 49 | - |
|
| 50 | - /** |
|
| 51 | - * Constructor. |
|
| 52 | - * Any supplied $args override class property defaults. |
|
| 53 | - * |
|
| 54 | - * @since 3.4.0 |
|
| 55 | - * |
|
| 56 | - * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 57 | - * @param string $id A specific ID of the section. |
|
| 58 | - * @param array $args Section arguments. |
|
| 59 | - */ |
|
| 60 | - public function __construct( $manager, $id, $args = array() ) { |
|
| 61 | - global $wp_version; |
|
| 62 | - |
|
| 63 | - parent::__construct( $manager, $id, $args ); |
|
| 64 | - |
|
| 65 | - // Redux addition. |
|
| 66 | - if ( isset( $args['section'] ) ) { |
|
| 67 | - $this->section = $args['section']; |
|
| 68 | - $this->description = $this->section['desc'] ?? ''; |
|
| 69 | - $this->opt_name = $args['opt_name'] ?? ''; |
|
| 70 | - } |
|
| 71 | - |
|
| 72 | - $version = explode( '-', $wp_version ); |
|
| 73 | - $this->wp_ver = $version[0]; |
|
| 74 | - } |
|
| 75 | - |
|
| 76 | - /** |
|
| 77 | - * WP < 4.3 Render |
|
| 78 | - */ |
|
| 79 | - protected function render() { |
|
| 80 | - global $wp_version; |
|
| 81 | - $version = explode( '-', $wp_version ); |
|
| 82 | - if ( version_compare( $version[0], '4.3', '<' ) ) { |
|
| 83 | - $this->render_fallback(); |
|
| 84 | - } |
|
| 85 | - } |
|
| 86 | - |
|
| 87 | - /** |
|
| 88 | - * Render the section, and the controls that have been added to it. |
|
| 89 | - * |
|
| 90 | - * @since 3.4.0 |
|
| 91 | - */ |
|
| 92 | - protected function render_fallback() { |
|
| 93 | - $classes = 'accordion-section redux-section control-section control-section-' . $this->type; |
|
| 94 | - ?> |
|
| 18 | + /** |
|
| 19 | + * Type of this section. |
|
| 20 | + * |
|
| 21 | + * @since 4.1.0 |
|
| 22 | + * @access public |
|
| 23 | + * @var string |
|
| 24 | + */ |
|
| 25 | + public $type = 'redux'; |
|
| 26 | + |
|
| 27 | + /** |
|
| 28 | + * Panel opt_name. |
|
| 29 | + * |
|
| 30 | + * @since 4.0.0 |
|
| 31 | + * @access public |
|
| 32 | + * @var string |
|
| 33 | + */ |
|
| 34 | + public $opt_name = ''; |
|
| 35 | + |
|
| 36 | + /** |
|
| 37 | + * Section array. |
|
| 38 | + * |
|
| 39 | + * @var array|mixed |
|
| 40 | + */ |
|
| 41 | + public $section = array(); |
|
| 42 | + |
|
| 43 | + /** |
|
| 44 | + * Section array. |
|
| 45 | + * |
|
| 46 | + * @var string |
|
| 47 | + */ |
|
| 48 | + public string $wp_ver; |
|
| 49 | + |
|
| 50 | + /** |
|
| 51 | + * Constructor. |
|
| 52 | + * Any supplied $args override class property defaults. |
|
| 53 | + * |
|
| 54 | + * @since 3.4.0 |
|
| 55 | + * |
|
| 56 | + * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 57 | + * @param string $id A specific ID of the section. |
|
| 58 | + * @param array $args Section arguments. |
|
| 59 | + */ |
|
| 60 | + public function __construct( $manager, $id, $args = array() ) { |
|
| 61 | + global $wp_version; |
|
| 62 | + |
|
| 63 | + parent::__construct( $manager, $id, $args ); |
|
| 64 | + |
|
| 65 | + // Redux addition. |
|
| 66 | + if ( isset( $args['section'] ) ) { |
|
| 67 | + $this->section = $args['section']; |
|
| 68 | + $this->description = $this->section['desc'] ?? ''; |
|
| 69 | + $this->opt_name = $args['opt_name'] ?? ''; |
|
| 70 | + } |
|
| 71 | + |
|
| 72 | + $version = explode( '-', $wp_version ); |
|
| 73 | + $this->wp_ver = $version[0]; |
|
| 74 | + } |
|
| 75 | + |
|
| 76 | + /** |
|
| 77 | + * WP < 4.3 Render |
|
| 78 | + */ |
|
| 79 | + protected function render() { |
|
| 80 | + global $wp_version; |
|
| 81 | + $version = explode( '-', $wp_version ); |
|
| 82 | + if ( version_compare( $version[0], '4.3', '<' ) ) { |
|
| 83 | + $this->render_fallback(); |
|
| 84 | + } |
|
| 85 | + } |
|
| 86 | + |
|
| 87 | + /** |
|
| 88 | + * Render the section, and the controls that have been added to it. |
|
| 89 | + * |
|
| 90 | + * @since 3.4.0 |
|
| 91 | + */ |
|
| 92 | + protected function render_fallback() { |
|
| 93 | + $classes = 'accordion-section redux-section control-section control-section-' . $this->type; |
|
| 94 | + ?> |
|
| 95 | 95 | <li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>"> |
| 96 | 96 | <h3 class="accordion-section-title" tabindex="0"> |
| 97 | 97 | <?php |
| 98 | - echo wp_kses( |
|
| 99 | - $this->title, |
|
| 100 | - array( |
|
| 101 | - 'em' => array(), |
|
| 102 | - 'i' => array(), |
|
| 103 | - 'strong' => array(), |
|
| 104 | - 'span' => array( |
|
| 105 | - 'class' => array(), |
|
| 106 | - 'style' => array(), |
|
| 107 | - ), |
|
| 108 | - ) |
|
| 109 | - ); |
|
| 110 | - ?> |
|
| 98 | + echo wp_kses( |
|
| 99 | + $this->title, |
|
| 100 | + array( |
|
| 101 | + 'em' => array(), |
|
| 102 | + 'i' => array(), |
|
| 103 | + 'strong' => array(), |
|
| 104 | + 'span' => array( |
|
| 105 | + 'class' => array(), |
|
| 106 | + 'style' => array(), |
|
| 107 | + ), |
|
| 108 | + ) |
|
| 109 | + ); |
|
| 110 | + ?> |
|
| 111 | 111 | <span class="screen-reader-text"><?php esc_attr_e( 'Press return or enter to expand', 'redux-framework' ); ?></span> |
| 112 | 112 | </h3> |
| 113 | 113 | <ul class="accordion-section-content redux-main"> |
| 114 | 114 | <?php |
| 115 | - if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 116 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 117 | - do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 118 | - } |
|
| 119 | - ?> |
|
| 115 | + if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 116 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 117 | + do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 118 | + } |
|
| 119 | + ?> |
|
| 120 | 120 | <?php if ( ! empty( $this->description ) ) { ?> |
| 121 | 121 | <li class="customize-section-description-container"> |
| 122 | 122 | <p class="description customize-section-description legacy"><?php echo wp_kses_post( $this->description ); ?></p> |
@@ -125,60 +125,60 @@ discard block |
||
| 125 | 125 | </ul> |
| 126 | 126 | </li> |
| 127 | 127 | <?php |
| 128 | - } |
|
| 129 | - |
|
| 130 | - |
|
| 131 | - /** |
|
| 132 | - * Gather the parameters passed to client JavaScript via JSON. |
|
| 133 | - * |
|
| 134 | - * @since 4.1.0 |
|
| 135 | - * |
|
| 136 | - * @return array The array to be exported to the client as JSON. |
|
| 137 | - */ |
|
| 138 | - public function json(): array { |
|
| 139 | - $array = wp_array_slice_assoc( |
|
| 140 | - parent::json(), |
|
| 141 | - array( |
|
| 142 | - 'id', |
|
| 143 | - 'title', |
|
| 144 | - 'description', |
|
| 145 | - 'priority', |
|
| 146 | - 'panel', |
|
| 147 | - 'type', |
|
| 148 | - ) |
|
| 149 | - ); |
|
| 150 | - |
|
| 151 | - $array['content'] = $this->get_content(); |
|
| 152 | - $array['active'] = $this->active(); |
|
| 153 | - $array['instanceNumber'] = $this->instance_number; |
|
| 154 | - |
|
| 155 | - if ( $this->panel ) { |
|
| 156 | - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ |
|
| 157 | - $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); |
|
| 158 | - } else { |
|
| 159 | - $array['customizeAction'] = __( 'Customizing', 'redux-framework' ); |
|
| 160 | - } |
|
| 161 | - |
|
| 162 | - // BEGIN Redux Additions. |
|
| 163 | - $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 164 | - $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 165 | - |
|
| 166 | - $array['opt_name'] = $this->opt_name; |
|
| 167 | - |
|
| 168 | - return $array; |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * An Underscore (JS) template for rendering this section. |
|
| 173 | - * Class variables for this section class are available in the `data` JS object; |
|
| 174 | - * export custom variables by overriding {@see WP_Customize_Section::json()}. |
|
| 175 | - * |
|
| 176 | - * @see WP_Customize_Section::print_template() |
|
| 177 | - * @since 4.3.0 |
|
| 178 | - */ |
|
| 179 | - protected function render_template() { |
|
| 180 | - |
|
| 181 | - ?> |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + |
|
| 131 | + /** |
|
| 132 | + * Gather the parameters passed to client JavaScript via JSON. |
|
| 133 | + * |
|
| 134 | + * @since 4.1.0 |
|
| 135 | + * |
|
| 136 | + * @return array The array to be exported to the client as JSON. |
|
| 137 | + */ |
|
| 138 | + public function json(): array { |
|
| 139 | + $array = wp_array_slice_assoc( |
|
| 140 | + parent::json(), |
|
| 141 | + array( |
|
| 142 | + 'id', |
|
| 143 | + 'title', |
|
| 144 | + 'description', |
|
| 145 | + 'priority', |
|
| 146 | + 'panel', |
|
| 147 | + 'type', |
|
| 148 | + ) |
|
| 149 | + ); |
|
| 150 | + |
|
| 151 | + $array['content'] = $this->get_content(); |
|
| 152 | + $array['active'] = $this->active(); |
|
| 153 | + $array['instanceNumber'] = $this->instance_number; |
|
| 154 | + |
|
| 155 | + if ( $this->panel ) { |
|
| 156 | + /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ |
|
| 157 | + $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); |
|
| 158 | + } else { |
|
| 159 | + $array['customizeAction'] = __( 'Customizing', 'redux-framework' ); |
|
| 160 | + } |
|
| 161 | + |
|
| 162 | + // BEGIN Redux Additions. |
|
| 163 | + $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 164 | + $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 165 | + |
|
| 166 | + $array['opt_name'] = $this->opt_name; |
|
| 167 | + |
|
| 168 | + return $array; |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * An Underscore (JS) template for rendering this section. |
|
| 173 | + * Class variables for this section class are available in the `data` JS object; |
|
| 174 | + * export custom variables by overriding {@see WP_Customize_Section::json()}. |
|
| 175 | + * |
|
| 176 | + * @see WP_Customize_Section::print_template() |
|
| 177 | + * @since 4.3.0 |
|
| 178 | + */ |
|
| 179 | + protected function render_template() { |
|
| 180 | + |
|
| 181 | + ?> |
|
| 182 | 182 | <li id="accordion-section-{{ data.id }}" |
| 183 | 183 | class="redux-standalone-section redux-customizer-opt-name redux-section accordion-section control-section control-section-{{ data.type }}" |
| 184 | 184 | data-opt-name="{{ data.opt_name }}" |
@@ -210,14 +210,14 @@ discard block |
||
| 210 | 210 | <p class="description customize-section-description">{{{ data.description }}}</p> |
| 211 | 211 | <# } #> |
| 212 | 212 | <?php |
| 213 | - if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 214 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 215 | - do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 216 | - } |
|
| 217 | - ?> |
|
| 213 | + if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 214 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 215 | + do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 216 | + } |
|
| 217 | + ?> |
|
| 218 | 218 | </li> |
| 219 | 219 | </ul> |
| 220 | 220 | </li> |
| 221 | 221 | <?php |
| 222 | - } |
|
| 222 | + } |
|
| 223 | 223 | } |
@@ -19,83 +19,83 @@ discard block |
||
| 19 | 19 | */ |
| 20 | 20 | class Redux_Customizer_Panel extends WP_Customize_Panel { |
| 21 | 21 | |
| 22 | - /** |
|
| 23 | - * Type of this panel. |
|
| 24 | - * |
|
| 25 | - * @since 4.0.0 |
|
| 26 | - * @access public |
|
| 27 | - * @var string |
|
| 28 | - */ |
|
| 29 | - public $type = 'redux'; |
|
| 22 | + /** |
|
| 23 | + * Type of this panel. |
|
| 24 | + * |
|
| 25 | + * @since 4.0.0 |
|
| 26 | + * @access public |
|
| 27 | + * @var string |
|
| 28 | + */ |
|
| 29 | + public $type = 'redux'; |
|
| 30 | 30 | |
| 31 | - /** |
|
| 32 | - * Panel opt_name. |
|
| 33 | - * |
|
| 34 | - * @since 4.0.0 |
|
| 35 | - * @access public |
|
| 36 | - * @var string |
|
| 37 | - */ |
|
| 38 | - public $opt_name = ''; |
|
| 31 | + /** |
|
| 32 | + * Panel opt_name. |
|
| 33 | + * |
|
| 34 | + * @since 4.0.0 |
|
| 35 | + * @access public |
|
| 36 | + * @var string |
|
| 37 | + */ |
|
| 38 | + public $opt_name = ''; |
|
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * Section array. |
|
| 42 | - * |
|
| 43 | - * @var array|mixed |
|
| 44 | - */ |
|
| 45 | - public $section = array(); |
|
| 40 | + /** |
|
| 41 | + * Section array. |
|
| 42 | + * |
|
| 43 | + * @var array|mixed |
|
| 44 | + */ |
|
| 45 | + public $section = array(); |
|
| 46 | 46 | |
| 47 | - /** |
|
| 48 | - * Section array. |
|
| 49 | - * |
|
| 50 | - * @var string |
|
| 51 | - */ |
|
| 52 | - public string $wp_ver; |
|
| 47 | + /** |
|
| 48 | + * Section array. |
|
| 49 | + * |
|
| 50 | + * @var string |
|
| 51 | + */ |
|
| 52 | + public string $wp_ver; |
|
| 53 | 53 | |
| 54 | - /** |
|
| 55 | - * Constructor. |
|
| 56 | - * Any supplied $args override class property defaults. |
|
| 57 | - * |
|
| 58 | - * @since 4.0.0 |
|
| 59 | - * |
|
| 60 | - * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 61 | - * @param string $id A specific ID for the panel. |
|
| 62 | - * @param array $args Panel arguments. |
|
| 63 | - */ |
|
| 64 | - public function __construct( $manager, $id, $args = array() ) { |
|
| 65 | - global $wp_version; |
|
| 54 | + /** |
|
| 55 | + * Constructor. |
|
| 56 | + * Any supplied $args override class property defaults. |
|
| 57 | + * |
|
| 58 | + * @since 4.0.0 |
|
| 59 | + * |
|
| 60 | + * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 61 | + * @param string $id A specific ID for the panel. |
|
| 62 | + * @param array $args Panel arguments. |
|
| 63 | + */ |
|
| 64 | + public function __construct( $manager, $id, $args = array() ) { |
|
| 65 | + global $wp_version; |
|
| 66 | 66 | |
| 67 | - parent::__construct( $manager, $id, $args ); |
|
| 67 | + parent::__construct( $manager, $id, $args ); |
|
| 68 | 68 | |
| 69 | - $version = explode( '-', $wp_version ); |
|
| 70 | - $this->wp_ver = $version[0]; |
|
| 69 | + $version = explode( '-', $wp_version ); |
|
| 70 | + $this->wp_ver = $version[0]; |
|
| 71 | 71 | |
| 72 | - // Redux addition. |
|
| 73 | - if ( isset( $args['section'] ) ) { |
|
| 74 | - $this->section = $args['section']; |
|
| 75 | - $this->description = $this->section['desc'] ?? ''; |
|
| 76 | - $this->opt_name = $args['opt_name'] ?? ''; |
|
| 77 | - } |
|
| 78 | - } |
|
| 72 | + // Redux addition. |
|
| 73 | + if ( isset( $args['section'] ) ) { |
|
| 74 | + $this->section = $args['section']; |
|
| 75 | + $this->description = $this->section['desc'] ?? ''; |
|
| 76 | + $this->opt_name = $args['opt_name'] ?? ''; |
|
| 77 | + } |
|
| 78 | + } |
|
| 79 | 79 | |
| 80 | - /** |
|
| 81 | - * WP < 4.3 Render |
|
| 82 | - * |
|
| 83 | - * @since |
|
| 84 | - * @access protected |
|
| 85 | - */ |
|
| 86 | - protected function render() { |
|
| 87 | - if ( version_compare( $this->wp_ver, '4.3', '<' ) ) { |
|
| 88 | - $this->render_fallback(); |
|
| 89 | - } |
|
| 90 | - } |
|
| 80 | + /** |
|
| 81 | + * WP < 4.3 Render |
|
| 82 | + * |
|
| 83 | + * @since |
|
| 84 | + * @access protected |
|
| 85 | + */ |
|
| 86 | + protected function render() { |
|
| 87 | + if ( version_compare( $this->wp_ver, '4.3', '<' ) ) { |
|
| 88 | + $this->render_fallback(); |
|
| 89 | + } |
|
| 90 | + } |
|
| 91 | 91 | |
| 92 | - /** |
|
| 93 | - * Render. |
|
| 94 | - */ |
|
| 95 | - protected function render_fallback() { |
|
| 96 | - $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type ); |
|
| 92 | + /** |
|
| 93 | + * Render. |
|
| 94 | + */ |
|
| 95 | + protected function render_fallback() { |
|
| 96 | + $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type ); |
|
| 97 | 97 | |
| 98 | - ?> |
|
| 98 | + ?> |
|
| 99 | 99 | <li id="accordion-panel-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>" |
| 100 | 100 | data-width="<?php echo isset( $this->section['customizer_width'] ) ? esc_attr( $this->section['customizer_width'] ) : ''; ?>"> |
| 101 | 101 | <h3 class="accordion-section-title" tabindex="0"> |
@@ -103,19 +103,19 @@ discard block |
||
| 103 | 103 | <i class="<?php echo esc_attr( $this->section['icon'] ); ?>"></i> |
| 104 | 104 | <?php endif; ?> |
| 105 | 105 | <?php |
| 106 | - echo wp_kses( |
|
| 107 | - $this->title, |
|
| 108 | - array( |
|
| 109 | - 'em' => array(), |
|
| 110 | - 'i' => array(), |
|
| 111 | - 'strong' => array(), |
|
| 112 | - 'span' => array( |
|
| 113 | - 'class' => array(), |
|
| 114 | - 'style' => array(), |
|
| 115 | - ), |
|
| 116 | - ) |
|
| 117 | - ); |
|
| 118 | - ?> |
|
| 106 | + echo wp_kses( |
|
| 107 | + $this->title, |
|
| 108 | + array( |
|
| 109 | + 'em' => array(), |
|
| 110 | + 'i' => array(), |
|
| 111 | + 'strong' => array(), |
|
| 112 | + 'span' => array( |
|
| 113 | + 'class' => array(), |
|
| 114 | + 'style' => array(), |
|
| 115 | + ), |
|
| 116 | + ) |
|
| 117 | + ); |
|
| 118 | + ?> |
|
| 119 | 119 | <span class="screen-reader-text"><?php esc_html_e( 'Press return or enter to open this panel', 'redux-framework' ); ?></span> |
| 120 | 120 | </h3> |
| 121 | 121 | <ul class="accordion-sub-container control-panel-content"> |
@@ -125,22 +125,22 @@ discard block |
||
| 125 | 125 | </ul> |
| 126 | 126 | </li> |
| 127 | 127 | <?php |
| 128 | - } |
|
| 128 | + } |
|
| 129 | 129 | |
| 130 | - /** |
|
| 131 | - * Render the sections that have been added to the panel. |
|
| 132 | - * |
|
| 133 | - * @since 4.1.0 |
|
| 134 | - * @access protected |
|
| 135 | - */ |
|
| 136 | - protected function render_content() { |
|
| 137 | - ?> |
|
| 130 | + /** |
|
| 131 | + * Render the sections that have been added to the panel. |
|
| 132 | + * |
|
| 133 | + * @since 4.1.0 |
|
| 134 | + * @access protected |
|
| 135 | + */ |
|
| 136 | + protected function render_content() { |
|
| 137 | + ?> |
|
| 138 | 138 | <li class="panel-meta accordion-section redux-panel redux-panel-meta control-section |
| 139 | 139 | <?php |
| 140 | - if ( empty( $this->description ) ) { |
|
| 141 | - echo ' cannot-expand'; |
|
| 142 | - } |
|
| 143 | - ?> |
|
| 140 | + if ( empty( $this->description ) ) { |
|
| 141 | + echo ' cannot-expand'; |
|
| 142 | + } |
|
| 143 | + ?> |
|
| 144 | 144 | "> |
| 145 | 145 | <div class="accordion-section-title" tabindex="0"> |
| 146 | 146 | <span class="preview-notice"> |
@@ -155,47 +155,47 @@ discard block |
||
| 155 | 155 | <?php } ?> |
| 156 | 156 | </li> |
| 157 | 157 | <?php |
| 158 | - } |
|
| 158 | + } |
|
| 159 | 159 | |
| 160 | - /** |
|
| 161 | - * JSON. |
|
| 162 | - * |
|
| 163 | - * @return array |
|
| 164 | - */ |
|
| 165 | - public function json(): array { |
|
| 166 | - $array = wp_array_slice_assoc( |
|
| 167 | - parent::json(), |
|
| 168 | - array( |
|
| 169 | - 'id', |
|
| 170 | - 'title', |
|
| 171 | - 'description', |
|
| 172 | - 'priority', |
|
| 173 | - 'type', |
|
| 174 | - ) |
|
| 175 | - ); |
|
| 160 | + /** |
|
| 161 | + * JSON. |
|
| 162 | + * |
|
| 163 | + * @return array |
|
| 164 | + */ |
|
| 165 | + public function json(): array { |
|
| 166 | + $array = wp_array_slice_assoc( |
|
| 167 | + parent::json(), |
|
| 168 | + array( |
|
| 169 | + 'id', |
|
| 170 | + 'title', |
|
| 171 | + 'description', |
|
| 172 | + 'priority', |
|
| 173 | + 'type', |
|
| 174 | + ) |
|
| 175 | + ); |
|
| 176 | 176 | |
| 177 | - $array['content'] = $this->get_content(); |
|
| 178 | - $array['active'] = $this->active(); |
|
| 179 | - $array['instanceNumber'] = $this->instance_number; |
|
| 177 | + $array['content'] = $this->get_content(); |
|
| 178 | + $array['active'] = $this->active(); |
|
| 179 | + $array['instanceNumber'] = $this->instance_number; |
|
| 180 | 180 | |
| 181 | - // BEGIN Redux Additions. |
|
| 182 | - $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 183 | - $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 181 | + // BEGIN Redux Additions. |
|
| 182 | + $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 183 | + $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 184 | 184 | |
| 185 | - $array['opt_name'] = $this->opt_name; |
|
| 186 | - return $array; |
|
| 187 | - } |
|
| 185 | + $array['opt_name'] = $this->opt_name; |
|
| 186 | + return $array; |
|
| 187 | + } |
|
| 188 | 188 | |
| 189 | - /** |
|
| 190 | - * An Underscore (JS) template for this panel's content (but not its container). |
|
| 191 | - * Class variables for this panel class are available in the `data` JS object; |
|
| 192 | - * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 193 | - * |
|
| 194 | - * @see WP_Customize_Panel::print_template() |
|
| 195 | - * @since 4.3.0 |
|
| 196 | - */ |
|
| 197 | - protected function content_template() { |
|
| 198 | - ?> |
|
| 189 | + /** |
|
| 190 | + * An Underscore (JS) template for this panel's content (but not its container). |
|
| 191 | + * Class variables for this panel class are available in the `data` JS object; |
|
| 192 | + * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 193 | + * |
|
| 194 | + * @see WP_Customize_Panel::print_template() |
|
| 195 | + * @since 4.3.0 |
|
| 196 | + */ |
|
| 197 | + protected function content_template() { |
|
| 198 | + ?> |
|
| 199 | 199 | <li |
| 200 | 200 | class="panel-meta customize-info redux-customizer-opt-name redux-panel accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>" |
| 201 | 201 | data-opt-name="{{{ data.opt_name }}}"> |
@@ -223,18 +223,18 @@ discard block |
||
| 223 | 223 | <# } #> |
| 224 | 224 | </li> |
| 225 | 225 | <?php |
| 226 | - } |
|
| 226 | + } |
|
| 227 | 227 | |
| 228 | - /** |
|
| 229 | - * An Underscore (JS) template for rendering this panel's container. |
|
| 230 | - * Class variables for this panel class are available in the `data` JS object; |
|
| 231 | - * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 232 | - * |
|
| 233 | - * @see WP_Customize_Panel::print_template() |
|
| 234 | - * @since 4.3.0 |
|
| 235 | - */ |
|
| 236 | - protected function render_template() { |
|
| 237 | - ?> |
|
| 228 | + /** |
|
| 229 | + * An Underscore (JS) template for rendering this panel's container. |
|
| 230 | + * Class variables for this panel class are available in the `data` JS object; |
|
| 231 | + * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 232 | + * |
|
| 233 | + * @see WP_Customize_Panel::print_template() |
|
| 234 | + * @since 4.3.0 |
|
| 235 | + */ |
|
| 236 | + protected function render_template() { |
|
| 237 | + ?> |
|
| 238 | 238 | <li id="accordion-panel-{{ data.id }}" |
| 239 | 239 | class="accordion-section redux-panel control-section control-panel control-panel-{{ data.type }}" |
| 240 | 240 | data-width="{{ data.width }}"> |
@@ -252,5 +252,5 @@ discard block |
||
| 252 | 252 | <ul class="accordion-sub-container control-panel-content"></ul> |
| 253 | 253 | </li> |
| 254 | 254 | <?php |
| 255 | - } |
|
| 255 | + } |
|
| 256 | 256 | } |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -13,631 +13,631 @@ |
||
| 13 | 13 | // Don't duplicate me! |
| 14 | 14 | if ( ! class_exists( 'Redux_Taxonomy' ) ) { |
| 15 | 15 | |
| 16 | - /** |
|
| 17 | - * Redux Taxonomy API Class |
|
| 18 | - * Simple API for Redux Framework |
|
| 19 | - * |
|
| 20 | - * @since 1.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Taxonomy { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * Terms array. |
|
| 26 | - * |
|
| 27 | - * @var array |
|
| 28 | - */ |
|
| 29 | - public static array $terms = array(); |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Sections array. |
|
| 33 | - * |
|
| 34 | - * @var array |
|
| 35 | - */ |
|
| 36 | - public static array $sections = array(); |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * Fields array. |
|
| 40 | - * |
|
| 41 | - * @var array |
|
| 42 | - */ |
|
| 43 | - public static array $fields = array(); |
|
| 44 | - |
|
| 45 | - /** |
|
| 46 | - * Priority array. |
|
| 47 | - * |
|
| 48 | - * @var array |
|
| 49 | - */ |
|
| 50 | - public static array $priority = array(); |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * Errors array. |
|
| 54 | - * |
|
| 55 | - * @var array |
|
| 56 | - */ |
|
| 57 | - public static array $errors = array(); |
|
| 58 | - |
|
| 59 | - /** |
|
| 60 | - * Init array. |
|
| 61 | - * |
|
| 62 | - * @var array |
|
| 63 | - */ |
|
| 64 | - public static array $init = array(); |
|
| 65 | - |
|
| 66 | - /** |
|
| 67 | - * Args array. |
|
| 68 | - * |
|
| 69 | - * @var array |
|
| 70 | - */ |
|
| 71 | - public static array $args = array(); |
|
| 72 | - |
|
| 73 | - /** |
|
| 74 | - * Load. |
|
| 75 | - */ |
|
| 76 | - public static function load() { |
|
| 77 | - add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 ); |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - /** |
|
| 81 | - * Enqueue support files and fields. |
|
| 82 | - * |
|
| 83 | - * @throws ReflectionException Exception. |
|
| 84 | - */ |
|
| 85 | - public static function enqueue() { |
|
| 86 | - global $pagenow; |
|
| 87 | - |
|
| 88 | - // Check and run instances of Redux where the opt_name hasn't been run. |
|
| 89 | - $pagenows = array( 'edit-tags.php', 'term.php' ); |
|
| 90 | - |
|
| 91 | - if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) { |
|
| 92 | - $instances = Redux::all_instances(); |
|
| 93 | - |
|
| 94 | - foreach ( self::$fields as $opt_name => $fields ) { |
|
| 95 | - if ( ! isset( $instances[ $opt_name ] ) ) { |
|
| 96 | - Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) ); |
|
| 97 | - |
|
| 98 | - Redux::set_sections( |
|
| 99 | - $opt_name, |
|
| 100 | - array( |
|
| 101 | - array( |
|
| 102 | - 'id' => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name, |
|
| 103 | - 'fields' => $fields, |
|
| 104 | - 'title' => 'N/A', |
|
| 105 | - ), |
|
| 106 | - ) |
|
| 107 | - ); |
|
| 108 | - |
|
| 109 | - Redux::init( $opt_name ); |
|
| 110 | - |
|
| 111 | - $instances = ReduxFrameworkInstances::get_all_instances(); |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - self::check_opt_name( $opt_name ); |
|
| 115 | - |
|
| 116 | - Redux::set_args( $opt_name, self::$args[ $opt_name ] ); |
|
| 117 | - } |
|
| 118 | - } |
|
| 119 | - } |
|
| 120 | - |
|
| 121 | - /** |
|
| 122 | - * Construct Args. |
|
| 123 | - * |
|
| 124 | - * @param string $opt_name Panel opt_name. |
|
| 125 | - * |
|
| 126 | - * @return mixed |
|
| 127 | - */ |
|
| 128 | - public static function construct_args( string $opt_name ) { |
|
| 129 | - $args = self::$args[ $opt_name ]; |
|
| 130 | - $args['opt_name'] = $opt_name; |
|
| 131 | - |
|
| 132 | - if ( ! isset( $args['menu_title'] ) ) { |
|
| 133 | - $args['menu_title'] = ucfirst( $opt_name ) . ' Options'; |
|
| 134 | - } |
|
| 135 | - |
|
| 136 | - if ( ! isset( $args['page_title'] ) ) { |
|
| 137 | - $args['page_title'] = ucfirst( $opt_name ) . ' Options'; |
|
| 138 | - } |
|
| 139 | - |
|
| 140 | - if ( ! isset( $args['page_slug'] ) ) { |
|
| 141 | - $args['page_slug'] = $opt_name . '_options'; |
|
| 142 | - } |
|
| 143 | - |
|
| 144 | - return $args; |
|
| 145 | - } |
|
| 146 | - |
|
| 147 | - /** |
|
| 148 | - * Construct Terms |
|
| 149 | - * |
|
| 150 | - * @param string $opt_name Panel opt_name. |
|
| 151 | - * |
|
| 152 | - * @return array |
|
| 153 | - */ |
|
| 154 | - public static function construct_terms( string $opt_name ): array { |
|
| 155 | - $terms = array(); |
|
| 156 | - |
|
| 157 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 158 | - return $terms; |
|
| 159 | - } |
|
| 160 | - |
|
| 161 | - foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 162 | - $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
|
| 163 | - $terms[] = $term; |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - ksort( $terms ); |
|
| 167 | - |
|
| 168 | - return $terms; |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * Construct Sections. |
|
| 173 | - * |
|
| 174 | - * @param string $opt_name Panel opt_name. |
|
| 175 | - * @param string $term_id Term ID. |
|
| 176 | - * |
|
| 177 | - * @return array |
|
| 178 | - */ |
|
| 179 | - public static function construct_sections( string $opt_name, string $term_id ): array { |
|
| 180 | - $sections = array(); |
|
| 181 | - |
|
| 182 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 183 | - return $sections; |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - foreach ( self::$sections[ $opt_name ] as $section_id => $section ) { |
|
| 187 | - if ( $section['term_id'] === $term_id ) { |
|
| 188 | - self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section; |
|
| 189 | - |
|
| 190 | - $p = $section['priority']; |
|
| 191 | - |
|
| 192 | - while ( isset( $sections[ $p ] ) ) { |
|
| 193 | - echo esc_html( $p++ ); |
|
| 194 | - } |
|
| 195 | - |
|
| 196 | - $section['fields'] = self::construct_fields( $opt_name, $section_id ); |
|
| 197 | - $sections[ $p ] = $section; |
|
| 198 | - } |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - ksort( $sections ); |
|
| 202 | - |
|
| 203 | - return $sections; |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - /** |
|
| 207 | - * Construct Fields. |
|
| 208 | - * |
|
| 209 | - * @param string $opt_name Panel opt_name. |
|
| 210 | - * @param string $section_id Section ID. |
|
| 211 | - * @param bool $permissions Permissions. |
|
| 212 | - * @param bool $add_visibility Add visibility. |
|
| 213 | - * |
|
| 214 | - * @return array |
|
| 215 | - */ |
|
| 216 | - public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
|
| 217 | - $fields = array(); |
|
| 218 | - |
|
| 219 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 220 | - return $fields; |
|
| 221 | - } |
|
| 222 | - |
|
| 223 | - foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 224 | - // Nested permissions. |
|
| 225 | - $field['permissions'] = $field['permissions'] ?? $permissions; |
|
| 226 | - |
|
| 227 | - self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 228 | - |
|
| 229 | - // Nested add_visibility permissions. |
|
| 230 | - $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
|
| 231 | - |
|
| 232 | - self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 233 | - |
|
| 234 | - if ( $field['section_id'] === $section_id ) { |
|
| 235 | - $p = $field['priority']; |
|
| 236 | - |
|
| 237 | - while ( isset( $fields[ $p ] ) ) { |
|
| 238 | - echo esc_html( $p++ ); |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - $fields[ $p ] = $field; |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - ksort( $fields ); |
|
| 246 | - |
|
| 247 | - return $fields; |
|
| 248 | - } |
|
| 249 | - |
|
| 250 | - /** |
|
| 251 | - * Get Section. |
|
| 252 | - * |
|
| 253 | - * @param string $opt_name Panel opt_name. |
|
| 254 | - * @param string $id ID. |
|
| 255 | - * |
|
| 256 | - * @return bool |
|
| 257 | - */ |
|
| 258 | - public static function get_section( string $opt_name = '', string $id = '' ): bool { |
|
| 259 | - self::check_opt_name( $opt_name ); |
|
| 260 | - |
|
| 261 | - if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 262 | - if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 263 | - $id = strtolower( sanitize_html_class( $id ) ); |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 267 | - } |
|
| 268 | - |
|
| 269 | - return false; |
|
| 270 | - } |
|
| 271 | - |
|
| 272 | - /** |
|
| 273 | - * Set_section. |
|
| 274 | - * |
|
| 275 | - * @param string $opt_name Panel opt_name. |
|
| 276 | - * @param array $section Section array. |
|
| 277 | - */ |
|
| 278 | - public static function set_section( string $opt_name = '', array $section = array() ) { |
|
| 279 | - self::check_opt_name( $opt_name ); |
|
| 280 | - |
|
| 281 | - if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) { |
|
| 282 | - if ( ! isset( $section['id'] ) ) { |
|
| 283 | - if ( isset( $section['title'] ) ) { |
|
| 284 | - $section['id'] = strtolower( sanitize_html_class( $section['title'] ) ); |
|
| 285 | - } else { |
|
| 286 | - $section['id'] = 'section'; |
|
| 287 | - } |
|
| 288 | - |
|
| 289 | - if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 290 | - $orig = $section['id']; |
|
| 291 | - $i = 0; |
|
| 292 | - |
|
| 293 | - while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 294 | - $section['id'] = $orig . '_' . $i; |
|
| 295 | - } |
|
| 296 | - } |
|
| 297 | - } |
|
| 298 | - |
|
| 299 | - if ( ! isset( $section['priority'] ) ) { |
|
| 300 | - $section['priority'] = self::get_priority( $opt_name, 'sections' ); |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - if ( isset( $section['fields'] ) ) { |
|
| 304 | - if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) { |
|
| 305 | - if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
|
| 306 | - foreach ( $section['fields'] as $key => $field ) { |
|
| 307 | - if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
|
| 308 | - $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 309 | - } |
|
| 310 | - |
|
| 311 | - if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
|
| 312 | - $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - self::process_fields_array( $opt_name, $section['id'], $section['fields'] ); |
|
| 318 | - } |
|
| 319 | - |
|
| 320 | - unset( $section['fields'] ); |
|
| 321 | - } |
|
| 322 | - |
|
| 323 | - self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 324 | - } else { |
|
| 325 | - self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' ); |
|
| 326 | - } |
|
| 327 | - } |
|
| 328 | - |
|
| 329 | - /** |
|
| 330 | - * Process Sections Array. |
|
| 331 | - * |
|
| 332 | - * @param string $opt_name Panel opt_name. |
|
| 333 | - * @param string $term_id Term ID. |
|
| 334 | - * @param array $sections Sections array. |
|
| 335 | - */ |
|
| 336 | - public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) { |
|
| 337 | - if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) { |
|
| 338 | - foreach ( $sections as $section ) { |
|
| 339 | - if ( ! is_array( $section ) ) { |
|
| 340 | - continue; |
|
| 341 | - } |
|
| 342 | - |
|
| 343 | - $section['term_id'] = $term_id; |
|
| 344 | - |
|
| 345 | - if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) { |
|
| 346 | - $section['fields'] = array(); |
|
| 347 | - } |
|
| 348 | - |
|
| 349 | - self::set_section( $opt_name, $section ); |
|
| 350 | - } |
|
| 351 | - } |
|
| 352 | - } |
|
| 353 | - |
|
| 354 | - /** |
|
| 355 | - * Process field array. |
|
| 356 | - * |
|
| 357 | - * @param string $opt_name Panel opt_name. |
|
| 358 | - * @param string $section_id Section ID. |
|
| 359 | - * @param array $fields Fields array. |
|
| 360 | - */ |
|
| 361 | - public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) { |
|
| 362 | - if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) { |
|
| 363 | - foreach ( $fields as $field ) { |
|
| 364 | - if ( ! is_array( $field ) ) { |
|
| 365 | - continue; |
|
| 366 | - } |
|
| 367 | - |
|
| 368 | - $field['section_id'] = $section_id; |
|
| 369 | - |
|
| 370 | - self::set_field( $opt_name, $field ); |
|
| 371 | - } |
|
| 372 | - } |
|
| 373 | - } |
|
| 374 | - |
|
| 375 | - /** |
|
| 376 | - * Get field. |
|
| 377 | - * |
|
| 378 | - * @param string $opt_name Panel opt_name. |
|
| 379 | - * @param string $id ID. |
|
| 380 | - * |
|
| 381 | - * @return bool |
|
| 382 | - */ |
|
| 383 | - public static function get_field( string $opt_name = '', string $id = '' ): bool { |
|
| 384 | - self::check_opt_name( $opt_name ); |
|
| 385 | - |
|
| 386 | - if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 387 | - return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 388 | - } |
|
| 389 | - |
|
| 390 | - return false; |
|
| 391 | - } |
|
| 392 | - |
|
| 393 | - /** |
|
| 394 | - * Set field. |
|
| 395 | - * |
|
| 396 | - * @param string $opt_name Panel opt_name. |
|
| 397 | - * @param array $field Field array. |
|
| 398 | - */ |
|
| 399 | - public static function set_field( string $opt_name = '', array $field = array() ) { |
|
| 400 | - self::check_opt_name( $opt_name ); |
|
| 401 | - |
|
| 402 | - if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) { |
|
| 403 | - if ( ! isset( $field['priority'] ) ) { |
|
| 404 | - $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
|
| 405 | - } |
|
| 406 | - |
|
| 407 | - self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 408 | - } |
|
| 409 | - } |
|
| 410 | - |
|
| 411 | - /** |
|
| 412 | - * Set args. |
|
| 413 | - * |
|
| 414 | - * @param string $opt_name Panel opt_name. |
|
| 415 | - * @param array $args Args array. |
|
| 416 | - */ |
|
| 417 | - public static function set_args( string $opt_name = '', array $args = array() ) { |
|
| 418 | - self::check_opt_name( $opt_name ); |
|
| 419 | - |
|
| 420 | - if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
|
| 421 | - self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | - self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 423 | - } |
|
| 424 | - } |
|
| 425 | - |
|
| 426 | - /** |
|
| 427 | - * Set term. |
|
| 428 | - * |
|
| 429 | - * @param string $opt_name Panel opt_name. |
|
| 430 | - * @param array $term Term array. |
|
| 431 | - */ |
|
| 432 | - public static function set_term( string $opt_name = '', array $term = array() ) { |
|
| 433 | - self::check_opt_name( $opt_name ); |
|
| 434 | - |
|
| 435 | - if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) { |
|
| 436 | - if ( ! isset( $term['id'] ) ) { |
|
| 437 | - if ( isset( $term['title'] ) ) { |
|
| 438 | - $term['id'] = strtolower( sanitize_html_class( $term['title'] ) ); |
|
| 439 | - } else { |
|
| 440 | - $term['id'] = 'term'; |
|
| 441 | - } |
|
| 442 | - |
|
| 443 | - if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 444 | - $orig = $term['id']; |
|
| 445 | - $i = 0; |
|
| 446 | - |
|
| 447 | - while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 448 | - $term['id'] = $orig . '_' . $i; |
|
| 449 | - } |
|
| 450 | - } |
|
| 451 | - } |
|
| 452 | - |
|
| 453 | - if ( isset( $term['sections'] ) ) { |
|
| 454 | - if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) { |
|
| 455 | - if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
|
| 456 | - foreach ( $term['sections'] as $key => $section ) { |
|
| 457 | - if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
|
| 458 | - $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 459 | - } |
|
| 460 | - |
|
| 461 | - if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
|
| 462 | - $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 463 | - } |
|
| 464 | - } |
|
| 465 | - } |
|
| 466 | - |
|
| 467 | - self::process_sections_array( $opt_name, $term['id'], $term['sections'] ); |
|
| 468 | - } |
|
| 469 | - |
|
| 470 | - unset( $term['sections'] ); |
|
| 471 | - } |
|
| 472 | - |
|
| 473 | - self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 474 | - } else { |
|
| 475 | - self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | - } |
|
| 477 | - } |
|
| 478 | - |
|
| 479 | - /** |
|
| 480 | - * Get terms. |
|
| 481 | - * |
|
| 482 | - * @param string $opt_name Panel opt_name. |
|
| 483 | - * |
|
| 484 | - * @return mixed |
|
| 485 | - */ |
|
| 486 | - public static function get_terms( string $opt_name = '' ) { |
|
| 487 | - self::check_opt_name( $opt_name ); |
|
| 488 | - |
|
| 489 | - if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | - return self::$terms[ $opt_name ]; |
|
| 491 | - } |
|
| 492 | - |
|
| 493 | - return false; |
|
| 494 | - } |
|
| 495 | - |
|
| 496 | - /** |
|
| 497 | - * Get priority. |
|
| 498 | - * |
|
| 499 | - * @param string $opt_name Panel opt_name. |
|
| 500 | - * @param string $type Field type. |
|
| 501 | - * |
|
| 502 | - * @return mixed |
|
| 503 | - */ |
|
| 504 | - public static function get_priority( string $opt_name, string $type ) { |
|
| 505 | - $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | - self::$priority[ $opt_name ][ $type ] += 1; |
|
| 507 | - |
|
| 508 | - return $priority; |
|
| 509 | - } |
|
| 510 | - |
|
| 511 | - /** |
|
| 512 | - * Check opt_name. |
|
| 513 | - * |
|
| 514 | - * @param string $opt_name Panel opt_name. |
|
| 515 | - */ |
|
| 516 | - public static function check_opt_name( string $opt_name = '' ) { |
|
| 517 | - if ( empty( $opt_name ) || is_array( $opt_name ) ) { |
|
| 518 | - return; |
|
| 519 | - } |
|
| 520 | - |
|
| 521 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | - self::$terms[ $opt_name ] = array(); |
|
| 523 | - } |
|
| 524 | - |
|
| 525 | - if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | - self::$priority[ $opt_name ]['args'] = 1; |
|
| 527 | - } |
|
| 528 | - |
|
| 529 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | - self::$sections[ $opt_name ] = array(); |
|
| 531 | - self::$priority[ $opt_name ]['sections'] = 1; |
|
| 532 | - } |
|
| 533 | - |
|
| 534 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | - self::$fields[ $opt_name ] = array(); |
|
| 536 | - self::$priority[ $opt_name ]['fields'] = 1; |
|
| 537 | - } |
|
| 538 | - |
|
| 539 | - if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | - self::$errors[ $opt_name ] = array(); |
|
| 541 | - } |
|
| 542 | - |
|
| 543 | - if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | - self::$init[ $opt_name ] = false; |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | - self::$args[ $opt_name ] = false; |
|
| 549 | - } |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - /** |
|
| 553 | - * Get field defaults. |
|
| 554 | - * |
|
| 555 | - * @param string $opt_name Panel opt_name. |
|
| 556 | - * |
|
| 557 | - * @return array|void |
|
| 558 | - */ |
|
| 559 | - public static function get_field_defaults( string $opt_name ) { |
|
| 560 | - if ( empty( $opt_name ) ) { |
|
| 561 | - return; |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 565 | - return array(); |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | - return array_map( |
|
| 569 | - function ( $field ) { |
|
| 570 | - return $field['default'] ?? ''; |
|
| 571 | - }, |
|
| 572 | - self::$fields[ $opt_name ] |
|
| 573 | - ); |
|
| 574 | - } |
|
| 575 | - |
|
| 576 | - /** |
|
| 577 | - * Get term meta. |
|
| 578 | - * |
|
| 579 | - * @param array $args Args array. |
|
| 580 | - * |
|
| 581 | - * @return array|mixed|string |
|
| 582 | - */ |
|
| 583 | - public static function get_term_meta( array $args = array() ) { |
|
| 584 | - $default = array( |
|
| 585 | - 'key' => '', |
|
| 586 | - 'opt_name' => '', |
|
| 587 | - 'taxonomy' => '', |
|
| 588 | - ); |
|
| 589 | - |
|
| 590 | - $args = wp_parse_args( $args, $default ); |
|
| 591 | - |
|
| 592 | - // phpcs:ignore WordPress.PHP.DontExtract |
|
| 593 | - extract( $args ); |
|
| 594 | - |
|
| 595 | - if ( empty( $taxonomy ) ) { |
|
| 596 | - return array(); |
|
| 597 | - } |
|
| 598 | - |
|
| 599 | - $single = ! empty( $key ); |
|
| 600 | - |
|
| 601 | - $meta = get_term_meta( $taxonomy, $key, $single ); |
|
| 602 | - |
|
| 603 | - // phpcs:ignore Generic.CodeAnalysis.EmptyStatement |
|
| 604 | - if ( $single ) { |
|
| 605 | - // Do nothing. |
|
| 606 | - } elseif ( ! empty( $meta ) ) { |
|
| 607 | - foreach ( $meta as $key => $value ) { |
|
| 608 | - if ( is_array( $value ) ) { |
|
| 609 | - $value = $value[0]; |
|
| 610 | - } |
|
| 611 | - |
|
| 612 | - $meta[ $key ] = maybe_unserialize( $value ); |
|
| 613 | - } |
|
| 614 | - } |
|
| 615 | - |
|
| 616 | - if ( ! empty( $opt_name ) ) { |
|
| 617 | - $defaults = self::get_field_defaults( $opt_name ); |
|
| 618 | - |
|
| 619 | - if ( $single ) { |
|
| 620 | - $default_value = ''; |
|
| 621 | - |
|
| 622 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | - $default_value = $defaults[ $key ]; |
|
| 624 | - } |
|
| 625 | - |
|
| 626 | - if ( is_array( $meta ) ) { |
|
| 627 | - if ( is_array( $default_value ) ) { |
|
| 628 | - $meta = wp_parse_args( $meta, $default_value ); |
|
| 629 | - } |
|
| 630 | - } elseif ( '' === $meta && '' !== $default_value ) { |
|
| 631 | - $meta = $default_value; |
|
| 632 | - } |
|
| 633 | - } else { |
|
| 634 | - $meta = wp_parse_args( $meta, $defaults ); |
|
| 635 | - } |
|
| 636 | - } |
|
| 637 | - |
|
| 638 | - return $meta; |
|
| 639 | - } |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - Redux_Taxonomy::load(); |
|
| 16 | + /** |
|
| 17 | + * Redux Taxonomy API Class |
|
| 18 | + * Simple API for Redux Framework |
|
| 19 | + * |
|
| 20 | + * @since 1.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Taxonomy { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * Terms array. |
|
| 26 | + * |
|
| 27 | + * @var array |
|
| 28 | + */ |
|
| 29 | + public static array $terms = array(); |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Sections array. |
|
| 33 | + * |
|
| 34 | + * @var array |
|
| 35 | + */ |
|
| 36 | + public static array $sections = array(); |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * Fields array. |
|
| 40 | + * |
|
| 41 | + * @var array |
|
| 42 | + */ |
|
| 43 | + public static array $fields = array(); |
|
| 44 | + |
|
| 45 | + /** |
|
| 46 | + * Priority array. |
|
| 47 | + * |
|
| 48 | + * @var array |
|
| 49 | + */ |
|
| 50 | + public static array $priority = array(); |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * Errors array. |
|
| 54 | + * |
|
| 55 | + * @var array |
|
| 56 | + */ |
|
| 57 | + public static array $errors = array(); |
|
| 58 | + |
|
| 59 | + /** |
|
| 60 | + * Init array. |
|
| 61 | + * |
|
| 62 | + * @var array |
|
| 63 | + */ |
|
| 64 | + public static array $init = array(); |
|
| 65 | + |
|
| 66 | + /** |
|
| 67 | + * Args array. |
|
| 68 | + * |
|
| 69 | + * @var array |
|
| 70 | + */ |
|
| 71 | + public static array $args = array(); |
|
| 72 | + |
|
| 73 | + /** |
|
| 74 | + * Load. |
|
| 75 | + */ |
|
| 76 | + public static function load() { |
|
| 77 | + add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 ); |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + /** |
|
| 81 | + * Enqueue support files and fields. |
|
| 82 | + * |
|
| 83 | + * @throws ReflectionException Exception. |
|
| 84 | + */ |
|
| 85 | + public static function enqueue() { |
|
| 86 | + global $pagenow; |
|
| 87 | + |
|
| 88 | + // Check and run instances of Redux where the opt_name hasn't been run. |
|
| 89 | + $pagenows = array( 'edit-tags.php', 'term.php' ); |
|
| 90 | + |
|
| 91 | + if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) { |
|
| 92 | + $instances = Redux::all_instances(); |
|
| 93 | + |
|
| 94 | + foreach ( self::$fields as $opt_name => $fields ) { |
|
| 95 | + if ( ! isset( $instances[ $opt_name ] ) ) { |
|
| 96 | + Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) ); |
|
| 97 | + |
|
| 98 | + Redux::set_sections( |
|
| 99 | + $opt_name, |
|
| 100 | + array( |
|
| 101 | + array( |
|
| 102 | + 'id' => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name, |
|
| 103 | + 'fields' => $fields, |
|
| 104 | + 'title' => 'N/A', |
|
| 105 | + ), |
|
| 106 | + ) |
|
| 107 | + ); |
|
| 108 | + |
|
| 109 | + Redux::init( $opt_name ); |
|
| 110 | + |
|
| 111 | + $instances = ReduxFrameworkInstances::get_all_instances(); |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + self::check_opt_name( $opt_name ); |
|
| 115 | + |
|
| 116 | + Redux::set_args( $opt_name, self::$args[ $opt_name ] ); |
|
| 117 | + } |
|
| 118 | + } |
|
| 119 | + } |
|
| 120 | + |
|
| 121 | + /** |
|
| 122 | + * Construct Args. |
|
| 123 | + * |
|
| 124 | + * @param string $opt_name Panel opt_name. |
|
| 125 | + * |
|
| 126 | + * @return mixed |
|
| 127 | + */ |
|
| 128 | + public static function construct_args( string $opt_name ) { |
|
| 129 | + $args = self::$args[ $opt_name ]; |
|
| 130 | + $args['opt_name'] = $opt_name; |
|
| 131 | + |
|
| 132 | + if ( ! isset( $args['menu_title'] ) ) { |
|
| 133 | + $args['menu_title'] = ucfirst( $opt_name ) . ' Options'; |
|
| 134 | + } |
|
| 135 | + |
|
| 136 | + if ( ! isset( $args['page_title'] ) ) { |
|
| 137 | + $args['page_title'] = ucfirst( $opt_name ) . ' Options'; |
|
| 138 | + } |
|
| 139 | + |
|
| 140 | + if ( ! isset( $args['page_slug'] ) ) { |
|
| 141 | + $args['page_slug'] = $opt_name . '_options'; |
|
| 142 | + } |
|
| 143 | + |
|
| 144 | + return $args; |
|
| 145 | + } |
|
| 146 | + |
|
| 147 | + /** |
|
| 148 | + * Construct Terms |
|
| 149 | + * |
|
| 150 | + * @param string $opt_name Panel opt_name. |
|
| 151 | + * |
|
| 152 | + * @return array |
|
| 153 | + */ |
|
| 154 | + public static function construct_terms( string $opt_name ): array { |
|
| 155 | + $terms = array(); |
|
| 156 | + |
|
| 157 | + if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 158 | + return $terms; |
|
| 159 | + } |
|
| 160 | + |
|
| 161 | + foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 162 | + $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
|
| 163 | + $terms[] = $term; |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + ksort( $terms ); |
|
| 167 | + |
|
| 168 | + return $terms; |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * Construct Sections. |
|
| 173 | + * |
|
| 174 | + * @param string $opt_name Panel opt_name. |
|
| 175 | + * @param string $term_id Term ID. |
|
| 176 | + * |
|
| 177 | + * @return array |
|
| 178 | + */ |
|
| 179 | + public static function construct_sections( string $opt_name, string $term_id ): array { |
|
| 180 | + $sections = array(); |
|
| 181 | + |
|
| 182 | + if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 183 | + return $sections; |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + foreach ( self::$sections[ $opt_name ] as $section_id => $section ) { |
|
| 187 | + if ( $section['term_id'] === $term_id ) { |
|
| 188 | + self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section; |
|
| 189 | + |
|
| 190 | + $p = $section['priority']; |
|
| 191 | + |
|
| 192 | + while ( isset( $sections[ $p ] ) ) { |
|
| 193 | + echo esc_html( $p++ ); |
|
| 194 | + } |
|
| 195 | + |
|
| 196 | + $section['fields'] = self::construct_fields( $opt_name, $section_id ); |
|
| 197 | + $sections[ $p ] = $section; |
|
| 198 | + } |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + ksort( $sections ); |
|
| 202 | + |
|
| 203 | + return $sections; |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + /** |
|
| 207 | + * Construct Fields. |
|
| 208 | + * |
|
| 209 | + * @param string $opt_name Panel opt_name. |
|
| 210 | + * @param string $section_id Section ID. |
|
| 211 | + * @param bool $permissions Permissions. |
|
| 212 | + * @param bool $add_visibility Add visibility. |
|
| 213 | + * |
|
| 214 | + * @return array |
|
| 215 | + */ |
|
| 216 | + public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
|
| 217 | + $fields = array(); |
|
| 218 | + |
|
| 219 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 220 | + return $fields; |
|
| 221 | + } |
|
| 222 | + |
|
| 223 | + foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 224 | + // Nested permissions. |
|
| 225 | + $field['permissions'] = $field['permissions'] ?? $permissions; |
|
| 226 | + |
|
| 227 | + self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 228 | + |
|
| 229 | + // Nested add_visibility permissions. |
|
| 230 | + $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
|
| 231 | + |
|
| 232 | + self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 233 | + |
|
| 234 | + if ( $field['section_id'] === $section_id ) { |
|
| 235 | + $p = $field['priority']; |
|
| 236 | + |
|
| 237 | + while ( isset( $fields[ $p ] ) ) { |
|
| 238 | + echo esc_html( $p++ ); |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + $fields[ $p ] = $field; |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + ksort( $fields ); |
|
| 246 | + |
|
| 247 | + return $fields; |
|
| 248 | + } |
|
| 249 | + |
|
| 250 | + /** |
|
| 251 | + * Get Section. |
|
| 252 | + * |
|
| 253 | + * @param string $opt_name Panel opt_name. |
|
| 254 | + * @param string $id ID. |
|
| 255 | + * |
|
| 256 | + * @return bool |
|
| 257 | + */ |
|
| 258 | + public static function get_section( string $opt_name = '', string $id = '' ): bool { |
|
| 259 | + self::check_opt_name( $opt_name ); |
|
| 260 | + |
|
| 261 | + if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 262 | + if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 263 | + $id = strtolower( sanitize_html_class( $id ) ); |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 267 | + } |
|
| 268 | + |
|
| 269 | + return false; |
|
| 270 | + } |
|
| 271 | + |
|
| 272 | + /** |
|
| 273 | + * Set_section. |
|
| 274 | + * |
|
| 275 | + * @param string $opt_name Panel opt_name. |
|
| 276 | + * @param array $section Section array. |
|
| 277 | + */ |
|
| 278 | + public static function set_section( string $opt_name = '', array $section = array() ) { |
|
| 279 | + self::check_opt_name( $opt_name ); |
|
| 280 | + |
|
| 281 | + if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) { |
|
| 282 | + if ( ! isset( $section['id'] ) ) { |
|
| 283 | + if ( isset( $section['title'] ) ) { |
|
| 284 | + $section['id'] = strtolower( sanitize_html_class( $section['title'] ) ); |
|
| 285 | + } else { |
|
| 286 | + $section['id'] = 'section'; |
|
| 287 | + } |
|
| 288 | + |
|
| 289 | + if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 290 | + $orig = $section['id']; |
|
| 291 | + $i = 0; |
|
| 292 | + |
|
| 293 | + while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 294 | + $section['id'] = $orig . '_' . $i; |
|
| 295 | + } |
|
| 296 | + } |
|
| 297 | + } |
|
| 298 | + |
|
| 299 | + if ( ! isset( $section['priority'] ) ) { |
|
| 300 | + $section['priority'] = self::get_priority( $opt_name, 'sections' ); |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + if ( isset( $section['fields'] ) ) { |
|
| 304 | + if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) { |
|
| 305 | + if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
|
| 306 | + foreach ( $section['fields'] as $key => $field ) { |
|
| 307 | + if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
|
| 308 | + $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 309 | + } |
|
| 310 | + |
|
| 311 | + if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
|
| 312 | + $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + self::process_fields_array( $opt_name, $section['id'], $section['fields'] ); |
|
| 318 | + } |
|
| 319 | + |
|
| 320 | + unset( $section['fields'] ); |
|
| 321 | + } |
|
| 322 | + |
|
| 323 | + self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 324 | + } else { |
|
| 325 | + self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' ); |
|
| 326 | + } |
|
| 327 | + } |
|
| 328 | + |
|
| 329 | + /** |
|
| 330 | + * Process Sections Array. |
|
| 331 | + * |
|
| 332 | + * @param string $opt_name Panel opt_name. |
|
| 333 | + * @param string $term_id Term ID. |
|
| 334 | + * @param array $sections Sections array. |
|
| 335 | + */ |
|
| 336 | + public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) { |
|
| 337 | + if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) { |
|
| 338 | + foreach ( $sections as $section ) { |
|
| 339 | + if ( ! is_array( $section ) ) { |
|
| 340 | + continue; |
|
| 341 | + } |
|
| 342 | + |
|
| 343 | + $section['term_id'] = $term_id; |
|
| 344 | + |
|
| 345 | + if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) { |
|
| 346 | + $section['fields'] = array(); |
|
| 347 | + } |
|
| 348 | + |
|
| 349 | + self::set_section( $opt_name, $section ); |
|
| 350 | + } |
|
| 351 | + } |
|
| 352 | + } |
|
| 353 | + |
|
| 354 | + /** |
|
| 355 | + * Process field array. |
|
| 356 | + * |
|
| 357 | + * @param string $opt_name Panel opt_name. |
|
| 358 | + * @param string $section_id Section ID. |
|
| 359 | + * @param array $fields Fields array. |
|
| 360 | + */ |
|
| 361 | + public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) { |
|
| 362 | + if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) { |
|
| 363 | + foreach ( $fields as $field ) { |
|
| 364 | + if ( ! is_array( $field ) ) { |
|
| 365 | + continue; |
|
| 366 | + } |
|
| 367 | + |
|
| 368 | + $field['section_id'] = $section_id; |
|
| 369 | + |
|
| 370 | + self::set_field( $opt_name, $field ); |
|
| 371 | + } |
|
| 372 | + } |
|
| 373 | + } |
|
| 374 | + |
|
| 375 | + /** |
|
| 376 | + * Get field. |
|
| 377 | + * |
|
| 378 | + * @param string $opt_name Panel opt_name. |
|
| 379 | + * @param string $id ID. |
|
| 380 | + * |
|
| 381 | + * @return bool |
|
| 382 | + */ |
|
| 383 | + public static function get_field( string $opt_name = '', string $id = '' ): bool { |
|
| 384 | + self::check_opt_name( $opt_name ); |
|
| 385 | + |
|
| 386 | + if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 387 | + return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 388 | + } |
|
| 389 | + |
|
| 390 | + return false; |
|
| 391 | + } |
|
| 392 | + |
|
| 393 | + /** |
|
| 394 | + * Set field. |
|
| 395 | + * |
|
| 396 | + * @param string $opt_name Panel opt_name. |
|
| 397 | + * @param array $field Field array. |
|
| 398 | + */ |
|
| 399 | + public static function set_field( string $opt_name = '', array $field = array() ) { |
|
| 400 | + self::check_opt_name( $opt_name ); |
|
| 401 | + |
|
| 402 | + if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) { |
|
| 403 | + if ( ! isset( $field['priority'] ) ) { |
|
| 404 | + $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
|
| 405 | + } |
|
| 406 | + |
|
| 407 | + self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 408 | + } |
|
| 409 | + } |
|
| 410 | + |
|
| 411 | + /** |
|
| 412 | + * Set args. |
|
| 413 | + * |
|
| 414 | + * @param string $opt_name Panel opt_name. |
|
| 415 | + * @param array $args Args array. |
|
| 416 | + */ |
|
| 417 | + public static function set_args( string $opt_name = '', array $args = array() ) { |
|
| 418 | + self::check_opt_name( $opt_name ); |
|
| 419 | + |
|
| 420 | + if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
|
| 421 | + self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | + self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 423 | + } |
|
| 424 | + } |
|
| 425 | + |
|
| 426 | + /** |
|
| 427 | + * Set term. |
|
| 428 | + * |
|
| 429 | + * @param string $opt_name Panel opt_name. |
|
| 430 | + * @param array $term Term array. |
|
| 431 | + */ |
|
| 432 | + public static function set_term( string $opt_name = '', array $term = array() ) { |
|
| 433 | + self::check_opt_name( $opt_name ); |
|
| 434 | + |
|
| 435 | + if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) { |
|
| 436 | + if ( ! isset( $term['id'] ) ) { |
|
| 437 | + if ( isset( $term['title'] ) ) { |
|
| 438 | + $term['id'] = strtolower( sanitize_html_class( $term['title'] ) ); |
|
| 439 | + } else { |
|
| 440 | + $term['id'] = 'term'; |
|
| 441 | + } |
|
| 442 | + |
|
| 443 | + if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 444 | + $orig = $term['id']; |
|
| 445 | + $i = 0; |
|
| 446 | + |
|
| 447 | + while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 448 | + $term['id'] = $orig . '_' . $i; |
|
| 449 | + } |
|
| 450 | + } |
|
| 451 | + } |
|
| 452 | + |
|
| 453 | + if ( isset( $term['sections'] ) ) { |
|
| 454 | + if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) { |
|
| 455 | + if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
|
| 456 | + foreach ( $term['sections'] as $key => $section ) { |
|
| 457 | + if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
|
| 458 | + $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 459 | + } |
|
| 460 | + |
|
| 461 | + if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
|
| 462 | + $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 463 | + } |
|
| 464 | + } |
|
| 465 | + } |
|
| 466 | + |
|
| 467 | + self::process_sections_array( $opt_name, $term['id'], $term['sections'] ); |
|
| 468 | + } |
|
| 469 | + |
|
| 470 | + unset( $term['sections'] ); |
|
| 471 | + } |
|
| 472 | + |
|
| 473 | + self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 474 | + } else { |
|
| 475 | + self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | + } |
|
| 477 | + } |
|
| 478 | + |
|
| 479 | + /** |
|
| 480 | + * Get terms. |
|
| 481 | + * |
|
| 482 | + * @param string $opt_name Panel opt_name. |
|
| 483 | + * |
|
| 484 | + * @return mixed |
|
| 485 | + */ |
|
| 486 | + public static function get_terms( string $opt_name = '' ) { |
|
| 487 | + self::check_opt_name( $opt_name ); |
|
| 488 | + |
|
| 489 | + if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | + return self::$terms[ $opt_name ]; |
|
| 491 | + } |
|
| 492 | + |
|
| 493 | + return false; |
|
| 494 | + } |
|
| 495 | + |
|
| 496 | + /** |
|
| 497 | + * Get priority. |
|
| 498 | + * |
|
| 499 | + * @param string $opt_name Panel opt_name. |
|
| 500 | + * @param string $type Field type. |
|
| 501 | + * |
|
| 502 | + * @return mixed |
|
| 503 | + */ |
|
| 504 | + public static function get_priority( string $opt_name, string $type ) { |
|
| 505 | + $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | + self::$priority[ $opt_name ][ $type ] += 1; |
|
| 507 | + |
|
| 508 | + return $priority; |
|
| 509 | + } |
|
| 510 | + |
|
| 511 | + /** |
|
| 512 | + * Check opt_name. |
|
| 513 | + * |
|
| 514 | + * @param string $opt_name Panel opt_name. |
|
| 515 | + */ |
|
| 516 | + public static function check_opt_name( string $opt_name = '' ) { |
|
| 517 | + if ( empty( $opt_name ) || is_array( $opt_name ) ) { |
|
| 518 | + return; |
|
| 519 | + } |
|
| 520 | + |
|
| 521 | + if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | + self::$terms[ $opt_name ] = array(); |
|
| 523 | + } |
|
| 524 | + |
|
| 525 | + if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | + self::$priority[ $opt_name ]['args'] = 1; |
|
| 527 | + } |
|
| 528 | + |
|
| 529 | + if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | + self::$sections[ $opt_name ] = array(); |
|
| 531 | + self::$priority[ $opt_name ]['sections'] = 1; |
|
| 532 | + } |
|
| 533 | + |
|
| 534 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | + self::$fields[ $opt_name ] = array(); |
|
| 536 | + self::$priority[ $opt_name ]['fields'] = 1; |
|
| 537 | + } |
|
| 538 | + |
|
| 539 | + if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | + self::$errors[ $opt_name ] = array(); |
|
| 541 | + } |
|
| 542 | + |
|
| 543 | + if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | + self::$init[ $opt_name ] = false; |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | + self::$args[ $opt_name ] = false; |
|
| 549 | + } |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + /** |
|
| 553 | + * Get field defaults. |
|
| 554 | + * |
|
| 555 | + * @param string $opt_name Panel opt_name. |
|
| 556 | + * |
|
| 557 | + * @return array|void |
|
| 558 | + */ |
|
| 559 | + public static function get_field_defaults( string $opt_name ) { |
|
| 560 | + if ( empty( $opt_name ) ) { |
|
| 561 | + return; |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 565 | + return array(); |
|
| 566 | + } |
|
| 567 | + |
|
| 568 | + return array_map( |
|
| 569 | + function ( $field ) { |
|
| 570 | + return $field['default'] ?? ''; |
|
| 571 | + }, |
|
| 572 | + self::$fields[ $opt_name ] |
|
| 573 | + ); |
|
| 574 | + } |
|
| 575 | + |
|
| 576 | + /** |
|
| 577 | + * Get term meta. |
|
| 578 | + * |
|
| 579 | + * @param array $args Args array. |
|
| 580 | + * |
|
| 581 | + * @return array|mixed|string |
|
| 582 | + */ |
|
| 583 | + public static function get_term_meta( array $args = array() ) { |
|
| 584 | + $default = array( |
|
| 585 | + 'key' => '', |
|
| 586 | + 'opt_name' => '', |
|
| 587 | + 'taxonomy' => '', |
|
| 588 | + ); |
|
| 589 | + |
|
| 590 | + $args = wp_parse_args( $args, $default ); |
|
| 591 | + |
|
| 592 | + // phpcs:ignore WordPress.PHP.DontExtract |
|
| 593 | + extract( $args ); |
|
| 594 | + |
|
| 595 | + if ( empty( $taxonomy ) ) { |
|
| 596 | + return array(); |
|
| 597 | + } |
|
| 598 | + |
|
| 599 | + $single = ! empty( $key ); |
|
| 600 | + |
|
| 601 | + $meta = get_term_meta( $taxonomy, $key, $single ); |
|
| 602 | + |
|
| 603 | + // phpcs:ignore Generic.CodeAnalysis.EmptyStatement |
|
| 604 | + if ( $single ) { |
|
| 605 | + // Do nothing. |
|
| 606 | + } elseif ( ! empty( $meta ) ) { |
|
| 607 | + foreach ( $meta as $key => $value ) { |
|
| 608 | + if ( is_array( $value ) ) { |
|
| 609 | + $value = $value[0]; |
|
| 610 | + } |
|
| 611 | + |
|
| 612 | + $meta[ $key ] = maybe_unserialize( $value ); |
|
| 613 | + } |
|
| 614 | + } |
|
| 615 | + |
|
| 616 | + if ( ! empty( $opt_name ) ) { |
|
| 617 | + $defaults = self::get_field_defaults( $opt_name ); |
|
| 618 | + |
|
| 619 | + if ( $single ) { |
|
| 620 | + $default_value = ''; |
|
| 621 | + |
|
| 622 | + if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | + $default_value = $defaults[ $key ]; |
|
| 624 | + } |
|
| 625 | + |
|
| 626 | + if ( is_array( $meta ) ) { |
|
| 627 | + if ( is_array( $default_value ) ) { |
|
| 628 | + $meta = wp_parse_args( $meta, $default_value ); |
|
| 629 | + } |
|
| 630 | + } elseif ( '' === $meta && '' !== $default_value ) { |
|
| 631 | + $meta = $default_value; |
|
| 632 | + } |
|
| 633 | + } else { |
|
| 634 | + $meta = wp_parse_args( $meta, $defaults ); |
|
| 635 | + } |
|
| 636 | + } |
|
| 637 | + |
|
| 638 | + return $meta; |
|
| 639 | + } |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + Redux_Taxonomy::load(); |
|
| 643 | 643 | } |
@@ -92,7 +92,7 @@ discard block |
||
| 92 | 92 | $instances = Redux::all_instances(); |
| 93 | 93 | |
| 94 | 94 | foreach ( self::$fields as $opt_name => $fields ) { |
| 95 | - if ( ! isset( $instances[ $opt_name ] ) ) { |
|
| 95 | + if ( ! isset( $instances[$opt_name] ) ) { |
|
| 96 | 96 | Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) ); |
| 97 | 97 | |
| 98 | 98 | Redux::set_sections( |
@@ -113,7 +113,7 @@ discard block |
||
| 113 | 113 | |
| 114 | 114 | self::check_opt_name( $opt_name ); |
| 115 | 115 | |
| 116 | - Redux::set_args( $opt_name, self::$args[ $opt_name ] ); |
|
| 116 | + Redux::set_args( $opt_name, self::$args[$opt_name] ); |
|
| 117 | 117 | } |
| 118 | 118 | } |
| 119 | 119 | } |
@@ -126,7 +126,7 @@ discard block |
||
| 126 | 126 | * @return mixed |
| 127 | 127 | */ |
| 128 | 128 | public static function construct_args( string $opt_name ) { |
| 129 | - $args = self::$args[ $opt_name ]; |
|
| 129 | + $args = self::$args[$opt_name]; |
|
| 130 | 130 | $args['opt_name'] = $opt_name; |
| 131 | 131 | |
| 132 | 132 | if ( ! isset( $args['menu_title'] ) ) { |
@@ -154,11 +154,11 @@ discard block |
||
| 154 | 154 | public static function construct_terms( string $opt_name ): array { |
| 155 | 155 | $terms = array(); |
| 156 | 156 | |
| 157 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 157 | + if ( ! isset( self::$terms[$opt_name] ) ) { |
|
| 158 | 158 | return $terms; |
| 159 | 159 | } |
| 160 | 160 | |
| 161 | - foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 161 | + foreach ( self::$terms[$opt_name] as $term ) { |
|
| 162 | 162 | $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
| 163 | 163 | $terms[] = $term; |
| 164 | 164 | } |
@@ -179,22 +179,22 @@ discard block |
||
| 179 | 179 | public static function construct_sections( string $opt_name, string $term_id ): array { |
| 180 | 180 | $sections = array(); |
| 181 | 181 | |
| 182 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 182 | + if ( ! isset( self::$sections[$opt_name] ) ) { |
|
| 183 | 183 | return $sections; |
| 184 | 184 | } |
| 185 | 185 | |
| 186 | - foreach ( self::$sections[ $opt_name ] as $section_id => $section ) { |
|
| 186 | + foreach ( self::$sections[$opt_name] as $section_id => $section ) { |
|
| 187 | 187 | if ( $section['term_id'] === $term_id ) { |
| 188 | - self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section; |
|
| 188 | + self::$sections[$opt_name][$section_id]['add_visibility'] = $section; |
|
| 189 | 189 | |
| 190 | 190 | $p = $section['priority']; |
| 191 | 191 | |
| 192 | - while ( isset( $sections[ $p ] ) ) { |
|
| 192 | + while ( isset( $sections[$p] ) ) { |
|
| 193 | 193 | echo esc_html( $p++ ); |
| 194 | 194 | } |
| 195 | 195 | |
| 196 | 196 | $section['fields'] = self::construct_fields( $opt_name, $section_id ); |
| 197 | - $sections[ $p ] = $section; |
|
| 197 | + $sections[$p] = $section; |
|
| 198 | 198 | } |
| 199 | 199 | } |
| 200 | 200 | |
@@ -216,29 +216,29 @@ discard block |
||
| 216 | 216 | public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
| 217 | 217 | $fields = array(); |
| 218 | 218 | |
| 219 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 219 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 220 | 220 | return $fields; |
| 221 | 221 | } |
| 222 | 222 | |
| 223 | - foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 223 | + foreach ( self::$fields[$opt_name] as $key => $field ) { |
|
| 224 | 224 | // Nested permissions. |
| 225 | 225 | $field['permissions'] = $field['permissions'] ?? $permissions; |
| 226 | 226 | |
| 227 | - self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 227 | + self::$fields[$opt_name][$key]['permissions'] = $field['permissions']; |
|
| 228 | 228 | |
| 229 | 229 | // Nested add_visibility permissions. |
| 230 | 230 | $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
| 231 | 231 | |
| 232 | - self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 232 | + self::$fields[$opt_name][$key]['add_visibility'] = $field['add_visibility']; |
|
| 233 | 233 | |
| 234 | 234 | if ( $field['section_id'] === $section_id ) { |
| 235 | 235 | $p = $field['priority']; |
| 236 | 236 | |
| 237 | - while ( isset( $fields[ $p ] ) ) { |
|
| 237 | + while ( isset( $fields[$p] ) ) { |
|
| 238 | 238 | echo esc_html( $p++ ); |
| 239 | 239 | } |
| 240 | 240 | |
| 241 | - $fields[ $p ] = $field; |
|
| 241 | + $fields[$p] = $field; |
|
| 242 | 242 | } |
| 243 | 243 | } |
| 244 | 244 | |
@@ -259,11 +259,11 @@ discard block |
||
| 259 | 259 | self::check_opt_name( $opt_name ); |
| 260 | 260 | |
| 261 | 261 | if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
| 262 | - if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 262 | + if ( ! isset( self::$sections[$opt_name][$id] ) ) { |
|
| 263 | 263 | $id = strtolower( sanitize_html_class( $id ) ); |
| 264 | 264 | } |
| 265 | 265 | |
| 266 | - return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 266 | + return self::$sections[$opt_name][$id] ?? false; |
|
| 267 | 267 | } |
| 268 | 268 | |
| 269 | 269 | return false; |
@@ -286,11 +286,11 @@ discard block |
||
| 286 | 286 | $section['id'] = 'section'; |
| 287 | 287 | } |
| 288 | 288 | |
| 289 | - if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 289 | + if ( isset( self::$sections[$opt_name][$section['id']] ) ) { |
|
| 290 | 290 | $orig = $section['id']; |
| 291 | 291 | $i = 0; |
| 292 | 292 | |
| 293 | - while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 293 | + while ( isset( self::$sections[$opt_name][$section['id']] ) ) { |
|
| 294 | 294 | $section['id'] = $orig . '_' . $i; |
| 295 | 295 | } |
| 296 | 296 | } |
@@ -305,11 +305,11 @@ discard block |
||
| 305 | 305 | if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
| 306 | 306 | foreach ( $section['fields'] as $key => $field ) { |
| 307 | 307 | if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
| 308 | - $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 308 | + $section['fields'][$key]['permissions'] = $section['permissions']; |
|
| 309 | 309 | } |
| 310 | 310 | |
| 311 | 311 | if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
| 312 | - $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 312 | + $section['fields'][$key]['add_visibility'] = $section['add_visibility']; |
|
| 313 | 313 | } |
| 314 | 314 | } |
| 315 | 315 | } |
@@ -320,9 +320,9 @@ discard block |
||
| 320 | 320 | unset( $section['fields'] ); |
| 321 | 321 | } |
| 322 | 322 | |
| 323 | - self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 323 | + self::$sections[$opt_name][$section['id']] = $section; |
|
| 324 | 324 | } else { |
| 325 | - self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' ); |
|
| 325 | + self::$errors[$opt_name]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' ); |
|
| 326 | 326 | } |
| 327 | 327 | } |
| 328 | 328 | |
@@ -384,7 +384,7 @@ discard block |
||
| 384 | 384 | self::check_opt_name( $opt_name ); |
| 385 | 385 | |
| 386 | 386 | if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
| 387 | - return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 387 | + return self::$fields[$opt_name][$id] ?? false; |
|
| 388 | 388 | } |
| 389 | 389 | |
| 390 | 390 | return false; |
@@ -404,7 +404,7 @@ discard block |
||
| 404 | 404 | $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
| 405 | 405 | } |
| 406 | 406 | |
| 407 | - self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 407 | + self::$fields[$opt_name][$field['id']] = $field; |
|
| 408 | 408 | } |
| 409 | 409 | } |
| 410 | 410 | |
@@ -418,8 +418,8 @@ discard block |
||
| 418 | 418 | self::check_opt_name( $opt_name ); |
| 419 | 419 | |
| 420 | 420 | if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
| 421 | - self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | - self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 421 | + self::$args[$opt_name] = self::$args[$opt_name] ?? array(); |
|
| 422 | + self::$args[$opt_name] = wp_parse_args( $args, self::$args[$opt_name] ); |
|
| 423 | 423 | } |
| 424 | 424 | } |
| 425 | 425 | |
@@ -440,11 +440,11 @@ discard block |
||
| 440 | 440 | $term['id'] = 'term'; |
| 441 | 441 | } |
| 442 | 442 | |
| 443 | - if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 443 | + if ( isset( self::$terms[$opt_name][$term['id']] ) ) { |
|
| 444 | 444 | $orig = $term['id']; |
| 445 | 445 | $i = 0; |
| 446 | 446 | |
| 447 | - while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 447 | + while ( isset( self::$terms[$opt_name][$term['id']] ) ) { |
|
| 448 | 448 | $term['id'] = $orig . '_' . $i; |
| 449 | 449 | } |
| 450 | 450 | } |
@@ -455,11 +455,11 @@ discard block |
||
| 455 | 455 | if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
| 456 | 456 | foreach ( $term['sections'] as $key => $section ) { |
| 457 | 457 | if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
| 458 | - $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 458 | + $term['sections'][$key]['permissions'] = $term['permissions']; |
|
| 459 | 459 | } |
| 460 | 460 | |
| 461 | 461 | if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
| 462 | - $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 462 | + $term['sections'][$key]['add_visibility'] = $term['add_visibility']; |
|
| 463 | 463 | } |
| 464 | 464 | } |
| 465 | 465 | } |
@@ -470,9 +470,9 @@ discard block |
||
| 470 | 470 | unset( $term['sections'] ); |
| 471 | 471 | } |
| 472 | 472 | |
| 473 | - self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 473 | + self::$terms[$opt_name][$term['id']] = $term; |
|
| 474 | 474 | } else { |
| 475 | - self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 475 | + self::$errors[$opt_name]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | 476 | } |
| 477 | 477 | } |
| 478 | 478 | |
@@ -486,8 +486,8 @@ discard block |
||
| 486 | 486 | public static function get_terms( string $opt_name = '' ) { |
| 487 | 487 | self::check_opt_name( $opt_name ); |
| 488 | 488 | |
| 489 | - if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | - return self::$terms[ $opt_name ]; |
|
| 489 | + if ( ! empty( $opt_name ) && ! empty( self::$terms[$opt_name] ) ) { |
|
| 490 | + return self::$terms[$opt_name]; |
|
| 491 | 491 | } |
| 492 | 492 | |
| 493 | 493 | return false; |
@@ -502,8 +502,8 @@ discard block |
||
| 502 | 502 | * @return mixed |
| 503 | 503 | */ |
| 504 | 504 | public static function get_priority( string $opt_name, string $type ) { |
| 505 | - $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | - self::$priority[ $opt_name ][ $type ] += 1; |
|
| 505 | + $priority = self::$priority[$opt_name][$type]; |
|
| 506 | + self::$priority[$opt_name][$type] += 1; |
|
| 507 | 507 | |
| 508 | 508 | return $priority; |
| 509 | 509 | } |
@@ -518,34 +518,34 @@ discard block |
||
| 518 | 518 | return; |
| 519 | 519 | } |
| 520 | 520 | |
| 521 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | - self::$terms[ $opt_name ] = array(); |
|
| 521 | + if ( ! isset( self::$terms[$opt_name] ) ) { |
|
| 522 | + self::$terms[$opt_name] = array(); |
|
| 523 | 523 | } |
| 524 | 524 | |
| 525 | - if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | - self::$priority[ $opt_name ]['args'] = 1; |
|
| 525 | + if ( ! isset( self::$priority[$opt_name] ) ) { |
|
| 526 | + self::$priority[$opt_name]['args'] = 1; |
|
| 527 | 527 | } |
| 528 | 528 | |
| 529 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | - self::$sections[ $opt_name ] = array(); |
|
| 531 | - self::$priority[ $opt_name ]['sections'] = 1; |
|
| 529 | + if ( ! isset( self::$sections[$opt_name] ) ) { |
|
| 530 | + self::$sections[$opt_name] = array(); |
|
| 531 | + self::$priority[$opt_name]['sections'] = 1; |
|
| 532 | 532 | } |
| 533 | 533 | |
| 534 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | - self::$fields[ $opt_name ] = array(); |
|
| 536 | - self::$priority[ $opt_name ]['fields'] = 1; |
|
| 534 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 535 | + self::$fields[$opt_name] = array(); |
|
| 536 | + self::$priority[$opt_name]['fields'] = 1; |
|
| 537 | 537 | } |
| 538 | 538 | |
| 539 | - if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | - self::$errors[ $opt_name ] = array(); |
|
| 539 | + if ( ! isset( self::$errors[$opt_name] ) ) { |
|
| 540 | + self::$errors[$opt_name] = array(); |
|
| 541 | 541 | } |
| 542 | 542 | |
| 543 | - if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | - self::$init[ $opt_name ] = false; |
|
| 543 | + if ( ! isset( self::$init[$opt_name] ) ) { |
|
| 544 | + self::$init[$opt_name] = false; |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | - if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | - self::$args[ $opt_name ] = false; |
|
| 547 | + if ( ! isset( self::$args[$opt_name] ) ) { |
|
| 548 | + self::$args[$opt_name] = false; |
|
| 549 | 549 | } |
| 550 | 550 | } |
| 551 | 551 | |
@@ -561,15 +561,15 @@ discard block |
||
| 561 | 561 | return; |
| 562 | 562 | } |
| 563 | 563 | |
| 564 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 564 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 565 | 565 | return array(); |
| 566 | 566 | } |
| 567 | 567 | |
| 568 | 568 | return array_map( |
| 569 | - function ( $field ) { |
|
| 569 | + function( $field ) { |
|
| 570 | 570 | return $field['default'] ?? ''; |
| 571 | 571 | }, |
| 572 | - self::$fields[ $opt_name ] |
|
| 572 | + self::$fields[$opt_name] |
|
| 573 | 573 | ); |
| 574 | 574 | } |
| 575 | 575 | |
@@ -609,7 +609,7 @@ discard block |
||
| 609 | 609 | $value = $value[0]; |
| 610 | 610 | } |
| 611 | 611 | |
| 612 | - $meta[ $key ] = maybe_unserialize( $value ); |
|
| 612 | + $meta[$key] = maybe_unserialize( $value ); |
|
| 613 | 613 | } |
| 614 | 614 | } |
| 615 | 615 | |
@@ -619,8 +619,8 @@ discard block |
||
| 619 | 619 | if ( $single ) { |
| 620 | 620 | $default_value = ''; |
| 621 | 621 | |
| 622 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | - $default_value = $defaults[ $key ]; |
|
| 622 | + if ( isset( $defaults[$key] ) ) { |
|
| 623 | + $default_value = $defaults[$key]; |
|
| 624 | 624 | } |
| 625 | 625 | |
| 626 | 626 | if ( is_array( $meta ) ) { |
@@ -10,40 +10,40 @@ discard block |
||
| 10 | 10 | |
| 11 | 11 | if ( ! class_exists( 'Redux_Customizer_Control', false ) ) { |
| 12 | 12 | |
| 13 | - /** |
|
| 14 | - * Class Redux_Customizer_Control |
|
| 15 | - */ |
|
| 16 | - class Redux_Customizer_Control extends WP_Customize_Control { |
|
| 13 | + /** |
|
| 14 | + * Class Redux_Customizer_Control |
|
| 15 | + */ |
|
| 16 | + class Redux_Customizer_Control extends WP_Customize_Control { |
|
| 17 | 17 | |
| 18 | - /** |
|
| 19 | - * Redux ID. |
|
| 20 | - * |
|
| 21 | - * @var string |
|
| 22 | - */ |
|
| 23 | - public string $redux_id = ''; |
|
| 18 | + /** |
|
| 19 | + * Redux ID. |
|
| 20 | + * |
|
| 21 | + * @var string |
|
| 22 | + */ |
|
| 23 | + public string $redux_id = ''; |
|
| 24 | 24 | |
| 25 | - /** |
|
| 26 | - * Field render. |
|
| 27 | - */ |
|
| 28 | - public function render() { |
|
| 25 | + /** |
|
| 26 | + * Field render. |
|
| 27 | + */ |
|
| 28 | + public function render() { |
|
| 29 | 29 | |
| 30 | - $this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) ); |
|
| 31 | - $class = 'customize-control redux-group-tab redux-field customize-control-' . $this->type; |
|
| 32 | - $opt_name_arr = explode( '[', $this->id ); |
|
| 33 | - $opt_name = $opt_name_arr[0]; |
|
| 34 | - $field_id = str_replace( ']', '', $opt_name_arr[1] ); |
|
| 30 | + $this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) ); |
|
| 31 | + $class = 'customize-control redux-group-tab redux-field customize-control-' . $this->type; |
|
| 32 | + $opt_name_arr = explode( '[', $this->id ); |
|
| 33 | + $opt_name = $opt_name_arr[0]; |
|
| 34 | + $field_id = str_replace( ']', '', $opt_name_arr[1] ); |
|
| 35 | 35 | |
| 36 | - $section = Redux_Helpers::section_from_field_id( $opt_name, $field_id ); |
|
| 36 | + $section = Redux_Helpers::section_from_field_id( $opt_name, $field_id ); |
|
| 37 | 37 | |
| 38 | - if ( isset( $section['disabled'] ) && true === $section['disabled'] ) { |
|
| 39 | - $class .= ' disabled'; |
|
| 40 | - } |
|
| 38 | + if ( isset( $section['disabled'] ) && true === $section['disabled'] ) { |
|
| 39 | + $class .= ' disabled'; |
|
| 40 | + } |
|
| 41 | 41 | |
| 42 | - if ( isset( $section['hidden'] ) && true === $section['hidden'] ) { |
|
| 43 | - $class .= ' hidden'; |
|
| 44 | - } |
|
| 42 | + if ( isset( $section['hidden'] ) && true === $section['hidden'] ) { |
|
| 43 | + $class .= ' hidden'; |
|
| 44 | + } |
|
| 45 | 45 | |
| 46 | - ?> |
|
| 46 | + ?> |
|
| 47 | 47 | <li id="<?php echo esc_attr( $this->redux_id ); ?>-li" class="<?php echo esc_attr( $class ); ?>"> |
| 48 | 48 | <?php if ( 'repeater' !== $this->type ) { ?> |
| 49 | 49 | <input |
@@ -57,42 +57,42 @@ discard block |
||
| 57 | 57 | <?php $this->render_content(); ?> |
| 58 | 58 | </li> |
| 59 | 59 | <?php |
| 60 | - } |
|
| 60 | + } |
|
| 61 | 61 | |
| 62 | - /** |
|
| 63 | - * Render content hook. |
|
| 64 | - */ |
|
| 65 | - public function render_content() { |
|
| 66 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | - do_action( 'redux/customizer/control/render/' . $this->redux_id, $this ); |
|
| 68 | - } |
|
| 62 | + /** |
|
| 63 | + * Render content hook. |
|
| 64 | + */ |
|
| 65 | + public function render_content() { |
|
| 66 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | + do_action( 'redux/customizer/control/render/' . $this->redux_id, $this ); |
|
| 68 | + } |
|
| 69 | 69 | |
| 70 | - /** |
|
| 71 | - * Label output. |
|
| 72 | - */ |
|
| 73 | - public function label() { |
|
| 74 | - // The label has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 75 | - echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 76 | - } |
|
| 70 | + /** |
|
| 71 | + * Label output. |
|
| 72 | + */ |
|
| 73 | + public function label() { |
|
| 74 | + // The label has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 75 | + echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 76 | + } |
|
| 77 | 77 | |
| 78 | - /** |
|
| 79 | - * Description output. |
|
| 80 | - */ |
|
| 81 | - public function description() { |
|
| 82 | - if ( ! empty( $this->description ) ) { |
|
| 83 | - // The description has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 84 | - echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>'; |
|
| 85 | - } |
|
| 86 | - } |
|
| 78 | + /** |
|
| 79 | + * Description output. |
|
| 80 | + */ |
|
| 81 | + public function description() { |
|
| 82 | + if ( ! empty( $this->description ) ) { |
|
| 83 | + // The description has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 84 | + echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>'; |
|
| 85 | + } |
|
| 86 | + } |
|
| 87 | 87 | |
| 88 | - /** |
|
| 89 | - * Title output. |
|
| 90 | - */ |
|
| 91 | - public function title() { |
|
| 92 | - echo '<span class="customize-control-title">'; |
|
| 93 | - $this->label(); |
|
| 94 | - $this->description(); |
|
| 95 | - echo '</span>'; |
|
| 96 | - } |
|
| 97 | - } |
|
| 88 | + /** |
|
| 89 | + * Title output. |
|
| 90 | + */ |
|
| 91 | + public function title() { |
|
| 92 | + echo '<span class="customize-control-title">'; |
|
| 93 | + $this->label(); |
|
| 94 | + $this->description(); |
|
| 95 | + echo '</span>'; |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | 98 | } |
@@ -12,429 +12,429 @@ |
||
| 12 | 12 | // Don't duplicate me! |
| 13 | 13 | if ( ! class_exists( 'Redux_Background', false ) ) { |
| 14 | 14 | |
| 15 | - /** |
|
| 16 | - * Main Redux_background class |
|
| 17 | - * |
|
| 18 | - * @since 3.1.5 |
|
| 19 | - */ |
|
| 20 | - class Redux_Background extends Redux_Field { |
|
| 21 | - |
|
| 22 | - /** |
|
| 23 | - * Set field and value defaults. |
|
| 24 | - */ |
|
| 25 | - public function set_defaults() { |
|
| 26 | - $defaults = array( |
|
| 27 | - 'background-color' => true, |
|
| 28 | - 'background-repeat' => true, |
|
| 29 | - 'background-attachment' => true, |
|
| 30 | - 'background-position' => true, |
|
| 31 | - 'background-image' => true, |
|
| 32 | - 'background-gradient' => false, |
|
| 33 | - 'background-clip' => false, |
|
| 34 | - 'background-origin' => false, |
|
| 35 | - 'background-size' => true, |
|
| 36 | - 'preview_media' => false, |
|
| 37 | - 'preview' => true, |
|
| 38 | - 'preview_height' => '200px', |
|
| 39 | - 'transparent' => true, |
|
| 40 | - ); |
|
| 41 | - |
|
| 42 | - $this->field = wp_parse_args( $this->field, $defaults ); |
|
| 43 | - |
|
| 44 | - // No errors please. |
|
| 45 | - $defaults = array( |
|
| 46 | - 'background-color' => '', |
|
| 47 | - 'background-repeat' => '', |
|
| 48 | - 'background-attachment' => '', |
|
| 49 | - 'background-position' => '', |
|
| 50 | - 'background-image' => '', |
|
| 51 | - 'background-clip' => '', |
|
| 52 | - 'background-origin' => '', |
|
| 53 | - 'background-size' => '', |
|
| 54 | - 'media' => array(), |
|
| 55 | - ); |
|
| 56 | - |
|
| 57 | - $this->value = wp_parse_args( $this->value, $defaults ); |
|
| 58 | - |
|
| 59 | - $defaults = array( |
|
| 60 | - 'id' => '', |
|
| 61 | - 'width' => '', |
|
| 62 | - 'height' => '', |
|
| 63 | - 'thumbnail' => '', |
|
| 64 | - ); |
|
| 65 | - |
|
| 66 | - $this->value['media'] = wp_parse_args( $this->value['media'], $defaults ); |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - /** |
|
| 70 | - * Field Render Function. |
|
| 71 | - * Takes the vars and outputs the HTML for the field in the settings |
|
| 72 | - * |
|
| 73 | - * @since 1.0.0 |
|
| 74 | - * @access public |
|
| 75 | - * @return void |
|
| 76 | - */ |
|
| 77 | - public function render() { |
|
| 78 | - $this->select2_config['allowClear'] = true; |
|
| 79 | - |
|
| 80 | - if ( isset( $this->field['select2'] ) ) { |
|
| 81 | - $this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config ); |
|
| 82 | - } else { |
|
| 83 | - $this->field['select2'] = $this->select2_config; |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - $this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] ); |
|
| 87 | - |
|
| 88 | - $select2_data = Redux_Functions::create_data_string( $this->field['select2'] ); |
|
| 89 | - |
|
| 90 | - if ( true === $this->field['background-color'] ) { |
|
| 91 | - if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) { |
|
| 92 | - $this->value['background-color'] = $this->value['color']; |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - $def_bg_color = $this->field['default']['background-color'] ?? ''; |
|
| 96 | - |
|
| 97 | - echo '<input '; |
|
| 98 | - echo 'data-id="' . esc_attr( $this->field['id'] ) . '"'; |
|
| 99 | - echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"'; |
|
| 100 | - echo 'id="' . esc_attr( $this->field['id'] ) . '-color"'; |
|
| 101 | - echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"'; |
|
| 102 | - echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"'; |
|
| 103 | - echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"'; |
|
| 104 | - |
|
| 105 | - $data = array( |
|
| 106 | - 'field' => $this->field, |
|
| 107 | - 'index' => 'color', |
|
| 108 | - ); |
|
| 109 | - |
|
| 110 | - echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 111 | - |
|
| 112 | - echo '>'; |
|
| 113 | - |
|
| 114 | - echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">'; |
|
| 115 | - |
|
| 116 | - if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) { |
|
| 117 | - $is_checked = ''; |
|
| 118 | - if ( 'transparent' === $this->value['background-color'] ) { |
|
| 119 | - $is_checked = ' checked="checked"'; |
|
| 120 | - } |
|
| 121 | - echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>'; |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) { |
|
| 125 | - echo '<br />'; |
|
| 126 | - } |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - if ( true === $this->field['background-repeat'] ) { |
|
| 130 | - $array = array( |
|
| 131 | - 'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ), |
|
| 132 | - 'repeat' => esc_html__( 'Repeat All', 'redux-framework' ), |
|
| 133 | - 'repeat-x' => esc_html__( 'Repeat Horizontally', 'redux-framework' ), |
|
| 134 | - 'repeat-y' => esc_html__( 'Repeat Vertically', 'redux-framework' ), |
|
| 135 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 136 | - ); |
|
| 137 | - |
|
| 138 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 139 | - echo '<option></option>'; |
|
| 140 | - |
|
| 141 | - foreach ( $array as $k => $v ) { |
|
| 142 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - echo '</select>'; |
|
| 146 | - } |
|
| 147 | - |
|
| 148 | - if ( true === $this->field['background-clip'] ) { |
|
| 149 | - $array = array( |
|
| 150 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 151 | - 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 152 | - 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 153 | - 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 154 | - ); |
|
| 155 | - |
|
| 156 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 157 | - echo '<option></option>'; |
|
| 158 | - |
|
| 159 | - foreach ( $array as $k => $v ) { |
|
| 160 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 161 | - } |
|
| 162 | - |
|
| 163 | - echo '</select>'; |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - if ( true === $this->field['background-origin'] ) { |
|
| 167 | - $array = array( |
|
| 168 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 169 | - 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 170 | - 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 171 | - 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 172 | - ); |
|
| 173 | - |
|
| 174 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 175 | - echo '<option></option>'; |
|
| 176 | - |
|
| 177 | - foreach ( $array as $k => $v ) { |
|
| 178 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - echo '</select>'; |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - if ( true === $this->field['background-size'] ) { |
|
| 185 | - $array = array( |
|
| 186 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 187 | - 'cover' => esc_html__( 'Cover', 'redux-framework' ), |
|
| 188 | - 'contain' => esc_html__( 'Contain', 'redux-framework' ), |
|
| 189 | - ); |
|
| 190 | - |
|
| 191 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 192 | - echo '<option></option>'; |
|
| 193 | - |
|
| 194 | - foreach ( $array as $k => $v ) { |
|
| 195 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 196 | - } |
|
| 197 | - |
|
| 198 | - echo '</select>'; |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - if ( true === $this->field['background-attachment'] ) { |
|
| 202 | - $array = array( |
|
| 203 | - 'fixed' => esc_html__( 'Fixed', 'redux-framework' ), |
|
| 204 | - 'scroll' => esc_html__( 'Scroll', 'redux-framework' ), |
|
| 205 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 206 | - ); |
|
| 207 | - |
|
| 208 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 209 | - echo '<option></option>'; |
|
| 210 | - |
|
| 211 | - foreach ( $array as $k => $v ) { |
|
| 212 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 213 | - } |
|
| 214 | - |
|
| 215 | - echo '</select>'; |
|
| 216 | - } |
|
| 217 | - |
|
| 218 | - if ( true === $this->field['background-position'] ) { |
|
| 219 | - $array = array( |
|
| 220 | - 'left top' => esc_html__( 'Left Top', 'redux-framework' ), |
|
| 221 | - 'left center' => esc_html__( 'Left center', 'redux-framework' ), |
|
| 222 | - 'left bottom' => esc_html__( 'Left Bottom', 'redux-framework' ), |
|
| 223 | - 'center top' => esc_html__( 'Center Top', 'redux-framework' ), |
|
| 224 | - 'center center' => esc_html__( 'Center Center', 'redux-framework' ), |
|
| 225 | - 'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ), |
|
| 226 | - 'right top' => esc_html__( 'Right Top', 'redux-framework' ), |
|
| 227 | - 'right center' => esc_html__( 'Right center', 'redux-framework' ), |
|
| 228 | - 'right bottom' => esc_html__( 'Right Bottom', 'redux-framework' ), |
|
| 229 | - ); |
|
| 230 | - |
|
| 231 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 232 | - echo '<option></option>'; |
|
| 233 | - |
|
| 234 | - foreach ( $array as $k => $v ) { |
|
| 235 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 236 | - } |
|
| 237 | - |
|
| 238 | - echo '</select>'; |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - if ( $this->field['background-image'] ) { |
|
| 242 | - echo '<br />'; |
|
| 243 | - |
|
| 244 | - if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { |
|
| 245 | - if ( is_array( $this->field['default'] ) ) { |
|
| 246 | - if ( ! empty( $this->field['default']['media']['id'] ) ) { |
|
| 247 | - $this->value['media']['id'] = $this->field['default']['media']['id']; |
|
| 248 | - } elseif ( ! empty( $this->field['default']['id'] ) ) { |
|
| 249 | - $this->value['media']['id'] = $this->field['default']['id']; |
|
| 250 | - } |
|
| 251 | - |
|
| 252 | - if ( ! empty( $this->field['default']['url'] ) ) { |
|
| 253 | - $this->value['background-image'] = $this->field['default']['url']; |
|
| 254 | - } elseif ( ! empty( $this->field['default']['media']['url'] ) ) { |
|
| 255 | - $this->value['background-image'] = $this->field['default']['media']['url']; |
|
| 256 | - } elseif ( ! empty( $this->field['default']['background-image'] ) ) { |
|
| 257 | - $this->value['background-image'] = $this->field['default']['background-image']; |
|
| 258 | - } |
|
| 259 | - } elseif ( is_numeric( $this->field['default'] ) ) { |
|
| 260 | - // Check if it's an attachment ID. |
|
| 261 | - $this->value['media']['id'] = $this->field['default']; |
|
| 262 | - } else { // Must be a URL. |
|
| 263 | - $this->value['background-image'] = $this->field['default']; |
|
| 264 | - } |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) { |
|
| 268 | - $img = wp_get_attachment_image_src( $this->value['media']['id'], 'full' ); |
|
| 269 | - $this->value['background-image'] = $img[0]; |
|
| 270 | - $this->value['media']['width'] = $img[1]; |
|
| 271 | - $this->value['media']['height'] = $img[2]; |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - $hide = 'hide '; |
|
| 275 | - |
|
| 276 | - if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) { |
|
| 277 | - $this->field['class'] .= ' noPreview'; |
|
| 278 | - } |
|
| 279 | - |
|
| 280 | - if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) { |
|
| 281 | - $hide = ''; |
|
| 282 | - } |
|
| 283 | - |
|
| 284 | - $placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' ); |
|
| 285 | - |
|
| 286 | - echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />'; |
|
| 287 | - echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />'; |
|
| 288 | - echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />'; |
|
| 289 | - echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />'; |
|
| 290 | - echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />'; |
|
| 291 | - |
|
| 292 | - // Preview. |
|
| 293 | - $hide = ''; |
|
| 294 | - |
|
| 295 | - if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) { |
|
| 296 | - $hide = 'hide '; |
|
| 297 | - } |
|
| 298 | - |
|
| 299 | - if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case. |
|
| 300 | - if ( ! empty( $this->value['media']['id'] ) ) { |
|
| 301 | - $image = wp_get_attachment_image_src( |
|
| 302 | - $this->value['media']['id'], |
|
| 303 | - array( |
|
| 304 | - 150, |
|
| 305 | - 150, |
|
| 306 | - ) |
|
| 307 | - ); |
|
| 308 | - |
|
| 309 | - $this->value['media']['thumbnail'] = $image[0]; |
|
| 310 | - } else { |
|
| 311 | - $this->value['media']['thumbnail'] = $this->value['background-image']; |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - echo '<div class="' . esc_attr( $hide ) . 'screenshot">'; |
|
| 316 | - echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">'; |
|
| 317 | - |
|
| 318 | - $alt = wp_prepare_attachment_for_js( $this->value['media']['id'] ); |
|
| 319 | - $alt = $alt['alt'] ?? ''; |
|
| 320 | - |
|
| 321 | - echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />'; |
|
| 322 | - echo '</a>'; |
|
| 323 | - echo '</div>'; |
|
| 324 | - |
|
| 325 | - // Upload controls DIV. |
|
| 326 | - echo '<div class="upload_button_div">'; |
|
| 327 | - |
|
| 328 | - // If the user has WP3.5+ show upload/remove button. |
|
| 329 | - echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>'; |
|
| 330 | - |
|
| 331 | - $hide = ''; |
|
| 332 | - if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) { |
|
| 333 | - $hide = ' hide'; |
|
| 334 | - } |
|
| 335 | - |
|
| 336 | - echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>'; |
|
| 337 | - |
|
| 338 | - echo '</div>'; |
|
| 339 | - } |
|
| 340 | - |
|
| 341 | - /** |
|
| 342 | - * Preview |
|
| 343 | - * */ |
|
| 344 | - if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) { |
|
| 345 | - $css = $this->css_style( $this->value ); |
|
| 346 | - |
|
| 347 | - $is_bg = strpos( $css, 'background-image' ); |
|
| 348 | - |
|
| 349 | - if ( empty( $css ) || ! $is_bg ) { |
|
| 350 | - $css = 'display:none;'; |
|
| 351 | - } |
|
| 352 | - |
|
| 353 | - $css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';'; |
|
| 354 | - echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '"> </p>'; |
|
| 355 | - } |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Enqueue Function. |
|
| 360 | - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css |
|
| 361 | - * |
|
| 362 | - * @since 1.0.0 |
|
| 363 | - * @access public |
|
| 364 | - * @return void |
|
| 365 | - */ |
|
| 366 | - public function enqueue() { |
|
| 367 | - if ( function_exists( 'wp_enqueue_media' ) ) { |
|
| 368 | - wp_enqueue_media(); |
|
| 369 | - } elseif ( ! wp_script_is( 'media-upload' ) ) { |
|
| 370 | - wp_enqueue_script( 'media-upload' ); |
|
| 371 | - } |
|
| 372 | - |
|
| 373 | - if ( ! wp_style_is( 'select2-css' ) ) { |
|
| 374 | - wp_enqueue_style( 'select2-css' ); |
|
| 375 | - } |
|
| 376 | - |
|
| 377 | - if ( ! wp_style_is( 'wp-color-picker' ) ) { |
|
| 378 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - $dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' ); |
|
| 382 | - |
|
| 383 | - wp_enqueue_script( |
|
| 384 | - 'redux-field-background', |
|
| 385 | - Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js', |
|
| 386 | - $dep_array, |
|
| 387 | - $this->timestamp, |
|
| 388 | - true |
|
| 389 | - ); |
|
| 390 | - |
|
| 391 | - if ( $this->parent->args['dev_mode'] ) { |
|
| 392 | - wp_enqueue_style( |
|
| 393 | - 'redux-field-background', |
|
| 394 | - Redux_Core::$url . 'inc/fields/background/redux-background.css', |
|
| 395 | - array(), |
|
| 396 | - $this->timestamp |
|
| 397 | - ); |
|
| 398 | - |
|
| 399 | - wp_enqueue_style( 'redux-color-picker' ); |
|
| 400 | - } |
|
| 401 | - } |
|
| 402 | - |
|
| 403 | - /** |
|
| 404 | - * Output CSS styling. |
|
| 405 | - * |
|
| 406 | - * @param array $data Value array. |
|
| 407 | - * |
|
| 408 | - * @return string |
|
| 409 | - */ |
|
| 410 | - public function css_style( $data = array() ): string { |
|
| 411 | - $css = ''; |
|
| 412 | - |
|
| 413 | - if ( ! empty( $data ) && is_array( $data ) ) { |
|
| 414 | - foreach ( $data as $key => $val ) { |
|
| 415 | - if ( ! empty( $val ) && 'media' !== $key ) { |
|
| 416 | - if ( 'background-image' === $key ) { |
|
| 417 | - $css .= $key . ":url('" . esc_url( $val ) . "');"; |
|
| 418 | - } else { |
|
| 419 | - $css .= $key . ':' . esc_attr( $val ) . ';'; |
|
| 420 | - } |
|
| 421 | - } |
|
| 422 | - } |
|
| 423 | - } |
|
| 424 | - |
|
| 425 | - return $css; |
|
| 426 | - } |
|
| 427 | - |
|
| 428 | - /** |
|
| 429 | - * Enable output_variables to be generated. |
|
| 430 | - * |
|
| 431 | - * @since 4.0.3 |
|
| 432 | - * @return void |
|
| 433 | - */ |
|
| 434 | - public function output_variables() { |
|
| 435 | - // No code needed, just defining the method is enough. |
|
| 436 | - } |
|
| 437 | - } |
|
| 15 | + /** |
|
| 16 | + * Main Redux_background class |
|
| 17 | + * |
|
| 18 | + * @since 3.1.5 |
|
| 19 | + */ |
|
| 20 | + class Redux_Background extends Redux_Field { |
|
| 21 | + |
|
| 22 | + /** |
|
| 23 | + * Set field and value defaults. |
|
| 24 | + */ |
|
| 25 | + public function set_defaults() { |
|
| 26 | + $defaults = array( |
|
| 27 | + 'background-color' => true, |
|
| 28 | + 'background-repeat' => true, |
|
| 29 | + 'background-attachment' => true, |
|
| 30 | + 'background-position' => true, |
|
| 31 | + 'background-image' => true, |
|
| 32 | + 'background-gradient' => false, |
|
| 33 | + 'background-clip' => false, |
|
| 34 | + 'background-origin' => false, |
|
| 35 | + 'background-size' => true, |
|
| 36 | + 'preview_media' => false, |
|
| 37 | + 'preview' => true, |
|
| 38 | + 'preview_height' => '200px', |
|
| 39 | + 'transparent' => true, |
|
| 40 | + ); |
|
| 41 | + |
|
| 42 | + $this->field = wp_parse_args( $this->field, $defaults ); |
|
| 43 | + |
|
| 44 | + // No errors please. |
|
| 45 | + $defaults = array( |
|
| 46 | + 'background-color' => '', |
|
| 47 | + 'background-repeat' => '', |
|
| 48 | + 'background-attachment' => '', |
|
| 49 | + 'background-position' => '', |
|
| 50 | + 'background-image' => '', |
|
| 51 | + 'background-clip' => '', |
|
| 52 | + 'background-origin' => '', |
|
| 53 | + 'background-size' => '', |
|
| 54 | + 'media' => array(), |
|
| 55 | + ); |
|
| 56 | + |
|
| 57 | + $this->value = wp_parse_args( $this->value, $defaults ); |
|
| 58 | + |
|
| 59 | + $defaults = array( |
|
| 60 | + 'id' => '', |
|
| 61 | + 'width' => '', |
|
| 62 | + 'height' => '', |
|
| 63 | + 'thumbnail' => '', |
|
| 64 | + ); |
|
| 65 | + |
|
| 66 | + $this->value['media'] = wp_parse_args( $this->value['media'], $defaults ); |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + /** |
|
| 70 | + * Field Render Function. |
|
| 71 | + * Takes the vars and outputs the HTML for the field in the settings |
|
| 72 | + * |
|
| 73 | + * @since 1.0.0 |
|
| 74 | + * @access public |
|
| 75 | + * @return void |
|
| 76 | + */ |
|
| 77 | + public function render() { |
|
| 78 | + $this->select2_config['allowClear'] = true; |
|
| 79 | + |
|
| 80 | + if ( isset( $this->field['select2'] ) ) { |
|
| 81 | + $this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config ); |
|
| 82 | + } else { |
|
| 83 | + $this->field['select2'] = $this->select2_config; |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + $this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] ); |
|
| 87 | + |
|
| 88 | + $select2_data = Redux_Functions::create_data_string( $this->field['select2'] ); |
|
| 89 | + |
|
| 90 | + if ( true === $this->field['background-color'] ) { |
|
| 91 | + if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) { |
|
| 92 | + $this->value['background-color'] = $this->value['color']; |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + $def_bg_color = $this->field['default']['background-color'] ?? ''; |
|
| 96 | + |
|
| 97 | + echo '<input '; |
|
| 98 | + echo 'data-id="' . esc_attr( $this->field['id'] ) . '"'; |
|
| 99 | + echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"'; |
|
| 100 | + echo 'id="' . esc_attr( $this->field['id'] ) . '-color"'; |
|
| 101 | + echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"'; |
|
| 102 | + echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"'; |
|
| 103 | + echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"'; |
|
| 104 | + |
|
| 105 | + $data = array( |
|
| 106 | + 'field' => $this->field, |
|
| 107 | + 'index' => 'color', |
|
| 108 | + ); |
|
| 109 | + |
|
| 110 | + echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 111 | + |
|
| 112 | + echo '>'; |
|
| 113 | + |
|
| 114 | + echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">'; |
|
| 115 | + |
|
| 116 | + if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) { |
|
| 117 | + $is_checked = ''; |
|
| 118 | + if ( 'transparent' === $this->value['background-color'] ) { |
|
| 119 | + $is_checked = ' checked="checked"'; |
|
| 120 | + } |
|
| 121 | + echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>'; |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) { |
|
| 125 | + echo '<br />'; |
|
| 126 | + } |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + if ( true === $this->field['background-repeat'] ) { |
|
| 130 | + $array = array( |
|
| 131 | + 'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ), |
|
| 132 | + 'repeat' => esc_html__( 'Repeat All', 'redux-framework' ), |
|
| 133 | + 'repeat-x' => esc_html__( 'Repeat Horizontally', 'redux-framework' ), |
|
| 134 | + 'repeat-y' => esc_html__( 'Repeat Vertically', 'redux-framework' ), |
|
| 135 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 136 | + ); |
|
| 137 | + |
|
| 138 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 139 | + echo '<option></option>'; |
|
| 140 | + |
|
| 141 | + foreach ( $array as $k => $v ) { |
|
| 142 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + echo '</select>'; |
|
| 146 | + } |
|
| 147 | + |
|
| 148 | + if ( true === $this->field['background-clip'] ) { |
|
| 149 | + $array = array( |
|
| 150 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 151 | + 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 152 | + 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 153 | + 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 154 | + ); |
|
| 155 | + |
|
| 156 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 157 | + echo '<option></option>'; |
|
| 158 | + |
|
| 159 | + foreach ( $array as $k => $v ) { |
|
| 160 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 161 | + } |
|
| 162 | + |
|
| 163 | + echo '</select>'; |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + if ( true === $this->field['background-origin'] ) { |
|
| 167 | + $array = array( |
|
| 168 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 169 | + 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 170 | + 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 171 | + 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 172 | + ); |
|
| 173 | + |
|
| 174 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 175 | + echo '<option></option>'; |
|
| 176 | + |
|
| 177 | + foreach ( $array as $k => $v ) { |
|
| 178 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + echo '</select>'; |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + if ( true === $this->field['background-size'] ) { |
|
| 185 | + $array = array( |
|
| 186 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 187 | + 'cover' => esc_html__( 'Cover', 'redux-framework' ), |
|
| 188 | + 'contain' => esc_html__( 'Contain', 'redux-framework' ), |
|
| 189 | + ); |
|
| 190 | + |
|
| 191 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 192 | + echo '<option></option>'; |
|
| 193 | + |
|
| 194 | + foreach ( $array as $k => $v ) { |
|
| 195 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 196 | + } |
|
| 197 | + |
|
| 198 | + echo '</select>'; |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + if ( true === $this->field['background-attachment'] ) { |
|
| 202 | + $array = array( |
|
| 203 | + 'fixed' => esc_html__( 'Fixed', 'redux-framework' ), |
|
| 204 | + 'scroll' => esc_html__( 'Scroll', 'redux-framework' ), |
|
| 205 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 206 | + ); |
|
| 207 | + |
|
| 208 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 209 | + echo '<option></option>'; |
|
| 210 | + |
|
| 211 | + foreach ( $array as $k => $v ) { |
|
| 212 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 213 | + } |
|
| 214 | + |
|
| 215 | + echo '</select>'; |
|
| 216 | + } |
|
| 217 | + |
|
| 218 | + if ( true === $this->field['background-position'] ) { |
|
| 219 | + $array = array( |
|
| 220 | + 'left top' => esc_html__( 'Left Top', 'redux-framework' ), |
|
| 221 | + 'left center' => esc_html__( 'Left center', 'redux-framework' ), |
|
| 222 | + 'left bottom' => esc_html__( 'Left Bottom', 'redux-framework' ), |
|
| 223 | + 'center top' => esc_html__( 'Center Top', 'redux-framework' ), |
|
| 224 | + 'center center' => esc_html__( 'Center Center', 'redux-framework' ), |
|
| 225 | + 'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ), |
|
| 226 | + 'right top' => esc_html__( 'Right Top', 'redux-framework' ), |
|
| 227 | + 'right center' => esc_html__( 'Right center', 'redux-framework' ), |
|
| 228 | + 'right bottom' => esc_html__( 'Right Bottom', 'redux-framework' ), |
|
| 229 | + ); |
|
| 230 | + |
|
| 231 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 232 | + echo '<option></option>'; |
|
| 233 | + |
|
| 234 | + foreach ( $array as $k => $v ) { |
|
| 235 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 236 | + } |
|
| 237 | + |
|
| 238 | + echo '</select>'; |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + if ( $this->field['background-image'] ) { |
|
| 242 | + echo '<br />'; |
|
| 243 | + |
|
| 244 | + if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { |
|
| 245 | + if ( is_array( $this->field['default'] ) ) { |
|
| 246 | + if ( ! empty( $this->field['default']['media']['id'] ) ) { |
|
| 247 | + $this->value['media']['id'] = $this->field['default']['media']['id']; |
|
| 248 | + } elseif ( ! empty( $this->field['default']['id'] ) ) { |
|
| 249 | + $this->value['media']['id'] = $this->field['default']['id']; |
|
| 250 | + } |
|
| 251 | + |
|
| 252 | + if ( ! empty( $this->field['default']['url'] ) ) { |
|
| 253 | + $this->value['background-image'] = $this->field['default']['url']; |
|
| 254 | + } elseif ( ! empty( $this->field['default']['media']['url'] ) ) { |
|
| 255 | + $this->value['background-image'] = $this->field['default']['media']['url']; |
|
| 256 | + } elseif ( ! empty( $this->field['default']['background-image'] ) ) { |
|
| 257 | + $this->value['background-image'] = $this->field['default']['background-image']; |
|
| 258 | + } |
|
| 259 | + } elseif ( is_numeric( $this->field['default'] ) ) { |
|
| 260 | + // Check if it's an attachment ID. |
|
| 261 | + $this->value['media']['id'] = $this->field['default']; |
|
| 262 | + } else { // Must be a URL. |
|
| 263 | + $this->value['background-image'] = $this->field['default']; |
|
| 264 | + } |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) { |
|
| 268 | + $img = wp_get_attachment_image_src( $this->value['media']['id'], 'full' ); |
|
| 269 | + $this->value['background-image'] = $img[0]; |
|
| 270 | + $this->value['media']['width'] = $img[1]; |
|
| 271 | + $this->value['media']['height'] = $img[2]; |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + $hide = 'hide '; |
|
| 275 | + |
|
| 276 | + if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) { |
|
| 277 | + $this->field['class'] .= ' noPreview'; |
|
| 278 | + } |
|
| 279 | + |
|
| 280 | + if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) { |
|
| 281 | + $hide = ''; |
|
| 282 | + } |
|
| 283 | + |
|
| 284 | + $placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' ); |
|
| 285 | + |
|
| 286 | + echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />'; |
|
| 287 | + echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />'; |
|
| 288 | + echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />'; |
|
| 289 | + echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />'; |
|
| 290 | + echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />'; |
|
| 291 | + |
|
| 292 | + // Preview. |
|
| 293 | + $hide = ''; |
|
| 294 | + |
|
| 295 | + if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) { |
|
| 296 | + $hide = 'hide '; |
|
| 297 | + } |
|
| 298 | + |
|
| 299 | + if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case. |
|
| 300 | + if ( ! empty( $this->value['media']['id'] ) ) { |
|
| 301 | + $image = wp_get_attachment_image_src( |
|
| 302 | + $this->value['media']['id'], |
|
| 303 | + array( |
|
| 304 | + 150, |
|
| 305 | + 150, |
|
| 306 | + ) |
|
| 307 | + ); |
|
| 308 | + |
|
| 309 | + $this->value['media']['thumbnail'] = $image[0]; |
|
| 310 | + } else { |
|
| 311 | + $this->value['media']['thumbnail'] = $this->value['background-image']; |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + echo '<div class="' . esc_attr( $hide ) . 'screenshot">'; |
|
| 316 | + echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">'; |
|
| 317 | + |
|
| 318 | + $alt = wp_prepare_attachment_for_js( $this->value['media']['id'] ); |
|
| 319 | + $alt = $alt['alt'] ?? ''; |
|
| 320 | + |
|
| 321 | + echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />'; |
|
| 322 | + echo '</a>'; |
|
| 323 | + echo '</div>'; |
|
| 324 | + |
|
| 325 | + // Upload controls DIV. |
|
| 326 | + echo '<div class="upload_button_div">'; |
|
| 327 | + |
|
| 328 | + // If the user has WP3.5+ show upload/remove button. |
|
| 329 | + echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>'; |
|
| 330 | + |
|
| 331 | + $hide = ''; |
|
| 332 | + if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) { |
|
| 333 | + $hide = ' hide'; |
|
| 334 | + } |
|
| 335 | + |
|
| 336 | + echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>'; |
|
| 337 | + |
|
| 338 | + echo '</div>'; |
|
| 339 | + } |
|
| 340 | + |
|
| 341 | + /** |
|
| 342 | + * Preview |
|
| 343 | + * */ |
|
| 344 | + if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) { |
|
| 345 | + $css = $this->css_style( $this->value ); |
|
| 346 | + |
|
| 347 | + $is_bg = strpos( $css, 'background-image' ); |
|
| 348 | + |
|
| 349 | + if ( empty( $css ) || ! $is_bg ) { |
|
| 350 | + $css = 'display:none;'; |
|
| 351 | + } |
|
| 352 | + |
|
| 353 | + $css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';'; |
|
| 354 | + echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '"> </p>'; |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Enqueue Function. |
|
| 360 | + * If this field requires any scripts, or css define this function and register/enqueue the scripts/css |
|
| 361 | + * |
|
| 362 | + * @since 1.0.0 |
|
| 363 | + * @access public |
|
| 364 | + * @return void |
|
| 365 | + */ |
|
| 366 | + public function enqueue() { |
|
| 367 | + if ( function_exists( 'wp_enqueue_media' ) ) { |
|
| 368 | + wp_enqueue_media(); |
|
| 369 | + } elseif ( ! wp_script_is( 'media-upload' ) ) { |
|
| 370 | + wp_enqueue_script( 'media-upload' ); |
|
| 371 | + } |
|
| 372 | + |
|
| 373 | + if ( ! wp_style_is( 'select2-css' ) ) { |
|
| 374 | + wp_enqueue_style( 'select2-css' ); |
|
| 375 | + } |
|
| 376 | + |
|
| 377 | + if ( ! wp_style_is( 'wp-color-picker' ) ) { |
|
| 378 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + $dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' ); |
|
| 382 | + |
|
| 383 | + wp_enqueue_script( |
|
| 384 | + 'redux-field-background', |
|
| 385 | + Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js', |
|
| 386 | + $dep_array, |
|
| 387 | + $this->timestamp, |
|
| 388 | + true |
|
| 389 | + ); |
|
| 390 | + |
|
| 391 | + if ( $this->parent->args['dev_mode'] ) { |
|
| 392 | + wp_enqueue_style( |
|
| 393 | + 'redux-field-background', |
|
| 394 | + Redux_Core::$url . 'inc/fields/background/redux-background.css', |
|
| 395 | + array(), |
|
| 396 | + $this->timestamp |
|
| 397 | + ); |
|
| 398 | + |
|
| 399 | + wp_enqueue_style( 'redux-color-picker' ); |
|
| 400 | + } |
|
| 401 | + } |
|
| 402 | + |
|
| 403 | + /** |
|
| 404 | + * Output CSS styling. |
|
| 405 | + * |
|
| 406 | + * @param array $data Value array. |
|
| 407 | + * |
|
| 408 | + * @return string |
|
| 409 | + */ |
|
| 410 | + public function css_style( $data = array() ): string { |
|
| 411 | + $css = ''; |
|
| 412 | + |
|
| 413 | + if ( ! empty( $data ) && is_array( $data ) ) { |
|
| 414 | + foreach ( $data as $key => $val ) { |
|
| 415 | + if ( ! empty( $val ) && 'media' !== $key ) { |
|
| 416 | + if ( 'background-image' === $key ) { |
|
| 417 | + $css .= $key . ":url('" . esc_url( $val ) . "');"; |
|
| 418 | + } else { |
|
| 419 | + $css .= $key . ':' . esc_attr( $val ) . ';'; |
|
| 420 | + } |
|
| 421 | + } |
|
| 422 | + } |
|
| 423 | + } |
|
| 424 | + |
|
| 425 | + return $css; |
|
| 426 | + } |
|
| 427 | + |
|
| 428 | + /** |
|
| 429 | + * Enable output_variables to be generated. |
|
| 430 | + * |
|
| 431 | + * @since 4.0.3 |
|
| 432 | + * @return void |
|
| 433 | + */ |
|
| 434 | + public function output_variables() { |
|
| 435 | + // No code needed, just defining the method is enough. |
|
| 436 | + } |
|
| 437 | + } |
|
| 438 | 438 | } |
| 439 | 439 | |
| 440 | 440 | class_alias( 'Redux_Background', 'ReduxFramework_Background' ); |