refactor: Major hyperscript refactoring and JS elimination
Inline Hyperscript Refactoring: - Body tag keyboard handlers: 20→8 lines (using helper functions) - Zoom control handlers: 85→35 lines (using zoom._hs) - PDF modal card selection: 90→6 lines (3 identical blocks eliminated) New Hyperscript Files: - zoom._hs: handleZoomInput, handleZoomReset, initZoomControl - pdf-modal._hs: selectPdfCard, handlePdfCardKey JavaScript Elimination (232 lines removed): - cv-functions.js: REMOVED - hyperscript defs are globally available - scroll-at-bottom-handler.js: REMOVED - duplicate of handleScroll() - footer-buttons-interaction.js: REMOVED - moved to hyperscript Added Tests: - 32-hyperscript-multi-src.test.mjs: Verifies multi-file loading - 33-keyboard-shortcuts-refactored.test.mjs: Keyboard shortcuts - 34-hyperscript-refactor-comprehensive.test.mjs: Full test suite Key Findings: - No hyperscript multi-file bug in 0.9.14 - Hyperscript def statements are globally accessible - Previous refactoring failures were syntax errors, not library bugs
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
-- File: zoom._hs
|
||||
-- Purpose: Zoom control helper functions
|
||||
-- Last Updated: 2025-11-30
|
||||
|
||||
-- ==============================================================================
|
||||
-- ZOOM SLIDER INPUT HANDLER
|
||||
-- ==============================================================================
|
||||
-- Called from zoom-slider input event to update zoom level
|
||||
def handleZoomInput(slider)
|
||||
set zoomValue to slider.value as a Number
|
||||
set zoomLevel to zoomValue / 100
|
||||
|
||||
-- Update display
|
||||
set valueEl to document.getElementById('zoom-value-current')
|
||||
if valueEl is not null
|
||||
put zoomValue into valueEl
|
||||
end
|
||||
set slider's @aria-valuenow to zoomValue
|
||||
set slider's @aria-valuetext to `${zoomValue}%`
|
||||
|
||||
-- Toggle reset button class
|
||||
set resetBtn to document.getElementById('zoom-reset')
|
||||
if resetBtn is not null
|
||||
if zoomValue is not 100
|
||||
add .zoom-not-default to resetBtn
|
||||
else
|
||||
remove .zoom-not-default from resetBtn
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply zoom to wrapper
|
||||
set wrapper to document.getElementById('zoom-wrapper')
|
||||
if wrapper is not null
|
||||
set wrapper's *zoom to zoomLevel
|
||||
-- Handle width for zoom > 100%
|
||||
if zoomLevel > 1
|
||||
set wrapper's *width to 'auto'
|
||||
set wrapper's *minWidth to '100%'
|
||||
set wrapper's *maxWidth to 'none'
|
||||
else
|
||||
set wrapper's *width to ''
|
||||
set wrapper's *minWidth to ''
|
||||
set wrapper's *maxWidth to ''
|
||||
end
|
||||
end
|
||||
|
||||
-- Save to localStorage
|
||||
set localStorage['cv-zoom'] to zoomValue
|
||||
end
|
||||
|
||||
-- ==============================================================================
|
||||
-- ZOOM RESET HANDLER
|
||||
-- ==============================================================================
|
||||
-- Called from reset button to reset zoom to 100%
|
||||
def handleZoomReset()
|
||||
set slider to document.getElementById('zoom-slider')
|
||||
if slider is not null
|
||||
set slider.value to 100
|
||||
call handleZoomInput(slider)
|
||||
call slider.focus()
|
||||
end
|
||||
end
|
||||
|
||||
-- ==============================================================================
|
||||
-- ZOOM CONTROL VISIBILITY
|
||||
-- ==============================================================================
|
||||
-- Initialize zoom control visibility on load
|
||||
def initZoomControl(control)
|
||||
-- Skip on mobile
|
||||
if window.innerWidth <= 768
|
||||
exit
|
||||
end
|
||||
|
||||
-- Load saved zoom level
|
||||
set savedZoom to localStorage.getItem('cv-zoom')
|
||||
set slider to document.getElementById('zoom-slider')
|
||||
if savedZoom and slider
|
||||
set slider.value to savedZoom
|
||||
call handleZoomInput(slider)
|
||||
end
|
||||
|
||||
-- Check visibility preference
|
||||
set isVisible to localStorage.getItem('cv-zoom-visible')
|
||||
if isVisible is 'true'
|
||||
remove .zoom-hidden from control
|
||||
set menuBtn to document.getElementById('show-zoom-menu-btn')
|
||||
if menuBtn is not null
|
||||
add .zoom-hidden to menuBtn
|
||||
end
|
||||
end
|
||||
|
||||
-- Load saved position
|
||||
set savedPos to localStorage.getItem('cv-zoom-position')
|
||||
if savedPos
|
||||
set pos to JSON.parse(savedPos)
|
||||
set control's *bottom to pos.bottom
|
||||
set control's *left to pos.left
|
||||
set control's *transform to 'none'
|
||||
end
|
||||
end
|
||||
|
||||
-- ==============================================================================
|
||||
-- ZOOM CLOSE HANDLER
|
||||
-- ==============================================================================
|
||||
-- Called when clicking the close button on zoom control
|
||||
def handleZoomClose(control)
|
||||
add .zoom-hidden to control
|
||||
set localStorage['cv-zoom-visible'] to 'false'
|
||||
set menuBtn to document.getElementById('show-zoom-menu-btn')
|
||||
if menuBtn is not null
|
||||
remove .zoom-hidden from menuBtn
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user