diff --git a/assets/scss/_browser.scss b/assets/scss/_browser.scss index b0347d5..0bd6997 100644 --- a/assets/scss/_browser.scss +++ b/assets/scss/_browser.scss @@ -1,4 +1,3 @@ - .browser { position: relative; --browser-blue: #00B39F; @@ -8,19 +7,11 @@ --browser-glow: rgba(0, 179, 159, 0.75); } -.browser-mockup { - position: relative; - max-width: 980px; - width: 100%; - margin: 48px auto 0; - container-type: inline-size; - display: flex; - flex-direction: column; -} .browser-shell { position: relative; - width: 100%; + max-width: 980px; + margin: 48px auto 0; border-radius: 22px; overflow: hidden; background: #111214; @@ -28,11 +19,9 @@ box-shadow: 0 40px 90px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.04); - aspect-ratio: 16 / 10; - display: flex; - flex-direction: column; } + .browser-shell::after { content: ""; position: absolute; @@ -42,38 +31,45 @@ pointer-events: none; } + .browser-header { display: flex; align-items: center; gap: 18px; - padding: 1.8cqi 2.2cqi; /* scale padding proportionally */ + padding: 18px 22px; background: #1a1b1d; border-bottom: 1px solid rgba(100, 100, 100, 0.06); } + .browser-dots { display: flex; - gap: 0.8cqi; + gap: 8px; } + .browser-dots span { - width: unquote("min(10px, 1.2cqi)"); - height: unquote("min(10px, 1.2cqi)"); + width: 10px; + height: 10px; border-radius: 50%; } + .dot-red { background: #ff5f57; } + .dot-yellow { background: #febc2e; } + .dot-green { background: #28c840; } + .browser-pill { flex: 1; justify-self: start; @@ -84,28 +80,21 @@ color: #cbd2d9; background: rgba(200, 200, 200, 0.08); margin: 0 auto; - font-size: clamp(0.6rem, 1.2cqi, 0.9rem); /* Scale font size slightly */ + font-size: .9rem; } + .browser-body { - flex: 1; position: relative; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; + min-height: 440px; + padding: 64px 32px; + display: grid; + place-items: center; + gap: 34px; background: linear-gradient(180deg, #000202 0%, #001211 65%, #00211e 100%); overflow: hidden; } -.browser-body-inner { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 34px; - transform-origin: center center; -} .browser-body::before { content: ""; @@ -118,14 +107,190 @@ .browser-scene { position: relative; + width: 100%; + max-width: 800px; + margin: 0 auto; + background: transparent; + + canvas { + width: 100%; + height: auto; + display: block; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + transform-style: preserve-3d; + filter: brightness(1) contrast(1); + cursor: pointer; + + // Hover effect: Scale and rotate + &:hover { + transform: scale(1.05) rotateY(2deg); + filter: brightness(1.15) contrast(1.1); + } + + // Active/Pulse effect on click + &:active { + animation: canvasPulse 0.6s ease; + } + } +} + +// Canvas pulse animation for click effect +@keyframes canvasPulse { + 0%, 100% { + transform: scale(1) rotateY(0deg); + } + 50% { + transform: scale(1.08) rotateY(3deg); + } +} + + +/* ============================================ + DASHBOARD IMAGE STYLES (NEW) + ============================================ */ + + +.dashboard-container { + perspective: 1200px; + width: 100%; + max-width: 560px; + height: auto; + position: relative; +} + + +.dashboard-content { + position: relative; + width: 100%; + border-radius: 12px; + overflow: hidden; + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(0, 211, 169, 0.3); + box-shadow: 0 8px 32px rgba(0, 179, 159, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.05); + backdrop-filter: blur(4px); + animation: dashboardFloat 4s ease-in-out infinite, + dashboardGlow 6s ease-in-out infinite; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + + &:hover { + border-color: rgba(0, 211, 169, 0.6); + box-shadow: 0 12px 40px rgba(0, 179, 159, 0.25), + inset 0 1px 0 rgba(255, 255, 255, 0.08); + } +} + + +.dashboard-image { + width: 100%; + height: auto; + display: block; + border-radius: 10px; + transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); + filter: drop-shadow(0 0 20px rgba(0, 179, 159, 0.25)); + will-change: transform, filter; + object-fit: cover; + cursor: pointer; + + &:hover { + filter: drop-shadow(0 0 30px rgba(0, 179, 159, 0.5)) brightness(1.1) contrast(1.05); + transform: scale(1.02) translateY(-2px); + } + + &:active { + animation: imagePulse 0.6s ease-out; + } +} + + +/* ============================================ + KEYFRAME ANIMATIONS FOR DASHBOARD + ============================================ */ + + +@keyframes dashboardFloat { + 0%, 100% { + transform: translateY(0px) rotateX(0deg); + } + 50% { + transform: translateY(-15px) rotateX(1deg); + } +} + + +@keyframes dashboardGlow { + 0%, 100% { + box-shadow: 0 8px 32px rgba(0, 179, 159, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.05); + } + 50% { + box-shadow: 0 12px 40px rgba(0, 179, 159, 0.25), + inset 0 1px 0 rgba(255, 255, 255, 0.08); + } +} + + +@keyframes imagePulse { + 0% { + transform: scale(1); + filter: drop-shadow(0 0 20px rgba(0, 211, 169, 0.5)); + } + 50% { + transform: scale(1.03); + filter: drop-shadow(0 0 40px rgba(0, 211, 169, 0.8)); + } + 100% { + transform: scale(1); + filter: drop-shadow(0 0 20px rgba(0, 211, 169, 0.25)); + } +} + + +/* ============================================ + LOGO FALLBACK STYLES + ============================================ */ + + +.logo-fallback-container { + perspective: 1000px; width: 280px; - height: 240px; - display: grid; - place-items: center; - perspective: 900px; - z-index: 4; + height: 280px; } + +.logo-3d-container { + perspective: 1000px; + width: 280px; + height: 280px; +} + + +.logo-3d { + width: 100%; + height: 100%; + position: relative; + transform-style: preserve-3d; + animation: rotateLogoY 8s ease-in-out infinite; + + img { + width: 100%; + height: 100%; + object-fit: contain; + filter: drop-shadow(0 0 30px rgba(0, 179, 159, 0.2)); + } +} + + +.logo-float { + animation: floatLogo 6s ease-in-out infinite; +} + + +/* ============================================ + 3D CUBE STYLES (OLD - KEPT FOR REFERENCE) + ============================================ */ + + .cube { position: relative; width: 140px; @@ -134,6 +299,7 @@ animation: cubeSpin 16s ease-in-out infinite, cubeFloat 6s ease-in-out infinite; } + .face { position: absolute; width: 140px; @@ -145,30 +311,36 @@ opacity: 0.95; } + .face-front { transform: translateZ(40px); } + .face-right { transform: rotateY(90deg) translateZ(40px); background: linear-gradient(145deg, #006661 0%, #003B37 100%); } + .face-left { transform: rotateY(-90deg) translateZ(40px); background: linear-gradient(145deg, #006661 0%, #003B37 100%); } + .face-top { transform: rotateX(90deg) translateZ(40px); background: linear-gradient(145deg, var(--browser-blue-soft) 0%, #007763 100%); } + .face-bottom { transform: rotateX(-90deg) translateZ(40px); background: linear-gradient(145deg, #003B37 0%, #002722 100%); } + .cube-shadow { position: absolute; width: 180px; @@ -179,6 +351,12 @@ animation: shadowPulse 6s ease-in-out infinite; } + +/* ============================================ + CTA BUTTON STYLES & ANIMATIONS + ============================================ */ + + .shine::before, .shine::after { content: ""; @@ -200,17 +378,20 @@ pointer-events: none; } + .shine.shine::before { animation: trail 14s infinite linear; opacity: 0.35; } + .shine.shine::after { animation: trail-offset 14s infinite linear; offset-distance: 50%; opacity: 0.5; } + .browser-cta { position: relative; z-index: 2; @@ -231,6 +412,7 @@ transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.3s ease; + cursor: pointer; &:hover { transform: translateY(-3px); @@ -245,6 +427,7 @@ } } + .browser-cta::after { content: ""; position: absolute; @@ -253,20 +436,21 @@ padding: 1px; background: linear-gradient(120deg, rgba(0, 211, 169, 0.6), rgba(0, 102, 97, 0.15)); -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } + .cta-hexagon { width: 18px; - height: 18px; /* (width * tan(60deg)) to maintain aspect ratio */ + height: 18px; background: radial-gradient(circle, rgba(158, 255, 236, 0.9), rgba(0, 211, 169, 0.55)); box-shadow: 0 0 12px rgba(0, 211, 169, 0.6); clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); } + .cta-spark { width: 18px; height: 18px; @@ -277,6 +461,7 @@ box-shadow: 0 0 12px rgba(0, 211, 169, 0.6); } + .cta-arrow { width: 26px; height: 26px; @@ -286,47 +471,252 @@ display: grid; place-items: center; position: relative; + transition: all 0.3s ease; + + &::before { + content: ""; + width: 7px; + height: 7px; + border-top: 2px solid rgba(158, 255, 236, 0.9); + border-right: 2px solid rgba(158, 255, 236, 0.9); + transform: rotate(45deg); + transition: all 0.3s ease; + } } -.cta-arrow::before { - content: ""; - width: 7px; - height: 7px; - border-top: 2px solid rgba(158, 255, 236, 0.9); - border-right: 2px solid rgba(158, 255, 236, 0.9); - transform: rotate(45deg); +.browser-cta:hover .cta-arrow { + border-color: rgba(0, 211, 169, 0.6); + background: rgba(0, 211, 169, 0.1); + + &::before { + transform: rotate(45deg) translateX(2px) translateY(-2px); + } } + +/* ============================================ + BROWSER STAND STYLES + ============================================ */ + .browser-stand { - width: 22.45cqi; - height: 13.06cqi; + width: 220px; + height: 128px; margin: 0 auto; - border-radius: 0 0 0px 00px; + border-radius: 0 0 0 0; background: linear-gradient(180deg, #1d251d, #0b120b); - box-shadow: 0 3cqi 6cqi rgba(0, 0, 0, 0.6); + box-shadow: 0 30px 60px rgba(0, 0, 0, 0.6); position: relative; } .browser-stand::before { content: ""; position: absolute; - width: 100%; - height: 18.75%; - top: 84.375%; + width: 220px; + height: 24px; + top: 108px; left: 50%; transform: translateX(-50%); border-radius: 4px; - // background: linear-gradient(180deg, #0d100d, #050805); - // box-shadow: inset 0 0 10px rgba(250, 250, 250, 0.45); - background: linear-gradient(to right,rgba(170, 204, 172, 0.082),color-mix(in srgb,#000 88%,#fff),rgba(170, 204, 172, 0.082)); + background: linear-gradient(to right, rgba(170, 204, 172, 0.082), color-mix(in srgb, #000 88%, #fff), rgba(170, 204, 172, 0.082)); } -.browser-shadow { - background: radial-gradient(circle at 50% 100%, rgba(0, 179, 159, 0.05), transparent 50%); - position: relative; - top: -12.24cqi; - height: 13.26cqi; + +/* ============================================ + BROWSER CTA CONTAINER + ============================================ */ + +.browser-cta-container { + display: flex; + justify-content: center; + align-items: center; width: 100%; - pointer-events: none; - z-index: -1; -} \ No newline at end of file + z-index: 10; +} + + +/* ============================================ + RESPONSIVE ADJUSTMENTS + ============================================ */ + +@media (max-width: 768px) { + .browser-shell { + max-width: 95vw; + margin: 24px auto 0; + } + + .browser-body { + min-height: 360px; + padding: 48px 24px; + gap: 24px; + } + + .browser-scene { + max-width: 100%; + } + + canvas { + max-width: 100%; + } + + .browser-pill { + max-width: 280px; + font-size: 0.85rem; + padding: 3px 12px; + } + + .browser-cta { + padding: 12px 20px; + font-size: 0.9rem; + gap: 12px; + } + + .browser-stand { + width: 180px; + height: 100px; + } + + .browser-stand::before { + width: 180px; + top: 84px; + } +} + +@media (max-width: 480px) { + .browser-shell { + max-width: 100%; + border-radius: 12px; + margin: 16px auto 0; + } + + .browser-body { + min-height: 300px; + padding: 32px 16px; + gap: 16px; + } + + .browser-header { + padding: 12px 16px; + gap: 12px; + } + + .browser-pill { + max-width: 200px; + font-size: 0.8rem; + padding: 2px 10px; + } + + .browser-dots { + gap: 6px; + } + + .browser-dots span { + width: 8px; + height: 8px; + } + + .browser-cta { + padding: 10px 16px; + font-size: 0.85rem; + gap: 10px; + border-radius: 999px; + } + + .cta-hexagon { + width: 14px; + height: 14px; + } + + .cta-arrow { + width: 22px; + height: 22px; + } + + .cta-arrow::before { + width: 6px; + height: 6px; + border-top: 1.5px solid rgba(158, 255, 236, 0.9); + border-right: 1.5px solid rgba(158, 255, 236, 0.9); + } + + .browser-stand { + width: 140px; + height: 80px; + } + + .browser-stand::before { + width: 140px; + height: 18px; + top: 66px; + } +} + + +/* ============================================ + UTILITY ANIMATIONS (Referenced in code) + ============================================ */ + +@keyframes trail { + 0% { + offset-distance: 0%; + } + 100% { + offset-distance: 100%; + } +} + +@keyframes trail-offset { + 0% { + offset-distance: 0%; + } + 100% { + offset-distance: 100%; + } +} + +@keyframes cubeSpin { + 0% { + transform: rotateX(0deg) rotateY(0deg); + } + 100% { + transform: rotateX(360deg) rotateY(360deg); + } +} + +@keyframes cubeFloat { + 0%, 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-20px); + } +} + +@keyframes shadowPulse { + 0%, 100% { + opacity: 0.65; + transform: scaleX(1); + } + 50% { + opacity: 0.9; + transform: scaleX(1.1); + } +} + +@keyframes rotateLogoY { + 0% { + transform: rotateY(0deg); + } + 100% { + transform: rotateY(360deg); + } +} + +@keyframes floatLogo { + 0%, 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-20px); + } +} + diff --git a/layouts/partials/cube-scene.html b/layouts/partials/cube-scene.html new file mode 100644 index 0000000..ef30e02 --- /dev/null +++ b/layouts/partials/cube-scene.html @@ -0,0 +1,256 @@ +