mroctopus / app /src /components /OctopusLogo.jsx
Ewan
Add guitar fretboard and drumstick legs to octopus logo
4b989e5
import { useId } from 'react';
export default function OctopusLogo({ size = 48 }) {
const id = useId();
const gradId = `octo${id.replace(/:/g, '')}`;
const legs = [
[-30, 'W'],
[-10, 'B'],
[10, 'W'],
[30, 'W'],
];
const ox = 24, oy = 25;
return (
<svg width={size} height={size} viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id={gradId} x1="10" y1="8" x2="38" y2="44" gradientUnits="userSpaceOnUse">
<stop stopColor="#a78bfa" />
<stop offset="1" stopColor="#06b6d4" />
</linearGradient>
</defs>
{/* Guitar fretboard leg β€” far left */}
<g transform={`rotate(-46, ${ox}, ${oy})`}>
{/* Fretboard body */}
<rect x={ox - 2.2} y={oy} width={4.4} height={19} rx={0.6}
fill="#2d1f4e" stroke="#9b8ec4" strokeWidth={0.5} />
{/* Fret lines */}
{[4, 7.5, 10.5, 13, 15.5, 17.5].map((fy, i) => (
<line key={i} x1={ox - 2.2} y1={oy + fy} x2={ox + 2.2} y2={oy + fy}
stroke="#c8c5d6" strokeWidth={0.4} />
))}
{/* Strings */}
{[-1.2, -0.4, 0.4, 1.2].map((sx, i) => (
<line key={i} x1={ox + sx} y1={oy + 0.5} x2={ox + sx} y2={oy + 18.5}
stroke="#a78bfa" strokeWidth={0.25} opacity={0.6} />
))}
</g>
{/* Tentacle legs β€” four piano keys, one black */}
{legs.map(([angle, type], i) => {
const isBlack = type === 'B';
const w = isBlack ? 3 : 4.2;
const h = 19;
const rx = isBlack ? 0.6 : 0.8;
return (
<g key={i} transform={`rotate(${angle}, ${ox}, ${oy})`}>
<rect x={ox - w / 2} y={oy} width={w} height={h} rx={rx}
fill={isBlack ? '#1e1b4b' : '#f5f3fa'}
stroke={isBlack ? '#c8c5d6' : '#9b8ec4'}
strokeWidth={isBlack ? 0.8 : 0.5} />
</g>
);
})}
{/* Drumstick leg β€” far right */}
<g transform={`rotate(46, ${ox}, ${oy})`}>
{/* Stick shaft β€” tapers from 1.8 to 1.0 */}
<polygon
points={`${ox - 0.9},${oy} ${ox + 0.9},${oy} ${ox + 0.5},${oy + 16} ${ox - 0.5},${oy + 16}`}
fill="#f5f3fa" stroke="#9b8ec4" strokeWidth={0.5} strokeLinejoin="round" />
{/* Bead (tip) */}
<ellipse cx={ox} cy={oy + 17.8} rx={1.4} ry={1.8}
fill="#e8dff5" stroke="#9b8ec4" strokeWidth={0.5} />
</g>
{/* Head */}
<ellipse cx="24" cy="16" rx="14" ry="12" fill={`url(#${gradId})`} />
<circle cx="19" cy="14" r="2.5" fill="#07070e" />
<circle cx="29" cy="14" r="2.5" fill="#07070e" />
<circle cx="20" cy="13.3" r="0.9" fill="white" opacity="0.9" />
<circle cx="30" cy="13.3" r="0.9" fill="white" opacity="0.9" />
</svg>
);
}