summaryrefslogblamecommitdiff
path: root/frontend/src/components/OrigamiDragonLogo.tsx
blob: 6a7a5fbb58a7339577123d01c08532507b396c58 (plain) (tree)



















































































































































































                                                                                                                    
import React from 'react'

type Variant = 'mark' | 'ribbonS' | 'badge' | 'crane' | 'craneOutline'

type Props = {
  variant?: Variant
  height?: number
  color?: string
  className?: string
  title?: string
  strokeWidth?: number
}

/**
 * Origami-style dragon logo for small header placement.
 * - Uses currentColor by default so it adapts to surrounding text color.
 * - Keep height around 20–24px in compact headers.
 */
export const OrigamiDragonLogo: React.FC<Props> = ({
  variant = 'crane',
  height = 20,
  color = 'currentColor',
  className = '',
  title = 'Soryu logo',
  strokeWidth = 12,
}) => {
  if (variant === 'craneOutline') {
    // Outline rendition inspired by provided licensed crane icon
    return (
      <svg
        className={className}
        role="img"
        aria-label={title}
        width={height}
        height={height}
        viewBox="0 0 100 100"
        xmlns="http://www.w3.org/2000/svg"
        style={{ display: 'inline-block', verticalAlign: 'middle', color }}
      >
        <title>{title}</title>
        <g fill="none" stroke="currentColor" strokeWidth={strokeWidth} strokeLinejoin="round" strokeLinecap="round">
          {/* Left tail → left wing base → body pivot */}
          <path d="M10 60 L36 76 L18 42 L42 58" />
          {/* Left wing upstroke */}
          <path d="M42 58 L26 12" />
          {/* Left wing inner crease to pivot */}
          <path d="M26 12 L50 62" />
          {/* Body lower crease */}
          <path d="M30 76 L50 62" />
          {/* Center mast (rear triangle) */}
          <path d="M50 62 L58 16 L64 70" />
          {/* Right wing outer edge */}
          <path d="M50 62 L72 30 L66 78" />
          {/* Right wing inner crease */}
          <path d="M72 30 L60 52" />
          {/* Neck and head */}
          <path d="M66 78 L82 54 L90 40 L96 56" />
          {/* Neck inner crease */}
          <path d="M82 54 L72 44" />
        </g>
      </svg>
    )
  }
  if (variant === 'crane') {
    // Origami crane silhouette with a dragon head
    return (
      <svg
        className={className}
        role="img"
        aria-label={title}
        width={height}
        height={height}
        viewBox="0 0 100 100"
        xmlns="http://www.w3.org/2000/svg"
        style={{ display: 'inline-block', verticalAlign: 'middle', color }}
      >
        <title>{title}</title>
        {/* Left/up wing */}
        <polygon points="46,48 22,24 40,52" fill="currentColor" opacity="0.95" />
        {/* Right/down wing */}
        <polygon points="52,52 78,76 58,54" fill="currentColor" opacity="0.78" />
        {/* Body (diamond) */}
        <polygon points="44,52 52,46 58,52 50,60" fill="currentColor" opacity="0.88" />
        {/* Tail */}
        <polygon points="44,60 34,70 46,64" fill="currentColor" opacity="0.7" />
        {/* Neck */}
        <polygon points="58,46 76,40 74,44 56,50" fill="currentColor" opacity="0.9" />
        {/* Dragon head (top plane) */}
        <polygon points="76,40 90,38 82,46" fill="currentColor" opacity="0.95" />
        {/* Dragon jaw plane */}
        <polygon points="74,44 90,46 82,50" fill="currentColor" opacity="0.8" />
        {/* Small horn */}
        <polygon points="86,36 92,38 88,42" fill="currentColor" opacity="0.85" />
      </svg>
    )
  }
  if (variant === 'mark') {
    // Angular origami dragon head/neck, faceted into simple planes
    return (
      <svg
        className={className}
        role="img"
        aria-label={title}
        width={height}
        height={height}
        viewBox="0 0 100 100"
        xmlns="http://www.w3.org/2000/svg"
        style={{ display: 'inline-block', verticalAlign: 'middle', color }}
      >
        <title>{title}</title>
        {/* Upper head */}
        <polygon points="60,22 86,16 73,34 58,30" fill="currentColor" opacity="0.95" />
        {/* Snout / jaw plane */}
        <polygon points="58,30 73,34 90,30 71,45" fill="currentColor" opacity="0.8" />
        {/* Neck planes */}
        <polygon points="58,30 71,45 56,60 40,66 30,72 22,64 46,48" fill="currentColor" opacity="0.9" />
        <polygon points="22,64 30,72 18,74 26,60" fill="currentColor" opacity="0.65" />
        {/* Small ear/horn suggestion */}
        <polygon points="78,18 86,16 82,24" fill="currentColor" opacity="0.7" />
      </svg>
    )
  }

  if (variant === 'ribbonS') {
    // Folded ribbon forming an angular "S" silhouette
    return (
      <svg
        className={className}
        role="img"
        aria-label={title}
        width={height}
        height={height}
        viewBox="0 0 100 100"
        xmlns="http://www.w3.org/2000/svg"
        style={{ display: 'inline-block', verticalAlign: 'middle', color }}
      >
        <title>{title}</title>
        {/* Top fold */}
        <polygon points="22,32 62,18 70,26 30,40" fill="currentColor" opacity="0.95" />
        {/* Middle fold (turning back) */}
        <polygon points="30,40 70,26 60,46 20,60" fill="currentColor" opacity="0.8" />
        {/* Lower fold */}
        <polygon points="22,64 60,46 68,54 28,70" fill="currentColor" opacity="0.9" />
      </svg>
    )
  }

  // badge
  return (
    <svg
      className={className}
      role="img"
      aria-label={title}
      width={height}
      height={height}
      viewBox="0 0 100 100"
      xmlns="http://www.w3.org/2000/svg"
      style={{ display: 'inline-block', verticalAlign: 'middle', color }}
    >
      <title>{title}</title>
      {/* Hex container */}
      <polygon
        points="50,6 83,25 83,75 50,94 17,75 17,25"
        fill="none"
        stroke="currentColor"
        strokeWidth="8"
        strokeLinejoin="round"
        opacity="0.9"
      />
      {/* Mini mark inside */}
      <g transform="translate(0,2) scale(0.85) translate(10,6)">
        <polygon points="60,22 86,16 73,34 58,30" fill="currentColor" opacity="0.95" />
        <polygon points="58,30 73,34 90,30 71,45" fill="currentColor" opacity="0.8" />
        <polygon points="58,30 71,45 56,60 40,66 30,72 22,64 46,48" fill="currentColor" opacity="0.9" />
      </g>
    </svg>
  )
}

export default OrigamiDragonLogo