Adding cityscape and junk

This commit is contained in:
Dan 2025-12-11 11:58:40 +00:00
parent 0d21b06acd
commit c51942e5c0
19 changed files with 1351 additions and 146 deletions

64
assets/sass/_mixins.scss Normal file
View file

@ -0,0 +1,64 @@
// Define your breakpoints
$breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
xxl: 1400px,
);
// Mixin for min-width (mobile-first)
@mixin media-up($breakpoint) {
@if map-has-key($breakpoints, $breakpoint) {
$value: map-get($breakpoints, $breakpoint);
@if $value == 0 {
@content;
} @else {
@media (min-width: $value) {
@content;
}
}
}
}
// Mixin for max-width (desktop-first)
@mixin media-down($breakpoint) {
@if map-has-key($breakpoints, $breakpoint) {
$value: map-get($breakpoints, $breakpoint);
@media (max-width: #{$value - 1px}) {
@content;
}
}
}
// Generate utility classes
@each $breakpoint, $value in $breakpoints {
// Hidden at this breakpoint and up
.hidden-#{$breakpoint}-up {
@include media-up($breakpoint) {
display: none !important;
}
}
// Hidden at this breakpoint and down
.hidden-#{$breakpoint}-down {
@include media-down($breakpoint) {
display: none !important;
}
}
// Visible only at this breakpoint
.visible-#{$breakpoint}-only {
display: none !important;
@include media-up($breakpoint) {
@if $breakpoint != xxl {
@include media-down($breakpoint) {
display: block !important;
}
} @else {
display: block !important;
}
}
}
}

View file

@ -34,7 +34,7 @@
.lamp-text {
font-size: 30px;
color: rgba(224, 27, 36, 0.7);
//color: rgba(224, 27, 36, 0.7);
}
}

View file

@ -1,16 +1,129 @@
.lava-lamp-container {
position: absolute;
bottom: 20%;
left: 20%;
width: 80px;
height: 150px;
display: flex;
flex-direction: column;
align-items: center;
z-index: 999;
position: relative;
margin: 0 auto;
//width: fit-content; /* or specify a fixed width */
.nav-lamp & {
top: -20px;
@include media-down(lg) {
top: auto;
}
}
&::before {
content: "";
position: absolute;
top: 10%;
width: 150%;
height: 80%;
background: conic-gradient(
from 0deg,
rgba(255, 100, 0, 0.8) 0deg,
transparent 5deg,
transparent 10deg,
rgba(255, 150, 0, 0.6) 15deg,
transparent 20deg,
transparent 25deg,
rgba(255, 200, 0, 0.7) 30deg,
transparent 35deg,
transparent 40deg,
rgba(255, 100, 0, 0.8) 45deg,
transparent 50deg,
transparent 55deg,
rgba(255, 150, 0, 0.6) 60deg,
transparent 65deg,
transparent 70deg,
rgba(255, 200, 0, 0.7) 75deg,
transparent 80deg,
transparent 85deg,
rgba(255, 100, 0, 0.8) 90deg,
transparent 95deg,
transparent 100deg,
rgba(255, 150, 0, 0.6) 105deg,
transparent 110deg,
transparent 115deg,
rgba(255, 200, 0, 0.7) 120deg,
transparent 125deg,
transparent 130deg,
rgba(255, 100, 0, 0.8) 135deg,
transparent 140deg,
transparent 145deg,
rgba(255, 150, 0, 0.6) 150deg,
transparent 155deg,
transparent 160deg,
rgba(255, 200, 0, 0.7) 165deg,
transparent 170deg,
transparent 175deg,
rgba(255, 100, 0, 0.8) 180deg,
transparent 185deg,
transparent 190deg,
rgba(255, 150, 0, 0.6) 195deg,
transparent 200deg,
transparent 205deg,
rgba(255, 200, 0, 0.7) 210deg,
transparent 215deg,
transparent 220deg,
rgba(255, 100, 0, 0.8) 225deg,
transparent 230deg,
transparent 235deg,
rgba(255, 150, 0, 0.6) 240deg,
transparent 245deg,
transparent 250deg,
rgba(255, 200, 0, 0.7) 255deg,
transparent 260deg,
transparent 265deg,
rgba(255, 100, 0, 0.8) 270deg,
transparent 275deg,
transparent 280deg,
rgba(255, 150, 0, 0.6) 285deg,
transparent 290deg,
transparent 295deg,
rgba(255, 200, 0, 0.7) 300deg,
transparent 305deg,
transparent 310deg,
rgba(255, 100, 0, 0.8) 315deg,
transparent 320deg,
transparent 325deg,
rgba(255, 150, 0, 0.6) 330deg,
transparent 335deg,
transparent 340deg,
rgba(255, 200, 0, 0.7) 345deg,
transparent 350deg,
transparent 355deg,
rgba(255, 100, 0, 0.8) 360deg
);
border-radius: 50%;
opacity: 0;
filter: blur(12px);
pointer-events: none;
transition:
opacity 0.4s ease,
transform 0.4s ease;
z-index: -1;
}
&:hover::before {
opacity: 1;
animation: rotate-beams 7s linear infinite;
}
}
@keyframes rotate-beams {
0% {
transform: rotate(0deg) scale(1);
}
50% {
transform: rotate(180deg) scale(1.2);
}
100% {
transform: rotate(360deg) scale(1);
}
}
.lamp-cap {
@ -116,14 +229,32 @@
transform: translate(-35%, -50%) rotate(85deg);
font-size: 30px;
font-weight: bold;
color: rgba(224, 27, 36, 0);
color: rgba(224, 27, 36, 0.7);
transition: color 0.5s ease;
pointer-events: none;
z-index: 1;
z-index: 4;
letter-spacing: 2px;
}
.lava-lamp:hover .lamp-text {
.lamp-text-shadow {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-35%, -50%) rotate(85deg);
font-size: 30px;
font-weight: bold;
color: rgba(224, 27, 36, 0);
transition: color 0.5s ease;
pointer-events: none;
z-index: 4;
letter-spacing: 2px;
@include media-down(lg) {
color: rgba(224, 27, 36, 0.2);
}
}
.lava-lamp:hover .lamp-text-shadow {
color: rgba(224, 27, 36, 0.7);
}

View file

@ -28,7 +28,7 @@
z-index: 1;
white-space: nowrap;
overflow: hidden;
font-size: 2.2rem;
font-size: 2em;
line-height: 1;
&::before {

View file

@ -1,15 +1,17 @@
.music {
position: absolute;
bottom: 15%;
right: 27%;
// position: absolute;
// bottom: 15%;
// right: 27%;
cursor: pointer;
position: relative;
height: 100px;
}
.music-text {
display: block;
position: absolute;
top: 0px;
left: -150px;
display: block;
bottom: 0;
right: 0;
color: white;
font-size: 20px;
font-weight: bold;
@ -20,9 +22,17 @@
padding-left: 5px;
padding-right: 5px;
border-radius: 5px;
background-color: black;
background-color: rgba(0, 0, 0, 0.7);
opacity: 0;
transition: opacity 0.3s ease;
text-align: center;
@include media-down(lg) {
opacity: 1;
transform: rotate(0deg);
bottom: 0;
font-size: 14px;
}
}
.music:hover .music-text {
@ -33,7 +43,7 @@
.notes {
position: absolute;
bottom: 30%;
left: -100px;
left: 50%;
transform: translateX(-50%);
pointer-events: none;
z-index: 9999;
@ -134,8 +144,9 @@
/* iPod group container - maintains relative positioning */
.ipod-group {
position: absolute;
left: -200px;
// position: absolute;
// left: -200px;
position: relative;
width: 150px;
height: 100px;
z-index: 15;
@ -156,16 +167,21 @@
inset 0 -1px 3px rgba(0, 0, 0, 0.2);
transform: rotate(-8deg);
z-index: 2;
@include media-down(lg) {
width: 70px;
height: 110px;
}
}
.ipod::before {
content: "";
position: absolute;
top: 8px;
top: 5%;
left: 50%;
transform: translateX(-50%);
width: 32px;
height: 22px;
width: 80%;
height: 40%;
background: linear-gradient(180deg, #1a1a2a 0%, #0a0a1a 100%);
border-radius: 2px;
box-shadow: inset 0 0 5px rgba(0, 100, 150, 0.3);
@ -173,11 +189,11 @@
.ipod-wheel {
position: absolute;
bottom: 8px;
bottom: 8%;
left: 50%;
transform: translateX(-50%);
width: 32px;
height: 30px;
width: 70%;
height: 42%;
background: radial-gradient(
circle at center,
#fff 0%,

View file

@ -1,8 +1,8 @@
/* VU Meter on desk */
.vu-meter {
position: absolute;
bottom: 18%;
right: 30%;
left: 90px;
top: 10px;
width: 120px;
height: 60px;
z-index: 8;

View file

@ -0,0 +1,370 @@
.window-frame {
position: relative;
width: 100%;
aspect-ratio: 16/9;
background: #3a3a3a;
border: 3px solid #2a2520;
border-top: 0px;
box-shadow:
inset 0 0 20px rgba(0, 0, 0, 0.8),
0 10px 40px rgba(0, 0, 0, 0.9);
overflow: hidden;
}
.window-frame::before {
content: "";
position: absolute;
inset: -20px;
border: 5px solid #1a1510;
border-top: 0px;
pointer-events: none;
z-index: 10;
}
/* Cityscape view */
.cityscape {
width: 100%;
height: 100%;
position: relative;
background: linear-gradient(
180deg,
#1a2332 0%,
#2a3a52 30%,
#4a5a72 60%,
#6a7a92 100%
);
overflow: hidden;
}
/* Sky with slight gradient */
.starfield {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 100%;
background: linear-gradient(180deg, #0a0f1a 0%, #1a2a3a 50%, #2a3a52 100%);
}
.building-windows {
width: 100%;
display: grid;
> .window-light {
width: 100%;
aspect-ratio: 1/1;
}
}
@mixin buildings-base {
position: absolute;
bottom: 0;
top: 0;
left: 0;
right: 0;
display: flex;
align-items: flex-end;
@for $i from 1 through 20 {
> .building:nth-child(#{$i}) {
@if random(4) == 1 {
opacity: 0;
}
> .building-windows {
@for $j from 1 through 40 {
> .window-light:nth-child(#{$j}) {
@if random(2) == 1 {
background: transparent;
box-shadow: none;
} @else {
$color-choice: random(100);
$light-color: null;
@if $color-choice <= 85 {
$hue: 40 + random(20); // 40-60
$sat: 70 + random(30); // 70-100%
$light: 50 + random(30); // 50-80%
$light-color: hsl($hue, $sat * 1%, $light * 1%);
} @else if $color-choice <= 95 {
$hue: 320 + random(20); // 320-340 (pink range)
$sat: 60 + random(40); // 60-100%
$light: 60 + random(20); // 60-80%
$light-color: hsl($hue, $sat * 1%, $light * 1%);
} @else {
$hue: 260 + random(40); // 260-300 (purple range)
$sat: 50 + random(50); // 50-100%
$light: 50 + random(30); // 50-80%
$light-color: hsl($hue, $sat * 1%, $light * 1%);
}
background: $light-color;
box-shadow: 0 0 10px $light-color;
}
}
}
}
}
}
}
.buildings-far {
@include buildings-base;
> .building {
background: linear-gradient(180deg, #272629 0%, #2a3a52 100%);
box-shadow:
inset -2px 0 5px rgba(0, 0, 0, 0.1),
0 0 10px rgba(42, 38, 31, 0.1);
> .building-windows {
width: 100%;
height: 50%;
opacity: 0.3;
padding: 5%;
}
}
@for $i from 1 through 20 {
> .building:nth-child(#{$i}) {
@if random(2) == 1 {
$width: random(10) + 5;
width: $width * 1%;
} @else {
$width: random(15) + 5;
width: $width + 15px;
}
$height: random(60) + 30;
height: $height * 1%;
> .building-windows {
grid-template-columns: repeat(#{random(3) + 3}, 1fr);
> .window-light {
aspect-ratio: #{0.5 + random(150) / 100};
}
}
}
}
}
.buildings-mid {
@include buildings-base;
> .building {
background: linear-gradient(180deg, #201e22 0%, #2a3a52 100%);
box-shadow:
inset -2px 0 5px rgba(0, 0, 0, 0.1),
0 0 10px rgba(42, 38, 31, 0.1);
> .building-windows {
width: 100%;
height: 50%;
opacity: 0.7;
padding: 5%;
}
}
@for $i from 1 through 20 {
> .building:nth-child(#{$i}) {
@if random(2) == 1 {
$width: random(10) + 10;
width: $width * 1%;
} @else {
$width: random(15) + 10;
width: $width + 15px;
}
$height: random(20) + 30;
height: $height * 1%;
> .building-windows {
grid-template-columns: repeat(#{random(3) + 3}, 1fr);
> .window-light {
aspect-ratio: #{0.5 + random(150) / 100};
}
}
}
}
}
.buildings-near {
@include buildings-base;
> .building {
background: linear-gradient(180deg, #121113 0%, #182230 100%);
box-shadow:
inset -2px 0 5px rgba(0, 0, 0, 0.1),
0 0 10px rgba(42, 38, 31, 0.1);
> .building-windows {
width: 100%;
height: 50%;
opacity: 0.8;
padding: 5%;
}
}
@for $i from 1 through 20 {
> .building:nth-child(#{$i}) {
@if random(2) == 1 {
$width: random(3) * 7;
width: $width * 1%;
} @else {
$width: random(10) + 50;
width: $width + 15px;
}
$height: random(3) * 10;
height: $height * 1%;
> .building-windows {
grid-template-columns: repeat(#{random(2) + 3}, 1fr);
> .window-light {
aspect-ratio: #{0.5 + random(150) / 100};
}
}
}
}
}
/* Buildings container */
.buildings {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 60%;
display: flex;
align-items: flex-end;
justify-content: space-around;
> .building {
animation: buildingGlow 4s ease-in-out infinite;
}
}
.building {
position: relative;
background: linear-gradient(180deg, #1a1a2e 0%, #0a0a1e 100%);
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 200, 100, 0.1);
}
/* Building windows */
.building-windows {
gap: 10%;
padding: 5% 5%;
}
.window-light {
background: #ffd700;
box-shadow: 0 0 10px #ffd700;
animation: windowFlicker 5s ease-in-out infinite;
}
.window-light:nth-child(odd) {
animation-delay: 0.5s;
}
.window-light:nth-child(3n) {
animation-delay: 3s;
}
.window-light:nth-child(4n) {
animation-delay: 5.5s;
}
@keyframes windowFlicker {
0%,
100% {
opacity: 0.3;
}
50% {
opacity: 0.9;
}
}
@keyframes buildingGlow {
0%,
100% {
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 200, 100, 0.1);
}
50% {
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 30px rgba(255, 200, 100, 0.2);
}
}
/* Dirt and grime on window */
.window-grime {
position: absolute;
inset: 0;
background:
radial-gradient(
circle at 20% 30%,
rgba(50, 40, 30, 0.2) 0%,
transparent 40%
),
radial-gradient(
circle at 80% 60%,
rgba(40, 35, 25, 0.15) 0%,
transparent 50%
),
radial-gradient(
circle at 50% 80%,
rgba(45, 38, 28, 0.18) 0%,
transparent 45%
);
pointer-events: none;
z-index: 6;
}
/* Glass reflection */
.glass-reflection {
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.1) 0%,
transparent 30%,
transparent 70%,
rgba(255, 255, 255, 0.05) 100%
);
pointer-events: none;
z-index: 7;
}
/* Ambient light from city */
.ambient-light {
position: absolute;
bottom: -50px;
left: 50%;
transform: translateX(-50%);
width: 200%;
height: 200px;
background: radial-gradient(
ellipse at center,
rgba(255, 200, 100, 0.2) 0%,
transparent 70%
);
filter: blur(40px);
animation: ambientPulse 3s ease-in-out infinite;
}
@keyframes ambientPulse {
0%,
100% {
opacity: 0.5;
}
50% {
opacity: 0.8;
}
}

View file

@ -1,3 +1,5 @@
@import "mixins";
@import "partials/global-styles";
@import "partials/neon-sign";
@ -8,6 +10,7 @@
@import "partials/lavalamp";
@import "partials/floppy";
@import "partials/lcd-display";
@import "partials/window";
@import "partials/content-screens";
@ -406,6 +409,26 @@ body {
);
}
.window {
position: absolute;
top: 0;
left: 20%;
aspect-ratio: 16/9;
width: 350px;
border: 5px solid #c4b89a;
border-top: 0px;
&::after {
content: "";
position: absolute;
bottom: -5px;
left: -3%;
width: 106%;
height: 10px;
background-color: #c4b89a;
}
}
/* Post-it notes and papers on wall */
.sticky-note {
font-family: "Caveat", cursive;
@ -435,7 +458,7 @@ body {
}
.note3 {
top: 12%;
top: 21%;
left: 38%;
transform: rotate(-3deg);
background: #99ff99;
@ -653,6 +676,13 @@ body {
left: 50%;
transform: translate(-50%, -50%);
z-index: 10;
@include media-down(lg) {
position: relative;
transform: none;
top: auto;
left: auto;
}
}
/* CRT Monitor bezel */
@ -667,6 +697,12 @@ body {
inset 0 2px 4px rgba(255, 255, 255, 0.3),
inset 0 -2px 4px rgba(0, 0, 0, 0.3);
position: relative;
@include media-down(lg) {
width: 100%;
padding: 0px 0px 45px 0px;
border-radius: 0px;
}
}
/* Brand logo on bezel */
@ -680,6 +716,10 @@ body {
font-size: 11px;
font-weight: bold;
letter-spacing: 2px;
@include media-down(lg) {
content: "RITUAL.SH";
}
}
/* Power indicator LED */
@ -775,6 +815,10 @@ body {
inset 0 0 40px rgba(0, 255, 100, 0.05),
inset 3px 3px 8px rgba(255, 255, 255, 0.1),
inset -3px -3px 8px rgba(0, 0, 0, 0.5);
@include media-down(lg) {
border-radius: 0px;
}
}
/* Screen curvature/glass emboss effect */
@ -1541,8 +1585,7 @@ body {
/* Coffee mug */
.coffee-mug {
bottom: 12%;
left: 75%;
position: relative;
width: 55px;
height: 62px;
background: linear-gradient(180deg, #4a2a1a 0%, #3a1a0a 100%);
@ -1575,3 +1618,62 @@ body {
/* Import a nice cursive font */
@import url("https://fonts.googleapis.com/css2?family=Neonderthaw&display=swap");
.navigation {
position: absolute;
bottom: 10%;
left: 0;
right: 0;
z-index: 999;
display: flex;
justify-content: space-evenly;
align-items: center;
@include media-down(lg) {
position: relative;
}
> .time-display {
width: 150px;
z-index: 30;
padding: 0.5em;
background: linear-gradient(180deg, #2a2a2a 0%, #1a1a1a 100%);
border: 1px solid #333;
box-shadow:
0 2px 8px rgba(0, 0, 0, 0.5),
inset 0 1px 2px rgba(255, 255, 255, 0.1);
border-radius: 1em;
cursor: pointer;
&::after {
content: "Interests and Tools";
position: absolute;
width: 150px;
color: white;
font-size: 20px;
font-weight: bold;
z-index: 8000;
transform: rotate(-10deg);
border: 1px solid #0f0;
padding: 2px;
padding-left: 5px;
padding-right: 5px;
border-radius: 5px;
background-color: rgba(0, 0, 0, 0.7);
opacity: 0;
transition: opacity 0.3s ease;
text-align: center;
@include media-down(lg) {
opacity: 1;
transform: rotate(0deg);
bottom: 0;
font-size: 14px;
}
}
&:hover::after {
opacity: 1;
}
}
}