docs: Update skeleton loader implementation from hyperscript to JavaScript

MIGRATION SUMMARY:
- Moved skeleton loader logic from hyperscript to JavaScript (main.js)
- Changed from htmx:oobAfterSwap to htmx:afterSettle event
- Changed OOB swap from innerHTML to outerHTML for proper element replacement
- Added languageSwitching flag for state tracking
- Added 100ms delay after afterSettle for final render completion

DOCUMENTATION UPDATES:
- 2-MODERN-WEB-TECHNIQUES.md: Updated skeleton loader section with
This commit is contained in:
juanatsap
2025-11-18 19:32:28 +00:00
parent 65eb91b00b
commit 1f6f8e417e
13 changed files with 539 additions and 150 deletions
+52
View File
@@ -10,6 +10,14 @@
// Flag to keep header visible after navigation
let keepHeaderVisible = false;
// Flag to track language switch in progress
let languageSwitching = false;
// Expose for testing (read-only access)
Object.defineProperty(window, 'languageSwitching', {
get: () => languageSwitching
});
// =============================================================================
// NAVIGATION & MENU SYSTEM
// =============================================================================
@@ -225,6 +233,50 @@
}
});
// Skeleton loader for language transitions
// Add .loading class when language button is clicked
document.addEventListener('htmx:beforeRequest', function(evt) {
try {
const element = evt.detail.elt;
if (element && element.classList && element.classList.contains('selector-btn')) {
// Set flag to track language switching
languageSwitching = true;
// Add loading class to page containers
const page1 = document.getElementById('cv-inner-content-page-1');
const page2 = document.getElementById('cv-inner-content-page-2');
if (page1) page1.classList.add('loading');
if (page2) page2.classList.add('loading');
console.log('Skeleton loader: Added .loading class to page containers');
}
} catch (e) {
console.error('Error in skeleton loader beforeRequest handler:', e);
}
});
// Remove .loading class after language transition completes
document.addEventListener('htmx:afterSettle', function(evt) {
try {
if (languageSwitching) {
// Wait for final render to complete
setTimeout(function() {
const page1 = document.getElementById('cv-inner-content-page-1');
const page2 = document.getElementById('cv-inner-content-page-2');
if (page1) page1.classList.remove('loading');
if (page2) page2.classList.remove('loading');
// Reset flag
languageSwitching = false;
console.log('Skeleton loader: Removed .loading class from page containers');
}, 100);
}
} catch (e) {
console.error('Error in skeleton loader afterSettle handler:', e);
}
});
// Sync toggle states between desktop and mobile menu
document.addEventListener('htmx:afterSwap', function(evt) {
try {