@font-face { font-family: "neon-future"; src: url("../fonts/NeonFuture.ttf"); font-display: swap; } @font-face { font-family: "shuttlex"; src: url("../fonts/SHUTTLE-X.ttf"); font-display: swap; } @font-face { font-family: "sunset-club"; src: url("../fonts/SunsetClub.otf"); font-display: swap; } @font-face { font-family: "robotoreg"; src: url("../fonts/RobotoCondensed-Regular.ttf"); font-display: swap; } :root { /* Backgrounds */ --bg-base: #1a1a1a; --bg-card-rgb: 24, 24, 24; /* Accent (maroon/crimson) */ --accent: rgb(139, 36, 36); --accent-rgb: 139, 36, 36; /* Text */ --text-heading: #ecebeb; --text-body: rgb(212, 212, 212); --text-secondary: #a8a8a8; --text-link: #a0a0a0a0; /* Status */ --status-online: #4caf50; --status-degraded: #ffc107; --status-offline: #f44336; --status-good: #8bc34a; /* Effects */ --neon-blue: #5271ff; /* Borders */ --border-subtle: rgba(168, 168, 168, 0.2); } html, body { scroll-behavior: smooth; } /* Enhanced link styling throughout site */ a { transition: color 0.2s ease, opacity 0.2s ease; } a:hover { opacity: 0.8; } body { margin: 0; background-attachment: fixed; background-size: 100% auto; background-clip: border-box; background-color: var(--bg-base); } * { font-family: "Roboto Condensed", sans-serif; } #fullIframe { width:100vw; height: 100vh; } #menu { height: 2rem; display: none; filter: brightness(0) saturate(100%) invert(72%) sepia(0%) saturate(1%) hue-rotate(151deg) brightness(95%) contrast(86%); float: right; margin-right: 1rem; margin-top: .25rem; cursor: pointer; } /* #defaultCanvas0 { position: fixed; top: 0; left: 0; position: fixed; z-index: -69; } */ #map { height: 100%; width: 100vw; position: fixed; top: 0; left: 0; z-index: -69; } .leaflet-layer, .leaflet-control-zoom-in, .leaflet-control-zoom-out, .leaflet-control-attribution { filter: brightness(500%) contrast(130%); } .leaflet-tile-pane { filter: brightness(50%); } h1 { color: var(--text-heading); } h2, h3, h4, h5 { color: var(--text-secondary); } h5 { margin: 0.3em 0 0 0; font-size: 1rem; font-weight: normal; } h2 p, h3 p { margin: 0 } strong { color: var(--text-heading); } ul { margin: 0; padding-left: 1.5em; color: var(--text-secondary); } li { margin-bottom: 0.5em; color: var(--text-secondary); } p, li, span { color: var(--text-body); font-size: 1rem; } strong { color: var(--text-heading); } span { font-size: .8rem; } a, a p { color: var(--text-link); text-decoration: none; } table { color: lightgray; border-collapse: collapse; } th, td { border-right: dotted 1px lightgray; padding: 0 1em; } tr { border: solid 1px lightgray; } .transparent { opacity: 0 !important; } .unsetPos { position: unset !important; } .header h1 { display: inline-block; transition: .4s; margin-bottom: 0px; margin-top: .5rem; margin-left: 1rem; font-size: 2rem; } .header { margin-bottom: 0px; margin-left: 0rem; background-color: var(--bg-base); z-index: 99; position: sticky; top: 0; left: 0; transition: .4s; border-bottom: solid .2em rgba(var(--accent-rgb), 0.5); overflow: hidden; } #homeIcon { margin: auto; display: block; /* width: 5em; */ width: 10em; /* height: 30em; */ /* max-height: 70vh; */ max-width: 90vw; } #homeName { margin-top: .25em; } #name-container { display: inline-block; cursor: pointer; max-width: calc(100% - 3em); margin: 0.2em; } .pointer { cursor: pointer; } .name { display: inline; color: #bbbaba; background: url("../icons/neonfinal3.svg") 0/5rem no-repeat; background-size: contain; padding-left: min(10vw, 3.5rem); font-size: xx-large; } .glitch { display: inline; } .textGrad { font-family: "shuttlex" !important; } .navControl { max-height: 57px; float: right; margin-right: 0; transition: .4s; } .navBar { display: flex; padding-left: 0px; margin: 0px; gap: 0; } .navElement { display: inline-block; text-align: center; background: transparent; padding: 0 1.4em; border-bottom: 2px solid transparent; cursor: pointer; position: relative; transition: border-color 0.25s ease, background-color 0.25s ease; } .navElement:hover { border-bottom-color: var(--accent); background-color: rgba(var(--accent-rgb), 0.08); } .navElement * { color: var(--text-secondary); margin: 0px; display: block; padding: .7rem 0; transition: color 0.25s ease; font-size: 0.95rem; letter-spacing: 0.04em; text-transform: uppercase; } .navElement:hover * { color: var(--text-heading); } #home { /* height: 100vh; */ overflow-y: hidden; } .selfcenter { align-self: center; } .langstats { width: min(100%, 350px); /* height: 165px; */ border: none; display: block; } .diamonds { background: black; background-image: linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .75)), url('../chesscom-embed/diamonds.png'); } .concentratedHead { display: inline-block; padding-right: 4rem; border-bottom: #0f0f0f solid 5px; color: white; position: relative; padding-bottom: 0.5em; margin-bottom: 1em; } .foreground { position: fixed; top: 0; left: 0; min-width: 100vw; min-height: 100vh; overflow: hidden; background-color: rgba(var(--bg-card-rgb), 0.85); z-index: -1; } .foregroundContent { padding-left: 8rem; padding-right: 2em; padding-bottom: 2em; padding-top: 2em; } .foregroundContent p { line-height: 1.5em; } .concentratedHead::after { content: ''; position: absolute; bottom: 0; left: 0; width: 60px; height: 3px; background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.8) 0%, transparent 100%); } .homeground { background-color: rgb(0, 0, 0, .6); } .homegroundContent { padding-top: 1em; padding-left: 0em; } .noBackground { background: none; } .relative { position: relative; } .noPad { padding-left: 0px !important; padding-right: 0px !important; } .centerContent { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; } .centerContent>div { margin-top: 30vh; margin-left: auto; margin-right: auto; text-align: center; } #HomeContent { display: inline-block; flex-grow: 1; min-width: 65em; } #nametag { padding: 2em 3em; background-color: rgb(44, 44, 44, .75); text-align: center; } #nametag h2{ font-size: medium; } #nametag p { text-shadow: none; color: var(--text-secondary); margin: 0; } #nametagContainer { display: flex; width: 100%; position: absolute; left: 0; justify-content: center; z-index: -1; } .nomargin { margin: 0; } .flex { display: flex; justify-content: space-around; } .equalitems { column-gap: 1em; } .equalitems > * { flex: 1 1 0; } .vFlex { display: flex; flex-direction: column; height: 100%; } .wrap { flex-wrap: wrap; max-width: 100%; } #aboutCards > * { margin: .25em; } .spaceBetween { justify-content: space-between; } .start { justify-content: left; } .hSpacer { width: 2em; height: 0; } .onRight { overflow: scroll; margin: auto; } .onRight>* { margin: auto; margin-bottom: 5px; } .bgi { background-size: contain; background-repeat: no-repeat; background-position-y: center; height: 100%; width: 100%; position: absolute; z-index: 0; } #Vertical { margin-left: auto; margin-right: auto; width: 0; height: 3rem; border-right: var(--accent) solid 1px; } .sideimg { float: right; top: 0; right: 0; display: block; max-width: min(40rem, 80%); max-height: min(30rem, 100%); } .col { width: calc(50% - 3rem); margin-bottom: 3em; float: left; } .rightCol { float: left; margin-right: 3em; } .boxedImg { border: .5rem solid rgba(22, 22, 22, .8); max-width: calc(90% - 1rem); display: block; margin-left: auto; margin-right: auto; } .blinkies { width: 150px; height: 20px; } #skillstag::after { content: "Click for details..."; display: block; font-size: small; color: var(--text-secondary); } #skillTree { border-left: var(--accent) solid 3px; border-radius: 0.5em; background: rgba(var(--bg-card-rgb), 0.85); font-size: x-large; margin-bottom: 10px; padding: 1em; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .skill { padding: .2em; color: var(--text-heading); } .skill.activeSkill > .skillname { color: rgb(170, 170, 170); } .skill > .skillname:hover { color: rgb(170, 170, 170); } .skill-children { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 0.3s ease; } .skill.activeSkill > .skill-children { grid-template-rows: 1fr; } .skill-children-inner { overflow: hidden; } .skill-children-inner > .skill { font-size: large !important; padding-left: .5em; } .skill > .skillname { text-decoration: underline; cursor: pointer; transition: color 0.2s ease, padding-left 0.2s ease; padding: 0.2em 0; } .skill > .skillname:hover { padding-left: 0.3em; } .skill > .skillname::after { content: " >"; } .skill.activeSkill > .skillname::after { content: " <"; } .skill[data-length="0"].activeSkill > .skillname, .skill[data-length="0"] > .skillname:hover, .skill.activeSkill > .skillname:hover { color: var(--text-heading); } .skill[data-length="0"] > .skillname::after { content: "" } .skill[data-length="0"] > .skillname { text-decoration: none; cursor: default; } /* Project List Grid */ .projectList { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 480px)); gap: 1.5em; width: 100%; } /* Project Card */ .project { position: relative; background: rgba(var(--bg-card-rgb), 0.92); border: 1px solid rgba(var(--accent-rgb), 0.15); border-left: 3px solid rgba(var(--accent-rgb), 0.75); display: flex; flex-direction: column; overflow: hidden; transition: border-color 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35); } /* Corner bracket: top-right */ .project::before { content: ''; position: absolute; top: -1px; right: -1px; width: 18px; height: 18px; border-top: 2px solid rgba(var(--accent-rgb), 0.5); border-right: 2px solid rgba(var(--accent-rgb), 0.5); z-index: 5; pointer-events: none; transition: border-color 0.3s ease; } /* Corner bracket: bottom-left */ .project::after { content: ''; position: absolute; bottom: -1px; left: 2px; width: 18px; height: 18px; border-bottom: 2px solid rgba(var(--accent-rgb), 0.5); border-left: 2px solid rgba(var(--accent-rgb), 0.5); z-index: 5; pointer-events: none; transition: border-color 0.3s ease; } .project:hover { border-color: rgba(var(--accent-rgb), 0.45); border-left-color: rgb(var(--accent-rgb)); box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), inset 0 0 0 1px rgba(var(--accent-rgb), 0.08); } .project:hover::before, .project:hover::after { border-color: rgba(var(--accent-rgb), 0.9); } /* Project Image */ .projImageWrap { position: relative; width: 100%; height: 200px; overflow: hidden; background: #0c0c0c; flex-shrink: 0; } .projImageWrap img { width: 100%; height: 100%; object-fit: cover; object-position: center top; filter: saturate(0.6) brightness(0.7); transition: filter 0.5s ease, transform 0.5s ease; display: block; } .project:hover .projImageWrap img { filter: saturate(0.85) brightness(0.85); transform: scale(1.04); } /* Scanlines overlay */ .projImageWrap::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( 0deg, transparent, transparent 3px, rgba(0, 0, 0, 0.1) 3px, rgba(0, 0, 0, 0.1) 4px ); z-index: 2; pointer-events: none; } /* Gradient fade into card body */ .projImageWrap::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 55%; background: linear-gradient(to bottom, transparent, rgba(var(--bg-card-rgb), 0.98)); z-index: 3; } /* Placeholder for projects without an image */ .projImagePlaceholder { width: 100%; height: 100%; background-image: repeating-linear-gradient( 45deg, rgba(var(--accent-rgb), 0.04) 0px, rgba(var(--accent-rgb), 0.04) 1px, transparent 1px, transparent 8px ), repeating-linear-gradient( -45deg, rgba(var(--accent-rgb), 0.04) 0px, rgba(var(--accent-rgb), 0.04) 1px, transparent 1px, transparent 8px ); } /* Status Badge */ .proj-status-badge { position: absolute; top: 0.75em; right: 0.75em; z-index: 4; display: inline-flex; align-items: center; gap: 0.45em; padding: 0.25em 0.65em 0.25em 0.5em; font-family: 'Courier New', Courier, monospace; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; border: 1px solid currentColor; background: rgba(0, 0, 0, 0.65); backdrop-filter: blur(6px); } .proj-status-badge.complete { color: var(--status-online); } .proj-status-badge.WIP { color: var(--status-degraded); } .proj-status-badge.incomplete { color: var(--status-offline); } .status-indicator { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: currentColor; box-shadow: 0 0 6px currentColor; flex-shrink: 0; } .proj-status-badge.complete .status-indicator { animation: statusPulse 2.5s ease-in-out infinite; } .proj-status-badge.WIP .status-indicator { animation: statusPulse 0.9s ease-in-out infinite; } .proj-status-badge.incomplete .status-indicator { opacity: 0.45; } @keyframes statusPulse { 0%, 100% { opacity: 1; box-shadow: 0 0 6px currentColor; } 50% { opacity: 0.2; box-shadow: none; } } /* Project Content */ .projContent { padding: 1.1em 1.4em 1.4em 1.2em; display: flex; flex-direction: column; flex: 1; gap: 0.6em; } .project h3 { margin: 0; font-size: 1.05rem; font-weight: 700; color: var(--text-heading); letter-spacing: 0.02em; line-height: 1.3; display: block; border-bottom: none; } .projDesc { font-size: 0.83rem; line-height: 1.65; color: rgba(236, 235, 235, 0.65); margin: 0; flex: 1; } /* Project Links */ .projLinks { display: flex; flex-wrap: wrap; gap: 0.5em; margin-top: auto; padding-top: 0.25em; } .proj-link { display: inline-flex; align-items: center; gap: 0.45em; padding: 0.3em 0.8em 0.3em 0.6em; border: 1px solid rgba(var(--accent-rgb), 0.35); background: rgba(var(--accent-rgb), 0.07); color: rgba(236, 235, 235, 0.75); text-decoration: none; font-family: 'Courier New', Courier, monospace; font-size: 0.68rem; letter-spacing: 0.1em; text-transform: uppercase; transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease; } .proj-link::before { content: '>'; color: rgba(var(--accent-rgb), 0.7); font-weight: 700; transition: color 0.2s ease; } .proj-link:hover { background: rgba(var(--accent-rgb), 0.18); border-color: rgba(var(--accent-rgb), 0.7); color: #ecebeb; } .proj-link:hover::before { color: rgb(var(--accent-rgb)); } .proj-link img.projectLink { height: 0.9em; width: auto; filter: invert(1) opacity(0.75); padding: 0; margin: 0; transition: filter 0.2s ease; } .proj-link:hover img.projectLink { filter: invert(1); } .grow { flex-grow: 1; } .tab { display: inline; float: right; } .bottomBox a, .placeholding { vertical-align: middle; display: inline; text-align: left; height: unset; } .footer { position: fixed; bottom: 0; left: 0; } #contentStuffer { display: flex; flex-direction: column; min-height: 100vh; } .socials { margin-left: 1rem; width: 0px; } .socials img { height: 2rem; margin-bottom: 1rem; filter: invert(29%) sepia(20%) saturate(1786%) hue-rotate(314deg) brightness(101%) contrast(110%); transition: .2s; } .socials img:hover { opacity: .5; } #vertLine { border-right: 1px solid var(--accent); margin-left: 1rem; height: 10rem; } .neon { display: inline-block; font-family: "neon-future"; color: #fff; text-shadow: 0 0 7px #fff, 0 0 10px #fff, 0 0 21px #fff, 0 0 42px var(--neon-blue), 0 0 82px var(--neon-blue), 0 0 92px var(--neon-blue), 0 0 102px var(--neon-blue), 0 0 151px var(--neon-blue); animation: pulsate 0.11s ease-in-out infinite alternate; } .neonBox h1 { font-size: min(4em, 12vw); } .neonBox h3 { font-size: min(2em, 6vw); } .neonBox { border: 0.2rem solid #fff; border-radius: 2rem; padding: 2em; margin: 2em; box-shadow: 0 0 0.2rem #fff, 0 0 0.2rem #fff, 0 0 2rem var(--neon-blue), 0 0 0.8rem var(--neon-blue), 0 0 2.8rem var(--neon-blue), inset 0 0 1.3rem var(--neon-blue); /* background-blend-mode: ; */ text-align: center; } @keyframes pulsate { 100% { text-shadow: 0 0 4px #fff, 0 0 11px #fff, 0 0 19px #fff, 0 0 40px var(--neon-blue), 0 0 80px var(--neon-blue), 0 0 90px var(--neon-blue), 0 0 100px var(--neon-blue), 0 0 150px var(--neon-blue); } 0% { text-shadow: 0 0 4px #fff, 0 0 10px #fff, 0 0 18px #fff, 0 0 38px var(--neon-blue), 0 0 73px var(--neon-blue), 0 0 80px var(--neon-blue), 0 0 94px var(--neon-blue), 0 0 140px var(--neon-blue); } } .fPage { height: 100vh; width: 100%; display: flex; position: absolute; justify-content: center; background-position: center; background-repeat: no-repeat; background-size: cover; } #desktopSpacer { height: min(20em, 30vh); } .homeSubContent { background-color: rgba(var(--bg-card-rgb), 0.85); padding: 2em 8em; border-top: solid 4px rgba(var(--accent-rgb), 0.5); border-radius: 0.5em 0.5em 0 0; box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.3); } #homeProjects { padding: 1em; } .homeProject { width: 20em; height:5em; } .heightBox { height: 100%; display: flex; flex-direction: column; justify-content: center; } .fullHeight { height: 100%; } .chess { max-width: 300px; border: none; } #chessProfile { border-radius: 0.5em; border-top: solid 3px rgba(var(--accent-rgb), 0.5); width: 300px; height: calc(125px + 2em); color: #AAAAAA; display: grid; grid-template-columns: 1fr 1fr; cursor: pointer; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .chessInfo { background-color: rgba(0, 0, 0, .3); ; margin: 1em; } .chessRapid::after, .chessBlitz::after, .chessBullet::after, .chessPuzzles::after { font-size: xx-small; float: right; margin-right: 5px; margin-top: 1rem; } .chessStat { display: inline; vertical-align: center; } .chessStat::after { font-size: xx-small; float: right; } .chessPuzzles::after { content: 'Tactics'; } .chessBullet::after { content: "Bullet"; } .chessBlitz::after { content: "Blitz"; } .chessRapid::after { content: "Rapid"; } .bottomtext { font-size: x-small; margin: 3px; color: white; text-align: right; } .black { background-color: black; } .identity { margin-right: 0px; } .identity h5 { margin: 0px; margin-top: -25px; background: black; z-index: 50; position: relative; width: 90%; margin-left: 10px; font-weight: bold; font-size: small; } .pfpContainer { display: flex; justify-content: center; height: 100%; } .pfpContainer>div { display: flex; flex-direction: column; justify-content: center; } .pfp { border-radius: 50%; width: 100px; text-align: center; } .vContainer { display: flex; flex-direction: column; max-height: 100%; max-width: 100%; justify-content: space-around; } .chessIcon { display: inline-block; font-family: Chess New; font-size: x-large; width: 25px; text-align: center; } .rapid { color: #6c9d41; } .blitz { color: #f7c045; } .bullet { color: #a58a45; } .puzzles { color: #db7e3b; } .bookshelf { max-width: 360px; padding: 10px; border: solid 2px #553; border-radius: 0.5em; background-image: url("../photos/wood.jpg"); cursor: pointer; transition: transform 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } .bookshelf:hover { transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5); } .bookshelfHeader { color: lightgray; margin: .5em; border-bottom: solid black 3px; flex-grow: 1; } .bookContainer { display: flex; justify-content: space-around; flex-wrap: wrap; gap: 1em; } .bookContainer > a { max-width: min(90px, 24%); } .book { display: inline-block; } .book img { display: block; margin: auto; width: 75px; height: 112px; transition: transform 0.3s ease, box-shadow 0.3s ease; border-radius: 2px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } .book img:hover { transform: translateY(-5px) scale(1.05); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5); } .book h4 { font-size: x-small; color: lightgray; margin-bottom: 0; text-align: center; } .bookReview { width: min(100%, 30em); padding: 1.5em; border-top: solid 4px rgba(var(--accent-rgb), 0.5); border-radius: 0.5em; background: rgba(var(--bg-card-rgb), 0.85); flex-grow: 1; transition: transform 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .bookReview:hover { transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4); } .bookcover { width: 6em; } .booklist { /* margin: min(10em, 10%); margin-bottom: 2em; margin-top: 2em; */ justify-content: left; gap: 1.5em; } .boxed { background-color: rgba(var(--bg-card-rgb), 0.85); border-top: solid 4px rgba(var(--accent-rgb), 0.5); border-radius: 0.5em; padding: 1.5em; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .emPad { padding: 1em; } .timeitem { transition: .4s; overflow-y: clip; height: auto; max-height: 500px; } .timeitem a { color: inherit; font-family: inherit; font-size: inherit; text-decoration: underline; } .datetext { margin: .25em; font-size: small; margin-left: -1.5em; font-family: robotoreg; } .smallImg { display: inline-block; width: 75px; } .hover-container { position: relative; } .hover-container .hover-element { position: absolute; top: 3em; left: -50%; padding: 1em; border-radius: 1em; width: 20em; background-color: var(--bg-base); opacity: 0; transition: 1s; z-index: -1; } .hover-container:hover .hover-element { opacity: 1; z-index: 10; } @font-face { font-family: Chess New; src: url('../fonts/chessglyph-new.0cc8115c.woff2'); font-display: swap; } @media screen and (max-width: 600px) { #nametagContainer { width: unset; } } @media screen and (max-width: 1400px) { .projectList { grid-template-columns: repeat(auto-fill, minmax(280px, 420px)); } #homepage { flex-direction: column; } #HomeContent { min-width: 0; } /* iOS gotta render gaussian blurs differently so better uhh make rasters for mobile users */ /* Be sure to uncomment this if we ever stop using jebwin memes */ /* #homeIcon { content: url("../icons/rasterlogo.png"); } */ .name { font-size: min(6vw, 2em); background: url("../icons/min.rasterLogo.avif") 0/5rem no-repeat; background-size: contain; } .mobileV { flex-direction: column; } #menu { display: unset; } .header { background-color: var(--bg-base); border-bottom: solid 3px rgba(var(--accent-rgb), 0.4); } .footer { position: unset; } #footerSpacer { flex-grow: 1; } #aboutCards { flex-direction: column; } #aboutCards > * { margin: .25em auto; } .header h1 { font-size: 1.5rem; } .navBar { flex-direction: column; background-color: rgba(var(--bg-card-rgb), 0.95); border-top: 1px solid rgba(var(--accent-rgb), 0.3); } .navElement { width: 100%; padding: 0; text-align: left; border-bottom: none; border-left: 3px solid transparent; transition: border-color 0.25s ease, background-color 0.25s ease; } .navElement:hover { border-bottom: none; border-left-color: var(--accent); background-color: rgba(var(--accent-rgb), 0.1); } .navElement + .navElement { border-top: 1px solid rgba(var(--accent-rgb), 0.1); } .navElement * { padding: .6rem 1.2rem; text-align: left; } .navControl { max-height: 0px; margin: 0; float: none; overflow: hidden; } .vertOnMobile { flex-direction: column; } .sideimg { position: relative; } body { background-size: auto 100%; } .foregroundContent { /* centered objects will need to remove 1.5 of this to center */ padding-left: 1em; padding-right: 1em; padding-bottom: 36px; padding-top: 3em; } .homegroundContent { padding-top: 5em; } .homeSubContent { padding: 1em; } .onRight { margin: unset; margin-top: 3rem; } .onRight>* { margin: auto; } .projDesc { margin: 0; } .col { width: 100%; margin-bottom: 0; } .rightCol { position: inherit; margin-right: inherit; } .footer { position: relative; width: 100%; display: inline-block; background-color: var(--accent); } .socials { display: flex; justify-content: space-around; padding-top: .5rem; padding-bottom: .5rem; margin-right: auto; margin-left: auto; width: min(100vw, 400px); } .socials * { display: inline; text-align: center; padding-left: 0px; padding-right: 0px; } .socials img { height: 2rem; margin-bottom: 0px; filter: none; } #vertLine { display: none; height: 0px; } .card-grid { grid-template-columns: 1fr; } .legend-items { flex-direction: column; gap: 0.5em; } .summary-content { flex-direction: column; text-align: center; } .summary-indicator { flex-direction: column; text-align: center; } } @media screen and (max-width: 600px) { .projectList { grid-template-columns: 1fr; } .projImageWrap { height: 160px; } } /* Reusable Card & State Components */ .page-subtitle { text-align: center; color: var(--text-secondary); margin-top: -10px; margin-bottom: 2em; font-size: 1rem; } /* Summary Card */ .summary-card { padding: 2em; margin-bottom: 2em; } .summary-content { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 2em; } .summary-indicator { display: flex; align-items: center; gap: 1.5em; } .summary-icon { font-size: 3rem; line-height: 1; animation: spin 2s linear infinite; } .summary-icon.operational { color: var(--status-online); animation: pulse-icon 1.5s ease-in-out infinite; } .summary-icon.partial { color: var(--status-degraded); animation: pulse-icon 1.5s ease-in-out infinite; } .summary-icon.major { color: var(--status-offline); animation: pulse-icon 1.5s ease-in-out infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes pulse-icon { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .summary-title { margin: 0; font-size: 1.5rem; color: var(--text-heading); font-weight: 600; } .metric-box { display: flex; flex-direction: column; align-items: center; padding: 1em 1.5em; border-radius: 0.5em; min-width: 80px; } .metric-number { font-size: 2rem; font-weight: bold; color: var(--text-heading); line-height: 1; } .metric-label { color: var(--text-secondary); font-size: 0.9rem; } .metric-box .metric-label { font-size: 0.85rem; margin-top: 0.3em; text-transform: uppercase; letter-spacing: 0.5px; } #refreshBtn { background: rgba(var(--accent-rgb), 0.8); color: var(--text-heading); border: none; padding: 0.5em 1.5em; border-radius: 0.3em; cursor: pointer; font-size: 0.9rem; transition: 0.3s; } #refreshBtn:hover:not(:disabled) { background: var(--accent); } #refreshBtn:disabled { opacity: 0.5; cursor: not-allowed; } /* Card Grid */ .card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5em; margin-bottom: 2em; } /* Info Card */ .info-card { background: rgba(var(--bg-card-rgb), 0.85); border-radius: 0.5em; padding: 1.5em; border-top: solid 4px rgba(var(--accent-rgb), 0.5); transition: 0.3s; } .info-card.online { border-top-color: rgba(76, 175, 80, 0.8); } .info-card.degraded { border-top-color: rgba(255, 193, 7, 0.8); } .info-card.offline { border-top-color: rgba(244, 67, 54, 0.8); } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1em; padding-bottom: 0.5em; border-bottom: 1px solid var(--border-subtle); } .card-header h3 { margin: 0; font-size: 1.1rem; color: var(--text-heading); } /* State Indicators */ .state-indicator { display: flex; align-items: center; gap: 0.5em; } .state-text { font-size: 0.85rem; color: var(--text-secondary); } .state-dot { width: 12px; height: 12px; border-radius: 50%; display: inline-block; } .state-dot.online, .state-dot.complete { background: var(--status-online); box-shadow: 0 0 10px var(--status-online); } .state-dot.degraded, .state-dot.WIP { background: var(--status-degraded); box-shadow: 0 0 10px var(--status-degraded); } .state-dot.offline, .state-dot.incomplete { background: var(--status-offline); box-shadow: 0 0 10px var(--status-offline); } .state-dot.loading { background: var(--text-secondary); animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .card-body { display: flex; flex-direction: column; gap: 0.5em; } .metric-row { display: flex; justify-content: space-between; padding: 0.3em 0; } .metric-value { color: var(--text-heading); font-size: 0.9rem; font-weight: bold; } .info-box { background: rgba(var(--bg-card-rgb), 0.85); border-radius: 0.5em; padding: 1.5em; border: solid 2px rgba(var(--accent-rgb), 0.5); margin-bottom: 2em; } .info-box h4 { margin-top: 0; color: var(--text-heading); } .legend-items { display: flex; gap: 2em; flex-wrap: wrap; } .legend-item { display: flex; align-items: center; gap: 0.5em; color: var(--text-secondary); font-size: 0.9rem; } .note-text { text-align: center; font-size: 0.85rem; color: var(--text-secondary); font-style: italic; } .card-footer { margin-top: 1em; padding-top: 0.8em; border-top: 1px solid var(--border-subtle); } .detail-label { color: var(--text-secondary); font-size: 0.85rem; margin-bottom: 0.3em; font-weight: bold; } .detail-values { color: var(--text-heading); font-size: 0.85rem; line-height: 1.5; } .detail-values strong { font-weight: 600; } /* State color utilities */ .text-excellent { color: var(--status-online) !important; } .text-good { color: var(--status-good) !important; } .text-fair { color: var(--status-degraded) !important; } .text-poor { color: var(--status-offline) !important; } .text-muted { color: #888 !important; }