You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.9 KiB

  1. import { TwMainColor } from "@/data/types";
  2. import { Route } from "@/routers/types";
  3. import Link from "next/link";
  4. import React, { FC, ReactNode } from "react";
  5. export interface BadgeProps {
  6. className?: string;
  7. name: ReactNode;
  8. color?: TwMainColor;
  9. href?: Route<string>;
  10. }
  11. const Badge: FC<BadgeProps> = ({
  12. className = "relative",
  13. name,
  14. color = "blue",
  15. href,
  16. }) => {
  17. const getColorClass = (hasHover = true) => {
  18. switch (color) {
  19. case "pink":
  20. return `text-pink-800 bg-pink-100 ${
  21. hasHover ? "hover:bg-pink-800" : ""
  22. }`;
  23. case "red":
  24. return `text-red-800 bg-red-100 ${hasHover ? "hover:bg-red-800" : ""}`;
  25. case "gray":
  26. return `text-gray-800 bg-gray-100 ${
  27. hasHover ? "hover:bg-gray-800" : ""
  28. }`;
  29. case "green":
  30. return `text-green-800 bg-green-100 ${
  31. hasHover ? "hover:bg-green-800" : ""
  32. }`;
  33. case "purple":
  34. return `text-purple-800 bg-purple-100 ${
  35. hasHover ? "hover:bg-purple-800" : ""
  36. }`;
  37. case "indigo":
  38. return `text-indigo-800 bg-indigo-100 ${
  39. hasHover ? "hover:bg-indigo-800" : ""
  40. }`;
  41. case "yellow":
  42. return `text-yellow-800 bg-yellow-100 ${
  43. hasHover ? "hover:bg-yellow-800" : ""
  44. }`;
  45. case "blue":
  46. return `text-blue-800 bg-blue-100 ${
  47. hasHover ? "hover:bg-blue-800" : ""
  48. }`;
  49. default:
  50. return `text-pink-800 bg-pink-100 ${
  51. hasHover ? "hover:bg-pink-800" : ""
  52. }`;
  53. }
  54. };
  55. const CLASSES =
  56. "nc-Badge inline-flex px-2.5 py-1 rounded-full font-medium text-xs " +
  57. className;
  58. return !!href ? (
  59. <Link
  60. href={href || ""}
  61. className={`transition-colors hover:text-white duration-300 ${CLASSES} ${getColorClass()}`}
  62. >
  63. {name}
  64. </Link>
  65. ) : (
  66. <span className={`${CLASSES} ${getColorClass(false)} ${className}`}>
  67. {name}
  68. </span>
  69. );
  70. };
  71. export default Badge;