585f620bd6
This commit includes two major improvements:
1. Hyperscript Code Organization:
- Extracted all hyperscript blocks >3 lines into reusable functions
- Created 6 new functions in functions._hs:
* toggleCVLength(isLong) - CV length toggle sync
* toggleIcons(showIcons) - Icons toggle sync
* toggleTheme(isClean) - Theme toggle sync
* syncPdfHover(show) - PDF button synchronized hover
* syncPrintHover(show) - Print button synchronized hover
* highlightZoomControl(show) - Zoom control highlight effect
- Reduced inline hyperscript from 11+ lines to 1-2 lines per element
- Updated 8 template files to use function calls:
* hamburger-menu.html
* view-controls.html
* action-buttons.html
* download-button.html
* print-friendly-button.html
* zoom-toggle-button.html
2. Mobile Button Layout (max-width: 900px):
- Repositioned three fixed buttons (PDF, Print, Info) horizontally at bottom center
- Print button perfectly centered in viewport
- Download button on left, Info button on right
- Hidden zoom and shortcuts buttons on mobile (available in hamburger menu)
- Removed conflicting old mobile styles that were hiding print button
- Smooth hover transitions maintained with proper transform calculations
Technical details:
- Used CSS transform with calc() for precise horizontal positioning
- Maintained hover effects with combined translateX/translateY transforms
- Ensured accessibility with proper ARIA labels and spacing
- All functions check element existence before manipulation
- LocalStorage sync maintained across desktop/mobile toggles
233 lines
6.9 KiB
Plaintext
233 lines
6.9 KiB
Plaintext
-- ==============================================================================
|
|
-- CV Site - Hyperscript Functions
|
|
-- ==============================================================================
|
|
-- Global hyperscript functions for CV interactive features
|
|
-- Keeps HTML templates clean and behavior organized
|
|
|
|
-- ==============================================================================
|
|
-- PRINT FUNCTIONS
|
|
-- ==============================================================================
|
|
|
|
def printFriendly()
|
|
-- Store current state
|
|
set container to the first .cv-container
|
|
set paper to the first .cv-paper
|
|
set wasClean to container.classList.contains('theme-clean')
|
|
set wasLong to paper.classList.contains('cv-long')
|
|
set currentZoom to localStorage.getItem('cv-zoom') or '100'
|
|
|
|
-- Apply print-friendly settings
|
|
if wasClean is false
|
|
add .theme-clean to container
|
|
end
|
|
remove .cv-long from paper
|
|
add .cv-short to paper
|
|
|
|
-- Reset zoom for consistent printing
|
|
set #zoom-wrapper's *zoom to 1
|
|
|
|
-- Let CSS apply, then print
|
|
wait 50ms
|
|
call window.print()
|
|
|
|
-- Wait for print dialog to close, then restore
|
|
wait 100ms
|
|
|
|
-- Restore original theme
|
|
if wasClean is false
|
|
remove .theme-clean from container
|
|
end
|
|
|
|
-- Restore original length
|
|
if wasLong is true
|
|
remove .cv-short from paper
|
|
add .cv-long to paper
|
|
end
|
|
|
|
-- Restore original zoom by triggering slider input event
|
|
if currentZoom is not '100'
|
|
set #zoom-slider's value to currentZoom
|
|
send input to #zoom-slider
|
|
end
|
|
end
|
|
|
|
-- ==============================================================================
|
|
-- SCROLL BEHAVIOR
|
|
-- ==============================================================================
|
|
|
|
def initScrollBehavior()
|
|
set :lastScroll to 0
|
|
set :scrollThreshold to 100
|
|
set :keepHeaderVisible to false
|
|
end
|
|
|
|
def handleScroll()
|
|
set currentScroll to window.pageYOffset
|
|
set menu to the first .navigation-menu
|
|
set isMenuOpen to menu.classList.contains('menu-open')
|
|
|
|
-- Calculate if at bottom (within 50px)
|
|
set scrollHeight to document.documentElement.scrollHeight
|
|
set clientHeight to document.documentElement.clientHeight
|
|
set isAtBottom to (scrollHeight - currentScroll - clientHeight) < 50
|
|
|
|
-- Reset keepHeaderVisible when scrolling up
|
|
if currentScroll < :lastScroll
|
|
set :keepHeaderVisible to false
|
|
end
|
|
|
|
-- Header visibility: Scrolling down past threshold
|
|
if currentScroll > :scrollThreshold and currentScroll > :lastScroll and :keepHeaderVisible is false
|
|
add .header-hidden to .action-bar
|
|
if isMenuOpen is true
|
|
add .header-hidden to menu
|
|
end
|
|
end
|
|
|
|
-- Header visibility: Scrolling up past threshold
|
|
if currentScroll > :scrollThreshold and (currentScroll <= :lastScroll or :keepHeaderVisible is true)
|
|
remove .header-hidden from .action-bar
|
|
if isMenuOpen is true
|
|
remove .header-hidden from menu
|
|
end
|
|
end
|
|
|
|
-- Header visibility: At top
|
|
if currentScroll <= :scrollThreshold
|
|
remove .header-hidden from .action-bar
|
|
if isMenuOpen is true
|
|
remove .header-hidden from menu
|
|
end
|
|
end
|
|
|
|
-- Back to top button visibility
|
|
if currentScroll > 300
|
|
set #back-to-top's *display to 'flex'
|
|
end
|
|
|
|
if currentScroll <= 300
|
|
set #back-to-top's *display to 'none'
|
|
end
|
|
|
|
-- At-bottom class for fixed buttons
|
|
if isAtBottom
|
|
add .at-bottom to #back-to-top
|
|
add .at-bottom to #info-button
|
|
add .at-bottom to #shortcuts-button
|
|
end
|
|
|
|
if not isAtBottom
|
|
remove .at-bottom from #back-to-top
|
|
remove .at-bottom from #info-button
|
|
remove .at-bottom from #shortcuts-button
|
|
end
|
|
|
|
-- Update last scroll position
|
|
set :lastScroll to currentScroll
|
|
end
|
|
|
|
-- ==============================================================================
|
|
-- TOGGLE FUNCTIONS (for view controls)
|
|
-- ==============================================================================
|
|
|
|
-- CV Length Toggle
|
|
def toggleCVLength(isLong)
|
|
set paper to the first .cv-paper
|
|
set otherToggle to (#lengthToggle or #lengthToggleMenu)
|
|
|
|
if isLong
|
|
remove .cv-short from paper
|
|
add .cv-long to paper
|
|
set localStorage['cv-length'] to 'long'
|
|
if otherToggle exists set otherToggle's checked to true
|
|
else
|
|
remove .cv-long from paper
|
|
add .cv-short to paper
|
|
set localStorage['cv-length'] to 'short'
|
|
if otherToggle exists set otherToggle's checked to false
|
|
end
|
|
end
|
|
|
|
-- Icons Toggle
|
|
def toggleIcons(showIcons)
|
|
set paper to the first .cv-paper
|
|
set otherToggle to (#iconToggle or #iconToggleMenu)
|
|
|
|
if showIcons
|
|
add .show-icons to paper
|
|
set localStorage['cv-icons'] to 'true'
|
|
if otherToggle exists set otherToggle's checked to true
|
|
else
|
|
remove .show-icons from paper
|
|
set localStorage['cv-icons'] to 'false'
|
|
if otherToggle exists set otherToggle's checked to false
|
|
end
|
|
end
|
|
|
|
-- Theme Toggle
|
|
def toggleTheme(isClean)
|
|
set container to the first .cv-container
|
|
set otherToggle to (#themeToggle or #themeToggleMenu)
|
|
|
|
if isClean
|
|
add .theme-clean to container
|
|
set localStorage['cv-theme'] to 'clean'
|
|
if otherToggle exists set otherToggle's checked to true
|
|
else
|
|
remove .theme-clean from container
|
|
set localStorage['cv-theme'] to 'default'
|
|
if otherToggle exists set otherToggle's checked to false
|
|
end
|
|
end
|
|
|
|
-- Synchronized Hover for PDF Buttons
|
|
def syncPdfHover(show)
|
|
set fixedBtn to #download-button
|
|
set actionBarBtn to #action-bar-pdf-btn
|
|
set menuBtn to the first .menu-pdf-btn
|
|
|
|
if show
|
|
if fixedBtn exists add .pdf-hover-sync to fixedBtn
|
|
if actionBarBtn exists add .pdf-hover-sync to actionBarBtn
|
|
if menuBtn exists add .pdf-hover-sync to menuBtn
|
|
else
|
|
if fixedBtn exists remove .pdf-hover-sync from fixedBtn
|
|
if actionBarBtn exists remove .pdf-hover-sync from actionBarBtn
|
|
if menuBtn exists remove .pdf-hover-sync from menuBtn
|
|
end
|
|
end
|
|
|
|
-- Synchronized Hover for Print Buttons
|
|
def syncPrintHover(show)
|
|
set fixedBtn to #print-friendly-button
|
|
set actionBarBtn to the first .action-bar-print-btn
|
|
set menuBtn to the first .menu-print-btn
|
|
|
|
if show
|
|
if fixedBtn exists add .print-hover-sync to fixedBtn
|
|
if actionBarBtn exists add .print-hover-sync to actionBarBtn
|
|
if menuBtn exists add .print-hover-sync to menuBtn
|
|
else
|
|
if fixedBtn exists remove .print-hover-sync from fixedBtn
|
|
if actionBarBtn exists remove .print-hover-sync from actionBarBtn
|
|
if menuBtn exists remove .print-hover-sync from menuBtn
|
|
end
|
|
end
|
|
|
|
-- Zoom Control Highlight
|
|
def highlightZoomControl(show)
|
|
set zoomControl to #zoom-control
|
|
|
|
if show
|
|
if zoomControl exists add .zoom-highlight to zoomControl
|
|
else
|
|
if zoomControl exists remove .zoom-highlight from zoomControl
|
|
end
|
|
end
|
|
|
|
-- ==============================================================================
|
|
-- KEYBOARD SHORTCUTS
|
|
-- ==============================================================================
|
|
-- Note: Keyboard event handlers are now defined inline in the body tag
|
|
-- because hyperscript 0.9.12 doesn't support nested event handlers (on ... inside def)
|