XENXOS / assets /css /boot.css
JSWAI's picture
Rename style.css to assets/css/boot.css
f2e03aa verified
Raw History Blame Contribute Delete
11.2 kB
/*
* ============================================================
* XENEX GLASS OS
* Boot Screen
* ============================================================
*
* Design principle:
* Realistic glass appearance without depending on heavy SVG
* filter stacks.
*
* The loader uses:
* - transparency
* - layered gradients
* - highlights
* - shadows
* - CSS transforms
* - animated light
*
* No SVG filters.
* No external libraries.
*/
/* ------------------------------------------------------------
RESET
------------------------------------------------------------ */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
}
body {
overflow: hidden;
background: #050505;
color: #ffffff;
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
Roboto,
Helvetica,
Arial,
sans-serif;
}
/* ------------------------------------------------------------
BOOT ROOT
------------------------------------------------------------ */
.xenex-boot {
position: fixed;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
isolation: isolate;
background:
radial-gradient(
circle at 50% 42%,
rgba(255, 255, 255, 0.035),
transparent 34%
),
#050505;
opacity: 1;
transition:
opacity 900ms ease,
visibility 900ms ease;
}
/*
* Added by boot.js when the boot sequence finishes.
*/
.xenex-boot.is-exiting {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
/* ------------------------------------------------------------
AMBIENT LIGHT FIELD
------------------------------------------------------------ */
.boot-background {
position: absolute;
inset: -20%;
z-index: -2;
pointer-events: none;
overflow: hidden;
}
/*
* These are deliberately soft.
* They are not the glass itself.
*
* The moving light gives the glass something to react to.
*/
.boot-glow {
position: absolute;
width: 28rem;
height: 28rem;
border-radius: 50%;
opacity: 0.12;
filter: blur(80px);
transform: translate3d(0, 0, 0);
will-change: transform;
}
/* Blue */
.boot-glow-blue {
top: 8%;
left: 12%;
background: #168cff;
animation:
blue-drift 9s ease-in-out infinite alternate;
}
/* Orange */
.boot-glow-orange {
right: 10%;
bottom: 10%;
background: #ff7a18;
animation:
orange-drift 11s ease-in-out infinite alternate;
}
/* Red */
.boot-glow-red {
right: 25%;
top: 20%;
background: #ff3045;
animation:
red-drift 13s ease-in-out infinite alternate;
}
@keyframes blue-drift {
from {
transform:
translate3d(-8vw, -3vh, 0)
scale(0.9);
}
to {
transform:
translate3d(15vw, 12vh, 0)
scale(1.15);
}
}
@keyframes orange-drift {
from {
transform:
translate3d(8vw, 10vh, 0)
scale(1);
}
to {
transform:
translate3d(-14vw, -8vh, 0)
scale(1.2);
}
}
@keyframes red-drift {
from {
transform:
translate3d(5vw, -5vh, 0)
scale(0.8);
}
to {
transform:
translate3d(-12vw, 12vh, 0)
scale(1.1);
}
}
/* ------------------------------------------------------------
BOOT CONTENT
------------------------------------------------------------ */
.boot-content {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
width: min(90vw, 440px);
text-align: center;
}
/* ------------------------------------------------------------
XENEX WORDMARK
------------------------------------------------------------ */
.xenex-wordmark {
display: flex;
align-items: baseline;
margin-bottom: 42px;
color: rgba(255, 255, 255, 0.96);
font-size: clamp(2rem, 7vw, 3.1rem);
font-weight: 500;
letter-spacing: -0.055em;
opacity: 0;
transform: translateY(10px);
animation:
wordmark-in 1200ms
350ms
cubic-bezier(0.2, 0.8, 0.2, 1)
forwards;
}
.xenex-wordmark .xenex-x {
font-weight: 700;
background:
linear-gradient(
120deg,
#ffffff 10%,
#55aaff 48%,
#ffffff 82%
);
background-clip: text;
-webkit-background-clip: text;
color: transparent;
}
.xenex-wordmark small {
margin-left: 8px;
font-size: 0.35em;
font-weight: 600;
letter-spacing: 0.08em;
opacity: 0.65;
}
@keyframes wordmark-in {
to {
opacity: 1;
transform: translateY(0);
}
}
/* ------------------------------------------------------------
GLASS LOADER
------------------------------------------------------------ */
.glass-loader {
position: relative;
width: min(72vw, 310px);
padding: 10px;
/*
* The outer capsule is intentionally not heavily blurred.
* We want it to look like physical glass rather than frosted
* plastic.
*/
border: 1px solid rgba(255, 255, 255, 0.20);
border-radius: 18px;
background:
linear-gradient(
135deg,
rgba(255, 255, 255, 0.15),
rgba(255, 255, 255, 0.035) 45%,
rgba(255, 255, 255, 0.075)
);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.22),
inset 0 -1px 0 rgba(255, 255, 255, 0.04),
0 16px 45px rgba(0, 0, 0, 0.45);
/*
* This is the only backdrop blur used in the boot capsule.
* It is deliberately restrained.
*/
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
opacity: 0;
transform: scale(0.94);
animation:
loader-in 900ms
800ms
cubic-bezier(0.2, 0.8, 0.2, 1)
forwards;
}
@keyframes loader-in {
to {
opacity: 1;
transform: scale(1);
}
}
/*
* A very subtle diagonal reflection across the glass.
*/
.glass-loader::before {
content: "";
position: absolute;
inset: 1px;
border-radius: inherit;
background:
linear-gradient(
115deg,
rgba(255, 255, 255, 0.12),
transparent 22%,
transparent 72%,
rgba(255, 255, 255, 0.055)
);
pointer-events: none;
}
/* ------------------------------------------------------------
INNER GLASS
------------------------------------------------------------ */
.loader-glass {
position: relative;
display: flex;
flex-direction: column;
gap: 5px;
padding: 7px 8px;
border-radius: 10px;
background:
rgba(0, 0, 0, 0.25);
overflow: hidden;
}
/* ------------------------------------------------------------
THREE LOADING BARS
------------------------------------------------------------ */
.loader-bar {
position: relative;
width: 100%;
height: 7px;
overflow: hidden;
border-radius: 999px;
background:
linear-gradient(
180deg,
rgba(255, 255, 255, 0.075),
rgba(255, 255, 255, 0.025)
);
box-shadow:
inset 0 1px 2px rgba(0, 0, 0, 0.5);
}
/*
* The moving light.
*
* It crosses each bar horizontally.
* The slight skew makes it feel less like a simple
* loading gradient and more like a passing light source.
*/
.loader-light {
position: absolute;
top: -5px;
left: -35%;
width: 35%;
height: calc(100% + 10px);
border-radius: 999px;
background:
linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.85),
#ffffff,
rgba(255, 255, 255, 0.5),
transparent
);
transform: skewX(-18deg);
filter: blur(0.3px);
box-shadow:
0 0 8px rgba(255, 255, 255, 0.65);
will-change: transform;
}
/*
* Each bar has a slightly different timing.
* This prevents the three lights from looking mechanically
* synchronized.
*/
.loader-bar:nth-child(1) .loader-light {
animation:
light-pass 2.4s linear infinite;
}
.loader-bar:nth-child(2) .loader-light {
animation:
light-pass 2.4s 500ms linear infinite;
}
.loader-bar:nth-child(3) .loader-light {
animation:
light-pass 2.4s 1000ms linear infinite;
}
@keyframes light-pass {
0% {
transform:
translateX(0)
skewX(-18deg);
}
100% {
transform:
translateX(390%)
skewX(-18deg);
}
}
/* ------------------------------------------------------------
BOOT STATUS
------------------------------------------------------------ */
.boot-status {
margin-top: 20px;
min-height: 1.2em;
color: rgba(255, 255, 255, 0.48);
font-size: 0.72rem;
font-weight: 400;
letter-spacing: 0.08em;
text-transform: uppercase;
opacity: 0;
animation:
status-in 800ms
1100ms
ease
forwards;
}
@keyframes status-in {
to {
opacity: 1;
}
}
/* ------------------------------------------------------------
TRANSITION LAYER
------------------------------------------------------------ */
.boot-transition {
position: absolute;
inset: 0;
z-index: 20;
pointer-events: none;
background: #050505;
opacity: 0;
}
/*
* JS will add this class when handing control to the
* next Xenex OS module.
*/
.boot-transition.is-active {
animation:
transition-cover 850ms
ease
forwards;
}
@keyframes transition-cover {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
/* ------------------------------------------------------------
REDUCED MOTION
------------------------------------------------------------ */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 1ms !important;
animation-iteration-count: 1 !important;
scroll-behavior: auto !important;
}
.xenex-wordmark {
opacity: 1;
transform: none;
}
.glass-loader {
opacity: 1;
transform: none;
}
.boot-status {
opacity: 1;
}
}
/* ------------------------------------------------------------
SMALL PHONES
------------------------------------------------------------ */
@media (max-width: 380px) {
.xenex-wordmark {
margin-bottom: 32px;
}
.glass-loader {
width: 78vw;
padding: 8px;
}
.loader-bar {
height: 6px;
}
.boot-status {
font-size: 0.64rem;
}
}
/* ------------------------------------------------------------
LARGE SCREENS
------------------------------------------------------------ */
@media (min-width: 1000px) {
.glass-loader {
width: 330px;
}
.loader-bar {
height: 8px;
}
}