LawBot / src /apps /templates /roleselection.html
Vishwanath77's picture
Upload 7 files
be76c74 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Legal Assistant | Pro Level AI Guidance</title>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap" rel="stylesheet">
<style>
/* Existing styles... */
body.direct-roles #landing { display: none !important; }
body.direct-roles #rolePage { opacity: 1 !important; visibility: visible !important; }
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body, html {
height: 100%;
overflow: hidden;
background-color: #030617;
cursor: default;
}
#particles {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 1;
pointer-events: none;
}
.cursor-glow {
position: fixed;
width: 350px;
height: 350px;
background: radial-gradient(circle, rgba(99, 102, 241, 0.12), transparent 75%);
pointer-events: none;
transform: translate(-50%, -50%);
z-index: 0;
transition: transform 0.15s ease-out;
}
.hero {
height: 100vh;
background: radial-gradient(circle at 50% 50%, #0d122b, #030617);
display: flex;
justify-content: center;
align-items: center;
position: relative;
overflow: hidden;
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 10;
perspective: 1000px; /* For the tilt effect */
}
.hero::before {
content: "";
position: absolute;
width: 800px;
height: 800px;
background: radial-gradient(circle, rgba(59, 130, 246, 0.25), transparent 75%);
top: -200px;
left: -200px;
filter: blur(120px);
animation: moveLight 12s infinite alternate ease-in-out;
pointer-events: none;
}
.hero::after {
content: "";
position: absolute;
width: 700px;
height: 700px;
background: radial-gradient(circle, rgba(147, 51, 234, 0.25), transparent 75%);
bottom: -200px;
right: -200px;
filter: blur(120px);
animation: moveLight2 15s infinite alternate ease-in-out;
pointer-events: none;
}
@keyframes moveLight {
from { transform: translate(0, 0); }
to { transform: translate(250px, 150px); }
}
@keyframes moveLight2 {
from { transform: translate(0, 0); }
to { transform: translate(-250px, -150px); }
}
/* FLOATING CONTENT */
.content {
text-align: center;
color: white;
z-index: 20;
max-width: 850px;
padding: 40px;
transform-style: preserve-3d;
animation: float 6s ease-in-out infinite;
will-change: transform;
}
@keyframes float {
0% { transform: translateY(0px); }
50% { transform: translateY(-15px); }
100% { transform: translateY(0px); }
}
.tag {
display: inline-block;
font-size: 0.8rem;
font-weight: 600;
color: #6ee7ff;
letter-spacing: 3px;
text-transform: uppercase;
margin-bottom: 25px;
background: rgba(110, 231, 255, 0.1);
padding: 6px 18px;
border-radius: 20px;
border: 1px solid rgba(110, 231, 255, 0.25);
animation: fadeIn 1s ease forwards;
}
.content h1 {
font-size: clamp(2.5rem, 8vw, 4.5rem);
white-space: nowrap;
font-weight: 700;
margin-bottom: 20px;
line-height: 1.1;
letter-spacing: -2px;
background: linear-gradient(to bottom, #fff 40%, #94a3b8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: fadeSlide 1.2s cubic-bezier(0.2, 0.8, 0.2, 1) forwards;
}
@media (max-width: 768px) {
.content h1 { white-space: normal; font-size: 3rem; }
}
.content p#subtitle {
font-size: clamp(1.1rem, 3.5vw, 1.45rem);
opacity: 0.9;
margin-bottom: 30px;
line-height: 1.7;
color: #cbd5e1;
min-height: 3.5em;
font-weight: 300;
}
.status {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
font-size: 0.85rem;
color: #6ee7ff;
opacity: 0.8;
letter-spacing: 1.5px;
margin-bottom: 50px;
text-transform: uppercase;
font-weight: 500;
animation: fadeIn 2s ease forwards;
}
.status::before {
content: "";
display: block;
width: 8px;
height: 8px;
background: #22c55e;
border-radius: 50%;
box-shadow: 0 0 10px #22c55e;
animation: blink 1.5s infinite;
}
@keyframes blink {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.3; transform: scale(0.8); }
}
.cta-btn {
position: relative;
overflow: hidden;
padding: 22px 60px;
font-size: 1.2rem;
font-weight: 600;
border: none;
border-radius: 100px;
background: linear-gradient(135deg, #3b82f6, #9333ea);
color: white;
cursor: pointer;
transition: all 0.5s cubic-bezier(0.19, 1, 0.22, 1);
text-transform: uppercase;
letter-spacing: 2px;
display: inline-block;
animation: pulseGlow 2.5s infinite ease-in-out;
box-shadow: 0 10px 30px rgba(99, 102, 241, 0.4);
}
@keyframes pulseGlow {
0% { box-shadow: 0 0 15px rgba(99, 102, 241, 0.4); }
50% { box-shadow: 0 0 35px rgba(99, 102, 241, 0.7); }
100% { box-shadow: 0 0 15px rgba(99, 102, 241, 0.4); }
}
.cta-btn::after {
content: "";
position: absolute;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255, 255, 255, 0.6), transparent 75%);
top: -50%;
left: -50%;
opacity: 0;
transition: 0.6s;
transform: scale(0.3);
pointer-events: none;
}
.cta-btn:hover {
transform: translateY(-8px) scale(1.05);
box-shadow: 0 30px 60px rgba(59, 130, 246, 0.6) !important;
letter-spacing: 3px;
}
.cta-btn:hover::after {
opacity: 1;
transform: scale(1);
}
.cta-btn:active {
transform: scale(0.96);
}
#rolePage {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: radial-gradient(circle at center, #0f172a, #030617);
opacity: 0;
visibility: hidden;
transition: opacity 1s ease;
z-index: 5;
}
#rolePage.visible {
opacity: 1;
visibility: visible;
}
.role-selection {
background: rgba(15, 23, 42, 0.6);
backdrop-filter: blur(35px);
-webkit-backdrop-filter: blur(35px);
padding: 65px;
border-radius: 45px;
border: 1px solid rgba(255, 255, 255, 0.08);
text-align: center;
width: 95%;
max-width: 680px;
box-shadow: 0 60px 120px -20px rgba(0, 0, 0, 0.8);
animation: slideUp 1s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
.role-selection h2 {
font-size: 3rem;
color: white;
margin-bottom: 20px;
font-weight: 700;
letter-spacing: -1.5px;
}
.role-selection p {
color: #94a3b8;
margin-bottom: 45px;
font-size: 1.15rem;
line-height: 1.6;
}
.roles {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 25px;
}
@media (max-width: 600px) {
.roles { grid-template-columns: 1fr; gap: 15px; }
.role-selection { padding: 40px 25px; }
.content h1 { line-height: 1.1; }
}
.role {
position: relative;
overflow: hidden;
background: rgba(255, 255, 255, 0.04);
color: #f1f5f9;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 24px;
border-radius: 24px;
cursor: pointer;
font-size: 1.15rem;
font-weight: 500;
transition: all 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
text-align: left;
display: flex;
align-items: center;
gap: 18px;
}
.role::before {
content: "";
position: absolute;
inset: 0;
border-radius: 24px;
background: linear-gradient(120deg, transparent, rgba(99, 102, 241, 0.2), transparent);
opacity: 0;
transition: 0.4s;
pointer-events: none;
}
.role:hover::before {
opacity: 1;
transform: translateX(100%) skewX(-15deg);
animation: sweep 0.6s ease-out forwards;
}
@keyframes sweep {
from { transform: translateX(-100%) skewX(-15deg); }
to { transform: translateX(100%) skewX(-15deg); }
}
.role:hover {
background: rgba(59, 130, 246, 0.15);
border-color: rgba(59, 130, 246, 0.5);
transform: translateY(-6px) scale(1.03);
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.4);
color: #fff;
}
.professional-footer {
margin-top: 60px;
color: #475569;
font-size: 0.95rem;
letter-spacing: 0.5px;
}
.professional-footer a {
color: #a5b4fc;
text-decoration: none;
font-weight: 600;
transition: 0.4s;
}
.professional-footer a:hover {
color: #818cf8;
text-shadow: 0 0 20px rgba(99, 102, 241, 0.6);
}
@keyframes fadeSlide {
from { opacity: 0; transform: translateY(35px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(60px); }
to { opacity: 1; transform: translateY(0); }
}
.hidden { display: none !important; }
.fade-out {
opacity: 0;
transform: scale(1.05);
pointer-events: none;
filter: blur(10px);
transition: 1s cubic-bezier(0.4, 0, 0.2, 1);
}
</style>
</head>
<body class="{% if show_roles %}direct-roles{% endif %}">
<canvas id="particles"></canvas>
<div class="hero" id="landing">
<div class="content">
<span class="tag">AI POWERED SYSTEM</span>
<h1>βš–οΈ AI Legal Assistant</h1>
<p id="subtitle"></p>
<div class="status">System Ready</div>
<button id="startBtn" class="cta-btn">
Start Consultation β†’
</button>
</div>
</div>
<div id="rolePage">
<div class="role-selection">
<h2>Who are you?</h2>
<p>Select your role to unlock precise legal intelligence and expert guidance tailored to your specific framework.</p>
<div class="roles">
<button class="role" data-role="Judge">πŸ‘¨βš–οΈ Judge</button>
<button class="role" data-role="Advocate/Lawyer">πŸ‘©βš–οΈ Advocate</button>
<button class="role" data-role="Woman">πŸ›‘οΈ Woman</button>
<button class="role" data-role="Citizen">πŸ‘€ Citizen</button>
<button class="role" data-role="Student">πŸŽ“ Student</button>
<button class="role" data-role="Minor">πŸ‘¦ Minor</button>
</div>
<footer class="professional-footer">
&copy; 2026 Law Bot AI β€’ Forged for Justice β€’ Managed by <a href="https://www.linkedin.com/in/vishwanath77" target="_blank">Vishwanath</a>
</footer>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const contentEl = document.querySelector(".content");
// --- CURSOR GLOW ---
const glow = document.createElement("div");
glow.classList.add("cursor-glow");
document.body.appendChild(glow);
document.addEventListener("mousemove", (e) => {
glow.style.left = e.clientX + "px";
glow.style.top = e.clientY + "px";
// --- PARALLAX TILT EFFECT ---
const x = (window.innerWidth / 2 - e.clientX) / 75;
const y = (window.innerHeight / 2 - e.clientY) / 75;
// Keep the floating animation active by adding these transforms
contentEl.style.transform = `perspective(1000px) rotateY(${x}deg) rotateX(${y}deg)`;
});
// --- PARTICLES ANIMATION ---
const canvas = document.getElementById("particles");
const ctx = canvas.getContext("2d");
let w, h, particles = [];
function initCanvas() {
w = canvas.width = window.innerWidth;
h = canvas.height = window.innerHeight;
particles = [];
for (let i = 0; i < 90; i++) {
particles.push({
x: Math.random() * w,
y: Math.random() * h,
r: Math.random() * 1.5 + 0.5,
dx: (Math.random() - 0.5) * 0.4,
dy: (Math.random() - 0.5) * 0.4,
alpha: Math.random() * 0.4 + 0.1
});
}
}
function animate() {
ctx.clearRect(0, 0, w, h);
particles.forEach(p => {
p.x += p.dx;
p.y += p.dy;
if (p.x < 0 || p.x > w) p.dx *= -1;
if (p.y < 0 || p.y > h) p.dy *= -1;
ctx.beginPath();
ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);
ctx.fillStyle = `rgba(110, 231, 255, ${p.alpha})`;
ctx.fill();
});
requestAnimationFrame(animate);
}
initCanvas();
animate();
window.addEventListener("resize", initCanvas);
// --- TYPING EFFECT ---
const subtitleText = "Precise legal guidance powered by state-of-the-art AI. Redefining how Indian citizens navigate justice with intelligence and speed.";
const subtitleEl = document.getElementById("subtitle");
let i = 0;
function typing() {
if (i < subtitleText.length) {
subtitleEl.innerHTML += subtitleText.charAt(i);
i++;
setTimeout(typing, 18);
}
}
setTimeout(typing, 800);
// --- NAVIGATION ---
const startBtn = document.getElementById("startBtn");
const landing = document.getElementById("landing");
const rolePage = document.getElementById("rolePage");
startBtn.addEventListener("click", () => {
landing.classList.add("fade-out");
setTimeout(() => {
landing.classList.add("hidden");
rolePage.classList.add("visible");
}, 1200);
});
document.querySelectorAll(".role").forEach(button => {
button.addEventListener("click", function () {
const role = this.getAttribute("data-role");
window.location.href = `/login?role=${encodeURIComponent(role)}`;
});
});
// --- PATHWAY PROTECTION (Fallback) ---
if (window.location.pathname.includes('/role')) {
document.body.classList.add('direct-roles');
}
});
</script>
</body>
</html>