-- ============================================================================== -- 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)