SPB Git

spb/vquant Public MIT

VibeQuant — AI-powered institutional-grade financial intelligence platform.

TypeScript 84.3% Python 11.7% JavaScript 1.6% CSS 1.5% HTML 0.7%
3.3 KB · 107 lines tsx
Raw Blame History
1/*2 * =============================================================================3 *  VibeQuant (vquant) — AI-Powered Financial Intelligence Platform4 * -----------------------------------------------------------------------------5 *  File:      client/src/components/chat/searching-widget.tsx6 *7 *  Author:    Simon-Pierre Boucher8 *  Contact:   contact@spboucher.ai9 *  Website:   https://www.spboucher.ai10 *  Demo:      https://www.vquant.ai11 *  License:   MIT (see LICENSE)12 *13 *  Copyright © 2026 Simon-Pierre Boucher. All rights reserved.14 * =============================================================================15 */1617import { motion } from "framer-motion";18import { Sparkles } from "lucide-react";1920export function SearchingWidget() {21  return (22    <motion.div23      initial={{ opacity: 0, y: 20 }}24      animate={{ opacity: 1, y: 0 }}25      exit={{ opacity: 0, y: -20 }}26      transition={{ duration: 0.4 }}27      className="w-full max-w-5xl mx-auto"28      data-testid="searching-widget"29    >30      <div className="flex flex-col items-center justify-center py-20 space-y-6">31        {/* Animated Icon */}32        <motion.div33          animate={{34            rotate: [0, 360],35            scale: [1, 1.1, 1],36          }}37          transition={{38            rotate: {39              duration: 2,40              repeat: Infinity,41              ease: "linear",42            },43            scale: {44              duration: 1.5,45              repeat: Infinity,46              ease: "easeInOut",47            },48          }}49          className="relative"50        >51          <div className="absolute inset-0 rounded-full bg-primary/20 blur-xl" />52          <div className="relative bg-gradient-to-br from-primary/10 to-cyan-500/10 p-6 rounded-full border border-primary/20">53            <Sparkles className="w-12 h-12 text-primary" />54          </div>55        </motion.div>5657        {/* Text Content */}58        <div className="text-center space-y-2">59          <motion.h360            initial={{ opacity: 0 }}61            animate={{ opacity: 1 }}62            transition={{ delay: 0.2 }}63            className="text-2xl font-semibold text-foreground"64            data-testid="text-searching-title"65          >66            Search in progress...67          </motion.h3>68          <motion.p69            initial={{ opacity: 0 }}70            animate={{ opacity: 1 }}71            transition={{ delay: 0.3 }}72            className="text-muted-foreground max-w-md"73            data-testid="text-searching-subtitle"74          >75            Analyzing and retrieving the best information76          </motion.p>77        </div>7879        {/* Animated Dots */}80        <motion.div81          className="flex gap-2"82          initial={{ opacity: 0 }}83          animate={{ opacity: 1 }}84          transition={{ delay: 0.4 }}85        >86          {[0, 1, 2].map((i) => (87            <motion.div88              key={i}89              animate={{90                y: [0, -10, 0],91                opacity: [0.5, 1, 0.5],92              }}93              transition={{94                duration: 1.5,95                repeat: Infinity,96                delay: i * 0.2,97                ease: "easeInOut",98              }}99              className="w-2 h-2 bg-primary rounded-full"100            />101          ))}102        </motion.div>103      </div>104    </motion.div>105  );106}107