File size: 2,234 Bytes
fb8c550
 
 
 
349f22c
fb8c550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'use client';

import { useState, useRef, useEffect } from 'react';
import Link from 'next/link';
import { Question as HelpCircle } from '@phosphor-icons/react';

interface LearnPopoverProps {
  term: string;
  explanation: string;
  topic?: string;
  children: React.ReactNode;
}

export function LearnPopover({ term, explanation, topic, children }: LearnPopoverProps) {
  const [open, setOpen] = useState(false);
  const wrapperRef = useRef<HTMLSpanElement>(null);

  useEffect(() => {
    function handleClickOutside(e: MouseEvent) {
      if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {
        setOpen(false);
      }
    }
    if (open) {
      document.addEventListener('mousedown', handleClickOutside);
    }
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, [open]);

  return (
    <span ref={wrapperRef} className="inline-flex items-center gap-0.5 relative">
      <span
        className="cursor-pointer border-b border-dotted border-accent-cyan/40 hover:border-accent-cyan transition"
        onClick={() => setOpen(!open)}
        role="button"
        tabIndex={0}
        onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpen(!open); } }}
        aria-label={`Learn about ${term}`}
      >
        {children}
      </span>
      <HelpCircle
        size={12}
        className="inline-block text-text-muted cursor-pointer hover:text-accent-cyan transition flex-shrink-0"
        onClick={() => setOpen(!open)}
      />
      {open && (
        <div
          className="absolute z-50 top-full left-0 mt-2 p-4 rounded-xl border border-glass-border bg-surface-2 shadow-glass-md max-w-xs text-sm"
          style={{ backdropFilter: 'blur(16px)' }}
        >
          <p className="font-semibold text-text-primary text-xs mb-1">{term}</p>
          <p className="text-text-secondary text-xs leading-relaxed">{explanation}</p>
          {topic && (
            <Link
              href={`/learn/${topic}`}
              className="inline-block mt-2 text-xs text-accent-cyan hover:underline font-medium"
            >
              Learn more &rarr;
            </Link>
          )}
        </div>
      )}
    </span>
  );
}