(closest thing to native video lazy). * - Auto-fills missing width / height attributes (best CLS win). * - Excludes by substring patterns (src or class match) — useful for * hero banner classes, logo files, etc. * * Tier: Free per FEATURES.md "Images" §1-6 (LiteSpeed parity — all * Free in LS Cache). * * @package XSpeed */ declare(strict_types=1); namespace XSpeed\Modules\Lazy; defined( 'ABSPATH' ) || exit; use XSpeed\Lazy_Loader; use XSpeed\Module; final class LazyModule extends Module { public const SLUG = 'lazy'; public const TIER = self::TIER_FREE; public const VERSION = '1.0.0'; public function ui_metadata(): array { return array( 'label' => 'Lazy Load', 'icon' => 'Image', 'description' => 'Defer images / iframes / videos until they scroll into view, and auto-add missing dimensions to prevent CLS.', ); } public function settings_schema(): array { return array( 'lazy_images' => array( 'type' => 'bool', 'default' => true, 'label' => 'Lazy-load Images', 'description' => 'Add loading="lazy" + decoding="async" to tags in post content. The first images on the page get loading="eager" so the LCP image is not deferred.', ), 'lazy_iframes' => array( 'type' => 'bool', 'default' => true, 'label' => 'Lazy-load Iframes', 'description' => 'Add loading="lazy" to