2d3d3de8cd
- Lazy load ninja-keys only on CMD+K press (0 requests on initial load) - Use esm.sh bundled module (3 requests vs ~81 previously) - Add esm.sh to CSP whitelist - Implement HTML Invoker Commands API for modals: - commandfor="modal-id" + command="show-modal" for opening - commandfor="modal-id" + command="close" for closing - Removes need for onclick handlers on modal buttons - Refactor index.html into layout partials (head, body-scripts) - Add comprehensive tests for both features
71 lines
3.2 KiB
HTML
71 lines
3.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="{{if eq .Lang "es"}}es{{else}}en{{end}}">
|
|
{{template "head" .}}
|
|
<body {{if .ThemeClean}}class="theme-clean"{{end}}
|
|
_="on load call initScrollBehavior()
|
|
on scroll from window call handleScroll()
|
|
on keydown
|
|
set tag to event.target.tagName
|
|
set ninjaKeys to document.getElementById('cmd-k-bar')
|
|
set ninjaOpen to (ninjaKeys is not null and ninjaKeys.opened)
|
|
set skip to (tag is 'INPUT' or tag is 'TEXTAREA' or ninjaOpen)
|
|
set noMod to (not event.ctrlKey and not event.metaKey and not event.altKey)
|
|
if event.key is '?' and noMod and not skip then halt the event then call openModalShortcut('shortcuts-modal') end
|
|
if (event.key is 'l' or event.key is 'L') and noMod and not skip then halt the event then call handleToggleShortcut('lengthToggle', 'lengthToggleMenu') end
|
|
if (event.key is 'i' or event.key is 'I') and noMod and not skip then halt the event then call handleToggleShortcut('iconToggle', 'iconToggleMenu') end
|
|
if (event.key is 'v' or event.key is 'V') and noMod and not skip then halt the event then call handleToggleShortcut('themeToggle', 'themeToggleMenu') end
|
|
end">
|
|
|
|
<!-- ============================================ -->
|
|
<!-- TOP NAVIGATION & CONTROLS -->
|
|
<!-- ============================================ -->
|
|
<div id="top"></div>
|
|
{{template "action-bar" .}}
|
|
{{template "hamburger-menu" .}}
|
|
{{template "color-theme-switcher" .}}
|
|
|
|
<!-- ============================================ -->
|
|
<!-- MAIN CV CONTENT -->
|
|
<!-- ============================================ -->
|
|
<div id="zoom-wrapper" class="zoom-wrapper">
|
|
<div class="cv-container">
|
|
{{template "cv-content.html" .}}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ============================================ -->
|
|
<!-- PAGE FOOTER & NOTIFICATIONS -->
|
|
<!-- ============================================ -->
|
|
{{template "page-footer" .}}
|
|
{{template "error-toast" .}}
|
|
{{template "pdf-toast" .}}
|
|
|
|
<!-- ============================================ -->
|
|
<!-- FLOATING BUTTONS -->
|
|
<!-- ============================================ -->
|
|
<div class="fixed-buttons-backdrop no-print"></div>
|
|
{{template "back-to-top" .}}
|
|
{{template "info-button" .}}
|
|
{{template "download-button" .}}
|
|
{{template "print-friendly-button" .}}
|
|
{{template "contact-button" .}}
|
|
{{template "zoom-toggle-button" .}}
|
|
{{template "shortcuts-button" .}}
|
|
{{template "cmd-k-button" .}}
|
|
|
|
<!-- ============================================ -->
|
|
<!-- MODALS -->
|
|
<!-- ============================================ -->
|
|
{{template "info-modal" .}}
|
|
{{template "shortcuts-modal" .}}
|
|
{{template "pdf-modal" .}}
|
|
{{template "contact-modal" .}}
|
|
{{template "zoom-control" .}}
|
|
|
|
<!-- ============================================ -->
|
|
<!-- SCRIPTS & ANALYTICS -->
|
|
<!-- ============================================ -->
|
|
{{template "body-scripts" .}}
|
|
</body>
|
|
</html>
|