chore: format
This commit is contained in:
@@ -1,119 +1,254 @@
|
||||
'use client'
|
||||
"use client";
|
||||
|
||||
import React, { useState } from 'react'
|
||||
import './KomposeIcon.css'
|
||||
import React, { useState } from "react";
|
||||
import "./KomposeIcon.css";
|
||||
|
||||
interface KomposeIconProps {
|
||||
size?: string
|
||||
interactive?: boolean
|
||||
className?: string
|
||||
size?: string;
|
||||
interactive?: boolean;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export default function KomposeIcon({
|
||||
size = '192px',
|
||||
interactive = true,
|
||||
className = ''
|
||||
export default function KomposeIcon({
|
||||
size = "192px",
|
||||
interactive = true,
|
||||
className = "",
|
||||
}: KomposeIconProps) {
|
||||
const [isClicked, setIsClicked] = useState(false)
|
||||
const [showRipple, setShowRipple] = useState(false)
|
||||
const [isClicked, setIsClicked] = useState(false);
|
||||
const [showRipple, setShowRipple] = useState(false);
|
||||
|
||||
const handleClick = () => {
|
||||
if (!interactive) return
|
||||
const handleClick = () => {
|
||||
if (!interactive) return;
|
||||
|
||||
setIsClicked(true)
|
||||
setShowRipple(true)
|
||||
setIsClicked(true);
|
||||
setShowRipple(true);
|
||||
|
||||
setTimeout(() => {
|
||||
setIsClicked(false)
|
||||
}, 600)
|
||||
setTimeout(() => {
|
||||
setIsClicked(false);
|
||||
}, 600);
|
||||
|
||||
setTimeout(() => {
|
||||
setShowRipple(false)
|
||||
}, 800)
|
||||
}
|
||||
setTimeout(() => {
|
||||
setShowRipple(false);
|
||||
}, 800);
|
||||
};
|
||||
|
||||
const handleTouch = (e: React.TouchEvent) => {
|
||||
if (!interactive) return
|
||||
handleClick()
|
||||
}
|
||||
const handleTouch = (e: React.TouchEvent) => {
|
||||
if (!interactive) return;
|
||||
handleClick();
|
||||
};
|
||||
|
||||
const wrapperClasses = [
|
||||
'kompose-icon-wrapper',
|
||||
isClicked && 'is-clicked',
|
||||
interactive && 'is-interactive',
|
||||
className
|
||||
].filter(Boolean).join(' ')
|
||||
const wrapperClasses = [
|
||||
"kompose-icon-wrapper",
|
||||
isClicked && "is-clicked",
|
||||
interactive && "is-interactive",
|
||||
className,
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(" ");
|
||||
|
||||
return (
|
||||
<div
|
||||
className={wrapperClasses}
|
||||
onClick={handleClick}
|
||||
onTouchStart={handleTouch}
|
||||
style={{ width: size, height: size }}
|
||||
>
|
||||
<svg
|
||||
className="kompose-icon"
|
||||
viewBox="0 0 192 192"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<defs>
|
||||
<pattern id="carbon192" x="0" y="0" width="7.68" height="7.68" patternUnits="userSpaceOnUse">
|
||||
<rect width="7.68" height="7.68" fill="#0a0e27"></rect>
|
||||
<path d="M0,0 L3.84,3.84 M3.84,0 L7.68,3.84 M0,3.84 L3.84,7.68" stroke="#060815" strokeWidth="1.5" opacity="0.5"></path>
|
||||
</pattern>
|
||||
return (
|
||||
<div
|
||||
className={wrapperClasses}
|
||||
onClick={handleClick}
|
||||
onTouchStart={handleTouch}
|
||||
style={{ width: size, height: size }}
|
||||
>
|
||||
<svg
|
||||
className="kompose-icon"
|
||||
viewBox="0 0 192 192"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<defs>
|
||||
<pattern
|
||||
id="carbon192"
|
||||
x="0"
|
||||
y="0"
|
||||
width="7.68"
|
||||
height="7.68"
|
||||
patternUnits="userSpaceOnUse"
|
||||
>
|
||||
<rect width="7.68" height="7.68" fill="#0a0e27"></rect>
|
||||
<path
|
||||
d="M0,0 L3.84,3.84 M3.84,0 L7.68,3.84 M0,3.84 L3.84,7.68"
|
||||
stroke="#060815"
|
||||
strokeWidth="1.5"
|
||||
opacity="0.5"
|
||||
></path>
|
||||
</pattern>
|
||||
|
||||
<linearGradient id="bgGrad192" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style={{ stopColor: '#1a1d2e', stopOpacity: 1 }}></stop>
|
||||
<stop offset="100%" style={{ stopColor: '#0a0e27', stopOpacity: 1 }}></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="bgGrad192" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop
|
||||
offset="0%"
|
||||
style={{ stopColor: "#1a1d2e", stopOpacity: 1 }}
|
||||
></stop>
|
||||
<stop
|
||||
offset="100%"
|
||||
style={{ stopColor: "#0a0e27", stopOpacity: 1 }}
|
||||
></stop>
|
||||
</linearGradient>
|
||||
|
||||
<linearGradient id="primaryGrad192" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" className="gradient-start" style={{ stopColor: '#00DC82', stopOpacity: 1 }}></stop>
|
||||
<stop offset="100%" className="gradient-end" style={{ stopColor: '#00a86b', stopOpacity: 1 }}></stop>
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="primaryGrad192"
|
||||
x1="0%"
|
||||
y1="0%"
|
||||
x2="100%"
|
||||
y2="100%"
|
||||
>
|
||||
<stop
|
||||
offset="0%"
|
||||
className="gradient-start"
|
||||
style={{ stopColor: "#00DC82", stopOpacity: 1 }}
|
||||
></stop>
|
||||
<stop
|
||||
offset="100%"
|
||||
className="gradient-end"
|
||||
style={{ stopColor: "#00a86b", stopOpacity: 1 }}
|
||||
></stop>
|
||||
</linearGradient>
|
||||
|
||||
<filter id="glow192">
|
||||
<feGaussianBlur stdDeviation="6" result="coloredBlur"></feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="glow192">
|
||||
<feGaussianBlur
|
||||
stdDeviation="6"
|
||||
result="coloredBlur"
|
||||
></feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<filter id="intenseglow192">
|
||||
<feGaussianBlur stdDeviation="12" result="coloredBlur"></feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<filter id="intenseglow192">
|
||||
<feGaussianBlur
|
||||
stdDeviation="12"
|
||||
result="coloredBlur"
|
||||
></feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
{/* Background */}
|
||||
<rect className="bg-rect" width="192" height="192" rx="24" fill="url(#bgGrad192)"></rect>
|
||||
<rect className="carbon-pattern" width="192" height="192" rx="24" fill="url(#carbon192)" opacity="0.4"></rect>
|
||||
{/* Background */}
|
||||
<rect
|
||||
className="bg-rect"
|
||||
width="192"
|
||||
height="192"
|
||||
rx="24"
|
||||
fill="url(#bgGrad192)"
|
||||
></rect>
|
||||
<rect
|
||||
className="carbon-pattern"
|
||||
width="192"
|
||||
height="192"
|
||||
rx="24"
|
||||
fill="url(#carbon192)"
|
||||
opacity="0.4"
|
||||
></rect>
|
||||
|
||||
{/* Stylized K */}
|
||||
<g className="k-letter" transform="translate(48, 48)">
|
||||
<line className="k-line k-vertical" x1="0" y1="0" x2="0" y2="96" stroke="url(#primaryGrad192)" strokeWidth="15" strokeLinecap="round" filter="url(#glow192)"></line>
|
||||
<line className="k-line k-diagonal-top" x1="0" y1="48" x2="57.6" y2="0" stroke="url(#primaryGrad192)" strokeWidth="15" strokeLinecap="round" filter="url(#glow192)"></line>
|
||||
<line className="k-line k-diagonal-bottom" x1="0" y1="48" x2="57.6" y2="96" stroke="url(#primaryGrad192)" strokeWidth="15" strokeLinecap="round" filter="url(#glow192)"></line>
|
||||
</g>
|
||||
{/* Stylized K */}
|
||||
<g className="k-letter" transform="translate(48, 48)">
|
||||
<line
|
||||
className="k-line k-vertical"
|
||||
x1="0"
|
||||
y1="0"
|
||||
x2="0"
|
||||
y2="96"
|
||||
stroke="url(#primaryGrad192)"
|
||||
strokeWidth="15"
|
||||
strokeLinecap="round"
|
||||
filter="url(#glow192)"
|
||||
></line>
|
||||
<line
|
||||
className="k-line k-diagonal-top"
|
||||
x1="0"
|
||||
y1="48"
|
||||
x2="57.6"
|
||||
y2="0"
|
||||
stroke="url(#primaryGrad192)"
|
||||
strokeWidth="15"
|
||||
strokeLinecap="round"
|
||||
filter="url(#glow192)"
|
||||
></line>
|
||||
<line
|
||||
className="k-line k-diagonal-bottom"
|
||||
x1="0"
|
||||
y1="48"
|
||||
x2="57.6"
|
||||
y2="96"
|
||||
stroke="url(#primaryGrad192)"
|
||||
strokeWidth="15"
|
||||
strokeLinecap="round"
|
||||
filter="url(#glow192)"
|
||||
></line>
|
||||
</g>
|
||||
|
||||
{/* Animated status dot */}
|
||||
<circle className="status-dot" cx="163.2" cy="163.2" r="11.52" fill="#00DC82" opacity="0.9"></circle>
|
||||
<circle className="status-ring" cx="163.2" cy="163.2" r="17.28" fill="none" stroke="#00DC82" strokeWidth="3" opacity="0.3"></circle>
|
||||
{/* Animated status dot */}
|
||||
<circle
|
||||
className="status-dot"
|
||||
cx="163.2"
|
||||
cy="163.2"
|
||||
r="11.52"
|
||||
fill="#00DC82"
|
||||
opacity="0.9"
|
||||
></circle>
|
||||
<circle
|
||||
className="status-ring"
|
||||
cx="163.2"
|
||||
cy="163.2"
|
||||
r="17.28"
|
||||
fill="none"
|
||||
stroke="#00DC82"
|
||||
strokeWidth="3"
|
||||
opacity="0.3"
|
||||
></circle>
|
||||
|
||||
{/* Tech corners */}
|
||||
<line className="corner corner-tl-h" x1="15.36" y1="15.36" x2="28.8" y2="15.36" stroke="#00DC82" strokeWidth="3" opacity="0.4"></line>
|
||||
<line className="corner corner-tl-v" x1="15.36" y1="15.36" x2="15.36" y2="28.8" stroke="#00DC82" strokeWidth="3" opacity="0.4"></line>
|
||||
<line className="corner corner-tr-h" x1="176.64" y1="15.36" x2="163.2" y2="15.36" stroke="#00DC82" strokeWidth="3" opacity="0.4"></line>
|
||||
<line className="corner corner-tr-v" x1="176.64" y1="15.36" x2="176.64" y2="28.8" stroke="#00DC82" strokeWidth="3" opacity="0.4"></line>
|
||||
</svg>
|
||||
{/* Tech corners */}
|
||||
<line
|
||||
className="corner corner-tl-h"
|
||||
x1="15.36"
|
||||
y1="15.36"
|
||||
x2="28.8"
|
||||
y2="15.36"
|
||||
stroke="#00DC82"
|
||||
strokeWidth="3"
|
||||
opacity="0.4"
|
||||
></line>
|
||||
<line
|
||||
className="corner corner-tl-v"
|
||||
x1="15.36"
|
||||
y1="15.36"
|
||||
x2="15.36"
|
||||
y2="28.8"
|
||||
stroke="#00DC82"
|
||||
strokeWidth="3"
|
||||
opacity="0.4"
|
||||
></line>
|
||||
<line
|
||||
className="corner corner-tr-h"
|
||||
x1="176.64"
|
||||
y1="15.36"
|
||||
x2="163.2"
|
||||
y2="15.36"
|
||||
stroke="#00DC82"
|
||||
strokeWidth="3"
|
||||
opacity="0.4"
|
||||
></line>
|
||||
<line
|
||||
className="corner corner-tr-v"
|
||||
x1="176.64"
|
||||
y1="15.36"
|
||||
x2="176.64"
|
||||
y2="28.8"
|
||||
stroke="#00DC82"
|
||||
strokeWidth="3"
|
||||
opacity="0.4"
|
||||
></line>
|
||||
</svg>
|
||||
|
||||
{/* Ripple effect container */}
|
||||
{showRipple && <div className="ripple"></div>}
|
||||
</div>
|
||||
)
|
||||
{/* Ripple effect container */}
|
||||
{showRipple && <div className="ripple"></div>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user