div-btn.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import React, { useState } from 'react'
  2. import './div-btn.scss'
  3. /**
  4. * Icon Button Component
  5. * @param {Object} props
  6. * @param {React.ReactNode} props.icon - Default icon (SVG or React component)
  7. * @param {React.ReactNode} props.iconHover - Hover icon (optional)
  8. * @param {React.ReactNode} props.iconPressed - Pressed icon (optional)
  9. * @param {React.ReactNode} props.iconDisabled - Disabled icon (optional)
  10. * @param {Function} props.onClick - Click handler function
  11. * @param {string} props.className - Additional CSS classes
  12. * @param {boolean} props.disabled - Disable button (default: false)
  13. * @param {string} props.title - Tooltip text
  14. * @param {boolean} props.rotateOnHover - Rotate icon on hover (default: false)
  15. * @param {number} props.rotateDegrees - Degrees to rotate on hover (default: 180)
  16. */
  17. function DivBtn({
  18. icon,
  19. iconHover,
  20. iconPressed,
  21. iconDisabled,
  22. onClick,
  23. className = '',
  24. disabled = false,
  25. title = '',
  26. rotateOnHover = false,
  27. rotateDegrees = 180
  28. }) {
  29. const [isPressed, setIsPressed] = useState(false)
  30. const [isHovered, setIsHovered] = useState(false)
  31. const handleClick = (e) => {
  32. if (!disabled && onClick) {
  33. onClick(e)
  34. }
  35. }
  36. const handleMouseDown = () => {
  37. if (!disabled) {
  38. setIsPressed(true)
  39. }
  40. }
  41. const handleMouseUp = () => {
  42. setIsPressed(false)
  43. }
  44. const handleMouseEnter = () => {
  45. if (!disabled) {
  46. setIsHovered(true)
  47. }
  48. }
  49. const handleMouseLeave = () => {
  50. setIsHovered(false)
  51. setIsPressed(false)
  52. }
  53. return (
  54. <div
  55. className={`div-btn ${rotateOnHover ? 'div-btn--rotate' : ''} ${disabled ? 'div-btn--disabled' : ''} ${isPressed ? 'div-btn--pressed' : ''} ${className}`}
  56. onClick={handleClick}
  57. onMouseDown={handleMouseDown}
  58. onMouseUp={handleMouseUp}
  59. onMouseEnter={handleMouseEnter}
  60. onMouseLeave={handleMouseLeave}
  61. title={title}
  62. role="button"
  63. tabIndex={disabled ? -1 : 0}
  64. onKeyDown={(e) => {
  65. if ((e.key === 'Enter' || e.key === ' ') && !disabled) {
  66. e.preventDefault()
  67. handleClick(e)
  68. }
  69. }}
  70. style={rotateOnHover ? { '--rotate-degrees': `${rotateDegrees}deg` } : {}}
  71. >
  72. <div className="div-btn__icon div-btn__icon--default">
  73. {icon}
  74. </div>
  75. {iconHover && (
  76. <div className="div-btn__icon div-btn__icon--hover">
  77. {iconHover}
  78. </div>
  79. )}
  80. {iconPressed && (
  81. <div className="div-btn__icon div-btn__icon--pressed">
  82. {iconPressed}
  83. </div>
  84. )}
  85. {iconDisabled && (
  86. <div className="div-btn__icon div-btn__icon--disabled">
  87. {iconDisabled}
  88. </div>
  89. )}
  90. </div>
  91. )
  92. }
  93. export default DivBtn