perf: add defer to scripts and lazy loading to images
Some checks failed
CI / ruff (push) Successful in 14s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled

Add defer attribute to 145 <script> tags across 103 template files
(PERF-067) and loading="lazy" to 22 <img> tags across 13 template
files (PERF-058). Both improve page load performance.

Validator totals: 0 errors, 2 warnings, 1360 info (down from 1527).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-16 20:55:52 +01:00
parent 3a7cf29386
commit 8ee8c398ce
110 changed files with 193 additions and 193 deletions

View File

@@ -234,5 +234,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/admin-user-detail.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/admin-user-detail.js') }}"></script>
{% endblock %}

View File

@@ -268,5 +268,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/admin-user-edit.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/admin-user-edit.js') }}"></script>
{% endblock %}

View File

@@ -258,5 +258,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/admin-users.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/admin-users.js') }}"></script>
{% endblock %}

View File

@@ -106,16 +106,16 @@
<!-- Scripts - ORDER MATTERS! -->
<!-- 1. Log Configuration -->
<script src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<!-- 2. Icons -->
<script src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<!-- 3. Utils -->
<script src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<!-- 4. API Client -->
<script src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<!-- 5. Alpine.js v3 with CDN fallback -->
<script>
@@ -135,6 +135,6 @@
</script>
<!-- 6. Login Logic -->
<script src="{{ url_for('core_static', path='admin/js/login.js') }}"></script>
<script defer src="{{ url_for('core_static', path='admin/js/login.js') }}"></script>
</body>
</html>
</html>

View File

@@ -452,5 +452,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/merchant-detail.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/merchant-detail.js') }}"></script>
{% endblock %}

View File

@@ -445,5 +445,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/merchant-edit.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/merchant-edit.js') }}"></script>
{% endblock %}

View File

@@ -247,5 +247,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/merchant-user-detail.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/merchant-user-detail.js') }}"></script>
{% endblock %}

View File

@@ -226,5 +226,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/merchant-users.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/merchant-users.js') }}"></script>
{% endblock %}

View File

@@ -245,5 +245,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/merchants.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/merchants.js') }}"></script>
{% endblock %}

View File

@@ -144,5 +144,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('static', path='admin/js/module-config.js') }}"></script>
<script defer src="{{ url_for('static', path='admin/js/module-config.js') }}"></script>
{% endblock %}

View File

@@ -270,5 +270,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('static', path='admin/js/module-info.js') }}"></script>
<script defer src="{{ url_for('static', path='admin/js/module-info.js') }}"></script>
{% endblock %}

View File

@@ -297,5 +297,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/platform-detail.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/platform-detail.js') }}"></script>
{% endblock %}

View File

@@ -320,5 +320,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/platform-edit.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/platform-edit.js') }}"></script>
{% endblock %}

View File

@@ -196,5 +196,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/platform-menu-config.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/platform-menu-config.js') }}"></script>
{% endblock %}

View File

@@ -278,5 +278,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/platform-modules.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/platform-modules.js') }}"></script>
{% endblock %}

View File

@@ -158,5 +158,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/platforms.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/platforms.js') }}"></script>
{% endblock %}

View File

@@ -111,11 +111,11 @@
</div>
<!-- Scripts -->
<script src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<script src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<script src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<script src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<script src="{{ url_for('tenancy_static', path='admin/js/select-platform.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/select-platform.js') }}"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.13.3/dist/cdn.min.js"></script>
</body>
</html>

View File

@@ -279,5 +279,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/store-create.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/store-create.js') }}"></script>
{% endblock %}

View File

@@ -45,7 +45,7 @@
<div class="grid gap-6 mb-8 md:grid-cols-4">
<!-- Verification Status -->
<div class="flex items-center p-4 bg-white rounded-lg shadow-xs dark:bg-gray-800">
<div class="p-3 mr-4 rounded-full"
<div class="p-3 mr-4 rounded-full"
:class="store?.is_verified ? 'text-green-500 bg-green-100 dark:text-green-100 dark:bg-green-500' : 'text-orange-500 bg-orange-100 dark:text-orange-100 dark:bg-orange-500'">
<span x-html="$icon(store?.is_verified ? 'badge-check' : 'clock', 'w-5 h-5')"></span>
</div>
@@ -268,11 +268,11 @@
</div>
<div>
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase">Website</p>
<a
<a
x-show="store?.website"
:href="store?.website"
:href="store?.website"
target="_blank"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400"
x-text="store?.website">
</a>
<span x-show="!store?.website" class="text-sm text-gray-700 dark:text-gray-300">-</span>
@@ -327,28 +327,28 @@
<div class="space-y-3">
<div x-show="store?.letzshop_csv_url_fr">
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase mb-1">French (FR)</p>
<a
:href="store?.letzshop_csv_url_fr"
<a
:href="store?.letzshop_csv_url_fr"
target="_blank"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
x-text="store?.letzshop_csv_url_fr">
</a>
</div>
<div x-show="store?.letzshop_csv_url_en">
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase mb-1">English (EN)</p>
<a
:href="store?.letzshop_csv_url_en"
<a
:href="store?.letzshop_csv_url_en"
target="_blank"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
x-text="store?.letzshop_csv_url_en">
</a>
</div>
<div x-show="store?.letzshop_csv_url_de">
<p class="text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase mb-1">German (DE)</p>
<a
:href="store?.letzshop_csv_url_de"
<a
:href="store?.letzshop_csv_url_de"
target="_blank"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
class="text-sm text-purple-600 hover:text-purple-700 dark:text-purple-400 break-all"
x-text="store?.letzshop_csv_url_de">
</a>
</div>
@@ -389,5 +389,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/store-detail.js') }}"></script>
{% endblock %}
<script defer src="{{ url_for('tenancy_static', path='admin/js/store-detail.js') }}"></script>
{% endblock %}

View File

@@ -428,5 +428,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/store-edit.js') }}"></script>
{% endblock %}
<script defer src="{{ url_for('tenancy_static', path='admin/js/store-edit.js') }}"></script>
{% endblock %}

View File

@@ -446,5 +446,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/store-theme.js') }}"></script>
{% endblock %}
<script defer src="{{ url_for('tenancy_static', path='admin/js/store-theme.js') }}"></script>
{% endblock %}

View File

@@ -124,6 +124,6 @@
{% endblock %}
{% block extra_scripts %}
<script src="https://cdn.jsdelivr.net/npm/tom-select@2.3.1/dist/js/tom-select.complete.min.js"></script>
<script src="{{ url_for('tenancy_static', path='admin/js/store-themes.js') }}"></script>
<script defer src="https://cdn.jsdelivr.net/npm/tom-select@2.3.1/dist/js/tom-select.complete.min.js"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/store-themes.js') }}"></script>
{% endblock %}

View File

@@ -228,5 +228,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/stores.js') }}"></script>
{% endblock %}
<script defer src="{{ url_for('tenancy_static', path='admin/js/stores.js') }}"></script>
{% endblock %}

View File

@@ -189,5 +189,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='admin/js/user-create.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='admin/js/user-create.js') }}"></script>
{% endblock %}

View File

@@ -107,16 +107,16 @@
<!-- Scripts - ORDER MATTERS! -->
<!-- 1. Log Configuration -->
<script src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<!-- 2. Icons -->
<script src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<!-- 3. Utils -->
<script src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<!-- 4. API Client -->
<script src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<!-- 5. Alpine.js v3 with CDN fallback -->
<script>
@@ -136,6 +136,6 @@
</script>
<!-- 6. Merchant Login Logic -->
<script src="{{ url_for('core_static', path='merchant/js/login.js') }}"></script>
<script defer src="{{ url_for('core_static', path='merchant/js/login.js') }}"></script>
</body>
</html>

View File

@@ -140,21 +140,21 @@
<!-- Scripts - ORDER MATTERS! -->
<!-- 1. Log Configuration -->
<script src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/log-config.js') }}"></script>
<!-- 2. Icons -->
<script src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/icons.js') }}"></script>
<!-- 3. Utils -->
<script src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/utils.js') }}"></script>
<!-- 4. API Client -->
<script src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<script defer src="{{ url_for('static', path='shared/js/api-client.js') }}"></script>
<!-- 5. Alpine.js v3 -->
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.0/dist/cdn.min.js"></script>
<!-- 6. Login Logic -->
<script src="{{ url_for('tenancy_static', path='store/js/login.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='store/js/login.js') }}"></script>
</body>
</html>
</html>

View File

@@ -202,5 +202,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='store/js/profile.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='store/js/profile.js') }}"></script>
{% endblock %}

View File

@@ -1402,5 +1402,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='store/js/settings.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='store/js/settings.js') }}"></script>
{% endblock %}

View File

@@ -289,5 +289,5 @@
{% endblock %}
{% block extra_scripts %}
<script src="{{ url_for('tenancy_static', path='store/js/team.js') }}"></script>
<script defer src="{{ url_for('tenancy_static', path='store/js/team.js') }}"></script>
{% endblock %}