Files
2026-07-13 13:08:41 +08:00

193 lines
4.4 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Presenton</title>
<style>
@font-face {
font-family: "Syne";
src: url("../assets/fonts/Syne-Regular.ttf") format("truetype");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: "Syne";
src: url("../assets/fonts/Syne-Medium.ttf") format("truetype");
font-weight: 500;
font-style: normal;
}
:root {
color-scheme: light;
--bg-top: #ffffff;
--bg-bottom: #f2f4ff;
--title: #2d3347;
--subtitle: #9298ae;
--hint: #7e86a0;
--track: rgba(255, 255, 255, 0.76);
--track-border: rgba(128, 120, 212, 0.12);
--fill-start: #735cf7;
--fill-mid: #6e67f7;
--fill-end: #6b8eff;
--progress: 0.24;
}
* {
box-sizing: border-box;
}
html,
body {
width: 100%;
height: 100%;
min-height: 100%;
margin: 0;
}
body {
display: grid;
place-items: center;
width: 100vw;
min-height: 100vh;
overflow: hidden;
font-family: "Syne", "Segoe UI", system-ui, sans-serif;
color: var(--title);
}
body::before {
content: "";
position: fixed;
inset: -20%;
pointer-events: none;
}
.launch-screen {
position: relative;
z-index: 1;
width: min(100%, 540px);
padding: 24px 28px 32px;
text-align: center;
}
.logo {
width: min(54vw, 300px);
margin: 0 auto 36px;
}
.title {
margin: 0;
font-size: clamp(1.3rem, 2.05vw, 1.72rem);
line-height: 1.12;
letter-spacing: -0.045em;
font-family: "Syne", system-ui, sans-serif;
font-weight: 500;
white-space: nowrap;
}
.subtitle {
margin: 14px 0 0;
font-size: clamp(0.98rem, 1.8vw, 1.04rem);
line-height: 1.5;
color: var(--subtitle);
font-weight: 500;
font-family: "Syne", "Segoe UI", system-ui, sans-serif;
}
.progress-track {
position: relative;
width: min(100%, 360px);
height: 12px;
margin: 40px auto 0;
overflow: hidden;
border-radius: 999px;
background: var(--track);
box-shadow:
inset 0 0 0 1px var(--track-border),
0 14px 32px rgba(112, 105, 186, 0.12);
}
.progress-fill {
position: absolute;
inset: 0 auto 0 0;
width: 100%;
overflow: hidden;
border-radius: inherit;
background: linear-gradient(90deg, var(--fill-start) 0%, var(--fill-mid) 56%, var(--fill-end) 100%);
box-shadow: 0 6px 18px rgba(112, 97, 242, 0.28);
transform: scaleX(var(--progress));
transform-origin: left center;
transition: transform 380ms ease;
}
.progress-fill::after {
content: "";
position: absolute;
inset: 0;
animation: shimmer 1.85s linear infinite;
}
.hint {
min-height: 1.5rem;
margin: 16px 0 0;
font-size: 0.88rem;
line-height: 1.5;
color: var(--hint);
letter-spacing: 0.01em;
font-family: "Syne", "Segoe UI", system-ui, sans-serif;
}
@keyframes shimmer {
0% {
transform: translateX(-125%);
}
100% {
transform: translateX(220%);
}
}
@media (max-width: 640px) {
.launch-screen {
width: min(100%, 440px);
padding: 16px 24px 24px;
}
.logo {
width: min(74vw, 260px);
margin-bottom: 30px;
}
.title {
font-size: clamp(1.35rem, 6.7vw, 1.8rem);
white-space: normal;
}
.progress-track {
width: min(100%, 320px);
margin-top: 34px;
}
}
</style>
</head>
<body>
<main class="launch-screen" aria-live="polite">
<img src="../assets/images/presenton_logo.png" alt="Presenton" class="logo">
<h1 class="title">Launching Presenton...</h1>
<p class="subtitle" data-startup-subtitle>Please wait a moment</p>
<div class="progress-track" role="progressbar" aria-label="Launching Presenton" aria-valuemin="0"
aria-valuemax="100" aria-valuenow="24" data-startup-meter>
<div class="progress-fill" data-startup-progress></div>
</div>
<p class="hint" data-startup-hint>Preparing your workspace</p>
</main>
<script src="./script.js"></script>
</body>
</html>