File size: 1,801 Bytes
a566fb0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import React, { useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';

export default function KeyTermBadge({ term, definition, color = "cyan" }) {
  const [showDefinition, setShowDefinition] = useState(false);

  const colors = {
    cyan: "bg-cyan-500/20 text-cyan-300 border-cyan-500/30 hover:bg-cyan-500/30",
    purple: "bg-purple-500/20 text-purple-300 border-purple-500/30 hover:bg-purple-500/30",
    pink: "bg-pink-500/20 text-pink-300 border-pink-500/30 hover:bg-pink-500/30",
    green: "bg-emerald-500/20 text-emerald-300 border-emerald-500/30 hover:bg-emerald-500/30",
    yellow: "bg-yellow-500/20 text-yellow-300 border-yellow-500/30 hover:bg-yellow-500/30"
  };

  return (
    <span className="relative inline-block">

      <motion.button

        className={`px-3 py-1 rounded-lg border ${colors[color]} font-semibold text-sm transition-colors cursor-pointer`}

        onClick={() => setShowDefinition(!showDefinition)}

        whileHover={{ scale: 1.05 }}

        whileTap={{ scale: 0.95 }}

      >

        {term}

      </motion.button>

      

      <AnimatePresence>

        {showDefinition && (

          <motion.div

            initial={{ opacity: 0, y: 10, scale: 0.9 }}

            animate={{ opacity: 1, y: 0, scale: 1 }}

            exit={{ opacity: 0, y: 10, scale: 0.9 }}

            className="absolute z-50 left-0 top-full mt-2 p-3 rounded-xl bg-slate-800 border border-white/20 shadow-xl min-w-[200px] max-w-[300px]"

          >

            <p className="text-white/90 text-sm">{definition}</p>

            <div className="absolute -top-2 left-4 w-4 h-4 bg-slate-800 border-l border-t border-white/20 transform rotate-45" />

          </motion.div>

        )}

      </AnimatePresence>

    </span>
  );
}