@import "../variables"; @import "variables"; @import "terminal"; @import "storefront"; @import "admin-ui"; @import "cube"; @import "data-flow"; .vendure-intro { --color-top: #17c1ff; --color-left: #30c6fd; --color-right: #13b7f3; --color-shadow: rgba(94, 94, 94, 0); --width-unit: 9vw; --border-width: calc(.0 * var(--width-unit)); --border-style: dashed; --front-border-width: 0; --border-color: rgb(95, 95, 95); background: radial-gradient(ellipse at center, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 56%, #d7d8d1 100%); margin: 0; overflow: hidden; box-sizing: border-box; height: 100vh; padding-top: 10vh; transition: padding-top 0.2s; @media all and (max-width: $sm-breakpoint) { padding-top: 10vh; } @media all and (min-height: 1000px) { padding-top: 5vh; } @media all and (min-width: $lg-breakpoint) { // --width-unit: 10vh; } } .intro-container { max-width: $container-max-width; margin: auto; position: relative; transition: opacity 1s; opacity: 0; &.visible { opacity: 1; } } .scene { perspective: calc(10 * var(--width-unit)); transform-style: preserve-3d; display: flex; align-items: center; justify-content: center; height: 40vw; transform: rotateX(-45deg); transition: transform $transition-duration, perspective $transition-duration; font-family: sans-serif; @media all and (min-height: 1000px) { height: 50vw; } } .intro-title { top: 18vw; right: 36px; position: absolute; text-align: right; max-width: $lg-breakpoint; margin: auto; opacity: 0; transform: translateY(-20px); visibility: hidden; transition: visibility 0s, opacity 2s, transform 2.5s ease-out; &.visible { opacity: 1; transform: translateY(0); visibility: visible; } a:link, a:visited { color: $color-link; text-decoration: none; } a:hover { color: $color-link; } h1 { color: $brand-color; font-size: calc(0.9 * var(--width-unit)); margin: 0 0 15px; font-family: $brand-font-face; } .subhead { max-width: calc(4 * var(--width-unit)); font-size: calc(0.3 * var(--width-unit)); color: desaturate($brand-color, 50%); margin: auto; } .more-icon { width: calc(1 * var(--width-unit)); transform: rotateZ(180deg); opacity: 0.1; } @media all and (min-width: $lg-breakpoint) { h1 { font-size: 6em; } .subhead { font-size: 2em; } .more-icon { width: 7em; }; } @media all and (min-height: 1000px) { top: 26vw; } @media all and (max-width: $sm-breakpoint) { top: 60vw; right: 0; text-align: center; padding: 0 24px; h1 { font-size: 4em; } .subhead { font-size: 1.5em; max-width: 100%; } } } .intro-controls { z-index: 1; text-align: center; .jump { button { border-radius: 50%; border: 1px; padding: 0; background-color: $gray-100; width: 16px; height: 16px; transition: background-color 0.8s; &.active { background-color: $gray-200; } } } button#replay { border: none; background: none; opacity: 0; transition: opacity 4s; &.visible { opacity: 0.3; } } } .intro-gql-logo { filter: saturate(0%); } /* * Makes the cubes aligned in a row */ @mixin aligned { &.scene { transform: rotateX(0); } .cube { transform: rotateY(0); margin: calc(0.5 * var(--width-unit)); } .cube__face { background-color: transparent; } .cube__face--front { background-color: $terminal-color; box-shadow: $shadow; } } @mixin focus-terminal { .cube1, .cube3 { max-width: 0px; .cube__face { background-color: transparent; box-shadow: 0px 6px 15px -2px transparent; } } .cube2 { .cube__face { background-color: transparent; box-shadow: 0px 6px 15px -2px transparent; } } .intro-terminal { font-size: calc(0.24 * var(--width-unit)); width: calc(4 * var(--width-unit)); height: calc(4 * var(--width-unit)); top: calc(-1 * var(--width-unit)); left: calc(-1 * var(--width-unit)); box-shadow: $shadow; } .intro-text-area { padding: calc(0.4 * var(--width-unit)) calc(0.18 * var(--width-unit)); } .intro-terminal-controls { position: relative; margin-left: calc(0.21 * var(--width-unit)); margin-top: calc(0.07 * var(--width-unit)); width: calc(0.1 * var(--width-unit)); height: calc(0.1 * var(--width-unit)); &:before { left: calc(-0.15 * var(--width-unit)); width: calc(0.1 * var(--width-unit)); height: calc(0.1 * var(--width-unit)); } &:after { left: calc(0.15 * var(--width-unit)); width: calc(0.1 * var(--width-unit)); height: calc(0.1 * var(--width-unit)); } } } @mixin dataFlowing { .data-flow-left { width: calc(1 * var(--width-unit)); left: calc(-1 * var(--width-unit)); transition: width 0.5s 0.3s, left 0.5s 0.3s; } .data-flow-right { width: calc(1 * var(--width-unit)); right: calc(-1 * var(--width-unit)); transition: width 0.5s 0.6s, right 0.5s 0.6s; } .cube1 { .cube__face--front { background-color: $brand-color; transition: background-color 0.3s 0.8s; } } .cube3 { .cube__face--front { background-color: $brand-color; transition: background-color 0.3s 1.1s; } } .intro-gql-logo { opacity: 1; transition: opacity 4.6s; img { transform: translateY(0); } } } .scene-0 { @include aligned; @include focus-terminal; .intro-admin-ui, .intro-storefront { opacity: 0; } } .scene-1 { @include aligned; @include focus-terminal; .intro-admin-ui, .intro-storefront { opacity: 0; } } .scene-2 { @include aligned; .intro-admin-ui, .intro-storefront { opacity: 0; } .cube__face--front { background-color: $terminal-color; } .cube1 { .cube__face { transition: background-color 0.8s 0s, box-shadow 0.5s 0s; } } .cube2 { .cube__face { transition: background-color 0.8s 1s, box-shadow 0.5s 0.4s; } } .cube3 { .cube__face { transition: background-color 0.8s 0.3s, box-shadow 0.5s 0.3s; } } } .scene-3 { @include aligned; @include dataFlowing; .intro-admin-ui, .intro-storefront { opacity: 0; } } .scene-4 { @include aligned; @include dataFlowing; .intro-admin-ui { opacity: 1; transition: opacity 0.8s 0.3s; } .intro-storefront { opacity: 1; transition: opacity 0.8s 0.5s; } } .scene-5 { .intro-admin-ui { opacity: 0; transition: opacity 0.2s; } .intro-storefront { opacity: 0; transition: opacity 0.2s; } .intro-gql-logo { opacity: 1; } .intro-terminal { opacity: 0; } .cube2, .cube3 { .cube__face--front { background-color: var(--color-right); } } $cube-easing: cubic-bezier(.11,.73,.84,.55); $cube-duration: 0.5s; .cube1 { .cube__face { transition: transform $cube-duration, background-color 0.1s 0.1s; } } .cube2 { .cube__face { transition: transform $cube-duration, background-color 0.3s 0.1s; } } .cube3 { .cube__face { transition: transform $cube-duration, background-color 0.1s 0.1s; } } .cube__face { --projection: 1.3; &.cube__face--front { animation: projectFront; animation-duration: $cube-duration; animation-fill-mode: both; animation-timing-function: $cube-easing; } &.cube__face--right { transform: rotateY( 90deg) translateZ(calc(1 * var(--width-unit))); } &.cube__face--back { transform: rotateY(180deg) translateZ(calc(1 * var(--width-unit))); } &.cube__face--left { animation: projectLeft; animation-duration: $cube-duration; animation-fill-mode: both; animation-timing-function: $cube-easing; } &.cube__face--top { animation: projectTop; animation-duration: $cube-duration; animation-fill-mode: both; animation-timing-function: $cube-easing; } &.cube__face--bottom { transform: rotateX(-90deg) translateZ(calc(1 * var(--width-unit))); } } } .scene-6 { @media all and (min-width: $sm-breakpoint) { transform: rotateX(-45deg) translateX(calc(-2 * var(--width-unit))); } .cube { transition: none; } .intro-admin-ui { opacity: 0; transition: opacity 0.2s; } .intro-storefront { opacity: 0; transition: opacity 0.2s; } .intro-gql-logo { opacity: 1; } .intro-terminal { opacity: 0; } .cube2, .cube3 { .cube__face--front { background-color: var(--color-right); } } .cube__face { transition: none; } $shimmerDuration: 8s; $shimmerTiming: ease-in-out; .cube1 { .cube__face--top { animation: shimmerTop $shimmerDuration $shimmerTiming $shimmerDuration * 0.02 infinite; } .cube__face--left { animation: shimmerLeft $shimmerDuration $shimmerTiming infinite; } } .cube2 { .cube__face--top { animation: shimmerTop $shimmerDuration $shimmerTiming $shimmerDuration * 0.05 infinite; } .cube__face--left { animation: shimmerLeft $shimmerDuration $shimmerTiming $shimmerDuration * 0.05 infinite; } .cube__face--front { animation: shimmerRight $shimmerDuration $shimmerTiming $shimmerDuration * 0.082 infinite; } } .cube3 { .cube__face--top { animation: shimmerTop $shimmerDuration $shimmerTiming $shimmerDuration * 0.1 infinite; } .cube__face--front { animation: shimmerRight $shimmerDuration $shimmerTiming $shimmerDuration * 0.12 infinite; } } } @keyframes projectFront { 0% { transform: rotateY(0deg) translateZ(calc(1 * var(--width-unit))); } 20% { transform: rotateY(0deg) translateZ(calc(var(--projection) * var(--width-unit))); } 100% { transform: rotateY(0deg) translateZ(calc(1 * var(--width-unit))); } } @keyframes projectLeft { 0% { transform: rotateY(-90deg) translateZ(calc(1 * var(--width-unit))); } 20% { transform: rotateY(-90deg) translateZ(calc(var(--projection) * var(--width-unit))); } 100% { transform: rotateY(-90deg) translateZ(calc(1 * var(--width-unit))); } } @keyframes projectTop { 0% { transform: rotateX( 90deg) translateZ(calc(1 * var(--width-unit))); } 20% { transform: rotateX( 90deg) translateZ(calc(var(--projection) * var(--width-unit))); } 100% { transform: rotateX( 90deg) translateZ(calc(1 * var(--width-unit))); } } @keyframes shimmerTop { 10% { background-color: #99e9ff; } 20% { background-color: var(--color-top); } } @keyframes shimmerLeft { 10% { background-color: #99e4ff;; } 20% { background-color: var(--color-left); } } @keyframes shimmerRight { 10% { background-color: #40ccff;; } 20% { background-color: var(--color-right); } }