algorithm-hover-card.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { ExternalLink, HelpCircle, LockKeyholeOpen, RectangleEllipsis } from 'lucide-react'
  2. import { HoverCard, HoverCardContent, HoverCardTrigger } from 'ui'
  3. import { AlgorithmDetail, algorithmDetails } from './algorithm-details'
  4. interface AlgorithmHoverCardProps {
  5. algorithm: keyof typeof algorithmDetails
  6. legacy?: boolean
  7. }
  8. export const AlgorithmHoverCard = ({ algorithm, legacy }: AlgorithmHoverCardProps) => {
  9. const details: AlgorithmDetail = algorithmDetails[algorithm]
  10. return (
  11. <div className="flex items-center gap-x-2">
  12. {algorithm === 'HS256' ? (
  13. <RectangleEllipsis className="shrink-0" size={14} />
  14. ) : (
  15. <LockKeyholeOpen className="shrink-0" size={14} />
  16. )}
  17. <p>{legacy ? `Legacy ${details.label}` : details.label}</p>
  18. <HoverCard closeDelay={50} openDelay={300}>
  19. <HoverCardTrigger className="min-w-0">
  20. <HelpCircle size={14} className="text-foreground-lighter" />
  21. </HoverCardTrigger>
  22. <HoverCardContent className="w-88 flex items-start gap-3" side="right" align="center">
  23. <div className="flex-1">
  24. <h4 className="font-semibold truncate">{details.name}</h4>
  25. <div className="flex flex-col gap-2 text-sm text-foreground-light">
  26. <p>{details.description}</p>
  27. <p>
  28. Pros:
  29. <ul className="list-disc pl-6">
  30. {details.pros.map((pro, i) => (
  31. <li key={i}>{pro}</li>
  32. ))}
  33. </ul>
  34. </p>
  35. <p>
  36. Cons:{' '}
  37. <ul className="list-disc pl-6">
  38. {details.cons.map((con, i) => (
  39. <li key={i}>{con}</li>
  40. ))}
  41. </ul>
  42. <br />
  43. </p>
  44. </div>
  45. <div className="space-y-1 mt-2">
  46. {details.links.map((link, index) => (
  47. <a
  48. key={index}
  49. href={link.url}
  50. target="_blank"
  51. rel="noopener noreferrer"
  52. className="text-xs text-brand hover:text-brand-600 flex items-center"
  53. >
  54. <ExternalLink className="w-3 h-3 mr-1 shrink-0" />
  55. <span className="truncate">{link.label}</span>
  56. </a>
  57. ))}
  58. </div>
  59. </div>
  60. </HoverCardContent>
  61. </HoverCard>
  62. </div>
  63. )
  64. }