From cb427801ff4fcea01caa00dd00145a735b4943c2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 2 Jun 2026 22:13:15 +0300 Subject: [PATCH] Animated glass auth card Replace the split layout with a centered glass card on a living background: drifting aurora blobs, a rotating conic-gradient halo around the card, a spring entrance with staggered content, a floating logo badge, and a one-time shimmer sweep on mount. Shared by all auth screens. Co-Authored-By: Claude Opus 4.8 --- frontend/components/auth/auth-ui.tsx | 205 +++++++++++++++------------ 1 file changed, 116 insertions(+), 89 deletions(-) diff --git a/frontend/components/auth/auth-ui.tsx b/frontend/components/auth/auth-ui.tsx index d55b6eb..8a986f7 100644 --- a/frontend/components/auth/auth-ui.tsx +++ b/frontend/components/auth/auth-ui.tsx @@ -1,82 +1,51 @@ -import { Check } from "lucide-react"; +"use client"; + +import { motion, type Variants } from "framer-motion"; import Image from "next/image"; import type { ReactNode } from "react"; import { cn } from "@/lib/utils"; -const FEATURES = [ - "Look up any patient just by asking", - "Rich record cards — vitals, labs, meds, history", - "Open-source, built around patient-owned data", -]; +const container: Variants = { + hidden: {}, + show: { transition: { staggerChildren: 0.09, delayChildren: 0.18 } }, +}; -// Left brand panel (desktop only): gradient glow, product pitch, feature list. -function BrandPanel() { +const item: Variants = { + hidden: { opacity: 0, y: 16 }, + show: { + opacity: 1, + y: 0, + transition: { type: "spring", stiffness: 150, damping: 18 }, + }, +}; + +// Slowly drifting colored blobs behind everything. +function Aurora() { return ( -
-
+ -
-
- -
- temetro - temetro -
- -
-

- Patient records, organized by conversation. -

-

- The AI middleman between you and patient data — retrieve, review and - update charts from a simple chat, so you spend less time clicking. -

-
    - {FEATURES.map((feature) => ( -
  • - - - - {feature} -
  • - ))} -
-
- -
- © temetro — open-source clinical tooling -
); } -// Centered, branded shell shared by every auth page (split layout on desktop). export function AuthShell({ title, subtitle, @@ -89,41 +58,99 @@ export function AuthShell({ footer?: ReactNode; }) { return ( -
- +
+ +
-
- {/* soft glow behind the form on small screens (no brand panel) */} -
+ {/* rotating gradient halo */} + -
-
+ className="absolute -inset-[2px] rounded-[30px] opacity-70 blur-[3px]" + style={{ + backgroundImage: + "conic-gradient(from 0deg, var(--primary), transparent 25%, transparent 50%, oklch(0.62 0.16 305), transparent 75%, var(--primary))", + }} + transition={{ duration: 10, repeat: Number.POSITIVE_INFINITY, ease: "linear" }} + /> -
-
- temetro + {/* the card */} + + {/* top edge highlight */} +
+ {/* one-time shimmer sweep on mount */} + + + + + temetro +

{title}

{subtitle && (

{subtitle}

)} -
+
- {children} + {children} {footer && ( -
{footer}
+ + {footer} + )} -
-
+
+
); }