diff --git a/config.toml b/config.toml index de46b97..699f05e 100644 --- a/config.toml +++ b/config.toml @@ -179,6 +179,8 @@ csp = [ # debug_no_styles = true [extra.nav] +# Whether to automatically hide nav when not hovered or focused +auto_hide = true # Whether to show the Atom/RSS feed button in the nav show_feed = true # Whether to show the manual theme switcher in the nav diff --git a/sass/_article.scss b/sass/_article.scss index 970c971..b00121b 100644 --- a/sass/_article.scss +++ b/sass/_article.scss @@ -20,18 +20,15 @@ } & + #heading { - margin-block-start: 35vw; + margin-block-start: calc(50vw - 8.75rem); } @media only screen and (max-width: 480px) { - body:has(&) #site-nav { - margin-block-start: 50vw; - } - - & + #heading { - margin-block-start: 2rem; + body:has(&) #site-nav:not(#handle + #site-nav) { + margin-block-start: calc(50vw + 1rem); } } + } #heading { diff --git a/sass/_general.scss b/sass/_general.scss index c6a3721..e3f545d 100644 --- a/sass/_general.scss +++ b/sass/_general.scss @@ -65,7 +65,7 @@ body { } .container { - margin: 0 auto; + margin: 4.25rem auto 0; width: min(var(--container-width), 90%); } diff --git a/sass/_nav.scss b/sass/_nav.scss index ba8de18..f32b59f 100644 --- a/sass/_nav.scss +++ b/sass/_nav.scss @@ -1,15 +1,76 @@ +#handle { + position: fixed; + z-index: 1; + transition: var(--transition); + margin: 0 auto; + inset-block-start: 1rem; + inset-inline-end: 0; + inset-inline-start: 0; + width: min(var(--container-width), 90%); + height: 3.25rem; + + &::before { + position: absolute; + transition: var(--transition); + margin: 0 auto; + inset-block-start: 0; + inset-inline-end: 0; + inset-inline-start: 0; + box-shadow: var(--edge-highlight); + border-radius: 999px; + background-color: var(--fg-muted-2); + width: 50%; + height: 0.5rem; + content: ""; + } + + &:hover::before, + &:has(+ #site-nav:hover)::before, + &:has(+ #site-nav *:focus-visible, + #site-nav *:focus)::before { + transform: translateY(-1rem) scale(0.5); + opacity: 0; + } + + &:hover + #site-nav { + transform: none; + opacity: 1; + } + + & + #site-nav { + position: fixed; + transform: translateY(-1rem) scale(0.5); + transform-origin: top; + opacity: 0; + transition: var(--transition); + margin: 0 auto; + width: max-content; + + nav { + pointer-events: none; + } + + &:hover, + &:has(*:focus-visible, *:focus) { + transform: none; + opacity: 1; + + nav { + pointer-events: all; + } + } + } +} + #site-nav { position: sticky; + left: 50%; z-index: 999; - margin: 1rem auto; + margin: 1rem auto 0; inset-block-start: 1rem; + inset-inline-end: 0; + inset-inline-start: 0; border-radius: 1.625rem; - max-width: 90%; - - @media only screen and (max-width: 480px) { - position: relative; - inset-block-start: 0; - } + max-width: min(var(--container-width), 90%); &::before { -webkit-backdrop-filter: var(--blur); @@ -362,13 +423,11 @@ } #search-results { - --mask: linear-gradient( - to bottom, - transparent, - black 1rem, - black calc(100% - 1rem), - transparent - ); + --mask: linear-gradient(to bottom, + transparent, + black 1rem, + black calc(100% - 1rem), + transparent); -webkit-mask-image: var(--mask); display: none; flex: 1; @@ -404,8 +463,7 @@ &:first-of-type, &.more-matches { margin-block-start: 0.5rem; - border-block-start: max(1px, 0.0625rem) solid - var(--fg-muted-2); + border-block-start: max(1px, 0.0625rem) solid var(--fg-muted-2); padding-block-start: 0.25rem; } diff --git a/templates/partials/nav.html b/templates/partials/nav.html index 12c1858..3c9f2b3 100644 --- a/templates/partials/nav.html +++ b/templates/partials/nav.html @@ -1,5 +1,8 @@ {%- set rel_attributes = macros_rel_attributes::rel_attributes() | trim -%} +{%- if config.extra.nav.auto_hide %} +
+{%- endif %}