mirror of
https://github.com/wahyd4/home-docker.git
synced 2026-08-09 04:15:52 +10:00
feat(demo-service): minimal SVG-animated access-restricted page
- Replaces login page with pure SVG animation (no login buttons) - Animated lock icon, pulsing dots, orbiting ring, breathing circles - Lightweight — zero dependencies, pure CSS/SVG
This commit is contained in:
@@ -386,34 +386,94 @@ AUTH_REQUIRED_HTML = """<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Login Required — Demo Manager</title>
|
||||
<title>Access Restricted — Demo Manager</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Inter",sans-serif;background:radial-gradient(ellipse at top,#1a1a2e 0%,#0d1117 70%);color:#c9d1d9;display:flex;align-items:center;justify-content:center;min-height:100vh}
|
||||
.card{text-align:center;max-width:420px;padding:48px 40px;background:rgba(22,27,34,0.7);border:1px solid rgba(48,54,61,0.5);border-radius:20px;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}
|
||||
.icon{font-size:56px;margin-bottom:20px;display:block;filter:drop-shadow(0 0 20px rgba(31,111,235,0.3))}
|
||||
h1{font-size:24px;font-weight:700;color:#f0f6fc;margin-bottom:8px}
|
||||
p{font-size:14px;color:#8b949e;line-height:1.6;margin-bottom:28px}
|
||||
.btn{display:inline-block;padding:12px 32px;border-radius:10px;font-size:15px;font-weight:600;text-decoration:none;transition:all .2s;border:none;cursor:pointer}
|
||||
.btn-primary{background:#1f6feb;color:#fff;box-shadow:0 4px 14px rgba(31,111,235,0.35)}
|
||||
.btn-primary:hover{background:#388bfd;box-shadow:0 6px 20px rgba(31,111,235,0.45);transform:translateY(-1px)}
|
||||
.footer{margin-top:32px;font-size:11px;color:#484f58}
|
||||
.footer a{color:#58a6ff;text-decoration:none}
|
||||
.footer a:hover{text-decoration:underline}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Inter",sans-serif;background:#0d1117;color:#c9d1d9;display:flex;align-items:center;justify-content:center;min-height:100vh;overflow:hidden}
|
||||
.bg{position:fixed;inset:0;pointer-events:none}
|
||||
.bg svg{width:100%;height:100%}
|
||||
.card{z-index:1;text-align:center;max-width:380px;padding:56px 40px 48px}
|
||||
.lock-wrap{width:80px;height:80px;margin:0 auto 28px;position:relative}
|
||||
.lock-wrap svg{width:100%;height:100%}
|
||||
h1{font-size:22px;font-weight:700;color:#f0f6fc;margin-bottom:6px;letter-spacing:-0.3px}
|
||||
p{font-size:13px;color:#6e7681;line-height:1.5}
|
||||
@keyframes pulse{0%,100%{opacity:.15}50%{opacity:.35}}
|
||||
@keyframes float{0%,100%{transform:translateY(0) rotate(0deg)}33%{transform:translateY(-8px) rotate(1deg)}66%{transform:translateY(4px) rotate(-1deg)}}
|
||||
@keyframes orbit{from{transform:rotate(0deg) translateX(60px) rotate(0deg)}to{transform:rotate(360deg) translateX(60px) rotate(-360deg)}}
|
||||
@keyframes blink{0%,100%{opacity:0}50%{opacity:1}}
|
||||
.dot{position:absolute;border-radius:50%;background:#1f6feb;animation:pulse 3s ease-in-out infinite}
|
||||
.d1{width:3px;height:3px;top:20%;left:15%;animation-delay:0s}
|
||||
.d2{width:4px;height:4px;top:60%;right:10%;animation-delay:.5s}
|
||||
.d3{width:2px;height:2px;top:30%;right:25%;animation-delay:1s}
|
||||
.d4{width:5px;height:5px;bottom:15%;left:20%;animation-delay:1.5s}
|
||||
.d5{width:2px;height:2px;top:10%;right:40%;animation-delay:2s}
|
||||
.d6{width:3px;height:3px;bottom:30%;right:25%;animation-delay:.8s}
|
||||
.orbit-ring{position:absolute;width:140px;height:140px;top:50%;left:50%;transform:translate(-50%,-50%);border:1px solid rgba(31,111,235,.08);border-radius:50%}
|
||||
.orbit-dot{position:absolute;width:5px;height:5px;background:#58a6ff;border-radius:50%;top:50%;left:50%;animation:orbit 8s linear infinite;box-shadow:0 0 12px rgba(88,166,255,.5)}
|
||||
.orbit-dot::after{content:"";position:absolute;width:3px;height:3px;background:#1f6feb;border-radius:50%;top:50%;left:50%;transform:translate(-50%,-50%);animation:blink 2s ease-in-out infinite}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="card">
|
||||
<span class="icon">🔐</span>
|
||||
<h1>Login Required</h1>
|
||||
<p>This area is protected by Pocket ID SSO.<br>Sign in with your junv.cc account to continue.</p>
|
||||
<a href="https://pass.junv.cc/oauth2/start?rd=https://demo.junv.cc/admin" class="btn btn-primary">Sign in with Pocket ID</a>
|
||||
<div class="footer">
|
||||
<a href="https://pass.junv.cc" target="_blank">pass.junv.cc</a>
|
||||
·
|
||||
<a href="https://demo.junv.cc/">demo.junv.cc</a>
|
||||
</div>
|
||||
<div class="bg">
|
||||
<svg viewBox="0 0 800 600" preserveAspectRatio="xMidYMid slice">
|
||||
<defs>
|
||||
<radialGradient id="g1" cx="50%" cy="40%"><stop offset="0%" stop-color="#1f6feb" stop-opacity="0.06"/><stop offset="100%" stop-color="transparent"/></radialGradient>
|
||||
<radialGradient id="g2" cx="30%" cy="60%"><stop offset="0%" stop-color="#58a6ff" stop-opacity="0.04"/><stop offset="100%" stop-color="transparent"/></radialGradient>
|
||||
</defs>
|
||||
<rect fill="url(#g1)" width="800" height="600"/>
|
||||
<rect fill="url(#g2)" width="800" height="600"/>
|
||||
<line x1="100" y1="60" x2="120" y2="80" stroke="#1f6feb" stroke-opacity="0.06" stroke-width="0.5"/>
|
||||
<line x1="680" y1="120" x2="700" y2="100" stroke="#58a6ff" stroke-opacity="0.06" stroke-width="0.5"/>
|
||||
<line x1="200" y1="500" x2="220" y2="520" stroke="#1f6feb" stroke-opacity="0.06" stroke-width="0.5"/>
|
||||
<line x1="600" y1="450" x2="580" y2="470" stroke="#58a6ff" stroke-opacity="0.06" stroke-width="0.5"/>
|
||||
<circle cx="400" cy="280" r="100" fill="none" stroke="#1f6feb" stroke-opacity="0.04" stroke-width="0.5">
|
||||
<animate attributeName="r" values="100;120;100" dur="6s" repeatCount="indefinite"/>
|
||||
<animate attributeName="stroke-opacity" values="0.04;0.02;0.04" dur="6s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<circle cx="400" cy="280" r="60" fill="none" stroke="#58a6ff" stroke-opacity="0.06" stroke-width="0.3">
|
||||
<animate attributeName="r" values="60;48;60" dur="4s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<rect x="380" y="260" width="40" height="40" rx="6" fill="none" stroke="#1f6feb" stroke-opacity="0.08" stroke-width="0.5" transform="rotate(45 400 280)">
|
||||
<animate attributeName="stroke-opacity" values="0.08;0.03;0.08" dur="5s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="385" y="265" width="30" height="30" rx="4" fill="none" stroke="#58a6ff" stroke-opacity="0.08" stroke-width="0.5" transform="rotate(45 400 280)">
|
||||
<animate attributeName="stroke-opacity" values="0.08;0.03;0.08" dur="5s" repeatCount="indefinite" begin="0.5s"/>
|
||||
</rect>
|
||||
<rect x="416" y="296" width="8" height="8" rx="2" fill="#58a6ff" fill-opacity="0.3">
|
||||
<animate attributeName="fill-opacity" values="0.3;0.1;0.3" dur="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="376" y="296" width="8" height="8" rx="2" fill="#1f6feb" fill-opacity="0.3">
|
||||
<animate attributeName="fill-opacity" values="0.3;0.1;0.3" dur="3s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="lock-wrap">
|
||||
<svg viewBox="0 0 80 80" fill="none">
|
||||
<rect x="26" y="38" width="28" height="24" rx="4" fill="none" stroke="#58a6ff" stroke-width="2">
|
||||
<animate attributeName="stroke-opacity" values="1;0.4;1" dur="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<path d="M30 38V28a10 10 0 0120 0v10" fill="none" stroke="#1f6feb" stroke-width="2" stroke-linecap="round">
|
||||
<animate attributeName="stroke-opacity" values="1;0.5;1" dur="2.5s" repeatCount="indefinite" begin="0.5s"/>
|
||||
</path>
|
||||
<circle cx="40" cy="50" r="3" fill="#58a6ff">
|
||||
<animate attributeName="opacity" values="1;0.3;1" dur="2s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<line x1="40" y1="53" x2="40" y2="57" stroke="#58a6ff" stroke-width="2" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="1;0.3;1" dur="2s" repeatCount="indefinite"/>
|
||||
</line>
|
||||
</svg>
|
||||
</div>
|
||||
<h1>Access Restricted</h1>
|
||||
<p>This area requires authentication.</p>
|
||||
</div>
|
||||
<div class="dot d1"></div>
|
||||
<div class="dot d2"></div>
|
||||
<div class="dot d3"></div>
|
||||
<div class="dot d4"></div>
|
||||
<div class="dot d5"></div>
|
||||
<div class="dot d6"></div>
|
||||
<div class="orbit-ring"><div class="orbit-dot"></div></div>
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user