11const currentPage = window . location . pathname ;
2+ const BREAKPOINT_LG = 991.98 ;
23let animation = sessionStorage . getItem ( "animation" ) === "true" ;
4+ let showSideBar = localStorage . getItem ( "showSideBar" ) === "true" ;
5+ let sidebar = document . querySelector ( ".my-sidebar" ) ;
6+ let toggler = document . getElementById ( "sidebar-toggler" ) ;
7+ toggler . addEventListener ( "click" , toggle ) ;
8+ window . addEventListener ( "resize" , hideAnimations ( ) ) ;
39
4- function hide ( ) {
5- let sidebar = document . querySelector ( ".my-side-bar" ) ;
6- // switching to home/resume page (toggle off the sidebar with animation)
7- if ( animation ) {
8- sidebar . classList . add ( "show" ) ;
9- void document . body . offsetHeight ;
10+ switch ( currentPage ) {
11+ case "/" :
12+ case "/resume/" :
13+ hideToggler ( ) ;
14+ if ( animation ) {
15+ sidebar . classList . add ( "show" ) ;
16+ toggler . classList . add ( "show" ) ;
17+ void document . body . offsetHeight ;
1018
19+ document . body . classList . remove ( "preload" ) ;
20+ hide ( ) ;
21+ } else {
22+ document . body . classList . remove ( "preload" ) ;
23+ }
24+ break ;
25+ default :
26+ if ( showSideBar && window . innerWidth > BREAKPOINT_LG ) {
27+ if ( animation ) {
28+ sidebar . classList . add ( "show" ) ;
29+ toggler . classList . add ( "show" ) ;
30+ void document . body . offsetHeight ;
31+ } else {
32+ document . body . classList . remove ( "preload" ) ;
33+ show ( ) ;
34+ }
35+ }
1136 document . body . classList . remove ( "preload" ) ;
12- sidebar . classList . remove ( "show" ) ;
13- sessionStorage . setItem ( "animation" , false ) ;
14- } else {
15- document . body . classList . remove ( "preload" ) ;
16- }
17- }
18-
19- function show ( ) {
20- let sidebar = document . querySelector ( ".my-side-bar" ) ;
21- if ( animation ) {
22- sidebar . classList . add ( "show" ) ;
23- void document . body . offsetHeight ;
24- document . body . classList . remove ( "preload" ) ;
25- } else {
26- document . body . classList . remove ( "preload" ) ;
27- sidebar . classList . add ( "show" ) ;
28- sessionStorage . setItem ( "animation" , true ) ;
29- }
37+ break ;
3038}
3139
32- window . onload = function ( ) {
33- switch ( currentPage ) {
34- case "/" :
35- case "/resume/" :
36- hide ( ) ;
37- break ;
38- default :
39- show ( ) ;
40- break ;
41- }
42- } ;
43-
44- let previousActive = null ;
40+ // Table of Content active code
41+ let activeElement = null ;
4542const observer = new IntersectionObserver ( ( entries ) => {
4643 for ( entry of entries ) {
4744 // NOTE: intersection ratios are only 1 or 0
@@ -54,18 +51,15 @@ const observer = new IntersectionObserver((entries) => {
5451 const element = links . get ( key ) ;
5552 if ( ! found && val ) {
5653 found = true ;
57- previousActive = key ;
54+ activeElement = key ;
5855 element . classList . add ( "active" ) ;
5956 history . replaceState ( null , null , `#${ key } ` ) ;
6057 } else {
6158 element . classList . remove ( "active" ) ;
6259 }
6360 } ) ;
6461
65- // Activate the previousActive
66- if ( ! found ) {
67- links . get ( previousActive ) . classList . add ( "active" ) ;
68- }
62+ links . get ( activeElement ) . classList . add ( "active" ) ;
6963} ) ;
7064
7165let links = new Map ( ) ;
@@ -76,3 +70,48 @@ for (el of document.querySelectorAll("#TableOfContents a[href]")) {
7670 actives . set ( id , false ) ;
7771 observer . observe ( document . getElementById ( id ) ) ;
7872}
73+
74+ function toggle ( ) {
75+ // use localStorage so user preference persists between sessions
76+ if ( sidebar . classList . contains ( "show" ) ) {
77+ hide ( ) ;
78+ localStorage . setItem ( "showSideBar" , false ) ;
79+ } else {
80+ show ( ) ;
81+ localStorage . setItem ( "showSideBar" , true ) ;
82+ }
83+ }
84+
85+ function hide ( ) {
86+ sidebar . classList . remove ( "show" ) ;
87+ toggler . classList . remove ( "show" ) ;
88+ sessionStorage . setItem ( "animation" , false ) ;
89+ }
90+
91+ function show ( ) {
92+ sidebar . classList . add ( "show" ) ;
93+ toggler . classList . add ( "show" ) ;
94+ sessionStorage . setItem ( "animation" , true ) ;
95+ }
96+
97+ function hideToggler ( ) {
98+ toggler . style . display = "none" ;
99+ }
100+
101+ function hideAnimations ( ) {
102+ let previousWidth = document . body . clientWidth ;
103+ return ( ) => {
104+ let currentWidth = document . body . clientWidth ;
105+
106+ let newDiff = currentWidth - BREAKPOINT_LG ;
107+ let previousDiff = previousWidth - BREAKPOINT_LG ;
108+
109+ // In between breakpoints. Disable animations
110+ if ( previousDiff > 0 != newDiff > 0 ) {
111+ document . body . classList . add ( "noanimation" ) ;
112+ void document . body . offsetHeight ;
113+ document . body . classList . remove ( "noanimation" ) ;
114+ }
115+ previousWidth = currentWidth ;
116+ } ;
117+ }
0 commit comments