nanochat/services/frontend/components/svg/SamosaSvg.tsx
Manmohan Sharma 634be4080b
feat(frontend): Next.js 14 frontend service for samosaChaat (#2)
Build services/frontend/ replacing the legacy nanochat/ui.html single-file UI.
Landing, login, and chat pages ported with full design system: Devanagari +
Great Vibes hero, samosa/chai/toran SVG animations, gold/cream palette.

- App Router pages: / (hero + floating illustrations), /login (split-screen
  OAuth with mandala motif), /chat (260px collapsible sidebar, suggestion
  chips, markdown + code-copy, auto-expanding input, slash commands)
- SSE streaming via useSSE hook and /api/chat/stream BFF route (proxies to
  CHAT_API_URL when set, falls back to mock echo for local dev)
- NextAuth.js v5 with Google + GitHub providers; middleware gates /chat/*
- Zustand store with localStorage persistence for conversations/settings
- Tailwind theme carries all ui.html tokens + keyframes (pendulum, float,
  wobble, steamFloat, steamType); SVG assets componentized under components/svg
- Multi-stage node:20-alpine Dockerfile with Next standalone output

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 11:26:57 -07:00

35 lines
2.3 KiB
TypeScript

export default function SamosaSvg({ className = '', width = 200, height = 175 }: { className?: string; width?: number; height?: number }) {
return (
<svg className={className} viewBox="0 0 220 195" width={width} height={height} aria-hidden="true">
<defs>
<linearGradient id="samosaG" x1="30%" y1="0%" x2="80%" y2="100%">
<stop offset="0%" stopColor="#edb44c" />
<stop offset="35%" stopColor="#d4940a" />
<stop offset="75%" stopColor="#b87a08" />
<stop offset="100%" stopColor="#8b5e0a" />
</linearGradient>
<linearGradient id="samosaHighlight" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="#f5d080" stopOpacity="0.5" />
<stop offset="100%" stopColor="#d4940a" stopOpacity="0" />
</linearGradient>
<filter id="samosaSh">
<feDropShadow dx="1" dy="3" stdDeviation="3" floodColor="#00000015" />
</filter>
</defs>
<ellipse cx="108" cy="178" rx="58" ry="7" fill="#00000008" />
<path d="M108,18 C88,18 38,72 28,128 C24,150 35,168 55,170 L162,170 C182,168 192,150 188,128 C178,72 128,18 108,18Z" fill="url(#samosaG)" filter="url(#samosaSh)" />
<path d="M108,18 C88,18 38,72 28,128 C24,150 35,168 55,170 L162,170 C182,168 192,150 188,128 C178,72 128,18 108,18Z" fill="url(#samosaHighlight)" />
<path d="M108,28 Q102,65 92,105 Q87,128 82,148" stroke="#a06808" strokeWidth="1.2" fill="none" opacity="0.35" />
<path d="M108,28 Q114,65 124,105 Q129,128 134,148" stroke="#a06808" strokeWidth="1.2" fill="none" opacity="0.35" />
<path d="M90,50 Q95,47 100,50 Q105,53 110,50 Q115,47 120,50 Q125,53 128,50" stroke="#8b5e0a" strokeWidth="1" fill="none" opacity="0.3" />
<path d="M55,170 Q80,164 108,166 Q136,168 162,170" stroke="#8b5e0a" strokeWidth="1.5" fill="none" opacity="0.4" />
<path d="M88,50 Q94,68 96,90" stroke="#f5d080" strokeWidth="2.5" fill="none" opacity="0.35" strokeLinecap="round" />
<ellipse cx="185" cy="158" rx="14" ry="9" fill="#2d8a4e" opacity="0.65" />
<ellipse cx="183" cy="156" rx="9" ry="5.5" fill="#3aa85e" opacity="0.45" />
<circle cx="60" cy="175" r="2" fill="#c4940a" opacity="0.3" />
<circle cx="165" cy="176" r="1.5" fill="#c4940a" opacity="0.25" />
<circle cx="145" cy="180" r="1.8" fill="#b87a08" opacity="0.2" />
</svg>
);
}