@@ -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 ) ) { |
@@ -55,7 +55,7 @@ discard block |
||
| 55 | 55 | * |
| 56 | 56 | * @var array|null |
| 57 | 57 | */ |
| 58 | - private static ?array $post_values = array(); |
|
| 58 | + private static ? array $post_values = array(); |
|
| 59 | 59 | |
| 60 | 60 | /** |
| 61 | 61 | * Options array. |
@@ -316,10 +316,10 @@ discard block |
||
| 316 | 316 | foreach ( $the_data as $key => $value ) { |
| 317 | 317 | if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
| 318 | 318 | foreach ( $value as $k => $v ) { |
| 319 | - $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 319 | + $decode = ( array ) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | 320 | $v = $decode; |
| 321 | - $dumb_array[ $k ] = $v; |
|
| 322 | - $the_data[ $key ] = $dumb_array; |
|
| 321 | + $dumb_array[$k] = $v; |
|
| 322 | + $the_data[$key] = $dumb_array; |
|
| 323 | 323 | } |
| 324 | 324 | } |
| 325 | 325 | } |
@@ -343,10 +343,10 @@ discard block |
||
| 343 | 343 | foreach ( self::$post_values as $key => $value ) { |
| 344 | 344 | if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
| 345 | 345 | $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
| 346 | - $data[ $key ] = $value; |
|
| 346 | + $data[$key] = $value; |
|
| 347 | 347 | |
| 348 | - $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | - $this->parent->options[ $key ] = $value; |
|
| 348 | + $GLOBALS[$this->parent->args['global_variable']][$key] = $value; |
|
| 349 | + $this->parent->options[$key] = $value; |
|
| 350 | 350 | } |
| 351 | 351 | } |
| 352 | 352 | } |
@@ -362,7 +362,7 @@ discard block |
||
| 362 | 362 | */ |
| 363 | 363 | public function render( object $control ) { |
| 364 | 364 | $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
| 365 | - $field = $this->options[ $field_id ]; |
|
| 365 | + $field = $this->options[$field_id]; |
|
| 366 | 366 | |
| 367 | 367 | if ( ! empty( $field['compiler'] ) ) { |
| 368 | 368 | echo '<tr class="compiler">'; |
@@ -370,7 +370,7 @@ discard block |
||
| 370 | 370 | echo '<tr>'; |
| 371 | 371 | } |
| 372 | 372 | |
| 373 | - echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 373 | + echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[$field['id']] ) . '</th>'; |
|
| 374 | 374 | echo '<td>'; |
| 375 | 375 | |
| 376 | 376 | $field['name'] = $field['id']; |
@@ -414,8 +414,8 @@ discard block |
||
| 414 | 414 | do_action( 'redux/extension/customizer/control/includes' ); |
| 415 | 415 | |
| 416 | 416 | $order = array( |
| 417 | - 'heading' => - 500, |
|
| 418 | - 'option' => - 500, |
|
| 417 | + 'heading' => -500, |
|
| 418 | + 'option' => -500, |
|
| 419 | 419 | ); |
| 420 | 420 | |
| 421 | 421 | $panel = ''; |
@@ -454,7 +454,7 @@ discard block |
||
| 454 | 454 | $parent_section_id = null; |
| 455 | 455 | $new_parent = true; |
| 456 | 456 | } |
| 457 | - if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 457 | + if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[$parent_section_id]['customizer'] ) && false === $this->parent->sections[$parent_section_id]['customizer'] ) ) { |
|
| 458 | 458 | continue; |
| 459 | 459 | } |
| 460 | 460 | |
@@ -487,7 +487,7 @@ discard block |
||
| 487 | 487 | } |
| 488 | 488 | $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
| 489 | 489 | |
| 490 | - if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 490 | + if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[( $key + 1 )]['subsection'] ) && $this->parent->sections[( $key + 1 )]['subsection'] ) { |
|
| 491 | 491 | $this->add_panel( |
| 492 | 492 | $this->parent->args['opt_name'] . '-' . $section['id'], |
| 493 | 493 | array( |
@@ -550,7 +550,7 @@ discard block |
||
| 550 | 550 | continue; |
| 551 | 551 | } |
| 552 | 552 | |
| 553 | - $this->options[ $option['id'] ] = $option; |
|
| 553 | + $this->options[$option['id']] = $option; |
|
| 554 | 554 | add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
| 555 | 555 | |
| 556 | 556 | $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
@@ -561,7 +561,7 @@ discard block |
||
| 561 | 561 | ++$order['option']; |
| 562 | 562 | } |
| 563 | 563 | |
| 564 | - if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 564 | + if ( ! empty( $this->options_defaults[$option['id']] ) ) { |
|
| 565 | 565 | $option['default'] = $this->options_defaults['option']['id']; |
| 566 | 566 | } |
| 567 | 567 | |
@@ -634,12 +634,12 @@ discard block |
||
| 634 | 634 | ) |
| 635 | 635 | ); |
| 636 | 636 | |
| 637 | - $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | - if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | - $section['fields'][ $skey ]['class'] = ''; |
|
| 637 | + $section['fields'][$skey]['name'] = $option['id']; |
|
| 638 | + if ( ! isset( $section['fields'][$skey]['class'] ) ) { // No errors please. |
|
| 639 | + $section['fields'][$skey]['class'] = ''; |
|
| 640 | 640 | } |
| 641 | 641 | |
| 642 | - $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 642 | + $this->controls[$section['fields'][$skey]['id']] = $section['fields'][$skey]; |
|
| 643 | 643 | } |
| 644 | 644 | } |
| 645 | 645 | } |
@@ -706,11 +706,11 @@ discard block |
||
| 706 | 706 | if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
| 707 | 707 | $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
| 708 | 708 | |
| 709 | - if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | - $this->parent->options[ $key ] = $value; |
|
| 709 | + if ( ! isset( $this->orig_options[$key] ) || $value !== $this->orig_options[$key] || ( isset( $this->orig_options[$key] ) && ! empty( $this->orig_options[$key] ) && empty( $value ) ) ) { |
|
| 710 | + $this->parent->options[$key] = $value; |
|
| 711 | 711 | $changed = true; |
| 712 | 712 | |
| 713 | - if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 713 | + if ( isset( $this->parent->compiler_fields[$key] ) ) { |
|
| 714 | 714 | $compiler = true; |
| 715 | 715 | } |
| 716 | 716 | } |
@@ -813,8 +813,8 @@ discard block |
||
| 813 | 813 | if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
| 814 | 814 | $replace = $value; |
| 815 | 815 | foreach ( $replace as $sub_array ) { |
| 816 | - $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | - $value[ $cs_array['id'] ] = $cs_array; |
|
| 816 | + $cs_array = ( array ) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | + $value[$cs_array['id']] = $cs_array; |
|
| 818 | 818 | } |
| 819 | 819 | } |
| 820 | 820 | |
@@ -14,828 +14,828 @@ |
||
| 14 | 14 | // Don't duplicate me! |
| 15 | 15 | if ( ! class_exists( 'Redux_Extension_Customizer', false ) ) { |
| 16 | 16 | |
| 17 | - /** |
|
| 18 | - * Main ReduxFramework customizer extension class |
|
| 19 | - * |
|
| 20 | - * @since 1.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Extension_Customizer extends Redux_Extension_Abstract { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * Set extension version. |
|
| 26 | - * |
|
| 27 | - * @var string |
|
| 28 | - */ |
|
| 29 | - public static $version = '4.5.1'; |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Set the name of the field. Ideally, this will also be your extension's name. |
|
| 33 | - * Please use underscores and NOT dashes. |
|
| 34 | - * |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - public string $field_name = 'customizer'; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * Set the friendly name of the extension. This is for display purposes. No underscores or dashes are required. |
|
| 41 | - * |
|
| 42 | - * @var string |
|
| 43 | - */ |
|
| 44 | - public string $extension_name = 'Customizer'; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * Original options. |
|
| 48 | - * |
|
| 49 | - * @var array|null |
|
| 50 | - */ |
|
| 51 | - private ?array $orig_options = array(); |
|
| 52 | - |
|
| 53 | - /** |
|
| 54 | - * Post values. |
|
| 55 | - * |
|
| 56 | - * @var array|null |
|
| 57 | - */ |
|
| 58 | - private static ?array $post_values = array(); |
|
| 59 | - |
|
| 60 | - /** |
|
| 61 | - * Options array. |
|
| 62 | - * |
|
| 63 | - * @var array|null |
|
| 64 | - */ |
|
| 65 | - public ?array $options = array(); |
|
| 66 | - |
|
| 67 | - /** |
|
| 68 | - * Controls array. |
|
| 69 | - * |
|
| 70 | - * @var array|null |
|
| 71 | - */ |
|
| 72 | - public ?array $controls = array(); |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * Before save array. |
|
| 76 | - * |
|
| 77 | - * @var array|null |
|
| 78 | - */ |
|
| 79 | - public ?array $before_save = array(); |
|
| 80 | - |
|
| 81 | - /** |
|
| 82 | - * Redux object. |
|
| 83 | - * |
|
| 84 | - * @var ReduxFramework|null |
|
| 85 | - */ |
|
| 86 | - protected ?ReduxFramework $redux; |
|
| 87 | - |
|
| 88 | - /** |
|
| 89 | - * Field array. |
|
| 90 | - * |
|
| 91 | - * @var array|null |
|
| 92 | - */ |
|
| 93 | - private ?array $redux_fields = array(); |
|
| 94 | - |
|
| 95 | - /** |
|
| 96 | - * Redux_Extension_my_extension constructor. |
|
| 97 | - * |
|
| 98 | - * @param ReduxFramework $redux ReduxFramework pointer. |
|
| 99 | - */ |
|
| 100 | - public function __construct( $redux ) { |
|
| 101 | - global $pagenow; |
|
| 102 | - global $wp_customize; |
|
| 103 | - |
|
| 104 | - parent::__construct( $redux, __FILE__ ); |
|
| 105 | - |
|
| 106 | - if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 107 | - return; |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - $this->add_field( 'customizer' ); |
|
| 111 | - |
|
| 112 | - $this->load(); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - /** |
|
| 116 | - * The customizer load code |
|
| 117 | - */ |
|
| 118 | - private function load() { |
|
| 119 | - global $pagenow, $wp_customize; |
|
| 120 | - |
|
| 121 | - if ( false === $this->parent->args['customizer'] ) { |
|
| 122 | - return; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - // Override the Redux_Core class. |
|
| 126 | - add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) ); |
|
| 127 | - |
|
| 128 | - if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 129 | - return; |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - self::get_post_values(); |
|
| 133 | - |
|
| 134 | - if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 135 | - $this->parent->args['customizer_only'] = true; |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 139 | - add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 ); |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls. |
|
| 143 | - add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); |
|
| 144 | - |
|
| 145 | - add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save. |
|
| 146 | - |
|
| 147 | - // Add global controls CSS file. |
|
| 148 | - add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) ); |
|
| 149 | - add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) ); |
|
| 150 | - add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 ); |
|
| 151 | - |
|
| 152 | - add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 ); |
|
| 153 | - |
|
| 154 | - add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) ); |
|
| 155 | - add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) ); |
|
| 156 | - } |
|
| 157 | - |
|
| 158 | - /** |
|
| 159 | - * Add nonce HTML for AJAX. |
|
| 160 | - */ |
|
| 161 | - public function add_nonce_html() { |
|
| 162 | - $nonce = wp_create_nonce( 'redux_customer_nonce' ); |
|
| 163 | - |
|
| 164 | - ?> |
|
| 17 | + /** |
|
| 18 | + * Main ReduxFramework customizer extension class |
|
| 19 | + * |
|
| 20 | + * @since 1.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Extension_Customizer extends Redux_Extension_Abstract { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * Set extension version. |
|
| 26 | + * |
|
| 27 | + * @var string |
|
| 28 | + */ |
|
| 29 | + public static $version = '4.5.1'; |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Set the name of the field. Ideally, this will also be your extension's name. |
|
| 33 | + * Please use underscores and NOT dashes. |
|
| 34 | + * |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + public string $field_name = 'customizer'; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * Set the friendly name of the extension. This is for display purposes. No underscores or dashes are required. |
|
| 41 | + * |
|
| 42 | + * @var string |
|
| 43 | + */ |
|
| 44 | + public string $extension_name = 'Customizer'; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * Original options. |
|
| 48 | + * |
|
| 49 | + * @var array|null |
|
| 50 | + */ |
|
| 51 | + private ?array $orig_options = array(); |
|
| 52 | + |
|
| 53 | + /** |
|
| 54 | + * Post values. |
|
| 55 | + * |
|
| 56 | + * @var array|null |
|
| 57 | + */ |
|
| 58 | + private static ?array $post_values = array(); |
|
| 59 | + |
|
| 60 | + /** |
|
| 61 | + * Options array. |
|
| 62 | + * |
|
| 63 | + * @var array|null |
|
| 64 | + */ |
|
| 65 | + public ?array $options = array(); |
|
| 66 | + |
|
| 67 | + /** |
|
| 68 | + * Controls array. |
|
| 69 | + * |
|
| 70 | + * @var array|null |
|
| 71 | + */ |
|
| 72 | + public ?array $controls = array(); |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * Before save array. |
|
| 76 | + * |
|
| 77 | + * @var array|null |
|
| 78 | + */ |
|
| 79 | + public ?array $before_save = array(); |
|
| 80 | + |
|
| 81 | + /** |
|
| 82 | + * Redux object. |
|
| 83 | + * |
|
| 84 | + * @var ReduxFramework|null |
|
| 85 | + */ |
|
| 86 | + protected ?ReduxFramework $redux; |
|
| 87 | + |
|
| 88 | + /** |
|
| 89 | + * Field array. |
|
| 90 | + * |
|
| 91 | + * @var array|null |
|
| 92 | + */ |
|
| 93 | + private ?array $redux_fields = array(); |
|
| 94 | + |
|
| 95 | + /** |
|
| 96 | + * Redux_Extension_my_extension constructor. |
|
| 97 | + * |
|
| 98 | + * @param ReduxFramework $redux ReduxFramework pointer. |
|
| 99 | + */ |
|
| 100 | + public function __construct( $redux ) { |
|
| 101 | + global $pagenow; |
|
| 102 | + global $wp_customize; |
|
| 103 | + |
|
| 104 | + parent::__construct( $redux, __FILE__ ); |
|
| 105 | + |
|
| 106 | + if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 107 | + return; |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + $this->add_field( 'customizer' ); |
|
| 111 | + |
|
| 112 | + $this->load(); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + /** |
|
| 116 | + * The customizer load code |
|
| 117 | + */ |
|
| 118 | + private function load() { |
|
| 119 | + global $pagenow, $wp_customize; |
|
| 120 | + |
|
| 121 | + if ( false === $this->parent->args['customizer'] ) { |
|
| 122 | + return; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + // Override the Redux_Core class. |
|
| 126 | + add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) ); |
|
| 127 | + |
|
| 128 | + if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 129 | + return; |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + self::get_post_values(); |
|
| 133 | + |
|
| 134 | + if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 135 | + $this->parent->args['customizer_only'] = true; |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 139 | + add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 ); |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls. |
|
| 143 | + add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); |
|
| 144 | + |
|
| 145 | + add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save. |
|
| 146 | + |
|
| 147 | + // Add global controls CSS file. |
|
| 148 | + add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) ); |
|
| 149 | + add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) ); |
|
| 150 | + add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 ); |
|
| 151 | + |
|
| 152 | + add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 ); |
|
| 153 | + |
|
| 154 | + add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) ); |
|
| 155 | + add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) ); |
|
| 156 | + } |
|
| 157 | + |
|
| 158 | + /** |
|
| 159 | + * Add nonce HTML for AJAX. |
|
| 160 | + */ |
|
| 161 | + public function add_nonce_html() { |
|
| 162 | + $nonce = wp_create_nonce( 'redux_customer_nonce' ); |
|
| 163 | + |
|
| 164 | + ?> |
|
| 165 | 165 | <div class="redux-customizer-nonce" data-nonce="<?php echo esc_attr( $nonce ); ?>"></div> |
| 166 | 166 | <?php |
| 167 | - } |
|
| 168 | - |
|
| 169 | - /** |
|
| 170 | - * AJAX callback for customizer save...to make sanitize/validate work. |
|
| 171 | - */ |
|
| 172 | - public function customizer() { |
|
| 173 | - try { |
|
| 174 | - $return_array = array(); |
|
| 175 | - |
|
| 176 | - if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) { |
|
| 177 | - $redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 178 | - |
|
| 179 | - $post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput |
|
| 180 | - |
|
| 181 | - // New method to avoid input_var nonsense. Thanks @harunbasic. |
|
| 182 | - $values = Redux_Functions_Ex::parse_str( $post_data ); |
|
| 183 | - |
|
| 184 | - $all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 185 | - |
|
| 186 | - $values = wp_parse_args( $values, $all_options ); |
|
| 187 | - |
|
| 188 | - $redux->options_class->set( $redux->options_class->validate_options( $values ) ); |
|
| 189 | - |
|
| 190 | - $redux->enqueue_class->get_warnings_and_errors_array(); |
|
| 191 | - |
|
| 192 | - $return_array = array( |
|
| 193 | - 'status' => 'success', |
|
| 194 | - 'options' => $redux->options, |
|
| 195 | - 'errors' => $redux->enqueue_class->localize_data['errors'] ?? null, |
|
| 196 | - 'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null, |
|
| 197 | - 'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null, |
|
| 198 | - ); |
|
| 199 | - } |
|
| 200 | - } catch ( Exception $e ) { |
|
| 201 | - $return_array = array( 'status' => $e->getMessage() ); |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - echo wp_json_encode( $return_array ); |
|
| 205 | - |
|
| 206 | - die; |
|
| 207 | - } |
|
| 208 | - |
|
| 209 | - /** |
|
| 210 | - * Field classes. |
|
| 211 | - * |
|
| 212 | - * @param array $option Option. |
|
| 213 | - */ |
|
| 214 | - public function create_field_classes( array $option ) { |
|
| 215 | - if ( empty( $this->redux_fields ) ) { |
|
| 216 | - $file_paths = glob( Redux_Core::$dir . 'inc/fields/*' ); |
|
| 217 | - |
|
| 218 | - foreach ( $file_paths as $file ) { |
|
| 219 | - if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 220 | - $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file ); |
|
| 221 | - } |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - $file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' ); |
|
| 225 | - |
|
| 226 | - foreach ( $file_paths as $file ) { |
|
| 227 | - if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 228 | - $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file ); |
|
| 229 | - } |
|
| 230 | - } |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 234 | - |
|
| 235 | - if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) { |
|
| 236 | - $upload_dir = Redux_Core::$upload_dir; |
|
| 237 | - |
|
| 238 | - if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 239 | - if ( ! is_dir( $upload_dir ) ) { |
|
| 240 | - Redux_Core::$filesystem->execute( 'mkdir', $upload_dir ); |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - $template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . ' class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . ' public $type = "redux-{{type}}";' . PHP_EOL . ' }' ); |
|
| 244 | - |
|
| 245 | - Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) ); |
|
| 246 | - } |
|
| 247 | - |
|
| 248 | - if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 249 | - include_once $upload_dir . $option['type'] . '.php'; |
|
| 250 | - } |
|
| 251 | - } |
|
| 252 | - } |
|
| 253 | - |
|
| 254 | - /** |
|
| 255 | - * Enqueue extension scripts/styles. |
|
| 256 | - */ |
|
| 257 | - public function enqueue_controls_css() { |
|
| 258 | - $this->parent->enqueue_class->get_warnings_and_errors_array(); |
|
| 259 | - $this->parent->enqueue_class->init(); |
|
| 260 | - |
|
| 261 | - if ( $this->parent->args['dev_mode'] ) { |
|
| 262 | - wp_enqueue_style( |
|
| 263 | - 'redux-extension-customizer', |
|
| 264 | - $this->extension_url . 'redux-extension-customizer.css', |
|
| 265 | - array(), |
|
| 266 | - self::$version |
|
| 267 | - ); |
|
| 268 | - } |
|
| 269 | - |
|
| 270 | - wp_enqueue_script( |
|
| 271 | - 'redux-extension-customizer', |
|
| 272 | - $this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js', |
|
| 273 | - array( 'jquery', 'redux-js' ), |
|
| 274 | - self::$version, |
|
| 275 | - true |
|
| 276 | - ); |
|
| 277 | - |
|
| 278 | - wp_localize_script( |
|
| 279 | - 'redux-extension-customizer', |
|
| 280 | - 'redux_customizer', |
|
| 281 | - array( |
|
| 282 | - 'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ), |
|
| 283 | - ) |
|
| 284 | - ); |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - /** |
|
| 288 | - * Enqueue panel CSS> |
|
| 289 | - */ |
|
| 290 | - public function enqueue_panel_css() {} |
|
| 291 | - |
|
| 292 | - /** |
|
| 293 | - * Remove core customizer class. |
|
| 294 | - * |
|
| 295 | - * @return string |
|
| 296 | - */ |
|
| 297 | - public function remove_core_customizer_class(): string { |
|
| 298 | - return ''; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - /** |
|
| 302 | - * Customize preview init. |
|
| 303 | - */ |
|
| 304 | - public function customize_preview_init() { |
|
| 305 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | - do_action( 'redux/customizer/live_preview' ); |
|
| 307 | - } |
|
| 308 | - |
|
| 309 | - /** |
|
| 310 | - * Get post values. |
|
| 311 | - */ |
|
| 312 | - protected static function get_post_values() { |
|
| 313 | - if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 314 | - $the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput |
|
| 315 | - |
|
| 316 | - foreach ( $the_data as $key => $value ) { |
|
| 317 | - if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 318 | - foreach ( $value as $k => $v ) { |
|
| 319 | - $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | - $v = $decode; |
|
| 321 | - $dumb_array[ $k ] = $v; |
|
| 322 | - $the_data[ $key ] = $dumb_array; |
|
| 323 | - } |
|
| 324 | - } |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - self::$post_values = $the_data; |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - |
|
| 331 | - /** |
|
| 332 | - * Override customizer values. |
|
| 333 | - * |
|
| 334 | - * @param array $data Values. |
|
| 335 | - * |
|
| 336 | - * @return array |
|
| 337 | - */ |
|
| 338 | - public function override_values( array $data ): array { |
|
| 339 | - self::get_post_values(); |
|
| 340 | - |
|
| 341 | - if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 342 | - if ( is_array( self::$post_values ) ) { |
|
| 343 | - foreach ( self::$post_values as $key => $value ) { |
|
| 344 | - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 345 | - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 346 | - $data[ $key ] = $value; |
|
| 347 | - |
|
| 348 | - $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | - $this->parent->options[ $key ] = $value; |
|
| 350 | - } |
|
| 351 | - } |
|
| 352 | - } |
|
| 353 | - } |
|
| 354 | - |
|
| 355 | - return $data; |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Render Redux fields. |
|
| 360 | - * |
|
| 361 | - * @param object $control . |
|
| 362 | - */ |
|
| 363 | - public function render( object $control ) { |
|
| 364 | - $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
|
| 365 | - $field = $this->options[ $field_id ]; |
|
| 366 | - |
|
| 367 | - if ( ! empty( $field['compiler'] ) ) { |
|
| 368 | - echo '<tr class="compiler">'; |
|
| 369 | - } else { |
|
| 370 | - echo '<tr>'; |
|
| 371 | - } |
|
| 372 | - |
|
| 373 | - echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 374 | - echo '<td>'; |
|
| 375 | - |
|
| 376 | - $field['name'] = $field['id']; |
|
| 377 | - $this->parent->render_class->field_input( $field ); |
|
| 378 | - |
|
| 379 | - echo '</td>'; |
|
| 380 | - echo '</tr>'; |
|
| 381 | - } |
|
| 382 | - |
|
| 383 | - // All sections, settings, and controls will be added here. |
|
| 384 | - |
|
| 385 | - /** |
|
| 386 | - * Register customizer controls. |
|
| 387 | - * |
|
| 388 | - * @param WP_Customize_Manager $wp_customize . |
|
| 389 | - * |
|
| 390 | - * @throws ReflectionException Exception. |
|
| 391 | - */ |
|
| 392 | - public function register_customizer_controls( WP_Customize_Manager $wp_customize ) { |
|
| 393 | - if ( ! class_exists( 'Redux_Customizer_Section' ) ) { |
|
| 394 | - require_once __DIR__ . '/inc/class-redux-customizer-section.php'; |
|
| 395 | - |
|
| 396 | - if ( method_exists( $wp_customize, 'register_section_type' ) ) { |
|
| 397 | - $wp_customize->register_section_type( 'Redux_Customizer_Section' ); |
|
| 398 | - } |
|
| 399 | - } |
|
| 400 | - |
|
| 401 | - if ( ! class_exists( 'Redux_Customizer_Panel' ) ) { |
|
| 402 | - require_once __DIR__ . '/inc/class-redux-customizer-panel.php'; |
|
| 403 | - |
|
| 404 | - if ( method_exists( $wp_customize, 'register_panel_type' ) ) { |
|
| 405 | - $wp_customize->register_panel_type( 'Redux_Customizer_Panel' ); |
|
| 406 | - } |
|
| 407 | - } |
|
| 408 | - |
|
| 409 | - if ( ! class_exists( 'Redux_Customizer_Control' ) ) { |
|
| 410 | - require_once __DIR__ . '/inc/class-redux-customizer-control.php'; |
|
| 411 | - } |
|
| 412 | - |
|
| 413 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 414 | - do_action( 'redux/extension/customizer/control/includes' ); |
|
| 415 | - |
|
| 416 | - $order = array( |
|
| 417 | - 'heading' => - 500, |
|
| 418 | - 'option' => - 500, |
|
| 419 | - ); |
|
| 420 | - |
|
| 421 | - $panel = ''; |
|
| 422 | - |
|
| 423 | - $this->parent->args['options_api'] = false; |
|
| 424 | - $this->parent->options_class->register(); |
|
| 425 | - |
|
| 426 | - $parent_section_id = null; |
|
| 427 | - $new_parent = true; |
|
| 428 | - |
|
| 429 | - foreach ( $this->parent->sections as $key => $section ) { |
|
| 430 | - // Not a type that should go on the customizer. |
|
| 431 | - |
|
| 432 | - foreach ( $section['fields'] as $field ) { |
|
| 433 | - if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) { |
|
| 434 | - continue 2; |
|
| 435 | - } |
|
| 436 | - } |
|
| 437 | - |
|
| 438 | - if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) { |
|
| 439 | - continue; |
|
| 440 | - } |
|
| 441 | - |
|
| 442 | - // If section customizer is set to false. |
|
| 443 | - if ( isset( $section['customizer'] ) && false === $section['customizer'] ) { |
|
| 444 | - continue; |
|
| 445 | - } |
|
| 446 | - |
|
| 447 | - // if we are in a subsection and parent is set to customizer false !!! |
|
| 448 | - if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) { |
|
| 449 | - if ( $new_parent ) { |
|
| 450 | - $new_parent = false; |
|
| 451 | - $parent_section_id = ( $key - 1 ); |
|
| 452 | - } |
|
| 453 | - } else { // not a subsection reset. |
|
| 454 | - $parent_section_id = null; |
|
| 455 | - $new_parent = true; |
|
| 456 | - } |
|
| 457 | - if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 458 | - continue; |
|
| 459 | - } |
|
| 460 | - |
|
| 461 | - $section['permissions'] = $section['permissions'] ?? 'edit_theme_options'; |
|
| 462 | - |
|
| 463 | - // No errors please. |
|
| 464 | - if ( ! isset( $section['desc'] ) ) { |
|
| 465 | - $section['desc'] = ''; |
|
| 466 | - } |
|
| 467 | - |
|
| 468 | - // Fill the description if there is a subtitle. |
|
| 469 | - if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) { |
|
| 470 | - $section['desc'] = $section['subtitle']; |
|
| 471 | - } |
|
| 472 | - |
|
| 473 | - // No title is present, let's show what section is missing a title. |
|
| 474 | - if ( ! isset( $section['title'] ) ) { |
|
| 475 | - $section['title'] = ''; |
|
| 476 | - } |
|
| 477 | - |
|
| 478 | - // Let's make a section ID from the title. |
|
| 479 | - if ( empty( $section['id'] ) ) { |
|
| 480 | - $section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) ); |
|
| 481 | - } |
|
| 482 | - |
|
| 483 | - // Let's set a default priority. |
|
| 484 | - if ( empty( $section['priority'] ) ) { |
|
| 485 | - $section['priority'] = $order['heading']; |
|
| 486 | - ++$order['heading']; |
|
| 487 | - } |
|
| 488 | - $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 489 | - |
|
| 490 | - if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 491 | - $this->add_panel( |
|
| 492 | - $this->parent->args['opt_name'] . '-' . $section['id'], |
|
| 493 | - array( |
|
| 494 | - 'priority' => $section['priority'], |
|
| 495 | - 'capability' => $section['permissions'], |
|
| 496 | - 'title' => $section['title'], |
|
| 497 | - 'section' => $section, |
|
| 498 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 499 | - 'description' => '', |
|
| 500 | - ), |
|
| 501 | - $wp_customize |
|
| 502 | - ); |
|
| 503 | - |
|
| 504 | - $panel = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 505 | - |
|
| 506 | - $this->add_section( |
|
| 507 | - $section['id'], |
|
| 508 | - array( |
|
| 509 | - 'title' => $section['title'], |
|
| 510 | - 'priority' => $section['priority'], |
|
| 511 | - 'description' => $section['desc'], |
|
| 512 | - 'section' => $section, |
|
| 513 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 514 | - 'capability' => $section['permissions'], |
|
| 515 | - 'panel' => $panel, |
|
| 516 | - ), |
|
| 517 | - $wp_customize |
|
| 518 | - ); |
|
| 519 | - } else { |
|
| 520 | - if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) { |
|
| 521 | - $panel = ''; |
|
| 522 | - } |
|
| 523 | - |
|
| 524 | - $this->add_section( |
|
| 525 | - $section['id'], |
|
| 526 | - array( |
|
| 527 | - 'title' => $section['title'], |
|
| 528 | - 'priority' => $section['priority'], |
|
| 529 | - 'description' => $section['desc'], |
|
| 530 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 531 | - 'section' => $section, |
|
| 532 | - 'capability' => $section['permissions'], |
|
| 533 | - 'panel' => $panel, |
|
| 534 | - ), |
|
| 535 | - $wp_customize |
|
| 536 | - ); |
|
| 537 | - } |
|
| 538 | - |
|
| 539 | - if ( ( empty( $section['fields'] ) ) ) { |
|
| 540 | - continue; |
|
| 541 | - } |
|
| 542 | - |
|
| 543 | - foreach ( $section['fields'] as $skey => $option ) { |
|
| 544 | - |
|
| 545 | - if ( isset( $option['customizer'] ) && false === $option['customizer'] ) { |
|
| 546 | - continue; |
|
| 547 | - } |
|
| 548 | - |
|
| 549 | - if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) { |
|
| 550 | - continue; |
|
| 551 | - } |
|
| 552 | - |
|
| 553 | - $this->options[ $option['id'] ] = $option; |
|
| 554 | - add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
|
| 555 | - |
|
| 556 | - $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
|
| 557 | - |
|
| 558 | - // Change the item priority if not set. |
|
| 559 | - if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) { |
|
| 560 | - $option['priority'] = $order['option']; |
|
| 561 | - ++$order['option']; |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 565 | - $option['default'] = $this->options_defaults['option']['id']; |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | - if ( ! isset( $option['default'] ) ) { |
|
| 569 | - $option['default'] = ''; |
|
| 570 | - } |
|
| 571 | - if ( ! isset( $option['title'] ) ) { |
|
| 572 | - $option['title'] = ''; |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; |
|
| 576 | - |
|
| 577 | - if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) { |
|
| 578 | - |
|
| 579 | - $wp_customize->add_setting( |
|
| 580 | - $option['id'], |
|
| 581 | - array( |
|
| 582 | - 'default' => $option['default'], |
|
| 583 | - 'transport' => 'refresh', |
|
| 584 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 585 | - 'sanitize_callback' => array( $this, 'field_validation' ), |
|
| 586 | - ) |
|
| 587 | - ); |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) { |
|
| 591 | - if ( empty( $option['args'] ) ) { |
|
| 592 | - $option['args'] = array(); |
|
| 593 | - } |
|
| 594 | - |
|
| 595 | - if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) { |
|
| 596 | - $icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php'; |
|
| 597 | - |
|
| 598 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 599 | - $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); |
|
| 600 | - |
|
| 601 | - if ( file_exists( $icons_file ) ) { |
|
| 602 | - require_once $icons_file; |
|
| 603 | - } |
|
| 604 | - } |
|
| 605 | - $option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] ); |
|
| 606 | - } |
|
| 607 | - |
|
| 608 | - $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 609 | - |
|
| 610 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 611 | - do_action( 'redux/extension/customizer/control_init', $option ); |
|
| 612 | - |
|
| 613 | - if ( ! class_exists( $class_name ) ) { |
|
| 614 | - continue; |
|
| 615 | - } |
|
| 616 | - |
|
| 617 | - $wp_customize->add_control( |
|
| 618 | - new $class_name( |
|
| 619 | - $wp_customize, |
|
| 620 | - $option['id'], |
|
| 621 | - array( |
|
| 622 | - 'label' => $option['title'], |
|
| 623 | - 'section' => $section['id'], |
|
| 624 | - 'settings' => $option['id'], |
|
| 625 | - 'type' => 'redux-' . $option['type'], |
|
| 626 | - 'field' => $option, |
|
| 627 | - 'ReduxFramework' => $this->parent, |
|
| 628 | - 'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array( |
|
| 629 | - 'Redux_Customizer_Active_Callback', |
|
| 630 | - 'evaluate', |
|
| 631 | - ) : '__return_true', |
|
| 632 | - 'priority' => $option['priority'], |
|
| 633 | - ) |
|
| 634 | - ) |
|
| 635 | - ); |
|
| 636 | - |
|
| 637 | - $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | - if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | - $section['fields'][ $skey ]['class'] = ''; |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 643 | - } |
|
| 644 | - } |
|
| 645 | - } |
|
| 646 | - |
|
| 647 | - /** |
|
| 648 | - * Add customizer section. |
|
| 649 | - * |
|
| 650 | - * @param string $id ID. |
|
| 651 | - * @param array $args Args. |
|
| 652 | - * @param WP_Customize_Manager $wp_customize . |
|
| 653 | - */ |
|
| 654 | - public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 655 | - |
|
| 656 | - if ( is_a( $id, 'WP_Customize_Section' ) ) { |
|
| 657 | - $section = $id; |
|
| 658 | - } else { |
|
| 659 | - $section = new Redux_Customizer_Section( $wp_customize, $id, $args ); |
|
| 660 | - } |
|
| 661 | - |
|
| 662 | - $wp_customize->add_section( $section, $args ); |
|
| 663 | - } |
|
| 664 | - |
|
| 665 | - /** |
|
| 666 | - * Add a customize panel. |
|
| 667 | - * |
|
| 668 | - * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. |
|
| 669 | - * @param array $args Optional. Panel arguments. Default empty array. |
|
| 670 | - * @param WP_Customize_Manager $wp_customize . |
|
| 671 | - * |
|
| 672 | - * @since 4.0.0 |
|
| 673 | - * @access public |
|
| 674 | - */ |
|
| 675 | - public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 676 | - if ( is_a( $id, 'WP_Customize_Panel' ) ) { |
|
| 677 | - $panel = $id; |
|
| 678 | - } else { |
|
| 679 | - $panel = new Redux_Customizer_Panel( $wp_customize, $id, $args ); |
|
| 680 | - } |
|
| 681 | - |
|
| 682 | - $wp_customize->add_panel( $panel, $args ); |
|
| 683 | - } |
|
| 684 | - |
|
| 685 | - /** |
|
| 686 | - * Actions to take after customizer save. |
|
| 687 | - * |
|
| 688 | - * @throws ReflectionException Exception. |
|
| 689 | - */ |
|
| 690 | - public function customizer_save_after() { |
|
| 691 | - if ( empty( $this->parent->options ) ) { |
|
| 692 | - $this->parent->get_options(); |
|
| 693 | - } |
|
| 694 | - |
|
| 695 | - if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) { |
|
| 696 | - $this->orig_options = $this->parent->options; |
|
| 697 | - } |
|
| 698 | - |
|
| 699 | - if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 700 | - $options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification |
|
| 701 | - |
|
| 702 | - $compiler = false; |
|
| 703 | - $changed = false; |
|
| 704 | - |
|
| 705 | - foreach ( $options as $key => $value ) { |
|
| 706 | - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 707 | - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 708 | - |
|
| 709 | - if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | - $this->parent->options[ $key ] = $value; |
|
| 711 | - $changed = true; |
|
| 712 | - |
|
| 713 | - if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 714 | - $compiler = true; |
|
| 715 | - } |
|
| 716 | - } |
|
| 717 | - } |
|
| 718 | - } |
|
| 719 | - |
|
| 720 | - if ( $changed ) { |
|
| 721 | - $this->parent->options_class->set( $this->parent->options ); |
|
| 722 | - if ( $compiler ) { |
|
| 723 | - // Have to set this to stop the output of the CSS and typography stuff. |
|
| 724 | - Redux_Core::$no_output = true; |
|
| 725 | - $this->parent->output_class->enqueue(); |
|
| 726 | - |
|
| 727 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 728 | - do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS ); |
|
| 729 | - |
|
| 730 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 731 | - do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent ); |
|
| 732 | - } |
|
| 733 | - } |
|
| 734 | - } |
|
| 735 | - } |
|
| 736 | - |
|
| 737 | - /** |
|
| 738 | - * Enqueue CSS/JS for the customizer controls |
|
| 739 | - * |
|
| 740 | - * @since 1.0.0 |
|
| 741 | - * @access public |
|
| 742 | - * @global $wp_styles |
|
| 743 | - * @return void |
|
| 744 | - */ |
|
| 745 | - public function enqueue() { |
|
| 746 | - $localize = array( |
|
| 747 | - 'save_pending' => esc_html__( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), |
|
| 748 | - 'reset_confirm' => esc_html__( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), |
|
| 749 | - 'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), |
|
| 750 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 751 | - 'field' => $this->parent->options, |
|
| 752 | - 'defaults' => $this->parent->options_defaults, |
|
| 753 | - 'folds' => Redux_Core::$folds, |
|
| 754 | - ); |
|
| 755 | - |
|
| 756 | - // Values used by the javascript. |
|
| 757 | - wp_localize_script( 'redux-js', 'redux_opts', $localize ); |
|
| 758 | - |
|
| 759 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 760 | - do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] ); |
|
| 761 | - |
|
| 762 | - foreach ( $this->parent->sections as $section ) { |
|
| 763 | - if ( isset( $section['fields'] ) ) { |
|
| 764 | - foreach ( $section['fields'] as $field ) { |
|
| 765 | - if ( isset( $field['type'] ) ) { |
|
| 766 | - $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 767 | - |
|
| 768 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 769 | - |
|
| 770 | - if ( false === $field_class ) { |
|
| 771 | - |
|
| 772 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 773 | - $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class ); |
|
| 774 | - |
|
| 775 | - if ( $class_file ) { |
|
| 776 | - require_once $class_file; |
|
| 777 | - |
|
| 778 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 779 | - |
|
| 780 | - } |
|
| 781 | - } |
|
| 782 | - |
|
| 783 | - if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { |
|
| 784 | - $enqueue = new $field_class( '', '', $this ); |
|
| 785 | - $enqueue->enqueue(); |
|
| 786 | - } |
|
| 787 | - } |
|
| 788 | - } |
|
| 789 | - } |
|
| 790 | - } |
|
| 791 | - } |
|
| 792 | - |
|
| 793 | - /** |
|
| 794 | - * Register Option for use |
|
| 795 | - * |
|
| 796 | - * @since 1.0.0 |
|
| 797 | - * @access public |
|
| 798 | - * @return void |
|
| 799 | - */ |
|
| 800 | - public function register_setting() { |
|
| 801 | - } |
|
| 802 | - |
|
| 803 | - /** |
|
| 804 | - * Validate the options before insertion |
|
| 805 | - * |
|
| 806 | - * @param array|string $value The options array. |
|
| 807 | - * |
|
| 808 | - * @return array|string $value |
|
| 809 | - * @since 3.0.0 |
|
| 810 | - * @access public |
|
| 811 | - */ |
|
| 812 | - public function field_validation( $value ) { |
|
| 813 | - if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 814 | - $replace = $value; |
|
| 815 | - foreach ( $replace as $sub_array ) { |
|
| 816 | - $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | - $value[ $cs_array['id'] ] = $cs_array; |
|
| 818 | - } |
|
| 819 | - } |
|
| 820 | - |
|
| 821 | - return $value; |
|
| 822 | - } |
|
| 823 | - } |
|
| 824 | - |
|
| 825 | - if ( ! function_exists( 'redux_customizer_custom_validation' ) ) { |
|
| 826 | - /** |
|
| 827 | - * Custom validation. |
|
| 828 | - * |
|
| 829 | - * @param mixed $field Field. |
|
| 830 | - * |
|
| 831 | - * @return mixed |
|
| 832 | - */ |
|
| 833 | - function redux_customizer_custom_validation( $field ) { |
|
| 834 | - return $field; |
|
| 835 | - } |
|
| 836 | - } |
|
| 167 | + } |
|
| 168 | + |
|
| 169 | + /** |
|
| 170 | + * AJAX callback for customizer save...to make sanitize/validate work. |
|
| 171 | + */ |
|
| 172 | + public function customizer() { |
|
| 173 | + try { |
|
| 174 | + $return_array = array(); |
|
| 175 | + |
|
| 176 | + if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) { |
|
| 177 | + $redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 178 | + |
|
| 179 | + $post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput |
|
| 180 | + |
|
| 181 | + // New method to avoid input_var nonsense. Thanks @harunbasic. |
|
| 182 | + $values = Redux_Functions_Ex::parse_str( $post_data ); |
|
| 183 | + |
|
| 184 | + $all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 185 | + |
|
| 186 | + $values = wp_parse_args( $values, $all_options ); |
|
| 187 | + |
|
| 188 | + $redux->options_class->set( $redux->options_class->validate_options( $values ) ); |
|
| 189 | + |
|
| 190 | + $redux->enqueue_class->get_warnings_and_errors_array(); |
|
| 191 | + |
|
| 192 | + $return_array = array( |
|
| 193 | + 'status' => 'success', |
|
| 194 | + 'options' => $redux->options, |
|
| 195 | + 'errors' => $redux->enqueue_class->localize_data['errors'] ?? null, |
|
| 196 | + 'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null, |
|
| 197 | + 'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null, |
|
| 198 | + ); |
|
| 199 | + } |
|
| 200 | + } catch ( Exception $e ) { |
|
| 201 | + $return_array = array( 'status' => $e->getMessage() ); |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + echo wp_json_encode( $return_array ); |
|
| 205 | + |
|
| 206 | + die; |
|
| 207 | + } |
|
| 208 | + |
|
| 209 | + /** |
|
| 210 | + * Field classes. |
|
| 211 | + * |
|
| 212 | + * @param array $option Option. |
|
| 213 | + */ |
|
| 214 | + public function create_field_classes( array $option ) { |
|
| 215 | + if ( empty( $this->redux_fields ) ) { |
|
| 216 | + $file_paths = glob( Redux_Core::$dir . 'inc/fields/*' ); |
|
| 217 | + |
|
| 218 | + foreach ( $file_paths as $file ) { |
|
| 219 | + if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 220 | + $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file ); |
|
| 221 | + } |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + $file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' ); |
|
| 225 | + |
|
| 226 | + foreach ( $file_paths as $file ) { |
|
| 227 | + if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 228 | + $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file ); |
|
| 229 | + } |
|
| 230 | + } |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 234 | + |
|
| 235 | + if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) { |
|
| 236 | + $upload_dir = Redux_Core::$upload_dir; |
|
| 237 | + |
|
| 238 | + if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 239 | + if ( ! is_dir( $upload_dir ) ) { |
|
| 240 | + Redux_Core::$filesystem->execute( 'mkdir', $upload_dir ); |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + $template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . ' class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . ' public $type = "redux-{{type}}";' . PHP_EOL . ' }' ); |
|
| 244 | + |
|
| 245 | + Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) ); |
|
| 246 | + } |
|
| 247 | + |
|
| 248 | + if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 249 | + include_once $upload_dir . $option['type'] . '.php'; |
|
| 250 | + } |
|
| 251 | + } |
|
| 252 | + } |
|
| 253 | + |
|
| 254 | + /** |
|
| 255 | + * Enqueue extension scripts/styles. |
|
| 256 | + */ |
|
| 257 | + public function enqueue_controls_css() { |
|
| 258 | + $this->parent->enqueue_class->get_warnings_and_errors_array(); |
|
| 259 | + $this->parent->enqueue_class->init(); |
|
| 260 | + |
|
| 261 | + if ( $this->parent->args['dev_mode'] ) { |
|
| 262 | + wp_enqueue_style( |
|
| 263 | + 'redux-extension-customizer', |
|
| 264 | + $this->extension_url . 'redux-extension-customizer.css', |
|
| 265 | + array(), |
|
| 266 | + self::$version |
|
| 267 | + ); |
|
| 268 | + } |
|
| 269 | + |
|
| 270 | + wp_enqueue_script( |
|
| 271 | + 'redux-extension-customizer', |
|
| 272 | + $this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js', |
|
| 273 | + array( 'jquery', 'redux-js' ), |
|
| 274 | + self::$version, |
|
| 275 | + true |
|
| 276 | + ); |
|
| 277 | + |
|
| 278 | + wp_localize_script( |
|
| 279 | + 'redux-extension-customizer', |
|
| 280 | + 'redux_customizer', |
|
| 281 | + array( |
|
| 282 | + 'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ), |
|
| 283 | + ) |
|
| 284 | + ); |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + /** |
|
| 288 | + * Enqueue panel CSS> |
|
| 289 | + */ |
|
| 290 | + public function enqueue_panel_css() {} |
|
| 291 | + |
|
| 292 | + /** |
|
| 293 | + * Remove core customizer class. |
|
| 294 | + * |
|
| 295 | + * @return string |
|
| 296 | + */ |
|
| 297 | + public function remove_core_customizer_class(): string { |
|
| 298 | + return ''; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + /** |
|
| 302 | + * Customize preview init. |
|
| 303 | + */ |
|
| 304 | + public function customize_preview_init() { |
|
| 305 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | + do_action( 'redux/customizer/live_preview' ); |
|
| 307 | + } |
|
| 308 | + |
|
| 309 | + /** |
|
| 310 | + * Get post values. |
|
| 311 | + */ |
|
| 312 | + protected static function get_post_values() { |
|
| 313 | + if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 314 | + $the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput |
|
| 315 | + |
|
| 316 | + foreach ( $the_data as $key => $value ) { |
|
| 317 | + if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 318 | + foreach ( $value as $k => $v ) { |
|
| 319 | + $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | + $v = $decode; |
|
| 321 | + $dumb_array[ $k ] = $v; |
|
| 322 | + $the_data[ $key ] = $dumb_array; |
|
| 323 | + } |
|
| 324 | + } |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + self::$post_values = $the_data; |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + |
|
| 331 | + /** |
|
| 332 | + * Override customizer values. |
|
| 333 | + * |
|
| 334 | + * @param array $data Values. |
|
| 335 | + * |
|
| 336 | + * @return array |
|
| 337 | + */ |
|
| 338 | + public function override_values( array $data ): array { |
|
| 339 | + self::get_post_values(); |
|
| 340 | + |
|
| 341 | + if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 342 | + if ( is_array( self::$post_values ) ) { |
|
| 343 | + foreach ( self::$post_values as $key => $value ) { |
|
| 344 | + if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 345 | + $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 346 | + $data[ $key ] = $value; |
|
| 347 | + |
|
| 348 | + $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | + $this->parent->options[ $key ] = $value; |
|
| 350 | + } |
|
| 351 | + } |
|
| 352 | + } |
|
| 353 | + } |
|
| 354 | + |
|
| 355 | + return $data; |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Render Redux fields. |
|
| 360 | + * |
|
| 361 | + * @param object $control . |
|
| 362 | + */ |
|
| 363 | + public function render( object $control ) { |
|
| 364 | + $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
|
| 365 | + $field = $this->options[ $field_id ]; |
|
| 366 | + |
|
| 367 | + if ( ! empty( $field['compiler'] ) ) { |
|
| 368 | + echo '<tr class="compiler">'; |
|
| 369 | + } else { |
|
| 370 | + echo '<tr>'; |
|
| 371 | + } |
|
| 372 | + |
|
| 373 | + echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 374 | + echo '<td>'; |
|
| 375 | + |
|
| 376 | + $field['name'] = $field['id']; |
|
| 377 | + $this->parent->render_class->field_input( $field ); |
|
| 378 | + |
|
| 379 | + echo '</td>'; |
|
| 380 | + echo '</tr>'; |
|
| 381 | + } |
|
| 382 | + |
|
| 383 | + // All sections, settings, and controls will be added here. |
|
| 384 | + |
|
| 385 | + /** |
|
| 386 | + * Register customizer controls. |
|
| 387 | + * |
|
| 388 | + * @param WP_Customize_Manager $wp_customize . |
|
| 389 | + * |
|
| 390 | + * @throws ReflectionException Exception. |
|
| 391 | + */ |
|
| 392 | + public function register_customizer_controls( WP_Customize_Manager $wp_customize ) { |
|
| 393 | + if ( ! class_exists( 'Redux_Customizer_Section' ) ) { |
|
| 394 | + require_once __DIR__ . '/inc/class-redux-customizer-section.php'; |
|
| 395 | + |
|
| 396 | + if ( method_exists( $wp_customize, 'register_section_type' ) ) { |
|
| 397 | + $wp_customize->register_section_type( 'Redux_Customizer_Section' ); |
|
| 398 | + } |
|
| 399 | + } |
|
| 400 | + |
|
| 401 | + if ( ! class_exists( 'Redux_Customizer_Panel' ) ) { |
|
| 402 | + require_once __DIR__ . '/inc/class-redux-customizer-panel.php'; |
|
| 403 | + |
|
| 404 | + if ( method_exists( $wp_customize, 'register_panel_type' ) ) { |
|
| 405 | + $wp_customize->register_panel_type( 'Redux_Customizer_Panel' ); |
|
| 406 | + } |
|
| 407 | + } |
|
| 408 | + |
|
| 409 | + if ( ! class_exists( 'Redux_Customizer_Control' ) ) { |
|
| 410 | + require_once __DIR__ . '/inc/class-redux-customizer-control.php'; |
|
| 411 | + } |
|
| 412 | + |
|
| 413 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 414 | + do_action( 'redux/extension/customizer/control/includes' ); |
|
| 415 | + |
|
| 416 | + $order = array( |
|
| 417 | + 'heading' => - 500, |
|
| 418 | + 'option' => - 500, |
|
| 419 | + ); |
|
| 420 | + |
|
| 421 | + $panel = ''; |
|
| 422 | + |
|
| 423 | + $this->parent->args['options_api'] = false; |
|
| 424 | + $this->parent->options_class->register(); |
|
| 425 | + |
|
| 426 | + $parent_section_id = null; |
|
| 427 | + $new_parent = true; |
|
| 428 | + |
|
| 429 | + foreach ( $this->parent->sections as $key => $section ) { |
|
| 430 | + // Not a type that should go on the customizer. |
|
| 431 | + |
|
| 432 | + foreach ( $section['fields'] as $field ) { |
|
| 433 | + if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) { |
|
| 434 | + continue 2; |
|
| 435 | + } |
|
| 436 | + } |
|
| 437 | + |
|
| 438 | + if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) { |
|
| 439 | + continue; |
|
| 440 | + } |
|
| 441 | + |
|
| 442 | + // If section customizer is set to false. |
|
| 443 | + if ( isset( $section['customizer'] ) && false === $section['customizer'] ) { |
|
| 444 | + continue; |
|
| 445 | + } |
|
| 446 | + |
|
| 447 | + // if we are in a subsection and parent is set to customizer false !!! |
|
| 448 | + if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) { |
|
| 449 | + if ( $new_parent ) { |
|
| 450 | + $new_parent = false; |
|
| 451 | + $parent_section_id = ( $key - 1 ); |
|
| 452 | + } |
|
| 453 | + } else { // not a subsection reset. |
|
| 454 | + $parent_section_id = null; |
|
| 455 | + $new_parent = true; |
|
| 456 | + } |
|
| 457 | + if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 458 | + continue; |
|
| 459 | + } |
|
| 460 | + |
|
| 461 | + $section['permissions'] = $section['permissions'] ?? 'edit_theme_options'; |
|
| 462 | + |
|
| 463 | + // No errors please. |
|
| 464 | + if ( ! isset( $section['desc'] ) ) { |
|
| 465 | + $section['desc'] = ''; |
|
| 466 | + } |
|
| 467 | + |
|
| 468 | + // Fill the description if there is a subtitle. |
|
| 469 | + if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) { |
|
| 470 | + $section['desc'] = $section['subtitle']; |
|
| 471 | + } |
|
| 472 | + |
|
| 473 | + // No title is present, let's show what section is missing a title. |
|
| 474 | + if ( ! isset( $section['title'] ) ) { |
|
| 475 | + $section['title'] = ''; |
|
| 476 | + } |
|
| 477 | + |
|
| 478 | + // Let's make a section ID from the title. |
|
| 479 | + if ( empty( $section['id'] ) ) { |
|
| 480 | + $section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) ); |
|
| 481 | + } |
|
| 482 | + |
|
| 483 | + // Let's set a default priority. |
|
| 484 | + if ( empty( $section['priority'] ) ) { |
|
| 485 | + $section['priority'] = $order['heading']; |
|
| 486 | + ++$order['heading']; |
|
| 487 | + } |
|
| 488 | + $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 489 | + |
|
| 490 | + if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 491 | + $this->add_panel( |
|
| 492 | + $this->parent->args['opt_name'] . '-' . $section['id'], |
|
| 493 | + array( |
|
| 494 | + 'priority' => $section['priority'], |
|
| 495 | + 'capability' => $section['permissions'], |
|
| 496 | + 'title' => $section['title'], |
|
| 497 | + 'section' => $section, |
|
| 498 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 499 | + 'description' => '', |
|
| 500 | + ), |
|
| 501 | + $wp_customize |
|
| 502 | + ); |
|
| 503 | + |
|
| 504 | + $panel = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 505 | + |
|
| 506 | + $this->add_section( |
|
| 507 | + $section['id'], |
|
| 508 | + array( |
|
| 509 | + 'title' => $section['title'], |
|
| 510 | + 'priority' => $section['priority'], |
|
| 511 | + 'description' => $section['desc'], |
|
| 512 | + 'section' => $section, |
|
| 513 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 514 | + 'capability' => $section['permissions'], |
|
| 515 | + 'panel' => $panel, |
|
| 516 | + ), |
|
| 517 | + $wp_customize |
|
| 518 | + ); |
|
| 519 | + } else { |
|
| 520 | + if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) { |
|
| 521 | + $panel = ''; |
|
| 522 | + } |
|
| 523 | + |
|
| 524 | + $this->add_section( |
|
| 525 | + $section['id'], |
|
| 526 | + array( |
|
| 527 | + 'title' => $section['title'], |
|
| 528 | + 'priority' => $section['priority'], |
|
| 529 | + 'description' => $section['desc'], |
|
| 530 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 531 | + 'section' => $section, |
|
| 532 | + 'capability' => $section['permissions'], |
|
| 533 | + 'panel' => $panel, |
|
| 534 | + ), |
|
| 535 | + $wp_customize |
|
| 536 | + ); |
|
| 537 | + } |
|
| 538 | + |
|
| 539 | + if ( ( empty( $section['fields'] ) ) ) { |
|
| 540 | + continue; |
|
| 541 | + } |
|
| 542 | + |
|
| 543 | + foreach ( $section['fields'] as $skey => $option ) { |
|
| 544 | + |
|
| 545 | + if ( isset( $option['customizer'] ) && false === $option['customizer'] ) { |
|
| 546 | + continue; |
|
| 547 | + } |
|
| 548 | + |
|
| 549 | + if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) { |
|
| 550 | + continue; |
|
| 551 | + } |
|
| 552 | + |
|
| 553 | + $this->options[ $option['id'] ] = $option; |
|
| 554 | + add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
|
| 555 | + |
|
| 556 | + $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
|
| 557 | + |
|
| 558 | + // Change the item priority if not set. |
|
| 559 | + if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) { |
|
| 560 | + $option['priority'] = $order['option']; |
|
| 561 | + ++$order['option']; |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 565 | + $option['default'] = $this->options_defaults['option']['id']; |
|
| 566 | + } |
|
| 567 | + |
|
| 568 | + if ( ! isset( $option['default'] ) ) { |
|
| 569 | + $option['default'] = ''; |
|
| 570 | + } |
|
| 571 | + if ( ! isset( $option['title'] ) ) { |
|
| 572 | + $option['title'] = ''; |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; |
|
| 576 | + |
|
| 577 | + if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) { |
|
| 578 | + |
|
| 579 | + $wp_customize->add_setting( |
|
| 580 | + $option['id'], |
|
| 581 | + array( |
|
| 582 | + 'default' => $option['default'], |
|
| 583 | + 'transport' => 'refresh', |
|
| 584 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 585 | + 'sanitize_callback' => array( $this, 'field_validation' ), |
|
| 586 | + ) |
|
| 587 | + ); |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) { |
|
| 591 | + if ( empty( $option['args'] ) ) { |
|
| 592 | + $option['args'] = array(); |
|
| 593 | + } |
|
| 594 | + |
|
| 595 | + if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) { |
|
| 596 | + $icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php'; |
|
| 597 | + |
|
| 598 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 599 | + $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); |
|
| 600 | + |
|
| 601 | + if ( file_exists( $icons_file ) ) { |
|
| 602 | + require_once $icons_file; |
|
| 603 | + } |
|
| 604 | + } |
|
| 605 | + $option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] ); |
|
| 606 | + } |
|
| 607 | + |
|
| 608 | + $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 609 | + |
|
| 610 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 611 | + do_action( 'redux/extension/customizer/control_init', $option ); |
|
| 612 | + |
|
| 613 | + if ( ! class_exists( $class_name ) ) { |
|
| 614 | + continue; |
|
| 615 | + } |
|
| 616 | + |
|
| 617 | + $wp_customize->add_control( |
|
| 618 | + new $class_name( |
|
| 619 | + $wp_customize, |
|
| 620 | + $option['id'], |
|
| 621 | + array( |
|
| 622 | + 'label' => $option['title'], |
|
| 623 | + 'section' => $section['id'], |
|
| 624 | + 'settings' => $option['id'], |
|
| 625 | + 'type' => 'redux-' . $option['type'], |
|
| 626 | + 'field' => $option, |
|
| 627 | + 'ReduxFramework' => $this->parent, |
|
| 628 | + 'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array( |
|
| 629 | + 'Redux_Customizer_Active_Callback', |
|
| 630 | + 'evaluate', |
|
| 631 | + ) : '__return_true', |
|
| 632 | + 'priority' => $option['priority'], |
|
| 633 | + ) |
|
| 634 | + ) |
|
| 635 | + ); |
|
| 636 | + |
|
| 637 | + $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | + if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | + $section['fields'][ $skey ]['class'] = ''; |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 643 | + } |
|
| 644 | + } |
|
| 645 | + } |
|
| 646 | + |
|
| 647 | + /** |
|
| 648 | + * Add customizer section. |
|
| 649 | + * |
|
| 650 | + * @param string $id ID. |
|
| 651 | + * @param array $args Args. |
|
| 652 | + * @param WP_Customize_Manager $wp_customize . |
|
| 653 | + */ |
|
| 654 | + public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 655 | + |
|
| 656 | + if ( is_a( $id, 'WP_Customize_Section' ) ) { |
|
| 657 | + $section = $id; |
|
| 658 | + } else { |
|
| 659 | + $section = new Redux_Customizer_Section( $wp_customize, $id, $args ); |
|
| 660 | + } |
|
| 661 | + |
|
| 662 | + $wp_customize->add_section( $section, $args ); |
|
| 663 | + } |
|
| 664 | + |
|
| 665 | + /** |
|
| 666 | + * Add a customize panel. |
|
| 667 | + * |
|
| 668 | + * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. |
|
| 669 | + * @param array $args Optional. Panel arguments. Default empty array. |
|
| 670 | + * @param WP_Customize_Manager $wp_customize . |
|
| 671 | + * |
|
| 672 | + * @since 4.0.0 |
|
| 673 | + * @access public |
|
| 674 | + */ |
|
| 675 | + public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 676 | + if ( is_a( $id, 'WP_Customize_Panel' ) ) { |
|
| 677 | + $panel = $id; |
|
| 678 | + } else { |
|
| 679 | + $panel = new Redux_Customizer_Panel( $wp_customize, $id, $args ); |
|
| 680 | + } |
|
| 681 | + |
|
| 682 | + $wp_customize->add_panel( $panel, $args ); |
|
| 683 | + } |
|
| 684 | + |
|
| 685 | + /** |
|
| 686 | + * Actions to take after customizer save. |
|
| 687 | + * |
|
| 688 | + * @throws ReflectionException Exception. |
|
| 689 | + */ |
|
| 690 | + public function customizer_save_after() { |
|
| 691 | + if ( empty( $this->parent->options ) ) { |
|
| 692 | + $this->parent->get_options(); |
|
| 693 | + } |
|
| 694 | + |
|
| 695 | + if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) { |
|
| 696 | + $this->orig_options = $this->parent->options; |
|
| 697 | + } |
|
| 698 | + |
|
| 699 | + if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 700 | + $options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification |
|
| 701 | + |
|
| 702 | + $compiler = false; |
|
| 703 | + $changed = false; |
|
| 704 | + |
|
| 705 | + foreach ( $options as $key => $value ) { |
|
| 706 | + if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 707 | + $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 708 | + |
|
| 709 | + if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | + $this->parent->options[ $key ] = $value; |
|
| 711 | + $changed = true; |
|
| 712 | + |
|
| 713 | + if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 714 | + $compiler = true; |
|
| 715 | + } |
|
| 716 | + } |
|
| 717 | + } |
|
| 718 | + } |
|
| 719 | + |
|
| 720 | + if ( $changed ) { |
|
| 721 | + $this->parent->options_class->set( $this->parent->options ); |
|
| 722 | + if ( $compiler ) { |
|
| 723 | + // Have to set this to stop the output of the CSS and typography stuff. |
|
| 724 | + Redux_Core::$no_output = true; |
|
| 725 | + $this->parent->output_class->enqueue(); |
|
| 726 | + |
|
| 727 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 728 | + do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS ); |
|
| 729 | + |
|
| 730 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 731 | + do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent ); |
|
| 732 | + } |
|
| 733 | + } |
|
| 734 | + } |
|
| 735 | + } |
|
| 736 | + |
|
| 737 | + /** |
|
| 738 | + * Enqueue CSS/JS for the customizer controls |
|
| 739 | + * |
|
| 740 | + * @since 1.0.0 |
|
| 741 | + * @access public |
|
| 742 | + * @global $wp_styles |
|
| 743 | + * @return void |
|
| 744 | + */ |
|
| 745 | + public function enqueue() { |
|
| 746 | + $localize = array( |
|
| 747 | + 'save_pending' => esc_html__( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), |
|
| 748 | + 'reset_confirm' => esc_html__( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), |
|
| 749 | + 'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), |
|
| 750 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 751 | + 'field' => $this->parent->options, |
|
| 752 | + 'defaults' => $this->parent->options_defaults, |
|
| 753 | + 'folds' => Redux_Core::$folds, |
|
| 754 | + ); |
|
| 755 | + |
|
| 756 | + // Values used by the javascript. |
|
| 757 | + wp_localize_script( 'redux-js', 'redux_opts', $localize ); |
|
| 758 | + |
|
| 759 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 760 | + do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] ); |
|
| 761 | + |
|
| 762 | + foreach ( $this->parent->sections as $section ) { |
|
| 763 | + if ( isset( $section['fields'] ) ) { |
|
| 764 | + foreach ( $section['fields'] as $field ) { |
|
| 765 | + if ( isset( $field['type'] ) ) { |
|
| 766 | + $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 767 | + |
|
| 768 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 769 | + |
|
| 770 | + if ( false === $field_class ) { |
|
| 771 | + |
|
| 772 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 773 | + $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class ); |
|
| 774 | + |
|
| 775 | + if ( $class_file ) { |
|
| 776 | + require_once $class_file; |
|
| 777 | + |
|
| 778 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 779 | + |
|
| 780 | + } |
|
| 781 | + } |
|
| 782 | + |
|
| 783 | + if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { |
|
| 784 | + $enqueue = new $field_class( '', '', $this ); |
|
| 785 | + $enqueue->enqueue(); |
|
| 786 | + } |
|
| 787 | + } |
|
| 788 | + } |
|
| 789 | + } |
|
| 790 | + } |
|
| 791 | + } |
|
| 792 | + |
|
| 793 | + /** |
|
| 794 | + * Register Option for use |
|
| 795 | + * |
|
| 796 | + * @since 1.0.0 |
|
| 797 | + * @access public |
|
| 798 | + * @return void |
|
| 799 | + */ |
|
| 800 | + public function register_setting() { |
|
| 801 | + } |
|
| 802 | + |
|
| 803 | + /** |
|
| 804 | + * Validate the options before insertion |
|
| 805 | + * |
|
| 806 | + * @param array|string $value The options array. |
|
| 807 | + * |
|
| 808 | + * @return array|string $value |
|
| 809 | + * @since 3.0.0 |
|
| 810 | + * @access public |
|
| 811 | + */ |
|
| 812 | + public function field_validation( $value ) { |
|
| 813 | + if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 814 | + $replace = $value; |
|
| 815 | + foreach ( $replace as $sub_array ) { |
|
| 816 | + $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | + $value[ $cs_array['id'] ] = $cs_array; |
|
| 818 | + } |
|
| 819 | + } |
|
| 820 | + |
|
| 821 | + return $value; |
|
| 822 | + } |
|
| 823 | + } |
|
| 824 | + |
|
| 825 | + if ( ! function_exists( 'redux_customizer_custom_validation' ) ) { |
|
| 826 | + /** |
|
| 827 | + * Custom validation. |
|
| 828 | + * |
|
| 829 | + * @param mixed $field Field. |
|
| 830 | + * |
|
| 831 | + * @return mixed |
|
| 832 | + */ |
|
| 833 | + function redux_customizer_custom_validation( $field ) { |
|
| 834 | + return $field; |
|
| 835 | + } |
|
| 836 | + } |
|
| 837 | 837 | } |
| 838 | 838 | |
| 839 | 839 | if ( ! class_exists( 'ReduxFramework_extension_customizer' ) ) { |
| 840 | - class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' ); |
|
| 840 | + class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' ); |
|
| 841 | 841 | } |
@@ -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' ); |
@@ -42,7 +42,7 @@ discard block |
||
| 42 | 42 | * |
| 43 | 43 | * @var array|null |
| 44 | 44 | */ |
| 45 | - public static ?array $field; |
|
| 45 | + public static ? array $field; |
|
| 46 | 46 | |
| 47 | 47 | /** |
| 48 | 48 | * WP Upload directory. |
@@ -63,7 +63,7 @@ discard block |
||
| 63 | 63 | * |
| 64 | 64 | * @var array|null |
| 65 | 65 | */ |
| 66 | - public static ?array $select; |
|
| 66 | + public static ? array $select; |
|
| 67 | 67 | |
| 68 | 68 | /** |
| 69 | 69 | * Class init. |
@@ -399,8 +399,8 @@ discard block |
||
| 399 | 399 | $html .= '<select name="' . self::$parent->args['opt_name'] . '[' . self::$field_id . '][' . $id . ']" id="redux-color-scheme-opt-select-' . $id . '"' . $width . ' class="redux-color-scheme-opt-select">'; |
| 400 | 400 | |
| 401 | 401 | foreach ( $v['options'] as $opt_id => $opt_val ) { |
| 402 | - $data[ $id ]['value'] = $data[ $id ]['value'] ?? ''; |
|
| 403 | - $html .= '<option value="' . $opt_id . '" ' . selected( $opt_id, $data[ $id ]['value'], false ) . '>' . $opt_val . '</option>'; |
|
| 402 | + $data[$id]['value'] = $data[$id]['value'] ?? ''; |
|
| 403 | + $html .= '<option value="' . $opt_id . '" ' . selected( $opt_id, $data[$id]['value'], false ) . '>' . $opt_val . '</option>'; |
|
| 404 | 404 | } |
| 405 | 405 | |
| 406 | 406 | $html .= '</select>'; |
@@ -545,7 +545,7 @@ discard block |
||
| 545 | 545 | $val['rgba'] = $val['rgba'] ?? $res; |
| 546 | 546 | $val['group'] = $val['group'] ?? ''; |
| 547 | 547 | |
| 548 | - $scheme[ $val['id'] ] = $val; |
|
| 548 | + $scheme[$val['id']] = $val; |
|
| 549 | 549 | } |
| 550 | 550 | } |
| 551 | 551 | |
@@ -579,9 +579,9 @@ discard block |
||
| 579 | 579 | foreach ( self::$select as $sel_arr ) { |
| 580 | 580 | $sel_grp = $sel_arr['group']; |
| 581 | 581 | if ( ! array_key_exists( $sel_grp, $sel_grps ) ) { |
| 582 | - $sel_grps[ $sel_grp ] = array(); |
|
| 582 | + $sel_grps[$sel_grp] = array(); |
|
| 583 | 583 | } |
| 584 | - $sel_grps[ $sel_grp ][] = $sel_arr; |
|
| 584 | + $sel_grps[$sel_grp][] = $sel_arr; |
|
| 585 | 585 | } |
| 586 | 586 | } |
| 587 | 587 | |
@@ -589,19 +589,19 @@ discard block |
||
| 589 | 589 | $group_arr = self::get_group_names(); |
| 590 | 590 | |
| 591 | 591 | foreach ( $group_arr as $group_name => $description ) { |
| 592 | - $groups[ $group_name ] = array(); |
|
| 592 | + $groups[$group_name] = array(); |
|
| 593 | 593 | |
| 594 | 594 | if ( is_array( $description ) ) { |
| 595 | - $grp_desc[ $group_name ] = $description['desc'] ?? ''; |
|
| 596 | - $grp_grpdesc[ $group_name ] = $description['group_desc'] ?? ''; |
|
| 597 | - $grp_hidden[ $group_name ] = $description['hidden'] ?? false; |
|
| 598 | - $grp_accordion_open[ $group_name ] = $description['accordion_open'] ?? false; |
|
| 595 | + $grp_desc[$group_name] = $description['desc'] ?? ''; |
|
| 596 | + $grp_grpdesc[$group_name] = $description['group_desc'] ?? ''; |
|
| 597 | + $grp_hidden[$group_name] = $description['hidden'] ?? false; |
|
| 598 | + $grp_accordion_open[$group_name] = $description['accordion_open'] ?? false; |
|
| 599 | 599 | |
| 600 | 600 | } else { |
| 601 | - $grp_desc[ $group_name ] = $description; |
|
| 602 | - $grp_hidden[ $group_name ] = false; |
|
| 603 | - $grp_accordion_open[ $group_name ] = false; |
|
| 604 | - $grp_grpdesc[ $group_name ] = false; |
|
| 601 | + $grp_desc[$group_name] = $description; |
|
| 602 | + $grp_hidden[$group_name] = false; |
|
| 603 | + $grp_accordion_open[$group_name] = false; |
|
| 604 | + $grp_grpdesc[$group_name] = false; |
|
| 605 | 605 | } |
| 606 | 606 | } |
| 607 | 607 | |
@@ -610,7 +610,7 @@ discard block |
||
| 610 | 610 | if ( is_array( $arr ) ) { |
| 611 | 611 | if ( ! empty( $arr['group'] ) ) { |
| 612 | 612 | if ( array_key_exists( $arr['group'], $group_arr ) ) { |
| 613 | - $groups[ $arr['group'] ][] = $arr; |
|
| 613 | + $groups[$arr['group']][] = $arr; |
|
| 614 | 614 | } else { |
| 615 | 615 | $groups[''][] = $arr; |
| 616 | 616 | } |
@@ -656,10 +656,10 @@ discard block |
||
| 656 | 656 | $class_hide = ''; |
| 657 | 657 | $is_open = ''; |
| 658 | 658 | |
| 659 | - if ( isset( $grp_hidden[ $title ] ) && '' !== $grp_hidden[ $title ] ) { |
|
| 660 | - $is_hidden = $grp_hidden[ $title ]; |
|
| 659 | + if ( isset( $grp_hidden[$title] ) && '' !== $grp_hidden[$title] ) { |
|
| 660 | + $is_hidden = $grp_hidden[$title]; |
|
| 661 | 661 | $class_hide = ( true === $is_hidden ) ? ' hidden ' : ''; |
| 662 | - $is_open = $grp_accordion_open[ $title ]; |
|
| 662 | + $is_open = $grp_accordion_open[$title]; |
|
| 663 | 663 | } |
| 664 | 664 | |
| 665 | 665 | $add_class = ''; |
@@ -689,8 +689,8 @@ discard block |
||
| 689 | 689 | } |
| 690 | 690 | |
| 691 | 691 | // apply group description, if any. |
| 692 | - if ( isset( $grp_desc[ $title ] ) && '' !== $grp_desc[ $title ] ) { |
|
| 693 | - $html .= '<span class="redux-label redux-layout-group-desc-label' . $icon_class . '">' . esc_attr( $grp_desc[ $title ] ) . '</label>'; |
|
| 692 | + if ( isset( $grp_desc[$title] ) && '' !== $grp_desc[$title] ) { |
|
| 693 | + $html .= '<span class="redux-label redux-layout-group-desc-label' . $icon_class . '">' . esc_attr( $grp_desc[$title] ) . '</label>'; |
|
| 694 | 694 | $add_hr = true; |
| 695 | 695 | |
| 696 | 696 | if ( $is_accordion ) { |
@@ -716,14 +716,14 @@ discard block |
||
| 716 | 716 | $html .= '<div class="redux-color-scheme-accordion-section" data-state="' . esc_attr( $is_open ) . '">'; |
| 717 | 717 | if ( false !== $grp_grpdesc ) { |
| 718 | 718 | $html .= '<div class="redux-color-scheme-group-desc">'; |
| 719 | - $html .= esc_attr( $grp_grpdesc[ $title ] ); |
|
| 719 | + $html .= esc_attr( $grp_grpdesc[$title] ); |
|
| 720 | 720 | $html .= '</div>'; |
| 721 | 721 | } |
| 722 | 722 | } |
| 723 | 723 | |
| 724 | 724 | // Select box render. |
| 725 | 725 | if ( array_key_exists( $title, $sel_grps ) ) { |
| 726 | - $html .= self::render_selects( $sel_grps[ $title ], $scheme ); |
|
| 726 | + $html .= self::render_selects( $sel_grps[$title], $scheme ); |
|
| 727 | 727 | } |
| 728 | 728 | } elseif ( $is_accordion ) { |
| 729 | 729 | $html .= '<div class="redux-color-scheme-accordion-section">'; |
@@ -798,7 +798,7 @@ discard block |
||
| 798 | 798 | return ''; |
| 799 | 799 | } |
| 800 | 800 | |
| 801 | - $picker_data = $scheme_data[ $v['id'] ]; |
|
| 801 | + $picker_data = $scheme_data[$v['id']]; |
|
| 802 | 802 | |
| 803 | 803 | // Hidden input for data string. |
| 804 | 804 | $html .= '<input |
@@ -962,7 +962,7 @@ discard block |
||
| 962 | 962 | return false; |
| 963 | 963 | } |
| 964 | 964 | |
| 965 | - return $data[ $scheme_name ]; |
|
| 965 | + return $data[$scheme_name]; |
|
| 966 | 966 | } |
| 967 | 967 | |
| 968 | 968 | /** |
@@ -989,7 +989,7 @@ discard block |
||
| 989 | 989 | // Enum through values and assign them to new array. |
| 990 | 990 | foreach ( $arr as $val ) { |
| 991 | 991 | if ( isset( $val['id'] ) ) { |
| 992 | - $new_scheme[ $val['id'] ] = $val; |
|
| 992 | + $new_scheme[$val['id']] = $val; |
|
| 993 | 993 | } |
| 994 | 994 | } |
| 995 | 995 | |
@@ -1001,12 +1001,12 @@ discard block |
||
| 1001 | 1001 | $schemes = array(); |
| 1002 | 1002 | } |
| 1003 | 1003 | |
| 1004 | - $scheme_data = $schemes[ $name ] ?? ''; |
|
| 1004 | + $scheme_data = $schemes[$name] ?? ''; |
|
| 1005 | 1005 | |
| 1006 | 1006 | if ( $scheme_data !== $new_scheme ) { |
| 1007 | 1007 | |
| 1008 | 1008 | // Add new scheme to array that will be saved. |
| 1009 | - $schemes[ $name ] = $new_scheme; |
|
| 1009 | + $schemes[$name] = $new_scheme; |
|
| 1010 | 1010 | |
| 1011 | 1011 | // Write the data to the JSON file. |
| 1012 | 1012 | return self::write_scheme_file( $schemes ); |
@@ -1076,9 +1076,9 @@ discard block |
||
| 1076 | 1076 | if ( isset( $v['type'] ) ) { |
| 1077 | 1077 | $val = $v['value']; |
| 1078 | 1078 | |
| 1079 | - unset( $data[ $k ] ); |
|
| 1079 | + unset( $data[$k] ); |
|
| 1080 | 1080 | |
| 1081 | - $data[ $k ] = $val; |
|
| 1081 | + $data[$k] = $val; |
|
| 1082 | 1082 | } |
| 1083 | 1083 | } |
| 1084 | 1084 | } |
@@ -1111,7 +1111,7 @@ discard block |
||
| 1111 | 1111 | } |
| 1112 | 1112 | |
| 1113 | 1113 | // Append ID to variable that holds the current scheme ID data. |
| 1114 | - $redux_options[ self::$field_id ] = $data; |
|
| 1114 | + $redux_options[self::$field_id] = $data; |
|
| 1115 | 1115 | |
| 1116 | 1116 | // Save the modified settings. |
| 1117 | 1117 | update_option( $opt_name, $redux_options ); |
@@ -11,773 +11,773 @@ discard block |
||
| 11 | 11 | defined( 'ABSPATH' ) || exit; |
| 12 | 12 | |
| 13 | 13 | if ( ! class_exists( 'Redux_Color_Scheme_Functions' ) ) { |
| 14 | - /** |
|
| 15 | - * Class Redux_Color_Scheme_Functions |
|
| 16 | - */ |
|
| 17 | - class Redux_Color_Scheme_Functions { |
|
| 18 | - |
|
| 19 | - /** |
|
| 20 | - * ReduxFramework object. |
|
| 21 | - * |
|
| 22 | - * @var null|ReduxFramework |
|
| 23 | - */ |
|
| 24 | - public static ?ReduxFramework $parent; |
|
| 25 | - |
|
| 26 | - /** |
|
| 27 | - * Field ID |
|
| 28 | - * |
|
| 29 | - * @var string|null |
|
| 30 | - */ |
|
| 31 | - public static ?string $field_id; |
|
| 32 | - |
|
| 33 | - /** |
|
| 34 | - * Field class. |
|
| 35 | - * |
|
| 36 | - * @var string|null |
|
| 37 | - */ |
|
| 38 | - public static ?string $field_class; |
|
| 39 | - |
|
| 40 | - /** |
|
| 41 | - * Field array. |
|
| 42 | - * |
|
| 43 | - * @var array|null |
|
| 44 | - */ |
|
| 45 | - public static ?array $field; |
|
| 46 | - |
|
| 47 | - /** |
|
| 48 | - * WP Upload directory. |
|
| 49 | - * |
|
| 50 | - * @var string|null |
|
| 51 | - */ |
|
| 52 | - public static ?string $upload_dir = ''; |
|
| 53 | - |
|
| 54 | - /** |
|
| 55 | - * WP Upload URI |
|
| 56 | - * |
|
| 57 | - * @var string|null |
|
| 58 | - */ |
|
| 59 | - public static ?string $upload_url = ''; |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * Select fields. |
|
| 63 | - * |
|
| 64 | - * @var array|null |
|
| 65 | - */ |
|
| 66 | - public static ?array $select; |
|
| 67 | - |
|
| 68 | - /** |
|
| 69 | - * Class init. |
|
| 70 | - * |
|
| 71 | - * @param ReduxFramework $redux ReduxFramework object. |
|
| 72 | - */ |
|
| 73 | - public static function init( ReduxFramework $redux ) { |
|
| 74 | - self::$parent = $redux; |
|
| 75 | - |
|
| 76 | - if ( empty( self::$field_id ) ) { |
|
| 77 | - self::$field = self::get_field( $redux ); |
|
| 78 | - |
|
| 79 | - if ( ! is_array( self::$field ) ) { |
|
| 80 | - return; |
|
| 81 | - } |
|
| 82 | - |
|
| 83 | - self::$field_id = self::$field['id']; |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - // Make sanitized upload dir DIR. |
|
| 87 | - self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_dir . 'color-schemes/' ); |
|
| 88 | - |
|
| 89 | - // Make sanitized upload dir URL. |
|
| 90 | - self::$upload_url = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_url . 'color-schemes/' ); |
|
| 91 | - |
|
| 92 | - Redux_Functions::init_wp_filesystem(); |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - /** |
|
| 96 | - * Checks if tooltips are in use. |
|
| 97 | - * |
|
| 98 | - * @param array $field Field array. |
|
| 99 | - * |
|
| 100 | - * @return bool |
|
| 101 | - */ |
|
| 102 | - public static function tooltips_in_use( array $field ): bool { |
|
| 103 | - $blocks = $field['default']; |
|
| 104 | - |
|
| 105 | - foreach ( $blocks as $arr ) { |
|
| 106 | - if ( isset( $arr['tooltip'] ) ) { |
|
| 107 | - return true; |
|
| 108 | - } |
|
| 109 | - } |
|
| 110 | - |
|
| 111 | - return false; |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * Convert DB values. |
|
| 116 | - */ |
|
| 117 | - public static function convert_to_db() { |
|
| 118 | - $upload_dir = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_dir . 'color-schemes/' ); |
|
| 119 | - |
|
| 120 | - $cur_scheme_file = Redux_Functions_Ex::wp_normalize_path( $upload_dir . '/' . self::$parent->args['opt_name'] . '_' . self::$field_id . '.json' ); |
|
| 121 | - |
|
| 122 | - if ( is_dir( $upload_dir ) ) { |
|
| 123 | - if ( file_exists( $cur_scheme_file ) ) { |
|
| 124 | - $data = Redux_Core::$filesystem->execute( 'get_contents', $cur_scheme_file ); |
|
| 125 | - if ( ! empty( $data ) ) { |
|
| 126 | - $data = json_decode( $data, true ); |
|
| 127 | - |
|
| 128 | - update_option( self::get_scheme_key(), $data ); |
|
| 129 | - |
|
| 130 | - Redux_Core::$filesystem->execute( 'delete', $cur_scheme_file ); |
|
| 131 | - } |
|
| 132 | - } |
|
| 133 | - } |
|
| 134 | - } |
|
| 135 | - |
|
| 136 | - /** |
|
| 137 | - * Get scheme key. |
|
| 138 | - * |
|
| 139 | - * @return string |
|
| 140 | - */ |
|
| 141 | - public static function get_scheme_key(): string { |
|
| 142 | - return 'redux_cs_' . self::$parent->args['opt_name'] . '_' . self::$field_id; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - /** |
|
| 146 | - * Get the list of groups names for the color scheme table. |
|
| 147 | - * |
|
| 148 | - * @since 2.0.0 |
|
| 149 | - * @access public static |
|
| 150 | - * @return array Array of group names. |
|
| 151 | - */ |
|
| 152 | - public static function get_group_names(): array { |
|
| 153 | - if ( empty( self::$field ) ) { |
|
| 154 | - self::$field = self::get_field(); |
|
| 155 | - } |
|
| 156 | - |
|
| 157 | - if ( isset( self::$field['groups'] ) ) { |
|
| 158 | - if ( is_array( self::$field['groups'] ) && ! empty( self::$field['groups'] ) ) { |
|
| 159 | - return self::$field['groups']; |
|
| 160 | - } |
|
| 161 | - } |
|
| 162 | - |
|
| 163 | - return array(); |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - /** |
|
| 167 | - * Get output transparent value. |
|
| 168 | - * |
|
| 169 | - * @return mixed |
|
| 170 | - */ |
|
| 171 | - public static function get_output_transparent_val() { |
|
| 172 | - if ( empty( self::$field ) ) { |
|
| 173 | - self::$field = self::get_field(); |
|
| 174 | - } |
|
| 175 | - |
|
| 176 | - if ( isset( self::$field['output_transparent'] ) ) { |
|
| 177 | - if ( ! empty( self::$field['output_transparent'] ) ) { |
|
| 178 | - return self::$field['output_transparent']; |
|
| 179 | - } |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - return false; |
|
| 183 | - } |
|
| 184 | - |
|
| 185 | - /** |
|
| 186 | - * Get select field name. |
|
| 187 | - * |
|
| 188 | - * @return array |
|
| 189 | - */ |
|
| 190 | - private static function get_select_names(): array { |
|
| 191 | - if ( empty( self::$field ) ) { |
|
| 192 | - self::$field = self::get_field(); |
|
| 193 | - } |
|
| 194 | - |
|
| 195 | - if ( isset( self::$field['select'] ) ) { |
|
| 196 | - if ( is_array( self::$field['select'] ) && ! empty( self::$field['select'] ) ) { |
|
| 197 | - return self::$field['select']; |
|
| 198 | - } |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - return array(); |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - /** |
|
| 205 | - * Get color scheme field. |
|
| 206 | - * |
|
| 207 | - * @param ReduxFramework|null $redux pointer. |
|
| 208 | - * |
|
| 209 | - * @return mixed |
|
| 210 | - */ |
|
| 211 | - public static function get_field( ?ReduxFramework $redux = null ) { |
|
| 212 | - if ( ! is_null( $redux ) ) { |
|
| 213 | - self::$parent = $redux; |
|
| 214 | - } |
|
| 215 | - |
|
| 216 | - if ( isset( $redux->field_sections['color_scheme'] ) ) { |
|
| 217 | - return reset( $redux->field_sections['color_scheme'] ); |
|
| 218 | - } |
|
| 219 | - |
|
| 220 | - $arr = self::$parent; |
|
| 221 | - |
|
| 222 | - foreach ( $arr as $part => $bla ) { |
|
| 223 | - if ( 'sections' === $part ) { |
|
| 224 | - foreach ( $bla as $field ) { |
|
| 225 | - foreach ( $field as $arg => $val ) { |
|
| 226 | - if ( 'fields' === $arg ) { |
|
| 227 | - foreach ( $val as $v ) { |
|
| 228 | - if ( ! empty( $v ) ) { |
|
| 229 | - foreach ( $v as $id => $x ) { |
|
| 230 | - if ( 'type' === $id ) { |
|
| 231 | - if ( 'color_scheme' === $x ) { |
|
| 232 | - return $v; |
|
| 233 | - } |
|
| 234 | - } |
|
| 235 | - } |
|
| 236 | - } |
|
| 237 | - } |
|
| 238 | - } |
|
| 239 | - } |
|
| 240 | - } |
|
| 241 | - } |
|
| 242 | - } |
|
| 243 | - |
|
| 244 | - return null; |
|
| 245 | - } |
|
| 246 | - |
|
| 247 | - /** |
|
| 248 | - * Output scheme dropdown selector. |
|
| 249 | - * |
|
| 250 | - * @param string $selected Selected scheme name. |
|
| 251 | - * |
|
| 252 | - * @return string HTML of dropdown selector. |
|
| 253 | - * @since 1.0.0 |
|
| 254 | - * @access public static |
|
| 255 | - */ |
|
| 256 | - public static function get_scheme_select_html( string $selected ): string { |
|
| 257 | - |
|
| 258 | - $html = '<select name="' . esc_attr( self::$parent->args['opt_name'] ) . '[redux-scheme-select]" id="redux-scheme-select-' . esc_attr( self::$field_id ) . '" class="redux-scheme-select">'; |
|
| 259 | - $html .= self::get_scheme_list_html( $selected ); |
|
| 260 | - $html .= '</select>'; |
|
| 261 | - |
|
| 262 | - return $html; |
|
| 263 | - } |
|
| 264 | - |
|
| 265 | - /** |
|
| 266 | - * Set current scheme ID, if one isn't specified. |
|
| 267 | - * |
|
| 268 | - * @param string $id Scheme name to set. |
|
| 269 | - * |
|
| 270 | - * @return void |
|
| 271 | - * @since 1.0.0 |
|
| 272 | - * @access public static |
|
| 273 | - */ |
|
| 274 | - public static function set_current_scheme_id( string $id ) { |
|
| 275 | - |
|
| 276 | - // Get opt name, for database. |
|
| 277 | - $opt_name = self::$parent->args['opt_name']; |
|
| 278 | - |
|
| 279 | - // Get all options from database. |
|
| 280 | - $redux_options = get_option( $opt_name, array() ); |
|
| 281 | - if ( ! is_array( $redux_options ) ) { |
|
| 282 | - $redux_options = array(); |
|
| 283 | - } |
|
| 284 | - // Append ID to variable that holds the current scheme ID data. |
|
| 285 | - $redux_options['redux-scheme-select'] = $id; |
|
| 286 | - |
|
| 287 | - // Save the modified settings. |
|
| 288 | - update_option( $opt_name, $redux_options ); |
|
| 289 | - } |
|
| 290 | - |
|
| 291 | - /** |
|
| 292 | - * Get tooltip toggle state. |
|
| 293 | - * |
|
| 294 | - * @return bool |
|
| 295 | - */ |
|
| 296 | - public static function get_tooltip_toggle_state(): bool { |
|
| 297 | - |
|
| 298 | - // Retrieve the opt_name, needed for database. |
|
| 299 | - $opt_name = self::$parent->args['opt_name']; |
|
| 300 | - |
|
| 301 | - // Get the entire options array. |
|
| 302 | - $redux_options = get_option( $opt_name ); |
|
| 303 | - |
|
| 304 | - return $redux_options['redux-color-scheme-tooltip-toggle'] ?? true; |
|
| 305 | - } |
|
| 306 | - |
|
| 307 | - /** |
|
| 308 | - * Gets the current schem ID from the database. |
|
| 309 | - * |
|
| 310 | - * @since 1.0.0 |
|
| 311 | - * @access public static |
|
| 312 | - * |
|
| 313 | - * @return string Current scheme ID. |
|
| 314 | - */ |
|
| 315 | - public static function get_current_scheme_id(): string { |
|
| 316 | - |
|
| 317 | - // Retrieve the opt_name, needed for databasae. |
|
| 318 | - $opt_name = self::$parent->args['opt_name']; |
|
| 319 | - |
|
| 320 | - // Get the entire options array. |
|
| 321 | - $redux_options = get_option( $opt_name ); |
|
| 322 | - |
|
| 323 | - // If the current scheme key exists... |
|
| 324 | - return $redux_options['redux-scheme-select'] ?? 'Default'; |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - /** |
|
| 328 | - * Get the list of schemes for the selector. |
|
| 329 | - * |
|
| 330 | - * @param string $sel Scheme name to select. |
|
| 331 | - * |
|
| 332 | - * @return string HTML option values. |
|
| 333 | - * @since 1.0.0 |
|
| 334 | - * @access static private |
|
| 335 | - */ |
|
| 336 | - private static function get_scheme_list_html( string $sel = '' ): string { |
|
| 337 | - // no errors, please. |
|
| 338 | - $html = ''; |
|
| 339 | - |
|
| 340 | - // Retrieves the list of saved schemes into an array variable. |
|
| 341 | - $dropdown_values = self::get_scheme_names(); |
|
| 342 | - |
|
| 343 | - // If the dropdown array has items... |
|
| 344 | - if ( ! empty( $dropdown_values ) ) { |
|
| 345 | - |
|
| 346 | - // Sort them alphbetically. |
|
| 347 | - asort( $dropdown_values ); |
|
| 348 | - } |
|
| 349 | - |
|
| 350 | - // trim the selected item. |
|
| 351 | - $sel = trim( $sel ); |
|
| 352 | - |
|
| 353 | - // If it's empty. |
|
| 354 | - if ( '' === $sel ) { |
|
| 355 | - |
|
| 356 | - // Make the current scheme id the selected value. |
|
| 357 | - $selected = self::get_current_scheme_id(); |
|
| 358 | - } else { |
|
| 359 | - |
|
| 360 | - // Otherwise, set it to the value passed to this function. |
|
| 361 | - $selected = $sel; |
|
| 362 | - } |
|
| 363 | - |
|
| 364 | - // Enum through the dropdown array and append the necessary HTML for the selector. |
|
| 365 | - foreach ( $dropdown_values as $k ) { |
|
| 366 | - $html .= '<option value="' . $k . '" ' . selected( $k, $selected, false ) . '>' . $k . '</option>'; |
|
| 367 | - } |
|
| 368 | - |
|
| 369 | - // Send it all packin'. |
|
| 370 | - return $html; |
|
| 371 | - } |
|
| 372 | - |
|
| 373 | - /** |
|
| 374 | - * Returns select HTML. |
|
| 375 | - * |
|
| 376 | - * @param array $arr Array of select fields to render. |
|
| 377 | - * @param array $data Array of scheme data. |
|
| 378 | - * |
|
| 379 | - * @return string HTML of select fields. |
|
| 380 | - * @since 1.0.4 |
|
| 381 | - * @access static private |
|
| 382 | - */ |
|
| 383 | - private static function render_selects( array $arr, array $data ): string { |
|
| 384 | - |
|
| 385 | - $html = ''; |
|
| 386 | - foreach ( $arr as $v ) { |
|
| 387 | - $id = $v['id']; |
|
| 388 | - |
|
| 389 | - if ( isset( $v['width'] ) && ! empty( $v['width'] ) ) { |
|
| 390 | - $size = $v['width']; |
|
| 391 | - } else { |
|
| 392 | - $size = '40%'; |
|
| 393 | - } |
|
| 394 | - |
|
| 395 | - $width = ' style="width: ' . $size . ';"'; |
|
| 396 | - |
|
| 397 | - $html .= '<span class="redux-label redux-color-scheme-opt-select-title">' . $v['title'] . '</span>'; |
|
| 398 | - |
|
| 399 | - $html .= '<select name="' . self::$parent->args['opt_name'] . '[' . self::$field_id . '][' . $id . ']" id="redux-color-scheme-opt-select-' . $id . '"' . $width . ' class="redux-color-scheme-opt-select">'; |
|
| 400 | - |
|
| 401 | - foreach ( $v['options'] as $opt_id => $opt_val ) { |
|
| 402 | - $data[ $id ]['value'] = $data[ $id ]['value'] ?? ''; |
|
| 403 | - $html .= '<option value="' . $opt_id . '" ' . selected( $opt_id, $data[ $id ]['value'], false ) . '>' . $opt_val . '</option>'; |
|
| 404 | - } |
|
| 405 | - |
|
| 406 | - $html .= '</select>'; |
|
| 407 | - $html .= '<span class="redux-label redux-color-scheme-opt-select-desc">' . $v['desc'] . '</span>'; |
|
| 408 | - $html .= '<hr class="redux-color-scheme-select-close-hr">'; |
|
| 409 | - $html .= '<br/>'; |
|
| 410 | - } |
|
| 411 | - |
|
| 412 | - return $html; |
|
| 413 | - } |
|
| 414 | - |
|
| 415 | - /** |
|
| 416 | - * Do diff. |
|
| 417 | - * |
|
| 418 | - * @param array $first_array Array one. |
|
| 419 | - * @param array $second_array Array two. |
|
| 420 | - * |
|
| 421 | - * @return array |
|
| 422 | - */ |
|
| 423 | - private static function do_diff( array $first_array, array $second_array ): array { |
|
| 424 | - |
|
| 425 | - /** |
|
| 426 | - * Serialize callback. |
|
| 427 | - * |
|
| 428 | - * @param array $arr Array. |
|
| 429 | - */ |
|
| 430 | - function my_serialize( array &$arr ) { |
|
| 431 | - $arr = maybe_serialize( $arr ); |
|
| 432 | - } |
|
| 433 | - |
|
| 434 | - /** |
|
| 435 | - * Unserialize callback. |
|
| 436 | - * |
|
| 437 | - * @param array $arr Array. |
|
| 438 | - */ |
|
| 439 | - function my_unserialize( &$arr ) { |
|
| 440 | - $arr = maybe_unserialize( $arr ); |
|
| 441 | - } |
|
| 442 | - |
|
| 443 | - // make a copy. |
|
| 444 | - $first_array_s = $first_array; |
|
| 445 | - $second_array_s = $second_array; |
|
| 446 | - |
|
| 447 | - // serialize all sub-arrays. |
|
| 448 | - array_walk( $first_array_s, 'my_serialize' ); |
|
| 449 | - array_walk( $second_array_s, 'my_serialize' ); |
|
| 450 | - |
|
| 451 | - // array_diff the serialized versions. |
|
| 452 | - $diff = array_diff( $first_array_s, $second_array_s ); |
|
| 453 | - |
|
| 454 | - // unserialize the result. |
|
| 455 | - array_walk( $diff, 'my_unserialize' ); |
|
| 456 | - |
|
| 457 | - // you've got it! |
|
| 458 | - return $diff; |
|
| 459 | - } |
|
| 460 | - |
|
| 461 | - /** |
|
| 462 | - * Returns colour pickers HTML table. |
|
| 463 | - * |
|
| 464 | - * @since 1.0.0 |
|
| 465 | - * @access public static |
|
| 466 | - * |
|
| 467 | - * @param string $scheme_id Scheme name of HTML to return. |
|
| 468 | - * |
|
| 469 | - * @return string HTML of colour picker table. |
|
| 470 | - */ |
|
| 471 | - public static function get_current_color_scheme_html( $scheme_id = false ): string { |
|
| 472 | - |
|
| 473 | - // If scheme_id is false. |
|
| 474 | - if ( ! $scheme_id ) { |
|
| 475 | - |
|
| 476 | - // Attempt to get the current scheme. |
|
| 477 | - $scheme_id = self::get_current_scheme_id(); |
|
| 478 | - |
|
| 479 | - // dummy check, because this shit happens! |
|
| 480 | - $arr_schemes = self::get_scheme_names(); |
|
| 481 | - |
|
| 482 | - if ( ! in_array( $scheme_id, $arr_schemes, true ) ) { |
|
| 483 | - $scheme_id = 'Default'; |
|
| 484 | - self::set_current_scheme_id( 'Default' ); |
|
| 485 | - } |
|
| 486 | - } |
|
| 487 | - |
|
| 488 | - // Set oft used variables. |
|
| 489 | - $opt_name = esc_attr( self::$parent->args['opt_name'] ); |
|
| 490 | - $field_id = esc_attr( self::$field_id ); |
|
| 491 | - $field_class = esc_attr( self::$field_class ); |
|
| 492 | - |
|
| 493 | - // Get the default options. |
|
| 494 | - $field = self::get_field(); |
|
| 495 | - |
|
| 496 | - $field['output_transparent'] = $field['output_transparent'] ?? ''; |
|
| 497 | - $is_accordion = $field['accordion'] ?? true; |
|
| 498 | - |
|
| 499 | - $def_opts = $field['default']; |
|
| 500 | - |
|
| 501 | - // Create array of element ids from default options. |
|
| 502 | - if ( ! empty( $def_opts ) ) { |
|
| 503 | - $id_arr = array(); |
|
| 504 | - |
|
| 505 | - foreach ( $def_opts as $vv ) { |
|
| 506 | - $id_arr[] = $vv['id']; |
|
| 507 | - } |
|
| 508 | - } |
|
| 509 | - |
|
| 510 | - // Get last saved default. |
|
| 511 | - $saved_def = get_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme' ); |
|
| 512 | - |
|
| 513 | - // Compare key counts between saved and current defaults to check |
|
| 514 | - // for changes in color scheme. |
|
| 515 | - if ( false !== $saved_def && is_array( $saved_def ) ) { |
|
| 516 | - |
|
| 517 | - // Get the new color inputs. |
|
| 518 | - $arr_diff = self::do_diff( $def_opts, $saved_def ); |
|
| 519 | - |
|
| 520 | - if ( ! empty( $arr_diff ) ) { |
|
| 521 | - update_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme', $def_opts ); |
|
| 522 | - } //} |
|
| 523 | - } else { |
|
| 524 | - update_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme', $def_opts ); |
|
| 525 | - } |
|
| 526 | - |
|
| 527 | - // get current scheme data. |
|
| 528 | - $scheme = self::get_scheme_data( $scheme_id ); |
|
| 529 | - |
|
| 530 | - if ( false === $scheme ) { |
|
| 531 | - return ''; |
|
| 532 | - } |
|
| 533 | - |
|
| 534 | - // If new color inputs exist... |
|
| 535 | - if ( ! empty( $arr_diff ) ) { |
|
| 536 | - foreach ( $arr_diff as $val ) { |
|
| 537 | - if ( ! empty( $val ) && isset( $val['id'] ) ) { |
|
| 538 | - |
|
| 539 | - $val['title'] = $val['title'] ?? $val['id']; |
|
| 540 | - $val['color'] = $val['color'] ?? ''; |
|
| 541 | - $val['alpha'] = $val['alpha'] ?? 1; |
|
| 542 | - |
|
| 543 | - $trans = $field['output_transparent']; |
|
| 544 | - $res = ( '' === $val['color'] || 'transparent' === $val['color'] ) ? $trans : Redux_Helpers::hex2rgba( $val['color'], $val['alpha'] ); |
|
| 545 | - $val['rgba'] = $val['rgba'] ?? $res; |
|
| 546 | - $val['group'] = $val['group'] ?? ''; |
|
| 547 | - |
|
| 548 | - $scheme[ $val['id'] ] = $val; |
|
| 549 | - } |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - // Get list of scheme names. |
|
| 553 | - $scheme_names = self::get_scheme_names(); |
|
| 554 | - |
|
| 555 | - // Update is saved scheme with new picker data. |
|
| 556 | - foreach ( $scheme_names as $name ) { |
|
| 557 | - self::set_scheme_data( $name, $scheme ); |
|
| 558 | - } |
|
| 559 | - |
|
| 560 | - // update the database. |
|
| 561 | - self::set_database_data( $scheme_id ); |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - // If it's not empty then... |
|
| 565 | - if ( ! empty( $scheme ) ) { |
|
| 566 | - |
|
| 567 | - // init arrays. |
|
| 568 | - $groups = array(); |
|
| 569 | - $grp_desc = array(); |
|
| 570 | - $groups[''] = array(); |
|
| 571 | - $sel_grps = array(); |
|
| 572 | - |
|
| 573 | - if ( ! isset( self::$select ) ) { |
|
| 574 | - self::$select = self::get_select_names(); |
|
| 575 | - } |
|
| 576 | - |
|
| 577 | - // Enum select fields into groups array for later render. |
|
| 578 | - if ( isset( self::$select ) ) { |
|
| 579 | - foreach ( self::$select as $sel_arr ) { |
|
| 580 | - $sel_grp = $sel_arr['group']; |
|
| 581 | - if ( ! array_key_exists( $sel_grp, $sel_grps ) ) { |
|
| 582 | - $sel_grps[ $sel_grp ] = array(); |
|
| 583 | - } |
|
| 584 | - $sel_grps[ $sel_grp ][] = $sel_arr; |
|
| 585 | - } |
|
| 586 | - } |
|
| 587 | - |
|
| 588 | - // Enum groups names. |
|
| 589 | - $group_arr = self::get_group_names(); |
|
| 590 | - |
|
| 591 | - foreach ( $group_arr as $group_name => $description ) { |
|
| 592 | - $groups[ $group_name ] = array(); |
|
| 593 | - |
|
| 594 | - if ( is_array( $description ) ) { |
|
| 595 | - $grp_desc[ $group_name ] = $description['desc'] ?? ''; |
|
| 596 | - $grp_grpdesc[ $group_name ] = $description['group_desc'] ?? ''; |
|
| 597 | - $grp_hidden[ $group_name ] = $description['hidden'] ?? false; |
|
| 598 | - $grp_accordion_open[ $group_name ] = $description['accordion_open'] ?? false; |
|
| 599 | - |
|
| 600 | - } else { |
|
| 601 | - $grp_desc[ $group_name ] = $description; |
|
| 602 | - $grp_hidden[ $group_name ] = false; |
|
| 603 | - $grp_accordion_open[ $group_name ] = false; |
|
| 604 | - $grp_grpdesc[ $group_name ] = false; |
|
| 605 | - } |
|
| 606 | - } |
|
| 607 | - |
|
| 608 | - // Assign color pickers to their specified group. |
|
| 609 | - foreach ( $scheme as $arr ) { |
|
| 610 | - if ( is_array( $arr ) ) { |
|
| 611 | - if ( ! empty( $arr['group'] ) ) { |
|
| 612 | - if ( array_key_exists( $arr['group'], $group_arr ) ) { |
|
| 613 | - $groups[ $arr['group'] ][] = $arr; |
|
| 614 | - } else { |
|
| 615 | - $groups[''][] = $arr; |
|
| 616 | - } |
|
| 617 | - } else { |
|
| 618 | - $groups[''][] = $arr; |
|
| 619 | - } |
|
| 620 | - } |
|
| 621 | - } |
|
| 622 | - |
|
| 623 | - $open_icon = ''; |
|
| 624 | - $close_icon = ''; |
|
| 625 | - |
|
| 626 | - if ( $is_accordion ) { |
|
| 627 | - $open_icon = apply_filters( 'redux/extension/color_scheme/' . self::$parent->args['opt_name'] . '/icon/open', 'dashicons dashicons-arrow-down' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 628 | - $close_icon = apply_filters( 'redux/extension/color_scheme/' . self::$parent->args['opt_name'] . '/icon/close', 'dashicons dashicons-arrow-up' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 629 | - } |
|
| 630 | - |
|
| 631 | - // open the list. |
|
| 632 | - $html = '<ul class="redux-scheme-layout" data-open-icon="' . $open_icon . '" data-close-icon="' . $close_icon . '">'; |
|
| 633 | - |
|
| 634 | - // Enumerate groups. |
|
| 635 | - foreach ( $groups as $title => $scheme_arr ) { |
|
| 636 | - |
|
| 637 | - if ( '' === $title ) { |
|
| 638 | - if ( empty( $scheme_arr ) ) { |
|
| 639 | - continue; |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - $kill_me = false; |
|
| 643 | - foreach ( $scheme_arr as $data ) { |
|
| 644 | - if ( ! array_key_exists( 'color', $data ) ) { |
|
| 645 | - $kill_me = true; |
|
| 646 | - break; |
|
| 647 | - } |
|
| 648 | - } |
|
| 649 | - if ( $kill_me ) { |
|
| 650 | - continue; |
|
| 651 | - } |
|
| 652 | - } |
|
| 653 | - |
|
| 654 | - $add_hr = false; |
|
| 655 | - $is_hidden = false; |
|
| 656 | - $class_hide = ''; |
|
| 657 | - $is_open = ''; |
|
| 658 | - |
|
| 659 | - if ( isset( $grp_hidden[ $title ] ) && '' !== $grp_hidden[ $title ] ) { |
|
| 660 | - $is_hidden = $grp_hidden[ $title ]; |
|
| 661 | - $class_hide = ( true === $is_hidden ) ? ' hidden ' : ''; |
|
| 662 | - $is_open = $grp_accordion_open[ $title ]; |
|
| 663 | - } |
|
| 664 | - |
|
| 665 | - $add_class = ''; |
|
| 666 | - if ( $is_accordion ) { |
|
| 667 | - $add_class = ' accordion '; |
|
| 668 | - } |
|
| 669 | - |
|
| 670 | - $html .= '<div class="redux-color-scheme-group' . $add_class . $class_hide . '">'; |
|
| 671 | - |
|
| 672 | - if ( ! $is_hidden ) { |
|
| 673 | - |
|
| 674 | - if ( $is_accordion ) { |
|
| 675 | - $html .= '<div class="redux-color-scheme-accordion">'; |
|
| 676 | - } |
|
| 677 | - $icon_class = ''; |
|
| 678 | - |
|
| 679 | - // apply group title, if any. |
|
| 680 | - if ( '' !== $title ) { |
|
| 681 | - $html .= '<br><span class="redux-label redux-layout-group-label">' . esc_attr( $title ) . '</span>'; |
|
| 682 | - |
|
| 683 | - if ( $is_accordion ) { |
|
| 684 | - $icon_class = ' titled'; |
|
| 685 | - } |
|
| 686 | - $add_hr = true; |
|
| 687 | - } elseif ( $is_accordion ) { |
|
| 688 | - $icon_class = ' not-titled'; |
|
| 689 | - } |
|
| 690 | - |
|
| 691 | - // apply group description, if any. |
|
| 692 | - if ( isset( $grp_desc[ $title ] ) && '' !== $grp_desc[ $title ] ) { |
|
| 693 | - $html .= '<span class="redux-label redux-layout-group-desc-label' . $icon_class . '">' . esc_attr( $grp_desc[ $title ] ) . '</label>'; |
|
| 694 | - $add_hr = true; |
|
| 695 | - |
|
| 696 | - if ( $is_accordion ) { |
|
| 697 | - $icon_class .= ' subtitled'; |
|
| 698 | - } |
|
| 699 | - } else { |
|
| 700 | - $icon_class .= ' not-subtitled'; |
|
| 701 | - } |
|
| 702 | - |
|
| 703 | - if ( $is_accordion ) { |
|
| 704 | - $html .= '<span class="' . esc_attr( $open_icon ) . $icon_class . '"></span>'; |
|
| 705 | - } |
|
| 706 | - |
|
| 707 | - // Add HR, if needed. |
|
| 708 | - if ( true === $add_hr ) { |
|
| 709 | - if ( ! $is_accordion ) { |
|
| 710 | - $html .= '<hr>'; |
|
| 711 | - } |
|
| 712 | - } |
|
| 713 | - |
|
| 714 | - if ( $is_accordion ) { |
|
| 715 | - $html .= '</div>'; |
|
| 716 | - $html .= '<div class="redux-color-scheme-accordion-section" data-state="' . esc_attr( $is_open ) . '">'; |
|
| 717 | - if ( false !== $grp_grpdesc ) { |
|
| 718 | - $html .= '<div class="redux-color-scheme-group-desc">'; |
|
| 719 | - $html .= esc_attr( $grp_grpdesc[ $title ] ); |
|
| 720 | - $html .= '</div>'; |
|
| 721 | - } |
|
| 722 | - } |
|
| 723 | - |
|
| 724 | - // Select box render. |
|
| 725 | - if ( array_key_exists( $title, $sel_grps ) ) { |
|
| 726 | - $html .= self::render_selects( $sel_grps[ $title ], $scheme ); |
|
| 727 | - } |
|
| 728 | - } elseif ( $is_accordion ) { |
|
| 729 | - $html .= '<div class="redux-color-scheme-accordion-section">'; |
|
| 730 | - } |
|
| 731 | - |
|
| 732 | - $html .= "<ul class='redux-scheme-layout'>"; |
|
| 733 | - |
|
| 734 | - // Enum through each element/id. |
|
| 735 | - foreach ( $scheme_arr as $v ) { |
|
| 736 | - if ( in_array( $v['id'], $id_arr, true ) ) { |
|
| 737 | - |
|
| 738 | - // If no title, use ID. |
|
| 739 | - $v['title'] = $v['title'] ?? $v['id']; |
|
| 740 | - |
|
| 741 | - // If no alpha, use 1 (solid). |
|
| 742 | - $v['alpha'] = $v['alpha'] ?? 1; |
|
| 743 | - |
|
| 744 | - // Fuck forbid no colour, set to white. |
|
| 745 | - $v['color'] = $v['color'] ?? ''; |
|
| 746 | - |
|
| 747 | - // RGBA.. |
|
| 748 | - $trans = $field['output_transparent']; |
|
| 749 | - $res = ( '' === $v['color'] || 'transparent' === $v['color'] ) ? $trans : Redux_Helpers::hex2rgba( $v['color'], $v['alpha'] ); |
|
| 750 | - $v['rgba'] = $v['rgba'] ?? $res; |
|
| 751 | - |
|
| 752 | - // group name. |
|
| 753 | - $v['group'] = $v['group'] ?? ''; |
|
| 754 | - |
|
| 755 | - $v['class'] = self::get_color_block_class( $field, $v['id'] ); |
|
| 756 | - |
|
| 757 | - $block_hide = self::get_block_hidden( $field, $v['id'] ) ? 'hidden' : ''; |
|
| 758 | - |
|
| 759 | - // tooltips. |
|
| 760 | - $tip_title = ''; |
|
| 761 | - $tip_text = ''; |
|
| 762 | - |
|
| 763 | - $tooltip_data = self::get_tooltip_data( $field, $v['id'] ); |
|
| 764 | - if ( false !== $tooltip_data ) { |
|
| 765 | - $tip_title = $tooltip_data['title'] ?? ''; |
|
| 766 | - $tip_text = $tooltip_data['text'] ?? ''; |
|
| 767 | - } |
|
| 768 | - |
|
| 769 | - // Begin the layout. |
|
| 770 | - $html .= '<li class="redux-scheme-layout ' . $class_hide . ' redux-cs-qtip ' . $block_hide . '" qtip-title="' . esc_attr( $tip_title ) . '" qtip-content="' . esc_attr( $tip_text ) . '">'; |
|
| 771 | - $html .= '<div class="redux-scheme-layout-container" data-id="' . $field_id . '-' . $v['id'] . '">'; |
|
| 772 | - |
|
| 773 | - if ( '' === $v['color'] || 'transparent' === $v['color'] ) { |
|
| 774 | - $color = ''; |
|
| 775 | - } else { |
|
| 776 | - $color = 'rgba(' . $v['rgba'] . ')'; |
|
| 777 | - } |
|
| 778 | - |
|
| 779 | - // colour picker dropdown. |
|
| 780 | - $html .= '<input |
|
| 14 | + /** |
|
| 15 | + * Class Redux_Color_Scheme_Functions |
|
| 16 | + */ |
|
| 17 | + class Redux_Color_Scheme_Functions { |
|
| 18 | + |
|
| 19 | + /** |
|
| 20 | + * ReduxFramework object. |
|
| 21 | + * |
|
| 22 | + * @var null|ReduxFramework |
|
| 23 | + */ |
|
| 24 | + public static ?ReduxFramework $parent; |
|
| 25 | + |
|
| 26 | + /** |
|
| 27 | + * Field ID |
|
| 28 | + * |
|
| 29 | + * @var string|null |
|
| 30 | + */ |
|
| 31 | + public static ?string $field_id; |
|
| 32 | + |
|
| 33 | + /** |
|
| 34 | + * Field class. |
|
| 35 | + * |
|
| 36 | + * @var string|null |
|
| 37 | + */ |
|
| 38 | + public static ?string $field_class; |
|
| 39 | + |
|
| 40 | + /** |
|
| 41 | + * Field array. |
|
| 42 | + * |
|
| 43 | + * @var array|null |
|
| 44 | + */ |
|
| 45 | + public static ?array $field; |
|
| 46 | + |
|
| 47 | + /** |
|
| 48 | + * WP Upload directory. |
|
| 49 | + * |
|
| 50 | + * @var string|null |
|
| 51 | + */ |
|
| 52 | + public static ?string $upload_dir = ''; |
|
| 53 | + |
|
| 54 | + /** |
|
| 55 | + * WP Upload URI |
|
| 56 | + * |
|
| 57 | + * @var string|null |
|
| 58 | + */ |
|
| 59 | + public static ?string $upload_url = ''; |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * Select fields. |
|
| 63 | + * |
|
| 64 | + * @var array|null |
|
| 65 | + */ |
|
| 66 | + public static ?array $select; |
|
| 67 | + |
|
| 68 | + /** |
|
| 69 | + * Class init. |
|
| 70 | + * |
|
| 71 | + * @param ReduxFramework $redux ReduxFramework object. |
|
| 72 | + */ |
|
| 73 | + public static function init( ReduxFramework $redux ) { |
|
| 74 | + self::$parent = $redux; |
|
| 75 | + |
|
| 76 | + if ( empty( self::$field_id ) ) { |
|
| 77 | + self::$field = self::get_field( $redux ); |
|
| 78 | + |
|
| 79 | + if ( ! is_array( self::$field ) ) { |
|
| 80 | + return; |
|
| 81 | + } |
|
| 82 | + |
|
| 83 | + self::$field_id = self::$field['id']; |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + // Make sanitized upload dir DIR. |
|
| 87 | + self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_dir . 'color-schemes/' ); |
|
| 88 | + |
|
| 89 | + // Make sanitized upload dir URL. |
|
| 90 | + self::$upload_url = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_url . 'color-schemes/' ); |
|
| 91 | + |
|
| 92 | + Redux_Functions::init_wp_filesystem(); |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + /** |
|
| 96 | + * Checks if tooltips are in use. |
|
| 97 | + * |
|
| 98 | + * @param array $field Field array. |
|
| 99 | + * |
|
| 100 | + * @return bool |
|
| 101 | + */ |
|
| 102 | + public static function tooltips_in_use( array $field ): bool { |
|
| 103 | + $blocks = $field['default']; |
|
| 104 | + |
|
| 105 | + foreach ( $blocks as $arr ) { |
|
| 106 | + if ( isset( $arr['tooltip'] ) ) { |
|
| 107 | + return true; |
|
| 108 | + } |
|
| 109 | + } |
|
| 110 | + |
|
| 111 | + return false; |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * Convert DB values. |
|
| 116 | + */ |
|
| 117 | + public static function convert_to_db() { |
|
| 118 | + $upload_dir = Redux_Functions_Ex::wp_normalize_path( ReduxFramework::$_upload_dir . 'color-schemes/' ); |
|
| 119 | + |
|
| 120 | + $cur_scheme_file = Redux_Functions_Ex::wp_normalize_path( $upload_dir . '/' . self::$parent->args['opt_name'] . '_' . self::$field_id . '.json' ); |
|
| 121 | + |
|
| 122 | + if ( is_dir( $upload_dir ) ) { |
|
| 123 | + if ( file_exists( $cur_scheme_file ) ) { |
|
| 124 | + $data = Redux_Core::$filesystem->execute( 'get_contents', $cur_scheme_file ); |
|
| 125 | + if ( ! empty( $data ) ) { |
|
| 126 | + $data = json_decode( $data, true ); |
|
| 127 | + |
|
| 128 | + update_option( self::get_scheme_key(), $data ); |
|
| 129 | + |
|
| 130 | + Redux_Core::$filesystem->execute( 'delete', $cur_scheme_file ); |
|
| 131 | + } |
|
| 132 | + } |
|
| 133 | + } |
|
| 134 | + } |
|
| 135 | + |
|
| 136 | + /** |
|
| 137 | + * Get scheme key. |
|
| 138 | + * |
|
| 139 | + * @return string |
|
| 140 | + */ |
|
| 141 | + public static function get_scheme_key(): string { |
|
| 142 | + return 'redux_cs_' . self::$parent->args['opt_name'] . '_' . self::$field_id; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + /** |
|
| 146 | + * Get the list of groups names for the color scheme table. |
|
| 147 | + * |
|
| 148 | + * @since 2.0.0 |
|
| 149 | + * @access public static |
|
| 150 | + * @return array Array of group names. |
|
| 151 | + */ |
|
| 152 | + public static function get_group_names(): array { |
|
| 153 | + if ( empty( self::$field ) ) { |
|
| 154 | + self::$field = self::get_field(); |
|
| 155 | + } |
|
| 156 | + |
|
| 157 | + if ( isset( self::$field['groups'] ) ) { |
|
| 158 | + if ( is_array( self::$field['groups'] ) && ! empty( self::$field['groups'] ) ) { |
|
| 159 | + return self::$field['groups']; |
|
| 160 | + } |
|
| 161 | + } |
|
| 162 | + |
|
| 163 | + return array(); |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + /** |
|
| 167 | + * Get output transparent value. |
|
| 168 | + * |
|
| 169 | + * @return mixed |
|
| 170 | + */ |
|
| 171 | + public static function get_output_transparent_val() { |
|
| 172 | + if ( empty( self::$field ) ) { |
|
| 173 | + self::$field = self::get_field(); |
|
| 174 | + } |
|
| 175 | + |
|
| 176 | + if ( isset( self::$field['output_transparent'] ) ) { |
|
| 177 | + if ( ! empty( self::$field['output_transparent'] ) ) { |
|
| 178 | + return self::$field['output_transparent']; |
|
| 179 | + } |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + return false; |
|
| 183 | + } |
|
| 184 | + |
|
| 185 | + /** |
|
| 186 | + * Get select field name. |
|
| 187 | + * |
|
| 188 | + * @return array |
|
| 189 | + */ |
|
| 190 | + private static function get_select_names(): array { |
|
| 191 | + if ( empty( self::$field ) ) { |
|
| 192 | + self::$field = self::get_field(); |
|
| 193 | + } |
|
| 194 | + |
|
| 195 | + if ( isset( self::$field['select'] ) ) { |
|
| 196 | + if ( is_array( self::$field['select'] ) && ! empty( self::$field['select'] ) ) { |
|
| 197 | + return self::$field['select']; |
|
| 198 | + } |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + return array(); |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + /** |
|
| 205 | + * Get color scheme field. |
|
| 206 | + * |
|
| 207 | + * @param ReduxFramework|null $redux pointer. |
|
| 208 | + * |
|
| 209 | + * @return mixed |
|
| 210 | + */ |
|
| 211 | + public static function get_field( ?ReduxFramework $redux = null ) { |
|
| 212 | + if ( ! is_null( $redux ) ) { |
|
| 213 | + self::$parent = $redux; |
|
| 214 | + } |
|
| 215 | + |
|
| 216 | + if ( isset( $redux->field_sections['color_scheme'] ) ) { |
|
| 217 | + return reset( $redux->field_sections['color_scheme'] ); |
|
| 218 | + } |
|
| 219 | + |
|
| 220 | + $arr = self::$parent; |
|
| 221 | + |
|
| 222 | + foreach ( $arr as $part => $bla ) { |
|
| 223 | + if ( 'sections' === $part ) { |
|
| 224 | + foreach ( $bla as $field ) { |
|
| 225 | + foreach ( $field as $arg => $val ) { |
|
| 226 | + if ( 'fields' === $arg ) { |
|
| 227 | + foreach ( $val as $v ) { |
|
| 228 | + if ( ! empty( $v ) ) { |
|
| 229 | + foreach ( $v as $id => $x ) { |
|
| 230 | + if ( 'type' === $id ) { |
|
| 231 | + if ( 'color_scheme' === $x ) { |
|
| 232 | + return $v; |
|
| 233 | + } |
|
| 234 | + } |
|
| 235 | + } |
|
| 236 | + } |
|
| 237 | + } |
|
| 238 | + } |
|
| 239 | + } |
|
| 240 | + } |
|
| 241 | + } |
|
| 242 | + } |
|
| 243 | + |
|
| 244 | + return null; |
|
| 245 | + } |
|
| 246 | + |
|
| 247 | + /** |
|
| 248 | + * Output scheme dropdown selector. |
|
| 249 | + * |
|
| 250 | + * @param string $selected Selected scheme name. |
|
| 251 | + * |
|
| 252 | + * @return string HTML of dropdown selector. |
|
| 253 | + * @since 1.0.0 |
|
| 254 | + * @access public static |
|
| 255 | + */ |
|
| 256 | + public static function get_scheme_select_html( string $selected ): string { |
|
| 257 | + |
|
| 258 | + $html = '<select name="' . esc_attr( self::$parent->args['opt_name'] ) . '[redux-scheme-select]" id="redux-scheme-select-' . esc_attr( self::$field_id ) . '" class="redux-scheme-select">'; |
|
| 259 | + $html .= self::get_scheme_list_html( $selected ); |
|
| 260 | + $html .= '</select>'; |
|
| 261 | + |
|
| 262 | + return $html; |
|
| 263 | + } |
|
| 264 | + |
|
| 265 | + /** |
|
| 266 | + * Set current scheme ID, if one isn't specified. |
|
| 267 | + * |
|
| 268 | + * @param string $id Scheme name to set. |
|
| 269 | + * |
|
| 270 | + * @return void |
|
| 271 | + * @since 1.0.0 |
|
| 272 | + * @access public static |
|
| 273 | + */ |
|
| 274 | + public static function set_current_scheme_id( string $id ) { |
|
| 275 | + |
|
| 276 | + // Get opt name, for database. |
|
| 277 | + $opt_name = self::$parent->args['opt_name']; |
|
| 278 | + |
|
| 279 | + // Get all options from database. |
|
| 280 | + $redux_options = get_option( $opt_name, array() ); |
|
| 281 | + if ( ! is_array( $redux_options ) ) { |
|
| 282 | + $redux_options = array(); |
|
| 283 | + } |
|
| 284 | + // Append ID to variable that holds the current scheme ID data. |
|
| 285 | + $redux_options['redux-scheme-select'] = $id; |
|
| 286 | + |
|
| 287 | + // Save the modified settings. |
|
| 288 | + update_option( $opt_name, $redux_options ); |
|
| 289 | + } |
|
| 290 | + |
|
| 291 | + /** |
|
| 292 | + * Get tooltip toggle state. |
|
| 293 | + * |
|
| 294 | + * @return bool |
|
| 295 | + */ |
|
| 296 | + public static function get_tooltip_toggle_state(): bool { |
|
| 297 | + |
|
| 298 | + // Retrieve the opt_name, needed for database. |
|
| 299 | + $opt_name = self::$parent->args['opt_name']; |
|
| 300 | + |
|
| 301 | + // Get the entire options array. |
|
| 302 | + $redux_options = get_option( $opt_name ); |
|
| 303 | + |
|
| 304 | + return $redux_options['redux-color-scheme-tooltip-toggle'] ?? true; |
|
| 305 | + } |
|
| 306 | + |
|
| 307 | + /** |
|
| 308 | + * Gets the current schem ID from the database. |
|
| 309 | + * |
|
| 310 | + * @since 1.0.0 |
|
| 311 | + * @access public static |
|
| 312 | + * |
|
| 313 | + * @return string Current scheme ID. |
|
| 314 | + */ |
|
| 315 | + public static function get_current_scheme_id(): string { |
|
| 316 | + |
|
| 317 | + // Retrieve the opt_name, needed for databasae. |
|
| 318 | + $opt_name = self::$parent->args['opt_name']; |
|
| 319 | + |
|
| 320 | + // Get the entire options array. |
|
| 321 | + $redux_options = get_option( $opt_name ); |
|
| 322 | + |
|
| 323 | + // If the current scheme key exists... |
|
| 324 | + return $redux_options['redux-scheme-select'] ?? 'Default'; |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + /** |
|
| 328 | + * Get the list of schemes for the selector. |
|
| 329 | + * |
|
| 330 | + * @param string $sel Scheme name to select. |
|
| 331 | + * |
|
| 332 | + * @return string HTML option values. |
|
| 333 | + * @since 1.0.0 |
|
| 334 | + * @access static private |
|
| 335 | + */ |
|
| 336 | + private static function get_scheme_list_html( string $sel = '' ): string { |
|
| 337 | + // no errors, please. |
|
| 338 | + $html = ''; |
|
| 339 | + |
|
| 340 | + // Retrieves the list of saved schemes into an array variable. |
|
| 341 | + $dropdown_values = self::get_scheme_names(); |
|
| 342 | + |
|
| 343 | + // If the dropdown array has items... |
|
| 344 | + if ( ! empty( $dropdown_values ) ) { |
|
| 345 | + |
|
| 346 | + // Sort them alphbetically. |
|
| 347 | + asort( $dropdown_values ); |
|
| 348 | + } |
|
| 349 | + |
|
| 350 | + // trim the selected item. |
|
| 351 | + $sel = trim( $sel ); |
|
| 352 | + |
|
| 353 | + // If it's empty. |
|
| 354 | + if ( '' === $sel ) { |
|
| 355 | + |
|
| 356 | + // Make the current scheme id the selected value. |
|
| 357 | + $selected = self::get_current_scheme_id(); |
|
| 358 | + } else { |
|
| 359 | + |
|
| 360 | + // Otherwise, set it to the value passed to this function. |
|
| 361 | + $selected = $sel; |
|
| 362 | + } |
|
| 363 | + |
|
| 364 | + // Enum through the dropdown array and append the necessary HTML for the selector. |
|
| 365 | + foreach ( $dropdown_values as $k ) { |
|
| 366 | + $html .= '<option value="' . $k . '" ' . selected( $k, $selected, false ) . '>' . $k . '</option>'; |
|
| 367 | + } |
|
| 368 | + |
|
| 369 | + // Send it all packin'. |
|
| 370 | + return $html; |
|
| 371 | + } |
|
| 372 | + |
|
| 373 | + /** |
|
| 374 | + * Returns select HTML. |
|
| 375 | + * |
|
| 376 | + * @param array $arr Array of select fields to render. |
|
| 377 | + * @param array $data Array of scheme data. |
|
| 378 | + * |
|
| 379 | + * @return string HTML of select fields. |
|
| 380 | + * @since 1.0.4 |
|
| 381 | + * @access static private |
|
| 382 | + */ |
|
| 383 | + private static function render_selects( array $arr, array $data ): string { |
|
| 384 | + |
|
| 385 | + $html = ''; |
|
| 386 | + foreach ( $arr as $v ) { |
|
| 387 | + $id = $v['id']; |
|
| 388 | + |
|
| 389 | + if ( isset( $v['width'] ) && ! empty( $v['width'] ) ) { |
|
| 390 | + $size = $v['width']; |
|
| 391 | + } else { |
|
| 392 | + $size = '40%'; |
|
| 393 | + } |
|
| 394 | + |
|
| 395 | + $width = ' style="width: ' . $size . ';"'; |
|
| 396 | + |
|
| 397 | + $html .= '<span class="redux-label redux-color-scheme-opt-select-title">' . $v['title'] . '</span>'; |
|
| 398 | + |
|
| 399 | + $html .= '<select name="' . self::$parent->args['opt_name'] . '[' . self::$field_id . '][' . $id . ']" id="redux-color-scheme-opt-select-' . $id . '"' . $width . ' class="redux-color-scheme-opt-select">'; |
|
| 400 | + |
|
| 401 | + foreach ( $v['options'] as $opt_id => $opt_val ) { |
|
| 402 | + $data[ $id ]['value'] = $data[ $id ]['value'] ?? ''; |
|
| 403 | + $html .= '<option value="' . $opt_id . '" ' . selected( $opt_id, $data[ $id ]['value'], false ) . '>' . $opt_val . '</option>'; |
|
| 404 | + } |
|
| 405 | + |
|
| 406 | + $html .= '</select>'; |
|
| 407 | + $html .= '<span class="redux-label redux-color-scheme-opt-select-desc">' . $v['desc'] . '</span>'; |
|
| 408 | + $html .= '<hr class="redux-color-scheme-select-close-hr">'; |
|
| 409 | + $html .= '<br/>'; |
|
| 410 | + } |
|
| 411 | + |
|
| 412 | + return $html; |
|
| 413 | + } |
|
| 414 | + |
|
| 415 | + /** |
|
| 416 | + * Do diff. |
|
| 417 | + * |
|
| 418 | + * @param array $first_array Array one. |
|
| 419 | + * @param array $second_array Array two. |
|
| 420 | + * |
|
| 421 | + * @return array |
|
| 422 | + */ |
|
| 423 | + private static function do_diff( array $first_array, array $second_array ): array { |
|
| 424 | + |
|
| 425 | + /** |
|
| 426 | + * Serialize callback. |
|
| 427 | + * |
|
| 428 | + * @param array $arr Array. |
|
| 429 | + */ |
|
| 430 | + function my_serialize( array &$arr ) { |
|
| 431 | + $arr = maybe_serialize( $arr ); |
|
| 432 | + } |
|
| 433 | + |
|
| 434 | + /** |
|
| 435 | + * Unserialize callback. |
|
| 436 | + * |
|
| 437 | + * @param array $arr Array. |
|
| 438 | + */ |
|
| 439 | + function my_unserialize( &$arr ) { |
|
| 440 | + $arr = maybe_unserialize( $arr ); |
|
| 441 | + } |
|
| 442 | + |
|
| 443 | + // make a copy. |
|
| 444 | + $first_array_s = $first_array; |
|
| 445 | + $second_array_s = $second_array; |
|
| 446 | + |
|
| 447 | + // serialize all sub-arrays. |
|
| 448 | + array_walk( $first_array_s, 'my_serialize' ); |
|
| 449 | + array_walk( $second_array_s, 'my_serialize' ); |
|
| 450 | + |
|
| 451 | + // array_diff the serialized versions. |
|
| 452 | + $diff = array_diff( $first_array_s, $second_array_s ); |
|
| 453 | + |
|
| 454 | + // unserialize the result. |
|
| 455 | + array_walk( $diff, 'my_unserialize' ); |
|
| 456 | + |
|
| 457 | + // you've got it! |
|
| 458 | + return $diff; |
|
| 459 | + } |
|
| 460 | + |
|
| 461 | + /** |
|
| 462 | + * Returns colour pickers HTML table. |
|
| 463 | + * |
|
| 464 | + * @since 1.0.0 |
|
| 465 | + * @access public static |
|
| 466 | + * |
|
| 467 | + * @param string $scheme_id Scheme name of HTML to return. |
|
| 468 | + * |
|
| 469 | + * @return string HTML of colour picker table. |
|
| 470 | + */ |
|
| 471 | + public static function get_current_color_scheme_html( $scheme_id = false ): string { |
|
| 472 | + |
|
| 473 | + // If scheme_id is false. |
|
| 474 | + if ( ! $scheme_id ) { |
|
| 475 | + |
|
| 476 | + // Attempt to get the current scheme. |
|
| 477 | + $scheme_id = self::get_current_scheme_id(); |
|
| 478 | + |
|
| 479 | + // dummy check, because this shit happens! |
|
| 480 | + $arr_schemes = self::get_scheme_names(); |
|
| 481 | + |
|
| 482 | + if ( ! in_array( $scheme_id, $arr_schemes, true ) ) { |
|
| 483 | + $scheme_id = 'Default'; |
|
| 484 | + self::set_current_scheme_id( 'Default' ); |
|
| 485 | + } |
|
| 486 | + } |
|
| 487 | + |
|
| 488 | + // Set oft used variables. |
|
| 489 | + $opt_name = esc_attr( self::$parent->args['opt_name'] ); |
|
| 490 | + $field_id = esc_attr( self::$field_id ); |
|
| 491 | + $field_class = esc_attr( self::$field_class ); |
|
| 492 | + |
|
| 493 | + // Get the default options. |
|
| 494 | + $field = self::get_field(); |
|
| 495 | + |
|
| 496 | + $field['output_transparent'] = $field['output_transparent'] ?? ''; |
|
| 497 | + $is_accordion = $field['accordion'] ?? true; |
|
| 498 | + |
|
| 499 | + $def_opts = $field['default']; |
|
| 500 | + |
|
| 501 | + // Create array of element ids from default options. |
|
| 502 | + if ( ! empty( $def_opts ) ) { |
|
| 503 | + $id_arr = array(); |
|
| 504 | + |
|
| 505 | + foreach ( $def_opts as $vv ) { |
|
| 506 | + $id_arr[] = $vv['id']; |
|
| 507 | + } |
|
| 508 | + } |
|
| 509 | + |
|
| 510 | + // Get last saved default. |
|
| 511 | + $saved_def = get_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme' ); |
|
| 512 | + |
|
| 513 | + // Compare key counts between saved and current defaults to check |
|
| 514 | + // for changes in color scheme. |
|
| 515 | + if ( false !== $saved_def && is_array( $saved_def ) ) { |
|
| 516 | + |
|
| 517 | + // Get the new color inputs. |
|
| 518 | + $arr_diff = self::do_diff( $def_opts, $saved_def ); |
|
| 519 | + |
|
| 520 | + if ( ! empty( $arr_diff ) ) { |
|
| 521 | + update_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme', $def_opts ); |
|
| 522 | + } //} |
|
| 523 | + } else { |
|
| 524 | + update_option( 'redux_' . $opt_name . '_' . $field_id . '_color_scheme', $def_opts ); |
|
| 525 | + } |
|
| 526 | + |
|
| 527 | + // get current scheme data. |
|
| 528 | + $scheme = self::get_scheme_data( $scheme_id ); |
|
| 529 | + |
|
| 530 | + if ( false === $scheme ) { |
|
| 531 | + return ''; |
|
| 532 | + } |
|
| 533 | + |
|
| 534 | + // If new color inputs exist... |
|
| 535 | + if ( ! empty( $arr_diff ) ) { |
|
| 536 | + foreach ( $arr_diff as $val ) { |
|
| 537 | + if ( ! empty( $val ) && isset( $val['id'] ) ) { |
|
| 538 | + |
|
| 539 | + $val['title'] = $val['title'] ?? $val['id']; |
|
| 540 | + $val['color'] = $val['color'] ?? ''; |
|
| 541 | + $val['alpha'] = $val['alpha'] ?? 1; |
|
| 542 | + |
|
| 543 | + $trans = $field['output_transparent']; |
|
| 544 | + $res = ( '' === $val['color'] || 'transparent' === $val['color'] ) ? $trans : Redux_Helpers::hex2rgba( $val['color'], $val['alpha'] ); |
|
| 545 | + $val['rgba'] = $val['rgba'] ?? $res; |
|
| 546 | + $val['group'] = $val['group'] ?? ''; |
|
| 547 | + |
|
| 548 | + $scheme[ $val['id'] ] = $val; |
|
| 549 | + } |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + // Get list of scheme names. |
|
| 553 | + $scheme_names = self::get_scheme_names(); |
|
| 554 | + |
|
| 555 | + // Update is saved scheme with new picker data. |
|
| 556 | + foreach ( $scheme_names as $name ) { |
|
| 557 | + self::set_scheme_data( $name, $scheme ); |
|
| 558 | + } |
|
| 559 | + |
|
| 560 | + // update the database. |
|
| 561 | + self::set_database_data( $scheme_id ); |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + // If it's not empty then... |
|
| 565 | + if ( ! empty( $scheme ) ) { |
|
| 566 | + |
|
| 567 | + // init arrays. |
|
| 568 | + $groups = array(); |
|
| 569 | + $grp_desc = array(); |
|
| 570 | + $groups[''] = array(); |
|
| 571 | + $sel_grps = array(); |
|
| 572 | + |
|
| 573 | + if ( ! isset( self::$select ) ) { |
|
| 574 | + self::$select = self::get_select_names(); |
|
| 575 | + } |
|
| 576 | + |
|
| 577 | + // Enum select fields into groups array for later render. |
|
| 578 | + if ( isset( self::$select ) ) { |
|
| 579 | + foreach ( self::$select as $sel_arr ) { |
|
| 580 | + $sel_grp = $sel_arr['group']; |
|
| 581 | + if ( ! array_key_exists( $sel_grp, $sel_grps ) ) { |
|
| 582 | + $sel_grps[ $sel_grp ] = array(); |
|
| 583 | + } |
|
| 584 | + $sel_grps[ $sel_grp ][] = $sel_arr; |
|
| 585 | + } |
|
| 586 | + } |
|
| 587 | + |
|
| 588 | + // Enum groups names. |
|
| 589 | + $group_arr = self::get_group_names(); |
|
| 590 | + |
|
| 591 | + foreach ( $group_arr as $group_name => $description ) { |
|
| 592 | + $groups[ $group_name ] = array(); |
|
| 593 | + |
|
| 594 | + if ( is_array( $description ) ) { |
|
| 595 | + $grp_desc[ $group_name ] = $description['desc'] ?? ''; |
|
| 596 | + $grp_grpdesc[ $group_name ] = $description['group_desc'] ?? ''; |
|
| 597 | + $grp_hidden[ $group_name ] = $description['hidden'] ?? false; |
|
| 598 | + $grp_accordion_open[ $group_name ] = $description['accordion_open'] ?? false; |
|
| 599 | + |
|
| 600 | + } else { |
|
| 601 | + $grp_desc[ $group_name ] = $description; |
|
| 602 | + $grp_hidden[ $group_name ] = false; |
|
| 603 | + $grp_accordion_open[ $group_name ] = false; |
|
| 604 | + $grp_grpdesc[ $group_name ] = false; |
|
| 605 | + } |
|
| 606 | + } |
|
| 607 | + |
|
| 608 | + // Assign color pickers to their specified group. |
|
| 609 | + foreach ( $scheme as $arr ) { |
|
| 610 | + if ( is_array( $arr ) ) { |
|
| 611 | + if ( ! empty( $arr['group'] ) ) { |
|
| 612 | + if ( array_key_exists( $arr['group'], $group_arr ) ) { |
|
| 613 | + $groups[ $arr['group'] ][] = $arr; |
|
| 614 | + } else { |
|
| 615 | + $groups[''][] = $arr; |
|
| 616 | + } |
|
| 617 | + } else { |
|
| 618 | + $groups[''][] = $arr; |
|
| 619 | + } |
|
| 620 | + } |
|
| 621 | + } |
|
| 622 | + |
|
| 623 | + $open_icon = ''; |
|
| 624 | + $close_icon = ''; |
|
| 625 | + |
|
| 626 | + if ( $is_accordion ) { |
|
| 627 | + $open_icon = apply_filters( 'redux/extension/color_scheme/' . self::$parent->args['opt_name'] . '/icon/open', 'dashicons dashicons-arrow-down' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 628 | + $close_icon = apply_filters( 'redux/extension/color_scheme/' . self::$parent->args['opt_name'] . '/icon/close', 'dashicons dashicons-arrow-up' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 629 | + } |
|
| 630 | + |
|
| 631 | + // open the list. |
|
| 632 | + $html = '<ul class="redux-scheme-layout" data-open-icon="' . $open_icon . '" data-close-icon="' . $close_icon . '">'; |
|
| 633 | + |
|
| 634 | + // Enumerate groups. |
|
| 635 | + foreach ( $groups as $title => $scheme_arr ) { |
|
| 636 | + |
|
| 637 | + if ( '' === $title ) { |
|
| 638 | + if ( empty( $scheme_arr ) ) { |
|
| 639 | + continue; |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + $kill_me = false; |
|
| 643 | + foreach ( $scheme_arr as $data ) { |
|
| 644 | + if ( ! array_key_exists( 'color', $data ) ) { |
|
| 645 | + $kill_me = true; |
|
| 646 | + break; |
|
| 647 | + } |
|
| 648 | + } |
|
| 649 | + if ( $kill_me ) { |
|
| 650 | + continue; |
|
| 651 | + } |
|
| 652 | + } |
|
| 653 | + |
|
| 654 | + $add_hr = false; |
|
| 655 | + $is_hidden = false; |
|
| 656 | + $class_hide = ''; |
|
| 657 | + $is_open = ''; |
|
| 658 | + |
|
| 659 | + if ( isset( $grp_hidden[ $title ] ) && '' !== $grp_hidden[ $title ] ) { |
|
| 660 | + $is_hidden = $grp_hidden[ $title ]; |
|
| 661 | + $class_hide = ( true === $is_hidden ) ? ' hidden ' : ''; |
|
| 662 | + $is_open = $grp_accordion_open[ $title ]; |
|
| 663 | + } |
|
| 664 | + |
|
| 665 | + $add_class = ''; |
|
| 666 | + if ( $is_accordion ) { |
|
| 667 | + $add_class = ' accordion '; |
|
| 668 | + } |
|
| 669 | + |
|
| 670 | + $html .= '<div class="redux-color-scheme-group' . $add_class . $class_hide . '">'; |
|
| 671 | + |
|
| 672 | + if ( ! $is_hidden ) { |
|
| 673 | + |
|
| 674 | + if ( $is_accordion ) { |
|
| 675 | + $html .= '<div class="redux-color-scheme-accordion">'; |
|
| 676 | + } |
|
| 677 | + $icon_class = ''; |
|
| 678 | + |
|
| 679 | + // apply group title, if any. |
|
| 680 | + if ( '' !== $title ) { |
|
| 681 | + $html .= '<br><span class="redux-label redux-layout-group-label">' . esc_attr( $title ) . '</span>'; |
|
| 682 | + |
|
| 683 | + if ( $is_accordion ) { |
|
| 684 | + $icon_class = ' titled'; |
|
| 685 | + } |
|
| 686 | + $add_hr = true; |
|
| 687 | + } elseif ( $is_accordion ) { |
|
| 688 | + $icon_class = ' not-titled'; |
|
| 689 | + } |
|
| 690 | + |
|
| 691 | + // apply group description, if any. |
|
| 692 | + if ( isset( $grp_desc[ $title ] ) && '' !== $grp_desc[ $title ] ) { |
|
| 693 | + $html .= '<span class="redux-label redux-layout-group-desc-label' . $icon_class . '">' . esc_attr( $grp_desc[ $title ] ) . '</label>'; |
|
| 694 | + $add_hr = true; |
|
| 695 | + |
|
| 696 | + if ( $is_accordion ) { |
|
| 697 | + $icon_class .= ' subtitled'; |
|
| 698 | + } |
|
| 699 | + } else { |
|
| 700 | + $icon_class .= ' not-subtitled'; |
|
| 701 | + } |
|
| 702 | + |
|
| 703 | + if ( $is_accordion ) { |
|
| 704 | + $html .= '<span class="' . esc_attr( $open_icon ) . $icon_class . '"></span>'; |
|
| 705 | + } |
|
| 706 | + |
|
| 707 | + // Add HR, if needed. |
|
| 708 | + if ( true === $add_hr ) { |
|
| 709 | + if ( ! $is_accordion ) { |
|
| 710 | + $html .= '<hr>'; |
|
| 711 | + } |
|
| 712 | + } |
|
| 713 | + |
|
| 714 | + if ( $is_accordion ) { |
|
| 715 | + $html .= '</div>'; |
|
| 716 | + $html .= '<div class="redux-color-scheme-accordion-section" data-state="' . esc_attr( $is_open ) . '">'; |
|
| 717 | + if ( false !== $grp_grpdesc ) { |
|
| 718 | + $html .= '<div class="redux-color-scheme-group-desc">'; |
|
| 719 | + $html .= esc_attr( $grp_grpdesc[ $title ] ); |
|
| 720 | + $html .= '</div>'; |
|
| 721 | + } |
|
| 722 | + } |
|
| 723 | + |
|
| 724 | + // Select box render. |
|
| 725 | + if ( array_key_exists( $title, $sel_grps ) ) { |
|
| 726 | + $html .= self::render_selects( $sel_grps[ $title ], $scheme ); |
|
| 727 | + } |
|
| 728 | + } elseif ( $is_accordion ) { |
|
| 729 | + $html .= '<div class="redux-color-scheme-accordion-section">'; |
|
| 730 | + } |
|
| 731 | + |
|
| 732 | + $html .= "<ul class='redux-scheme-layout'>"; |
|
| 733 | + |
|
| 734 | + // Enum through each element/id. |
|
| 735 | + foreach ( $scheme_arr as $v ) { |
|
| 736 | + if ( in_array( $v['id'], $id_arr, true ) ) { |
|
| 737 | + |
|
| 738 | + // If no title, use ID. |
|
| 739 | + $v['title'] = $v['title'] ?? $v['id']; |
|
| 740 | + |
|
| 741 | + // If no alpha, use 1 (solid). |
|
| 742 | + $v['alpha'] = $v['alpha'] ?? 1; |
|
| 743 | + |
|
| 744 | + // Fuck forbid no colour, set to white. |
|
| 745 | + $v['color'] = $v['color'] ?? ''; |
|
| 746 | + |
|
| 747 | + // RGBA.. |
|
| 748 | + $trans = $field['output_transparent']; |
|
| 749 | + $res = ( '' === $v['color'] || 'transparent' === $v['color'] ) ? $trans : Redux_Helpers::hex2rgba( $v['color'], $v['alpha'] ); |
|
| 750 | + $v['rgba'] = $v['rgba'] ?? $res; |
|
| 751 | + |
|
| 752 | + // group name. |
|
| 753 | + $v['group'] = $v['group'] ?? ''; |
|
| 754 | + |
|
| 755 | + $v['class'] = self::get_color_block_class( $field, $v['id'] ); |
|
| 756 | + |
|
| 757 | + $block_hide = self::get_block_hidden( $field, $v['id'] ) ? 'hidden' : ''; |
|
| 758 | + |
|
| 759 | + // tooltips. |
|
| 760 | + $tip_title = ''; |
|
| 761 | + $tip_text = ''; |
|
| 762 | + |
|
| 763 | + $tooltip_data = self::get_tooltip_data( $field, $v['id'] ); |
|
| 764 | + if ( false !== $tooltip_data ) { |
|
| 765 | + $tip_title = $tooltip_data['title'] ?? ''; |
|
| 766 | + $tip_text = $tooltip_data['text'] ?? ''; |
|
| 767 | + } |
|
| 768 | + |
|
| 769 | + // Begin the layout. |
|
| 770 | + $html .= '<li class="redux-scheme-layout ' . $class_hide . ' redux-cs-qtip ' . $block_hide . '" qtip-title="' . esc_attr( $tip_title ) . '" qtip-content="' . esc_attr( $tip_text ) . '">'; |
|
| 771 | + $html .= '<div class="redux-scheme-layout-container" data-id="' . $field_id . '-' . $v['id'] . '">'; |
|
| 772 | + |
|
| 773 | + if ( '' === $v['color'] || 'transparent' === $v['color'] ) { |
|
| 774 | + $color = ''; |
|
| 775 | + } else { |
|
| 776 | + $color = 'rgba(' . $v['rgba'] . ')'; |
|
| 777 | + } |
|
| 778 | + |
|
| 779 | + // colour picker dropdown. |
|
| 780 | + $html .= '<input |
|
| 781 | 781 | id="' . $field_id . '-' . esc_attr( $v['id'] ) . '-color" |
| 782 | 782 | class="' . $field_class . ' ' . esc_attr( $v['class'] ) . '" |
| 783 | 783 | type="text" |
@@ -793,15 +793,15 @@ discard block |
||
| 793 | 793 | data-output-transparent="' . esc_attr( $field['output_transparent'] ) . '" |
| 794 | 794 | />'; |
| 795 | 795 | |
| 796 | - $scheme_data = self::get_scheme_data( $scheme_id ); |
|
| 797 | - if ( false === $scheme_data ) { |
|
| 798 | - return ''; |
|
| 799 | - } |
|
| 796 | + $scheme_data = self::get_scheme_data( $scheme_id ); |
|
| 797 | + if ( false === $scheme_data ) { |
|
| 798 | + return ''; |
|
| 799 | + } |
|
| 800 | 800 | |
| 801 | - $picker_data = $scheme_data[ $v['id'] ]; |
|
| 801 | + $picker_data = $scheme_data[ $v['id'] ]; |
|
| 802 | 802 | |
| 803 | - // Hidden input for data string. |
|
| 804 | - $html .= '<input |
|
| 803 | + // Hidden input for data string. |
|
| 804 | + $html .= '<input |
|
| 805 | 805 | type="hidden" |
| 806 | 806 | class="redux-hidden-data" |
| 807 | 807 | name="' . esc_attr( $opt_name ) . '[' . esc_attr( $field_id ) . '][' . esc_attr( $v['id'] ) . '][data]" |
@@ -809,312 +809,312 @@ discard block |
||
| 809 | 809 | value="' . rawurlencode( wp_json_encode( $picker_data ) ) . '" |
| 810 | 810 | />'; |
| 811 | 811 | |
| 812 | - // closing html tags. |
|
| 813 | - $html .= '</div>'; |
|
| 814 | - $html .= '<span class="redux-label redux-layout-label">' . esc_attr( $v['title'] ) . '</span>'; |
|
| 815 | - $html .= '</li>'; |
|
| 816 | - } |
|
| 817 | - } |
|
| 818 | - $html .= '</ul>'; |
|
| 819 | - |
|
| 820 | - $html .= '<hr class="redux-color-scheme-blank-hr">'; |
|
| 821 | - |
|
| 822 | - if ( $is_accordion ) { |
|
| 823 | - $html .= '</div>'; |
|
| 824 | - } |
|
| 825 | - |
|
| 826 | - $html .= '</div>'; |
|
| 827 | - } |
|
| 828 | - |
|
| 829 | - // Close list. |
|
| 830 | - $html .= '</ul>'; |
|
| 831 | - } |
|
| 832 | - |
|
| 833 | - // html var not empty, return it. |
|
| 834 | - if ( ! empty( $html ) ) { |
|
| 835 | - return $html; |
|
| 836 | - } |
|
| 837 | - |
|
| 838 | - return ''; |
|
| 839 | - } |
|
| 840 | - |
|
| 841 | - /** |
|
| 842 | - * Get color block class. |
|
| 843 | - * |
|
| 844 | - * @param array $field Field array. |
|
| 845 | - * @param string $id Field ID. |
|
| 846 | - * |
|
| 847 | - * @return string |
|
| 848 | - */ |
|
| 849 | - private static function get_color_block_class( array $field, string $id ): string { |
|
| 850 | - $def = $field['default']; |
|
| 851 | - |
|
| 852 | - if ( ! empty( $def ) ) { |
|
| 853 | - foreach ( $def as $arr ) { |
|
| 854 | - if ( $arr['id'] === $id ) { |
|
| 855 | - if ( isset( $arr['class'] ) ) { |
|
| 856 | - return $arr['class']; |
|
| 857 | - } |
|
| 858 | - } |
|
| 859 | - } |
|
| 860 | - } |
|
| 861 | - |
|
| 862 | - return ''; |
|
| 863 | - } |
|
| 864 | - |
|
| 865 | - /** |
|
| 866 | - * Get tooltip data. |
|
| 867 | - * |
|
| 868 | - * @param array $field Field array. |
|
| 869 | - * @param string $id Field ID. |
|
| 870 | - * |
|
| 871 | - * @return mixed |
|
| 872 | - */ |
|
| 873 | - private static function get_tooltip_data( array $field, string $id ) { |
|
| 874 | - $def = $field['default']; |
|
| 875 | - |
|
| 876 | - if ( ! empty( $def ) ) { |
|
| 877 | - foreach ( $def as $arr ) { |
|
| 878 | - if ( $arr['id'] === $id ) { |
|
| 879 | - if ( isset( $arr['tooltip'] ) ) { |
|
| 880 | - return $arr['tooltip']; |
|
| 881 | - } |
|
| 882 | - } |
|
| 883 | - } |
|
| 884 | - } |
|
| 885 | - |
|
| 886 | - return false; |
|
| 887 | - } |
|
| 888 | - |
|
| 889 | - /** |
|
| 890 | - * Get hidden blocks. |
|
| 891 | - * |
|
| 892 | - * @param array $field Field ID. |
|
| 893 | - * @param string $id Field ID. |
|
| 894 | - * |
|
| 895 | - * @return bool |
|
| 896 | - */ |
|
| 897 | - private static function get_block_hidden( array $field, string $id ): bool { |
|
| 898 | - $def = $field['default']; |
|
| 899 | - |
|
| 900 | - if ( ! empty( $def ) ) { |
|
| 901 | - foreach ( $def as $arr ) { |
|
| 902 | - if ( $arr['id'] === $id ) { |
|
| 903 | - if ( isset( $arr['hidden'] ) ) { |
|
| 904 | - return $arr['hidden']; |
|
| 905 | - } |
|
| 906 | - } |
|
| 907 | - } |
|
| 908 | - } |
|
| 909 | - |
|
| 910 | - return false; |
|
| 911 | - } |
|
| 912 | - |
|
| 913 | - /** |
|
| 914 | - * Returns scheme file contents. |
|
| 915 | - * |
|
| 916 | - * @since 1.0.0 |
|
| 917 | - * @access public static |
|
| 918 | - * |
|
| 919 | - * @return array Array of scheme data. |
|
| 920 | - */ |
|
| 921 | - public static function read_scheme_file() { |
|
| 922 | - $key = self::get_scheme_key(); |
|
| 923 | - $data = get_option( $key ); |
|
| 924 | - |
|
| 925 | - if ( empty( $data ) ) { |
|
| 926 | - $arr_data = false; |
|
| 927 | - } else { |
|
| 928 | - $arr_data = $data; |
|
| 929 | - } |
|
| 930 | - |
|
| 931 | - return $arr_data; |
|
| 932 | - } |
|
| 933 | - |
|
| 934 | - /** |
|
| 935 | - * Sets scheme file contents. |
|
| 936 | - * |
|
| 937 | - * @param array $arr_data PHP array of data to encode. |
|
| 938 | - * |
|
| 939 | - * @return bool Result of write function. |
|
| 940 | - * @since 1.0.0 |
|
| 941 | - * @access public static |
|
| 942 | - */ |
|
| 943 | - public static function write_scheme_file( array $arr_data ): bool { |
|
| 944 | - $key = self::get_scheme_key(); |
|
| 945 | - |
|
| 946 | - return update_option( $key, $arr_data ); |
|
| 947 | - } |
|
| 948 | - |
|
| 949 | - /** |
|
| 950 | - * Gets individual scheme data from scheme JSON file. |
|
| 951 | - * |
|
| 952 | - * @param string $scheme_name Name of scheme. |
|
| 953 | - * |
|
| 954 | - * @return mixed PHP array of scheme data. |
|
| 955 | - * @since 1.0.0 |
|
| 956 | - * @access public static |
|
| 957 | - */ |
|
| 958 | - public static function get_scheme_data( string $scheme_name ) { |
|
| 959 | - $data = self::read_scheme_file(); |
|
| 960 | - |
|
| 961 | - if ( false === $data ) { |
|
| 962 | - return false; |
|
| 963 | - } |
|
| 964 | - |
|
| 965 | - return $data[ $scheme_name ]; |
|
| 966 | - } |
|
| 967 | - |
|
| 968 | - /** |
|
| 969 | - * Sets individual scheme data to scheme JSON file. |
|
| 970 | - * |
|
| 971 | - * @param string $name Name of a scheme to save. |
|
| 972 | - * @param array $arr Scheme data to encode. |
|
| 973 | - * |
|
| 974 | - * @return bool Result of file written. |
|
| 975 | - * @since 1.0.0 |
|
| 976 | - * @access public static |
|
| 977 | - */ |
|
| 978 | - public static function set_scheme_data( string $name, array $arr ): bool { |
|
| 979 | - |
|
| 980 | - // Create blank array. |
|
| 981 | - $new_scheme = array(); |
|
| 982 | - |
|
| 983 | - // If name is present. |
|
| 984 | - if ( $name ) { |
|
| 985 | - |
|
| 986 | - // then add the name at the new array's key. |
|
| 987 | - $new_scheme['color_scheme_name'] = $name; |
|
| 988 | - |
|
| 989 | - // Enum through values and assign them to new array. |
|
| 990 | - foreach ( $arr as $val ) { |
|
| 991 | - if ( isset( $val['id'] ) ) { |
|
| 992 | - $new_scheme[ $val['id'] ] = $val; |
|
| 993 | - } |
|
| 994 | - } |
|
| 995 | - |
|
| 996 | - // read the contents of the current scheme file. |
|
| 997 | - $schemes = self::read_scheme_file(); |
|
| 998 | - |
|
| 999 | - // If returned false (not there) then create a new array. |
|
| 1000 | - if ( false === $schemes ) { |
|
| 1001 | - $schemes = array(); |
|
| 1002 | - } |
|
| 1003 | - |
|
| 1004 | - $scheme_data = $schemes[ $name ] ?? ''; |
|
| 1005 | - |
|
| 1006 | - if ( $scheme_data !== $new_scheme ) { |
|
| 1007 | - |
|
| 1008 | - // Add new scheme to array that will be saved. |
|
| 1009 | - $schemes[ $name ] = $new_scheme; |
|
| 1010 | - |
|
| 1011 | - // Write the data to the JSON file. |
|
| 1012 | - return self::write_scheme_file( $schemes ); |
|
| 1013 | - } |
|
| 1014 | - } |
|
| 1015 | - |
|
| 1016 | - // !success |
|
| 1017 | - return false; |
|
| 1018 | - } |
|
| 1019 | - |
|
| 1020 | - /** |
|
| 1021 | - * Enumerate the scheme names from the JSON store file. |
|
| 1022 | - * |
|
| 1023 | - * @since 1.0.0 |
|
| 1024 | - * @access public static |
|
| 1025 | - * @return array Array of stored scheme names. |
|
| 1026 | - */ |
|
| 1027 | - public static function get_scheme_names(): array { |
|
| 1028 | - |
|
| 1029 | - // Read the JSON file, which returns a PHP array. |
|
| 1030 | - $schemes = self::read_scheme_file(); |
|
| 1031 | - |
|
| 1032 | - // Create a new array. |
|
| 1033 | - $output = array(); |
|
| 1034 | - |
|
| 1035 | - if ( false !== $schemes ) { |
|
| 1036 | - |
|
| 1037 | - // If the schemes array IS an array (versus false), then... |
|
| 1038 | - if ( is_array( $schemes ) ) { |
|
| 1039 | - |
|
| 1040 | - // Enum them. |
|
| 1041 | - foreach ( $schemes as $scheme ) { |
|
| 1042 | - |
|
| 1043 | - // If the color_scheme_name key is set... |
|
| 1044 | - if ( isset( $scheme['color_scheme_name'] ) ) { |
|
| 1045 | - |
|
| 1046 | - // Push it onto the array stack. |
|
| 1047 | - $output[] = $scheme['color_scheme_name']; |
|
| 1048 | - } |
|
| 1049 | - } |
|
| 1050 | - } |
|
| 1051 | - } |
|
| 1052 | - |
|
| 1053 | - // Kick the full array out the door. |
|
| 1054 | - return $output; |
|
| 1055 | - } |
|
| 1056 | - |
|
| 1057 | - /** |
|
| 1058 | - * Get data array from scheme. |
|
| 1059 | - * |
|
| 1060 | - * @param string $scheme Scheme name. |
|
| 1061 | - * |
|
| 1062 | - * @return array |
|
| 1063 | - */ |
|
| 1064 | - public static function data_array_from_scheme( string $scheme ): array { |
|
| 1065 | - |
|
| 1066 | - // Get scheme data from JSON file. |
|
| 1067 | - $data = self::get_scheme_data( $scheme ); |
|
| 1068 | - if ( false === $data ) { |
|
| 1069 | - return array(); |
|
| 1070 | - } |
|
| 1071 | - |
|
| 1072 | - // Don't need to save select arrays to database, |
|
| 1073 | - // just the id => value. |
|
| 1074 | - if ( ! empty( $data ) ) { |
|
| 1075 | - foreach ( $data as $k => $v ) { |
|
| 1076 | - if ( isset( $v['type'] ) ) { |
|
| 1077 | - $val = $v['value']; |
|
| 1078 | - |
|
| 1079 | - unset( $data[ $k ] ); |
|
| 1080 | - |
|
| 1081 | - $data[ $k ] = $val; |
|
| 1082 | - } |
|
| 1083 | - } |
|
| 1084 | - } |
|
| 1085 | - |
|
| 1086 | - return $data; |
|
| 1087 | - } |
|
| 1088 | - |
|
| 1089 | - /** |
|
| 1090 | - * Sets current scheme to database. |
|
| 1091 | - * |
|
| 1092 | - * @param string $scheme Current scheme name. |
|
| 1093 | - * |
|
| 1094 | - * @return void |
|
| 1095 | - * @since 1.0.0 |
|
| 1096 | - * @access private |
|
| 1097 | - */ |
|
| 1098 | - public static function set_database_data( string $scheme = 'Default' ) { |
|
| 1099 | - |
|
| 1100 | - $data = self::data_array_from_scheme( $scheme ); |
|
| 1101 | - |
|
| 1102 | - // Get opt name, for database. |
|
| 1103 | - $opt_name = self::$parent->args['opt_name']; |
|
| 1104 | - |
|
| 1105 | - // Get all options from database. |
|
| 1106 | - $redux_options = get_option( $opt_name ); |
|
| 1107 | - |
|
| 1108 | - if ( empty( self::$field_id ) ) { |
|
| 1109 | - self::$field = self::get_field(); |
|
| 1110 | - self::$field_id = self::$field['id']; |
|
| 1111 | - } |
|
| 1112 | - |
|
| 1113 | - // Append ID to variable that holds the current scheme ID data. |
|
| 1114 | - $redux_options[ self::$field_id ] = $data; |
|
| 1115 | - |
|
| 1116 | - // Save the modified settings. |
|
| 1117 | - update_option( $opt_name, $redux_options ); |
|
| 1118 | - } |
|
| 1119 | - } |
|
| 812 | + // closing html tags. |
|
| 813 | + $html .= '</div>'; |
|
| 814 | + $html .= '<span class="redux-label redux-layout-label">' . esc_attr( $v['title'] ) . '</span>'; |
|
| 815 | + $html .= '</li>'; |
|
| 816 | + } |
|
| 817 | + } |
|
| 818 | + $html .= '</ul>'; |
|
| 819 | + |
|
| 820 | + $html .= '<hr class="redux-color-scheme-blank-hr">'; |
|
| 821 | + |
|
| 822 | + if ( $is_accordion ) { |
|
| 823 | + $html .= '</div>'; |
|
| 824 | + } |
|
| 825 | + |
|
| 826 | + $html .= '</div>'; |
|
| 827 | + } |
|
| 828 | + |
|
| 829 | + // Close list. |
|
| 830 | + $html .= '</ul>'; |
|
| 831 | + } |
|
| 832 | + |
|
| 833 | + // html var not empty, return it. |
|
| 834 | + if ( ! empty( $html ) ) { |
|
| 835 | + return $html; |
|
| 836 | + } |
|
| 837 | + |
|
| 838 | + return ''; |
|
| 839 | + } |
|
| 840 | + |
|
| 841 | + /** |
|
| 842 | + * Get color block class. |
|
| 843 | + * |
|
| 844 | + * @param array $field Field array. |
|
| 845 | + * @param string $id Field ID. |
|
| 846 | + * |
|
| 847 | + * @return string |
|
| 848 | + */ |
|
| 849 | + private static function get_color_block_class( array $field, string $id ): string { |
|
| 850 | + $def = $field['default']; |
|
| 851 | + |
|
| 852 | + if ( ! empty( $def ) ) { |
|
| 853 | + foreach ( $def as $arr ) { |
|
| 854 | + if ( $arr['id'] === $id ) { |
|
| 855 | + if ( isset( $arr['class'] ) ) { |
|
| 856 | + return $arr['class']; |
|
| 857 | + } |
|
| 858 | + } |
|
| 859 | + } |
|
| 860 | + } |
|
| 861 | + |
|
| 862 | + return ''; |
|
| 863 | + } |
|
| 864 | + |
|
| 865 | + /** |
|
| 866 | + * Get tooltip data. |
|
| 867 | + * |
|
| 868 | + * @param array $field Field array. |
|
| 869 | + * @param string $id Field ID. |
|
| 870 | + * |
|
| 871 | + * @return mixed |
|
| 872 | + */ |
|
| 873 | + private static function get_tooltip_data( array $field, string $id ) { |
|
| 874 | + $def = $field['default']; |
|
| 875 | + |
|
| 876 | + if ( ! empty( $def ) ) { |
|
| 877 | + foreach ( $def as $arr ) { |
|
| 878 | + if ( $arr['id'] === $id ) { |
|
| 879 | + if ( isset( $arr['tooltip'] ) ) { |
|
| 880 | + return $arr['tooltip']; |
|
| 881 | + } |
|
| 882 | + } |
|
| 883 | + } |
|
| 884 | + } |
|
| 885 | + |
|
| 886 | + return false; |
|
| 887 | + } |
|
| 888 | + |
|
| 889 | + /** |
|
| 890 | + * Get hidden blocks. |
|
| 891 | + * |
|
| 892 | + * @param array $field Field ID. |
|
| 893 | + * @param string $id Field ID. |
|
| 894 | + * |
|
| 895 | + * @return bool |
|
| 896 | + */ |
|
| 897 | + private static function get_block_hidden( array $field, string $id ): bool { |
|
| 898 | + $def = $field['default']; |
|
| 899 | + |
|
| 900 | + if ( ! empty( $def ) ) { |
|
| 901 | + foreach ( $def as $arr ) { |
|
| 902 | + if ( $arr['id'] === $id ) { |
|
| 903 | + if ( isset( $arr['hidden'] ) ) { |
|
| 904 | + return $arr['hidden']; |
|
| 905 | + } |
|
| 906 | + } |
|
| 907 | + } |
|
| 908 | + } |
|
| 909 | + |
|
| 910 | + return false; |
|
| 911 | + } |
|
| 912 | + |
|
| 913 | + /** |
|
| 914 | + * Returns scheme file contents. |
|
| 915 | + * |
|
| 916 | + * @since 1.0.0 |
|
| 917 | + * @access public static |
|
| 918 | + * |
|
| 919 | + * @return array Array of scheme data. |
|
| 920 | + */ |
|
| 921 | + public static function read_scheme_file() { |
|
| 922 | + $key = self::get_scheme_key(); |
|
| 923 | + $data = get_option( $key ); |
|
| 924 | + |
|
| 925 | + if ( empty( $data ) ) { |
|
| 926 | + $arr_data = false; |
|
| 927 | + } else { |
|
| 928 | + $arr_data = $data; |
|
| 929 | + } |
|
| 930 | + |
|
| 931 | + return $arr_data; |
|
| 932 | + } |
|
| 933 | + |
|
| 934 | + /** |
|
| 935 | + * Sets scheme file contents. |
|
| 936 | + * |
|
| 937 | + * @param array $arr_data PHP array of data to encode. |
|
| 938 | + * |
|
| 939 | + * @return bool Result of write function. |
|
| 940 | + * @since 1.0.0 |
|
| 941 | + * @access public static |
|
| 942 | + */ |
|
| 943 | + public static function write_scheme_file( array $arr_data ): bool { |
|
| 944 | + $key = self::get_scheme_key(); |
|
| 945 | + |
|
| 946 | + return update_option( $key, $arr_data ); |
|
| 947 | + } |
|
| 948 | + |
|
| 949 | + /** |
|
| 950 | + * Gets individual scheme data from scheme JSON file. |
|
| 951 | + * |
|
| 952 | + * @param string $scheme_name Name of scheme. |
|
| 953 | + * |
|
| 954 | + * @return mixed PHP array of scheme data. |
|
| 955 | + * @since 1.0.0 |
|
| 956 | + * @access public static |
|
| 957 | + */ |
|
| 958 | + public static function get_scheme_data( string $scheme_name ) { |
|
| 959 | + $data = self::read_scheme_file(); |
|
| 960 | + |
|
| 961 | + if ( false === $data ) { |
|
| 962 | + return false; |
|
| 963 | + } |
|
| 964 | + |
|
| 965 | + return $data[ $scheme_name ]; |
|
| 966 | + } |
|
| 967 | + |
|
| 968 | + /** |
|
| 969 | + * Sets individual scheme data to scheme JSON file. |
|
| 970 | + * |
|
| 971 | + * @param string $name Name of a scheme to save. |
|
| 972 | + * @param array $arr Scheme data to encode. |
|
| 973 | + * |
|
| 974 | + * @return bool Result of file written. |
|
| 975 | + * @since 1.0.0 |
|
| 976 | + * @access public static |
|
| 977 | + */ |
|
| 978 | + public static function set_scheme_data( string $name, array $arr ): bool { |
|
| 979 | + |
|
| 980 | + // Create blank array. |
|
| 981 | + $new_scheme = array(); |
|
| 982 | + |
|
| 983 | + // If name is present. |
|
| 984 | + if ( $name ) { |
|
| 985 | + |
|
| 986 | + // then add the name at the new array's key. |
|
| 987 | + $new_scheme['color_scheme_name'] = $name; |
|
| 988 | + |
|
| 989 | + // Enum through values and assign them to new array. |
|
| 990 | + foreach ( $arr as $val ) { |
|
| 991 | + if ( isset( $val['id'] ) ) { |
|
| 992 | + $new_scheme[ $val['id'] ] = $val; |
|
| 993 | + } |
|
| 994 | + } |
|
| 995 | + |
|
| 996 | + // read the contents of the current scheme file. |
|
| 997 | + $schemes = self::read_scheme_file(); |
|
| 998 | + |
|
| 999 | + // If returned false (not there) then create a new array. |
|
| 1000 | + if ( false === $schemes ) { |
|
| 1001 | + $schemes = array(); |
|
| 1002 | + } |
|
| 1003 | + |
|
| 1004 | + $scheme_data = $schemes[ $name ] ?? ''; |
|
| 1005 | + |
|
| 1006 | + if ( $scheme_data !== $new_scheme ) { |
|
| 1007 | + |
|
| 1008 | + // Add new scheme to array that will be saved. |
|
| 1009 | + $schemes[ $name ] = $new_scheme; |
|
| 1010 | + |
|
| 1011 | + // Write the data to the JSON file. |
|
| 1012 | + return self::write_scheme_file( $schemes ); |
|
| 1013 | + } |
|
| 1014 | + } |
|
| 1015 | + |
|
| 1016 | + // !success |
|
| 1017 | + return false; |
|
| 1018 | + } |
|
| 1019 | + |
|
| 1020 | + /** |
|
| 1021 | + * Enumerate the scheme names from the JSON store file. |
|
| 1022 | + * |
|
| 1023 | + * @since 1.0.0 |
|
| 1024 | + * @access public static |
|
| 1025 | + * @return array Array of stored scheme names. |
|
| 1026 | + */ |
|
| 1027 | + public static function get_scheme_names(): array { |
|
| 1028 | + |
|
| 1029 | + // Read the JSON file, which returns a PHP array. |
|
| 1030 | + $schemes = self::read_scheme_file(); |
|
| 1031 | + |
|
| 1032 | + // Create a new array. |
|
| 1033 | + $output = array(); |
|
| 1034 | + |
|
| 1035 | + if ( false !== $schemes ) { |
|
| 1036 | + |
|
| 1037 | + // If the schemes array IS an array (versus false), then... |
|
| 1038 | + if ( is_array( $schemes ) ) { |
|
| 1039 | + |
|
| 1040 | + // Enum them. |
|
| 1041 | + foreach ( $schemes as $scheme ) { |
|
| 1042 | + |
|
| 1043 | + // If the color_scheme_name key is set... |
|
| 1044 | + if ( isset( $scheme['color_scheme_name'] ) ) { |
|
| 1045 | + |
|
| 1046 | + // Push it onto the array stack. |
|
| 1047 | + $output[] = $scheme['color_scheme_name']; |
|
| 1048 | + } |
|
| 1049 | + } |
|
| 1050 | + } |
|
| 1051 | + } |
|
| 1052 | + |
|
| 1053 | + // Kick the full array out the door. |
|
| 1054 | + return $output; |
|
| 1055 | + } |
|
| 1056 | + |
|
| 1057 | + /** |
|
| 1058 | + * Get data array from scheme. |
|
| 1059 | + * |
|
| 1060 | + * @param string $scheme Scheme name. |
|
| 1061 | + * |
|
| 1062 | + * @return array |
|
| 1063 | + */ |
|
| 1064 | + public static function data_array_from_scheme( string $scheme ): array { |
|
| 1065 | + |
|
| 1066 | + // Get scheme data from JSON file. |
|
| 1067 | + $data = self::get_scheme_data( $scheme ); |
|
| 1068 | + if ( false === $data ) { |
|
| 1069 | + return array(); |
|
| 1070 | + } |
|
| 1071 | + |
|
| 1072 | + // Don't need to save select arrays to database, |
|
| 1073 | + // just the id => value. |
|
| 1074 | + if ( ! empty( $data ) ) { |
|
| 1075 | + foreach ( $data as $k => $v ) { |
|
| 1076 | + if ( isset( $v['type'] ) ) { |
|
| 1077 | + $val = $v['value']; |
|
| 1078 | + |
|
| 1079 | + unset( $data[ $k ] ); |
|
| 1080 | + |
|
| 1081 | + $data[ $k ] = $val; |
|
| 1082 | + } |
|
| 1083 | + } |
|
| 1084 | + } |
|
| 1085 | + |
|
| 1086 | + return $data; |
|
| 1087 | + } |
|
| 1088 | + |
|
| 1089 | + /** |
|
| 1090 | + * Sets current scheme to database. |
|
| 1091 | + * |
|
| 1092 | + * @param string $scheme Current scheme name. |
|
| 1093 | + * |
|
| 1094 | + * @return void |
|
| 1095 | + * @since 1.0.0 |
|
| 1096 | + * @access private |
|
| 1097 | + */ |
|
| 1098 | + public static function set_database_data( string $scheme = 'Default' ) { |
|
| 1099 | + |
|
| 1100 | + $data = self::data_array_from_scheme( $scheme ); |
|
| 1101 | + |
|
| 1102 | + // Get opt name, for database. |
|
| 1103 | + $opt_name = self::$parent->args['opt_name']; |
|
| 1104 | + |
|
| 1105 | + // Get all options from database. |
|
| 1106 | + $redux_options = get_option( $opt_name ); |
|
| 1107 | + |
|
| 1108 | + if ( empty( self::$field_id ) ) { |
|
| 1109 | + self::$field = self::get_field(); |
|
| 1110 | + self::$field_id = self::$field['id']; |
|
| 1111 | + } |
|
| 1112 | + |
|
| 1113 | + // Append ID to variable that holds the current scheme ID data. |
|
| 1114 | + $redux_options[ self::$field_id ] = $data; |
|
| 1115 | + |
|
| 1116 | + // Save the modified settings. |
|
| 1117 | + update_option( $opt_name, $redux_options ); |
|
| 1118 | + } |
|
| 1119 | + } |
|
| 1120 | 1120 | } |