:root { --primer-color-accent: 255, 255, 0; --color-accent: yellow; --hue-accent: 0deg; --padding: 20px; --running-size: 80px; --header-search-size: var(--running-size); } /* # Cornerstones */ * { fill: inherit; color: inherit; margin: 0; font-size: inherit; box-sizing: border-box; font-family: "Roboto Mono", sans-serif; } ::-webkit-scrollbar { display: none; } body { color: white; display: grid; font-size: 15px; overflow-x: hidden; min-height: 100svh; justify-items: center; background-color: black; grid-template-rows: var(--running-size) 1fr; overscroll-behavior: none; &::before { top: -5%; right: 0; width: 20%; height: 5%; opacity: 0; z-index: 1000; content: ""; position: absolute; box-shadow: 0 0 30svh 10svh rgba(var(--primer-color-accent), .2), 0 0 30svh 60svh rgba(var(--primer-color-accent), .1), 0 0 30svh 150svh rgba(var(--primer-color-accent), .02) ; transition: 1s opacity; border-radius: 100%; } } a { color: inherit; display: contents; text-decoration: none; } /* # Components */ :is(h1, h2, h3, p, li) > a { --underline-tickness: 3px; display: initial; text-decoration: underline; text-underline-offset: var(--underline-tickness); text-decoration-color: var(--color-accent); text-decoration-thickness: var(--underline-tickness); @media (hover: hover) { &:hover { color: var(--color-accent); text-underline-offset: 1px; text-decoration-thickness: calc(var(--underline-tickness) * 2); } } } h1 { color: var(--color-accent); font-size: 30px; } h2 { font-size: 30px; } h3 { font-size: 25px; } /* ## Buttons */ button { fill: inherit; color: inherit; border: none; cursor: pointer; background-color: transparent; @media (hover: hover) { &:hover { border-color: rgba(255, 255, 255, .2); background-color: rgba(255, 255, 255, .1); } } &.inline { gap: 10px; fill: var(--color-accent); display: flex; padding: calc(var(--padding) / 1.5); background: linear-gradient(139deg, rgba(0, 0, 0, 0) 0%, rgba(var(--primer-color-accent), .1) 100%); align-items: center; border-radius: 7px; @media (hover: hover) { & { transition-duration: 300ms; transition-property: background-color, border-color, box-shadow, color, fill; } &:hover { fill: var(--color-accent); color: var(--color-accent); } } &:not(.solid) { box-shadow: 0 0 0 2px rgba(var(--primer-color-accent), .1), 10px 7px 40px 3px rgba(var(--primer-color-accent), .06) ; @media (hover: hover) { &:hover { box-shadow: 0 0 0 2px rgba(var(--primer-color-accent), 1), 10px 7px 30px 3px rgba(var(--primer-color-accent), .07) ; } } } &.solid { fill: black; color: black; border: solid 2px rgba(var(--primer-color-accent), 1); border-color: var(--color-accent); background-color: var(--color-accent); @media (hover: hover) { box-shadow: 0 -10px 20px 10px rgba(var(--primer-color-accent), .05); border-color: rgba(var(--primer-color-accent), .2); background-color: rgba(var(--primer-color-accent), .2); } } svg { flex: none; height: 1em; &:last-child { width: 1.5em; margin-left: auto; } &.chevron:last-child { transform: rotate(-90deg); } } } } /* ## Header */ header { --border-style: solid 1px rgba(255, 255, 255, .2); top: 0; width: 100%; height: var(--running-size); display: grid; z-index: 100; position: sticky; overflow: hidden; perspective: 3000px; align-items: stretch; border-bottom: var(--border-style); backdrop-filter: blur(20px); background-color: rgba(0, 0, 0, .8); grid-template-rows: var(--running-size); grid-template-columns: 1fr var(--header-search-size) var(--running-size); -webkit-backdrop-filter: blur(20px); /* TODO: this is ugly */ &.searchboxActive > * { transform: rotateX(-180deg); } &.searchboxActive searchbox { transform: rotateX(0); } > * { --anim-3d-depth: 5px; --anim-3d-peek: 25deg; transform: rotateX(0deg); transition: 300ms background-color; box-shadow: 0 var(--anim-3d-depth) 0 0 rgba(255, 255, 255, .2); backface-visibility: hidden; /* enable 3d flip animation */ @media not (prefers-reduced-motion: reduce) { & { --transform-duration: 600ms; transition: var(--transform-duration) transform, 300ms background-color; } } } nav { gap: calc(var(--padding) * 2); display: flex; padding: var(--padding); align-items: center; > p { white-space: nowrap; } .buttons { display: none; } } .logo { fill: none; .path.solid { @media (hover: hover) { .logo:hover & { fill: var(--color-accent); } } } path.stroke { fill: var(--color-accent); } } /* Don't show nested headers */ header { .search { display: none; } } button { --icon-size: 25px; gap: var(--padding); fill: var(--color-accent); color: rgba(255, 255, 255, .5); width: 100%; cursor: pointer; display: grid; padding: var(--padding); font-size: 13px; border-left: var(--border-style); align-items: center; justify-items: center; grid-template-columns: 1fr; &:not(.logo) { svg { width: var(--icon-size); } } &.search { p { display: none; } @media (hover: hover) { @media not (prefers-reduced-motion: reduce) { header:not(.searchboxActive) &:hover, header:not(.searchboxActive) &:hover + button.logo { transform: rotateX(calc(var(--anim-3d-peek) * -1)); } header:not(.searchboxActive) &:hover ~ searchbox { transform: rotateX(calc(180deg - var(--anim-3d-peek))); } } } } } /* TODO: custom element or div */ searchbox { right: 0; width: 100%; height: var(--running-size); display: grid; position: absolute; transform: rotateX(180deg); box-shadow: none; align-items: stretch; background-color: var(--color-accent); grid-template-rows: var(--running-size); grid-template-columns: 1fr var(--running-size); > * { box-shadow: 0 calc(var(--anim-3d-depth) * -1) 0 0 rgba(var(--primer-color-accent), .8); } button { fill: black; transition: 300ms background-color, 300ms border-color; border-color: rgba(0, 0, 0, .1); @media (hover: hover) { & { background-color: rgba(0, 0, 0, .08); } } } input { color: black; border: none; padding: 0 var(--padding); outline: none; background-color: transparent; &::placeholder { color: rgba(0, 0, 0, .5); } } } } /* ## vv-shell */ vv-shell { width: 100%; padding: calc(var(--padding) * 1.5); position: relative; max-width: 1000px; } /* ## Search results */ search-results { gap: var(--padding); top: var(--running-size); right: 0; width: 100%; height: calc(100svh - var(--running-size)); padding: var(--padding); display: flex; opacity: 0; z-index: 50; position: fixed; transform: scale(.99); overflow-y: scroll; transition: 500ms opacity, 300ms transform; pointer-events: none; flex-direction: column; background-color: black; transform-origin: 100% 0; .searchboxActive ~ & { opacity: 1; pointer-events: all; transform: scale(1); } section { .search { display: none; } } .info { gap: var(--padding); margin: auto; display: flex; align-items: center; flex-direction: column; :is(svg, img) { fill: var(--color-accent); width: 60px; } } } /* # Size queries */ @media (min-width: 700px) { :root { --header-search-size: 250px; } /* # Cornerstones */ body::before { left: 0; right: unset; box-shadow: 0 0 30svh 10svh rgba(var(--primer-color-accent), .1), 0 0 30svh 60svh rgba(var(--primer-color-accent), .05), 0 0 30svh 150svh rgba(var(--primer-color-accent), .02) ; } /* ## Header */ header nav { margin: 0 calc(var(--padding) / 2); } header > button.search { grid-template-columns: var(--icon-size) 1fr; } header > button.search p { display: initial; } header.searchboxActive > nav { transform: rotateX(0deg); pointer-events: all; } /* ### Searchbox */ header searchbox { width: calc(var(--header-search-size) + var(--running-size)); } /* ### Menu */ /* Move the search box to the header */ header > button.search { display: grid; justify-items: baseline; } @media (min-height: 600px) { search-results { top: calc(var(--running-size) + var(--padding)); width: 50%; height: calc(100svh - 100px); box-shadow: inset 0 0 100px 200px rgba(0, 0, 0, 1), 0 0 100px 200px rgba(0, 0, 0, 1) ; backdrop-filter: blur(15px); background-color: rgba(0, 0, 0, .8); --webkit-backdrop-filter: blur(15px); } } } @media (min-width: 900px) { header { .buttons { gap: 10px; width: 100%; display: grid; white-space: nowrap; align-items: center; grid-template-columns: repeat(3, 100px); button { border: dashed 1px rgba(255, 255, 255, .3); padding: 13px var(--padding); transition: 100ms border; border-radius: 6px; &:hover { border-color: var(--color-accent); background-color: transparent; } :is( [vv-page="/work"] a[href="/work"], [vv-page="/about"] a[href="/about"], [vv-page="/contact"] a[href="/contact"] ) & { color: var(--color-accent); border-style: solid; border-color: var(--color-accent); } } } } }