aboutsummaryrefslogtreecommitdiff
path: root/static/navigator.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/navigator.js')
-rw-r--r--static/navigator.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/static/navigator.js b/static/navigator.js
new file mode 100644
index 0000000..a4385fa
--- /dev/null
+++ b/static/navigator.js
@@ -0,0 +1,87 @@
+let pageTransitionLock = false;
+let pageTransitionAnimating = false;
+let pageTransitionCleared = false;
+
+function bindAllRelativeAnchors() {
+ document.querySelectorAll('a[href^="/"]:not([navigator-bind])').forEach((el) => {
+ el.setAttribute('navigator-bind', 'true');
+ el.addEventListener('click', (e) => {
+ e.preventDefault();
+ goToPage((new URL(e.target.href)).pathname);
+ });
+ });
+}
+
+function showContentIfPageIsLoaded () {
+ if (!pageTransitionLock) {
+ showContent(() => {
+ pageTransitionAnimating = false;
+ bindAllRelativeAnchors();
+ });
+ }
+}
+
+function goToPage(url, cb) {
+ if (pageTransitionLock) return;
+ pageTransitionLock = true;
+ pageTransitionAnimating = true;
+ pageTransitionCleared = false;
+
+ let footerCommandPrompt = document.querySelector('#footer-command-prompt .text');
+ history.pushState({date: "new url -> " + url}, url, url);
+
+ fetch(url).then((response) => {
+ response.text().then(html => {
+ let parser = new DOMParser();
+ let htmlDOM = parser.parseFromString(html, 'text/html');
+
+ let mainContainer = document.querySelector('main');
+
+ function swapHTMLContent() {
+ if (!pageTransitionCleared) {
+ window.requestAnimationFrame(swapHTMLContent);
+ return;
+ }
+
+ mainContainer.innerHTML = '';
+ mainContainer.innerHTML = htmlDOM.querySelector('main').innerHTML;
+ if (headerAnimationTerminated) showContent(bindAllRelativeAnchors);
+ pageTransitionLock = false;
+ }
+
+ swapHTMLContent();
+ });
+ });
+
+ typingAnimation(
+ footerCommandPrompt,
+ 'clear',
+ 0,
+ () => {
+ clearHeaderTerminal(() => {
+ hideContent();
+ pageTransitionCleared = true;
+ footerCommandPrompt.innerHTML = '';
+ if (url == "/") {
+ headerTerminalExecute(
+ "source jefferson.sh",
+ "source jefferson.sh",
+ showContentIfPageIsLoaded,
+ );
+ } else if (url == "/contato") {
+ headerTerminalExecute(
+ "source pages/contato.sh",
+ "source pages/contato.sh",
+ showContentIfPageIsLoaded,
+ );
+ } else if (url.match(/\/artigos/)) {
+ headerTerminalExecute(
+ `ARTICLE_FILE=.${decodeURI(url).replace(' ', '\\ ')};source pages/article.sh`,
+ `ARTICLE_FILE=.${decodeURI(url).replace(' ', '\\ ')};source pages/article.sh`,
+ showContentIfPageIsLoaded,
+ );
+ }
+ });
+ }
+ );
+}