# jch-optimize/trunk/src/Admin/Settings/FieldCallbacks.php

JCH Optimize, version trunk. 1,117 lines.

- Page: https://pluginprobe.com/plugins/jch-optimize/trunk/code/src/Admin/Settings/FieldCallbacks.php
- Raw: https://pluginprobe.com/plugins/jch-optimize/trunk/raw/src/Admin/Settings/FieldCallbacks.php
- Modified: 2026-08-22T22:53:50+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/jch-optimize/trunk/code/src/Admin/Settings/FieldCallbacks.php#L10-L20`.

```php
<?php

/**
 * JCH Optimize - Performs several front-end optimizations for fast downloads
 *
 * @package   jchoptimize/wordpress-platform
 * @author    Samuel Marshall <samuel@jch-optimize.net>
 * @copyright Copyright (c) 2020 Samuel Marshall / JCH Optimize
 * @license   GNU/GPLv3, or later. See LICENSE file
 *
 * If LICENSE file missing, see <http://www.gnu.org/licenses/>.
 */

namespace JchOptimize\WordPress\Admin\Settings;

use JchOptimize\Core\FeatureHelpers\ResponsiveImages;

use function __;
use function array_keys;

abstract class FieldCallbacks
{
    ## General Tab

    /*
    General Section
    */

    public static function pro_downloadid(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function debug(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function order_plugin(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function disable_logged_in_users(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    /*
     Elements Above Fold
     */

    public static function elements_above_fold_home(): void
    {
        ControlRenderer::render('text', __FUNCTION__, '300');
    }

    public static function elements_above_fold(): void
    {
        ControlRenderer::render('text', __FUNCTION__, '300');
    }

    public static function elements_above_fold_per_page(): void
    {
        $subfields = [
            [
                'name'         => 'elements',
                'type'         => 'text',
                /*'header'       => 'Number of elements',*/
                'defaultValue' => '300',
                'class'        => 'small-text bg-white'
            ]
        ];

        ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'url', 'file', 'url', $subfields);
    }

    public static function elements_above_fold_marker(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Exclude Menu Urls Section
    */
    public static function menuexcludedurl(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'file');
    }

    /*
    Cache Storage Section
    */
    public static function pro_cache_storage_adapter(): void
    {
        $options = [
            'filesystem' => __('Filesystem', 'jch-optimize'),
            'apcu'       => __('APCu', 'jch-optimize'),
            'memcached'  => __('Memcached', 'jch-optimize'),
            'redis'      => __('Redis', 'jch-optimize')
        ];

        $class = CacheStorageSupport::class;

        $conditions = [
            'apcu'      => [$class, 'isApcuSupported'],
            'memcached' => [$class, 'isMemcachedSupported'],
            'redis'     => [$class, 'isRedisSupported']
        ];

        ControlRenderer::render('select.pro', __FUNCTION__, 'filesystem', $options, '', $conditions);
    }

    public static function cache_lifetime(): void
    {
        $aOptions = [
            '1800'    => __('30 min', 'jch-optimize'),
            '3600'    => __('1 hour', 'jch-optimize'),
            '10800'   => __('3 hours', 'jch-optimize'),
            '21600'   => __('6 hours', 'jch-optimize'),
            '43200'   => __('12 hours', 'jch-optimize'),
            '86400'   => __('1 day', 'jch-optimize'),
            '172800'  => __('2 days', 'jch-optimize'),
            '604800'  => __('7 days', 'jch-optimize'),
            '1209600' => __('2 weeks', 'jch-optimize')
        ];

        ControlRenderer::render('select', __FUNCTION__, '1800', $aOptions);
    }

    public static function memcached_server_host(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '127.0.0.1');
    }

    public static function memcached_server_port(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '11211');
    }

    public static function redis_server_host(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '127.0.0.1');
    }

    public static function redis_server_port(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '6379');
    }

    public static function redis_server_password(): void
    {
        ControlRenderer::render('input.pro', __FUNCTION__, '', 'password');
    }

    public static function redis_server_database(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '0');
    }

    public static function delete_expiry(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    /*
     Recache Section
     */

    public static function recache_base_url(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function recache_crawl_limit(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '100');
    }

    public static function recache_concurrency(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '10');
    }

    public static function recache_max_depth(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '3');
    }

    public static function recache_delete_cache(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function recache_frequency(): void
    {
        $options = [
            '0'          => __('Disabled', 'jch-optimize'),
            '1'          => __('On save only', 'jch-optimize'),
            'hourly'     => __('Hourly', 'jch-optimize'),
            'twicedaily' => __('Twice Daily', 'jch-optimize'),
            'daily'      => __('Daily', 'jch-optimize'),
        ];

        ControlRenderer::render('select.pro', __FUNCTION__, '1', $options);
    }

    ## Combine Files tab

    /*
    Combine CSS/Js Section
    */

    public static function combine_files_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function combine_files(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function smart_combine(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function try_catch(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function html_minify_level(): void
    {
        $aOptions = [
            '0' => __('Basic', 'jch-optimize'),
            '1' => __('Advanced', 'jch-optimize'),
            '2' => __('Ultra', 'jch-optimize')
        ];

        ControlRenderer::render('select', __FUNCTION__, '0', $aOptions);
    }

    public static function htaccess(): void
    {
        $aOptions = [
            '2' => __('Static css and js files', 'jch-optimize'),
            '0' => __('PHP file with query', 'jch-optimize'),
            '1' => __('PHP using url re-write', 'jch-optimize'),
            '3' => __('PHP using url re-write (Without Options +FollowSymLinks)', 'jch-optimize'),
        ];

        ControlRenderer::render('select', __FUNCTION__, '2', $aOptions);
    }

    /*
    Combine Files Automatic Section
    */

    public static function gzip(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function html_minify(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function includeAllExtensions(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function phpAndExternal(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    ## CSS Tab

    /*
    CSS Automatic Settings Section
    */

    public static function css(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function css_minify(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function replaceImports(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function inlineStyle(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Exclude CSS Files section
    */

    public static function excludeCss(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'file');
    }

    public static function excludeCssComponents(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'extension');
    }

    public static function excludeStyles(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'style');
    }

    public static function excludeAllStyles(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Remove CSS Files section
    */

    public static function remove_css(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'css', 'file');
    }

    /*
     Custom CSS section
     */
    public static function custom_css_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function custom_css(): void
    {
        ControlRenderer::render('textarea', __FUNCTION__, '');
    }

    public static function mobile_css(): void
    {
        ControlRenderer::render('textarea', __FUNCTION__, '');
    }

    public static function desktop_css(): void
    {
        ControlRenderer::render('textarea', __FUNCTION__, '');
    }

    /*
    Optimize CSS Delivery Section
    */

    public static function optimizeCssDelivery_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function pro_reduce_unused_css(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_dynamic_selectors(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'selectors', 'style');
    }

    public static function dynamic_css_selectors(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'selectors', 'style');
    }

    public static function critical_css_configure_helper(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }
    ## JavaScript Tab

    /*
    JavaScript Automatic Settings Section
    */

    public static function javascript(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function js_minify(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function inlineScripts(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function bottom_js(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function loadAsynchronous(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Exclude JavaScript Files
    */

    public static function excludeJs_peo(): void
    {
        $subfields = [
            ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',],
            ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',]
        ];

        ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'file', 'url', $subfields);
    }

    public static function excludeJsComponents_peo(): void
    {
        $subfields = [
            ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',],
            ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',]
        ];

        ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'extension', 'url', $subfields);
    }

    public static function excludeScripts_peo(): void
    {
        $subfields = [
            ['name' => 'ieo', 'type' => 'checkbox', 'header' => 'Ignore execution order',],
            ['name' => 'dontmove', 'type' => 'checkbox', 'header' => 'Don\'t move to bottom',]
        ];

        ControlRenderer::render('multiselectjs', __FUNCTION__, [], 'js', 'script', 'script', $subfields);
    }

    public static function excludeAllScripts(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Remove JavaScript Files Section
     */
    public static function remove_js(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'js', 'file');
    }

    /*
    Reduce Unused JavaScript Section
    */

    public static function pro_reduce_unused_js_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_criticalJs(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'criticaljs', 'file');
    }

    public static function pro_criticalScripts(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'js', 'script');
    }

    public static function pro_criticalModules(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'modules', 'file');
    }

    public static function pro_criticalModulesScripts(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'modulesScripts', 'script');
    }

    public static function critical_js_configure_helper(): void
    {
        ControlRenderer::render('criticaljsmodalbutton.pro', __FUNCTION__, '');
    }

    ## Page Cache Tab

    /*
    Page Cache Section
    */

    public static function cache_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function pro_cache_platform(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function page_cache_exclude_form_users(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function page_cache_browser_caching(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function page_cache_lifetime(): void
    {
        $aOptions = [
            '900'    => __('15 min', 'jch-optimize'),
            '1800'   => __('30 min', 'jch-optimize'),
            '3600'   => __('1 hour', 'jch-optimize'),
            '10800'  => __('3 hours', 'jch-optimize'),
            '21600'  => __('6 hours', 'jch-optimize'),
            '43200'  => __('12 hours', 'jch-optimize'),
            '86400'  => __('1 day', 'jch-optimize'),
            '172800' => __('2 days', 'jch-optimize'),
            '604800' => __('1 week', 'jch-optimize')
        ];

        ControlRenderer::render('select', __FUNCTION__, '900', $aOptions);
    }

    public static function cache_exclude(): void
    {
        //We're using class as the last argument to be able to include '?' in the multiselect box
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'class');
    }

    public static function page_cache_ignore_query_values(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'url', 'class');
    }

    public static function pro_capture_cache_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    /*
     Cloudflare Cache Purge Section
     */

    public static function cf_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function cf_api_token(): void
    {
        ControlRenderer::render('verifycftoken.pro', __FUNCTION__, '');
    }

    public static function cf_zone_id(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function cf_mode_switcher_integration(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    ## Media Tab

    /*
    Add Image Attributes Section
    */

    public static function img_attributes_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
    Sprite Generator Section
    */

    public static function csg_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function csg_direction(): void
    {
        $aOptions = [
            'vertical'   => __('vertical', 'jch-optimize'),
            'horizontal' => __('horizontal', 'jch-optimize')
        ];

        ControlRenderer::render('select', __FUNCTION__, 'vertical', $aOptions);
    }

    public static function csg_wrap_images(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function csg_exclude_images(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'images', 'file');
    }

    public static function csg_include_images(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'images', 'file');
    }

    /*
    Lazy Load Images Section
    */

    public static function lazyload_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function pro_lazyload_iframe(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_lazyload_audiovideo(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_lazyload_bgimages(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function excludeLazyLoad(): void
    {
        ControlRenderer::render('multiselect', __FUNCTION__, [], 'lazyload', 'file');
    }

    public static function pro_excludeLazyLoadFolders(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'folder');
    }

    public static function pro_excludeLazyLoadClass(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'class');
    }

    public static function includeLazyLoad(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file');
    }

    public static function includeLazyLoadFolders(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'folder');
    }

    public static function includeLazyLoadClass(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'class');
    }

    ## Preloads Tab

    /*
    HTTP/2 Preload
    */

    public static function http2_push_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function pro_http2_preload_modules(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function pro_http2_file_types(): void
    {
        $aOptions = [
            'style'  => 'style',
            'script' => 'script',
            'font'   => 'font',
            'image'  => 'image'
        ];

        ControlRenderer::render('checkboxes', __FUNCTION__, array_keys($aOptions), $aOptions);
    }

    public static function pro_http2_include(): void
    {
        $subfields = [
            [
                'name'    => 'crossorigin',
                'type'    => 'select',
                'header'  => 'Crossorigin',
                'options' => [
                    ['value' => '', 'text' => '- None -'],
                    ['value' => 'anonymous', 'text' => 'anonymous'],
                    ['value' => 'use-credentials', 'text' => 'use-credentials'],
                ],
                'legacy'  => ['anonymous', 'use-credentials'],
                'class'   => 'bg-white'
            ]
            /*      ['name' => 'anonymous', 'type' => 'checkbox', 'header' => 'Crossorigin: \'anonymous\''],
                  ['name' => 'use-credentials', 'type' => 'checkbox', 'header' => '\'use-credentials\''] */
        ];

        ControlRenderer::render(
            'multiselectjs.pro',
            __FUNCTION__,
            [],
            'http2',
            'file',
            'url',
            $subfields,
            'only-one'
        );
    }

    public static function pro_http2_exclude(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'http2', 'file');
    }

    /*
     Largest Contentful Paint Images
     */

    public static function pro_lcp_images_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_lcp_images(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file');
    }

    public static function pro_lcp_identifiers(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file');
    }

    public static function lcp_images_mobile(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file');
    }

    public static function lcp_images_desktop(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'lazyload', 'file');
    }

    /*
    Optimize Fonts Section
    */

    public static function pro_optimizeFonts_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_force_swap_policy(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function pro_optimize_font_files(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'css', 'file');
    }

    /*
     Preconnect Third-party
     */

    public static function pro_preconnect_domains_enable(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_preconnect_domains(): void
    {
        $subfields = [
            [
                'name'    => 'crossorigin',
                'type'    => 'select',
                'header'  => 'Crossorigin',
                'options' => [
                    ['value' => '', 'text' => '- None -'],
                    ['value' => 'anonymous', 'text' => 'anonymous'],
                    ['value' => 'use-credentials', 'text' => 'use-credentials'],
                ],
                'legacy'  => ['anonymous', 'use-credentials'],
                'class'   => 'bg-white'
            ],
            /*   ['name' => 'anonymous', 'type' => 'checkbox', 'header' => 'Crossorigin: \'anonymous\''],
               ['name' => 'use-credentials', 'type' => 'checkbox', 'header' => '\'use-credentials\'']*/
        ];

        ControlRenderer::render(
            'multiselectjs.pro',
            __FUNCTION__,
            [],
            'origin',
            'origin',
            'url',
            $subfields,
            'only-one'
        );
    }

    public static function dns_prefetch_domains(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'origin', 'origin');
    }

    ## CDN Tab

    /*
    CDN Section
    */

    public static function cookielessdomain_enable(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    public static function cdn_scheme(): void
    {
        $aOptions = [
            '0' => __('scheme relative', 'jch-optimize'),
            '1' => __('http', 'jch-optimize'),
            '2' => __('https', 'jch-optimize')
        ];

        ControlRenderer::render('select', __FUNCTION__, '0', $aOptions);
    }

    public static function cookielessdomain(): void
    {
        ControlRenderer::render('text', __FUNCTION__, '');
    }

    public static function staticfiles(): void
    {
        ControlRenderer::render('checkboxes', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray());
    }

    /**
     * @return array<string, string>
     */
    private static function staticFilesArray(): array
    {
        return [
            'css'   => 'css',
            'png'   => 'png',
            'gif'   => 'gif',
            'ico'   => 'ico',
            'pdf'   => 'pdf',
            'js'    => 'js',
            'jpe?g' => 'jp(e)g',
            'bmp'   => 'bmp',
            'webp'  => 'webp',
            'svg'   => 'svg'
        ];
    }

    public static function pro_customcdnextensions(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'url', 'file');
    }

    public static function pro_cookielessdomain_2(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function pro_staticfiles_2(): void
    {
        ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray());
    }

    public static function pro_cookielessdomain_3(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function pro_staticfiles_3(): void
    {
        ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys(self::staticFilesArray()), self::staticFilesArray());
    }

    ## Optimize Images Tab

    /*
    Global Options Section
    */

    public static function ignore_optimized(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    /*
     Next Generation Images Section
     */

    public static function pro_next_gen_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function gen_avif_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function load_avif_webp_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_web_old_browsers(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_load_webp_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function load_avif_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    /*
     Responsive Image Section
     */
    public static function pro_gen_responsive_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '1');
    }

    public static function pro_load_responsive_images(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function cropgravity(): void
    {
        if (JCH_PRO) {
            $subfields = [
                [
                    'name'    => 'gravity',
                    'type'    => 'select',
                    'header'  => 'Position',
                    'options' => [
                        ['value' => 'West', 'text' => 'Left', 'selected' => false],
                        ['value' => 'Center', 'text' => 'Center', 'selected' => true],
                        ['value' => 'East', 'text' => 'Right', 'selected' => false],
                    ],
                    'class'   => 'bg-white'
                ],
                [
                    'name'         => 'cropwidth',
                    'type'         => 'text',
                    'header'       => 'Width (px)',
                    'defaultValue' => ResponsiveImages::$breakpoints[0],
                    'class'        => 'small-text bg-white'
                ]
            ];
        } else {
            $subfields = [];
        }

        ControlRenderer::render(
            'multiselectjs.pro',
            __FUNCTION__,
            [],
            'lazyload',
            'file',
            'url',
            $subfields
        );
    }

    /*
     Optimization Configuration Section
     */
    public static function lossy(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    public static function save_metadata(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '0');
    }

    /*
     Upload Setting Section
     */
    public static function pro_api_concurrency(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '2');
    }

    public static function pro_api_num_files(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '');
    }

    public static function pro_api_max_size(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '2M');
    }

    public static function api_connection_timeout(): void
    {
        ControlRenderer::render('text.pro', __FUNCTION__, '30');
    }

    /*
    Optimize Images By URLs Section
    */

    public static function pro_api_resize_mode(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    /*
    Optimize Images By Folders Section
    */

    public static function recursive(): void
    {
        ControlRenderer::render('switch', __FUNCTION__, '1');
    }

    ## Miscellaneous Tab

    /*
    Reduce DOM Section
    */

    public static function pro_reduce_dom(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }

    public static function pro_html_sections(): void
    {
        $options = [
            'header'  => 'header',
            'nav'     => 'nav',
            'main'    => 'main',
            'article' => 'article',
            'section' => 'section',
            'aside'   => 'aside',
            'footer'  => 'footer',
        ];

        ControlRenderer::render('checkboxes.pro', __FUNCTION__, array_keys($options), $options);
    }

    public static function reduce_dom_identifiers(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class');
    }

    public static function reduce_dom_exclude_identifiers(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class');
    }

    public static function reduce_dom_above_fold_identifiers(): void
    {
        ControlRenderer::render('multiselect.pro', __FUNCTION__, [], 'reducedom', 'class');
    }

    /*
    Mode Switcher Menu Section
    */
    public static function pro_disableModeSwitcher(): void
    {
        ControlRenderer::render('switch.pro', __FUNCTION__, '0');
    }
}

```
