muddle/modules/amezing/sass/layout/_sidebar.scss
2026-10-23 09:12:49 -04:00

781 lines
14 KiB
SCSS

@use "../citrine/abstracts/functions" as *;
@use "../citrine/abstracts/mixins" as *;
#site-sidebar {
display: flex;
position: sticky;
grid-area: sidebar;
flex-direction: column;
z-index: 3;
transition-duration: var(--transition);
transition-property:
visibility,
transform,
inset-block-start,
box-shadow,
border-inline-end,
border-start-end-radius,
border-end-end-radius,
height;
inset-block-start: 0;
inset-inline-start: 0;
border-inline-end: rpx(1) solid var(--bg-muted-2);
width: var(--sidebar-width);
height: 100vh;
@supports (height: 100dvh) {
height: 100dvh;
}
@media only screen and (max-width: 960px) {
transform: translateX(-100%);
visibility: hidden;
inset-block-start: 3.25rem;
box-shadow: var(--edge-highlight), var(--shadow);
border-inline-end: 0 solid transparent;
border-start-end-radius: var(--rounded-corner);
border-end-end-radius: var(--rounded-corner);
height: calc(100vh - 3.75rem);
:root[dir*="rtl"] & {
transform: translateX(100%);
}
@supports (height: 100dvh) {
height: calc(100dvh - 3.75rem);
}
#site-header:has(#expand-sidebar:checked) ~ & {
transform: none;
visibility: visible;
backdrop-filter: var(--blur);
-webkit-backdrop-filter: var(--blur);
background-color: var(--glass-bg-1);
}
}
&-content {
display: flex;
position: relative;
flex: 1;
overflow: hidden;
}
}
#site-sidebar-header {
display: flex;
align-items: center;
transform-origin: rpx(22) 50%;
transition:
box-shadow var(--transition),
background-color var(--transition),
color var(--transition),
transform var(--transition-bezier);
margin: 1rem;
margin-block-end: 0;
border-radius: 1.375rem;
padding: 0.25rem;
padding-inline-end: 0.75rem;
min-width: 0;
color: var(--fg-muted-1);
text-decoration: none;
&:hover {
box-shadow: var(--edge-highlight);
background-color: var(--bg-muted-1);
color: var(--fg-muted-2);
.icon {
background-color: var(--bg-muted-2);
}
}
&:active {
transform: var(--active);
}
img {
margin: 0;
}
img,
.icon {
margin-inline-end: 0.5rem;
border-radius: 50%;
}
img {
width: 2.25rem;
height: 2.25rem;
}
.icon {
transition: background-color var(--transition);
box-shadow: var(--edge-highlight);
background-color: var(--bg-muted-1);
padding: 0.5rem;
font-size: 1.25rem;
}
div {
display: flex;
flex: 1;
flex-direction: column;
gap: 0.125rem;
min-width: 0;
line-height: 1.25;
span:nth-of-type(1) {
overflow: hidden;
font-size: var(--font-size-small);
text-overflow: ellipsis;
white-space: nowrap;
}
span:nth-of-type(2) {
font-weight: var(--font-weight-normal);
font-size: var(--font-size-x-small);
}
}
}
#sidebar-nav,
#sidebar-meta {
display: flex;
flex: 1;
flex-direction: column;
transition:
visibility var(--transition),
opacity var(--transition),
filter var(--transition),
transform var(--transition-bezier);
padding: 1rem;
width: var(--sidebar-width);
min-width: 100%;
overflow: hidden auto;
scrollbar-width: thin;
}
#site-header:has(#site-sidebar-modes #mode-meta:checked) + #site-sidebar {
#sidebar-nav {
transform: perspective(var(--content-width)) rotateY(15deg);
opacity: var(--disabled-opacity);
filter: blur(0.25rem);
}
#sidebar-meta {
transform: perspective(var(--content-width));
visibility: visible;
opacity: 1;
filter: none;
}
}
#sidebar-nav {
transform: perspective(var(--content-width));
transform-origin: left;
:root[dir*="rtl"] & {
transform-origin: right;
}
a {
display: flex;
flex: 1;
align-items: center;
transform-origin: rpx(22) 50%;
transition:
box-shadow var(--transition),
background-color var(--transition),
color var(--transition),
transform var(--transition-bezier);
border-radius: 1.375rem;
padding: 0.25rem;
padding-inline-end: 0.75rem;
overflow: hidden;
color: var(--fg-muted-1);
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
&:hover {
box-shadow: var(--edge-highlight);
background-color: var(--bg-muted-1);
color: var(--fg-muted-2);
.icon {
background-color: var(--bg-muted-2);
}
}
&:active {
transform: var(--active);
}
&[aria-current="page"] {
box-shadow: var(--edge-highlight);
background-color: var(--bg-muted-1);
color: var(--accent-color);
.icon {
@include gradient-fill;
text-shadow: none;
}
&:hover {
background-color: var(--bg-muted-2);
.icon {
@include gradient-fill(hover);
}
}
}
&.new .icon {
position: relative;
&::after {
position: absolute;
inset-block-start: rpx(1);
inset-inline-end: rpx(1);
border-radius: 50%;
background-color: var(--accent-color);
width: 0.75rem;
height: 0.75rem;
content: "";
}
}
}
.icon {
transition:
background-color var(--transition),
color var(--transition),
box-shadow var(--transition);
margin-inline-end: 0.5rem;
box-shadow: var(--edge-highlight);
border-radius: 50%;
background-color: var(--bg-muted-1);
padding: 0.5rem;
font-size: 1.25rem;
&.fallback {
width: 1.25rem;
font-weight: var(--font-weight-semi-bold);
font-size: var(--font-size-medium);
line-height: 1.25rem;
font-family: var(--font-monospace);
text-align: center;
&::before {
content: none;
}
}
}
details {
flex: 1;
margin-block-end: 0;
box-shadow: none;
border-radius: 0;
background-color: transparent;
padding: 0;
&[open] {
summary {
transform: none;
opacity: 1;
box-shadow: none;
background-color: transparent;
&::before {
transform: none;
}
@supports not (block-size: calc-size(auto, size)) {
& ~ * {
animation: none;
}
}
}
}
summary {
display: flex;
position: relative;
align-items: center;
border-radius: 0;
padding: 0.75rem 0;
color: var(--fg-muted-1);
font-weight: var(--font-weight-normal);
font-size: var(--font-size-small);
line-height: var(--font-size-small);
white-space: nowrap;
&:hover {
box-shadow: none;
background-color: transparent;
}
&:active {
transform: none;
}
&::before {
position: absolute;
transform: rotate(-90deg);
transition: transform var(--transition-bezier);
margin-inline-end: 0;
inset-block: 0.5rem;
inset-inline-end: 0;
font-size: 1rem;
}
.line {
flex: 1;
margin-inline: 0.5rem 1.5rem;
background-color: var(--bg-muted-2);
height: rpx(1);
}
}
ul {
margin-block: 0;
}
}
ul {
display: flex;
flex-direction: column;
gap: 0.25rem;
margin-block: auto;
padding-inline-start: 0;
list-style: none;
}
li {
display: flex;
transition: width var(--transition);
margin-block: 0;
padding-inline-start: 0;
width: 100%;
}
}
#sidebar-meta {
position: absolute;
transform: perspective(var(--content-width)) rotateY(-30deg);
transform-origin: left;
visibility: hidden;
opacity: 0;
filter: blur(0.25rem);
inset: 0;
:root[dir*="rtl"] & {
transform-origin: right;
}
&:has(> div:empty) {
.status-page {
display: flex;
}
& > div {
display: none;
}
}
& > div {
display: flex;
flex-direction: column;
gap: 1rem;
margin-block: auto;
}
.card {
background-color: var(--glass-bg-1);
}
.while-writing {
display: inherit;
position: relative;
flex-direction: inherit;
gap: inherit;
margin: calc(-0.25rem - rpx(1));
margin-block-start: 1rem;
border: rpx(1) solid var(--bg-muted-2);
border-block-start: none;
border-end-start-radius: calc(var(--rounded-corner) + 0.25rem + #{rpx(1)});
border-end-end-radius: calc(var(--rounded-corner) + 0.25rem + #{rpx(1)});
padding: 0.25rem;
.card-title {
display: flex;
position: absolute;
gap: 0.25rem;
inset-block-start: calc(var(--rounded-corner-small) * -1);
inset-inline: rpx(-1);
height: var(--rounded-corner-small);
.line {
border: rpx(1) solid var(--bg-muted-2);
border-block-end: none;
}
.line:nth-of-type(1) {
border-inline-end: none;
border-start-start-radius: var(--rounded-corner);
width: var(--rounded-corner);
}
.line:nth-of-type(2) {
flex: 1;
border-inline-start: none;
border-start-end-radius: var(--rounded-corner);
}
.title {
color: var(--fg-muted-2);
font-size: var(--font-size-small);
line-height: 0;
}
}
}
.weather {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
border-radius: 1.375rem;
padding: 0.25rem;
padding-inline-end: 1.25rem;
line-height: 1;
&.cloudy {
animation: perlin 12s linear infinite;
background-image: url("/weather/perlin.png");
@media (prefers-color-scheme: dark) {
background-image: url("/weather/perlin-dark.png");
}
}
&.showers {
animation: rain 3s linear infinite;
background-image: url("/weather/rain.svg");
@media (prefers-color-scheme: dark) {
background-image: url("/weather/rain-dark.svg");
}
}
&.snowing {
animation: snow 12s linear infinite;
background-image: url("/weather/snow.svg");
@media (prefers-color-scheme: dark) {
background-image: url("/weather/snow-dark.svg");
}
}
div {
display: flex;
align-items: center;
gap: 0.5rem;
}
.title {
color: inherit;
font-size: var(--font-size-medium);
}
.icon {
box-shadow: var(--edge-highlight);
border-radius: 50%;
background-color: var(--bg-muted-1);
padding: 0.5rem;
font-size: 1.25rem;
}
.condition {
color: var(--fg-muted-2);
font-size: var(--font-size-small);
}
@keyframes rain {
to {
background-position: 256px 320px;
}
}
@keyframes perlin {
to {
background-position: -256px -64px;
}
}
@keyframes snow {
to {
background-position: 256px 512px;
}
}
}
.music {
display: flex;
position: relative;
flex-direction: column;
gap: 0.5rem;
border-radius: 1rem;
&::after {
position: absolute;
z-index: 1;
inset: 0;
box-shadow: var(--edge-highlight);
border-radius: inherit;
max-height: 5rem;
pointer-events: none;
content: "";
}
.carousel {
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
display: flex;
margin-block: 0;
box-shadow: var(--shadow);
border-radius: inherit;
background-color: var(--glass-bg-1);
padding-inline-start: 0;
overflow-x: auto;
scroll-behavior: smooth;
scrollbar-width: none;
list-style: none;
li {
display: flex;
position: relative;
flex-shrink: 0;
gap: 1rem;
margin-block: 0;
outline: none;
padding: 0.5rem;
width: 100%;
overflow: hidden;
scroll-snap-align: start;
&.has-cover {
animation: cover-alternate 60s ease-in-out infinite;
background-image: var(--bg-overlay), var(--blurnail);
background-position: center;
background-size: 2000%;
@keyframes cover-alternate {
// X 100%
// Y ┌─────────────┐
// │ 1,9 │
// │ 8 2 │
// │ 3,7 │
// │ 6 4 │
// │ 5 │
// 100% └─────────────┘
from {
background-position: 50% 0%;
}
12.5% {
background-position: 100% 25%;
}
25% {
background-position: 50% 50%;
}
37.5% {
background-position: 100% 75%;
}
50% {
background-position: 50% 100%;
}
62.5% {
background-position: 0% 75%;
}
75% {
background-position: 50% 50%;
}
87.5% {
background-position: 0% 25%;
}
to {
background-position: 50% 0%;
}
}
.music-type {
color: var(--fg-muted-neutral-1);
}
.music-artist {
color: var(--fg-muted-neutral-2);
}
}
& > div {
display: flex;
flex: 1;
flex-direction: column;
justify-content: space-between;
gap: 0.25rem;
margin-inline-end: 0.5rem;
margin-block: 0.25rem;
min-width: 0;
min-width: 0;
line-height: 1;
}
a {
position: absolute;
z-index: 1;
inset: 0;
border-radius: inherit;
}
}
}
.music-type {
color: var(--fg-muted-1);
font-size: var(--font-size-xx-small);
}
.music-artist {
color: var(--fg-muted-2);
font-size: var(--font-size-small);
}
.title {
color: var(--fg-color);
font-size: var(--font-size-medium);
}
img {
margin: 0;
border-radius: var(--rounded-corner-small);
}
&-paginator {
display: flex;
justify-content: center;
gap: 0.25rem;
margin-inline: 1rem;
margin-block: 0;
padding-inline-start: 0;
list-style: none;
li {
display: flex;
margin-block: 0;
padding-inline-start: 0;
height: 0.75rem;
}
a {
transition:
width var(--transition),
height var(--transition),
background-color var(--transition),
transform var(--transition-bezier);
margin-block: auto;
border-radius: 0.375rem;
background-color: var(--fg-muted-1);
width: 1.5rem;
height: 0.375rem;
&:hover {
background-color: var(--fg-muted-2);
}
&:active {
transform: var(--active);
}
&.active {
background-color: var(--fg-color);
width: 0.75rem;
height: 0.75rem;
}
}
}
}
.toc {
display: flex;
flex-direction: column;
max-height: calc(var(--content-width) / 3);
@media only screen and (max-width: 720px) {
max-height: calc(var(--content-width) / 2);
}
.title {
margin-block-end: 1rem;
}
.overshoot {
flex: 1;
margin: -1rem;
padding: 1rem;
overflow: auto;
scrollbar-width: thin;
ul {
margin-block: 0;
padding-inline-start: 1rem;
color: var(--fg-muted-1);
font-size: var(--font-size-small);
}
li {
margin-block: 0;
padding-inline-start: 0;
&::marker {
color: inherit;
}
}
a {
color: inherit;
text-decoration: none;
}
}
}
.status-page {
display: none;
margin-block: auto;
text-align: center;
.title,
p {
color: var(--fg-muted-2);
}
.icon {
margin-inline: auto;
color: var(--fg-muted-1);
font-size: 3rem;
}
p {
margin-block: 0;
}
}
}