import React, { useState } from 'react'; import { Info, Star, Compass, BookOpen, Sparkles, Moon, Sun, CircleDot } from 'lucide-react'; // --- DATA --- const nakshatraNamesMalayalam = ["അശ്വതി", "ഭരണി", "കാർത്തിക", "രോഹിണി", "മകയിരം", "തിരുവാതിര", "പുണർതം", "പൂയം", "ആയില്യം", "മകം", "പൂരം", "ഉത്രം", "അത്തം", "ചിത്തിര", "ചോതി", "വിശാഖം", "അനിഴം", "തൃക്കേട്ട", "മൂലം", "പൂരാടം", "ഉത്രാടം", "തിരുവോണം", "അവിട്ടം", "ചതയം", "പൂരുരുട്ടാതി", "ഉത്തൃട്ടാതി", "രേവതി"]; const nakshatraNamesEng = ["Ashvini", "Bharani", "Krittika", "Rohini", "Mrigashirsha", "Ardra", "Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni", "Hasta", "Chitra", "Swati", "Vishakha", "Anuradha", "Jyeshtha", "Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishtha", "Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati"]; const rasiNamesMalayalam = ["മേടം", "ഇടവം", "മിഥുനം", "കർക്കടകം", "ചിങ്ങം", "കന്നി", "തുലാം", "വൃശ്ചികം", "ധനു", "മകരം", "കുംഭം", "മീനം"]; const rasiNamesEng = ["Mesha (Aries)", "Vrisha (Taurus)", "Mithuna (Gemini)", "Karka (Cancer)", "Simha (Leo)", "Kanya (Virgo)", "Tula (Libra)", "Vrishchika (Scorpio)", "Dhanu (Sagittarius)", "Makar (Capricorn)", "Kumbha (Aquarius)", "Meen (Pisces)"]; // Vibrant Astrological properties const tattvas = { Fire: "അഗ്നി (Fire)", Earth: "ഭൂമി (Earth)", Air: "വായു (Air)", Water: "ജലം (Water)" }; const rasiDetails = [ { element: 'Fire', lord: 'Mars' }, { element: 'Earth', lord: 'Venus' }, { element: 'Air', lord: 'Mercury' }, { element: 'Water', lord: 'Moon' }, { element: 'Fire', lord: 'Sun' }, { element: 'Earth', lord: 'Mercury' }, { element: 'Air', lord: 'Venus' }, { element: 'Water', lord: 'Mars' }, { element: 'Fire', lord: 'Jupiter' }, { element: 'Earth', lord: 'Saturn' }, { element: 'Air', lord: 'Saturn' }, { element: 'Water', lord: 'Jupiter' } ]; // Vimshottari Dasha Sequence const navagrahaDetails = { Ketu: { eng: 'Ketu', mal: 'കേതു', color: '#b45309', textColor: '#ffffff', icon: '☋', type: 'Shadow' }, // Orange-Brown Venus: { eng: 'Venus', mal: 'ശുക്രൻ', color: '#ec4899', textColor: '#ffffff', icon: '♀', type: 'Benefic' }, // Vibrant Pink Sun: { eng: 'Sun', mal: 'സൂര്യൻ', color: '#dc2626', textColor: '#ffffff', icon: '☉', type: 'Malefic' }, // Red Moon: { eng: 'Moon', mal: 'ചന്ദ്രൻ', color: '#f8fafc', textColor: '#0f172a', icon: '☾', type: 'Benefic' }, // Silver/White Mars: { eng: 'Mars', mal: 'ചൊവ്വ', color: '#b91c1c', textColor: '#ffffff', icon: '♂', type: 'Malefic' }, // Deep Red Rahu: { eng: 'Rahu', mal: 'രാഹു', color: '#334155', textColor: '#ffffff', icon: '☊', type: 'Shadow' }, // Slate Jupiter: { eng: 'Jupiter', mal: 'വ്യാഴം', color: '#eab308', textColor: '#ffffff', icon: '♃', type: 'Benefic' }, // Yellow/Gold Saturn: { eng: 'Saturn', mal: 'ശനി', color: '#1e3a8a', textColor: '#ffffff', icon: '♄', type: 'Malefic' }, // Deep Blue Mercury: { eng: 'Mercury', mal: 'ബുധൻ', color: '#16a34a', textColor: '#ffffff', icon: '☿', type: 'Benefic' } // Emerald Green }; const grahaSequence = ['Ketu', 'Venus', 'Sun', 'Moon', 'Mars', 'Rahu', 'Jupiter', 'Saturn', 'Mercury']; // Vibrant Element Colors for Rasis const elementColors = { Fire: '#fca5a5', Earth: '#86efac', Air: '#fde047', Water: '#93c5fd' }; const elementColorsHover = { Fire: '#f87171', Earth: '#4ade80', Air: '#facc15', Water: '#60a5fa' }; const nakColors = ['#fdf4ff', '#fff1f2', '#f0fdf4']; // Data Generation const rasis = rasiNamesMalayalam.map((name, i) => ({ type: 'rasi', id: i + 1, malayalam: name, english: rasiNamesEng[i], startAngle: i * 30, endAngle: (i + 1) * 30, color: elementColors[rasiDetails[i].element], hoverColor: elementColorsHover[rasiDetails[i].element], element: tattvas[rasiDetails[i].element], lord: navagrahaDetails[rasiDetails[i].lord] })); const nakshatraDegrees = 360 / 27; const nakshatras = nakshatraNamesMalayalam.map((name, i) => ({ type: 'nakshatra', id: i + 1, malayalam: name, english: nakshatraNamesEng[i], startAngle: i * nakshatraDegrees, endAngle: (i + 1) * nakshatraDegrees, color: nakColors[i % 3], lord: navagrahaDetails[grahaSequence[i % 9]] })); // Navagraha Ring Data (mapped directly to Nakshatras) const grahas = nakshatras.map((nak, i) => ({ ...nak.lord, type: 'graha', id: `graha-${i}`, nakshatraId: nak.id, startAngle: nak.startAngle, endAngle: nak.endAngle })); // --- COMPONENT --- export default function App() { const [selectedItem, setSelectedItem] = useState(null); const [hoveredItem, setHoveredItem] = useState(null); // Geometry Helpers const getCoordinates = (cx, cy, radius, angleDeg) => { const angleRad = (angleDeg * Math.PI) / 180; return { x: cx - radius * Math.sin(angleRad), y: cy - radius * Math.cos(angleRad) }; }; const createArcPath = (cx, cy, innerR, outerR, startAngle, endAngle) => { const startOut = getCoordinates(cx, cy, outerR, startAngle); const endOut = getCoordinates(cx, cy, outerR, endAngle); const startIn = getCoordinates(cx, cy, innerR, startAngle); const endIn = getCoordinates(cx, cy, innerR, endAngle); const largeArcFlag = endAngle - startAngle > 180 ? 1 : 0; return [ `M ${startOut.x} ${startOut.y}`, `A ${outerR} ${outerR} 0 ${largeArcFlag} 0 ${endOut.x} ${endOut.y}`, `L ${endIn.x} ${endIn.y}`, `A ${innerR} ${innerR} 0 ${largeArcFlag} 1 ${startIn.x} ${startIn.y}`, 'Z' ].join(' '); }; const getTextTransform = (cx, cy, radius, midAngle) => { const pos = getCoordinates(cx, cy, radius, midAngle); let rotation = -midAngle; if (midAngle > 90 && midAngle < 270) rotation += 180; return `translate(${pos.x}, ${pos.y}) rotate(${rotation})`; }; const getOverlapInfo = (rasi, nak) => { const overlap = Math.max(0, Math.min(rasi.endAngle, nak.endAngle) - Math.max(rasi.startAngle, nak.startAngle)); if (overlap < 0.01) return null; const proportion = overlap / nakshatraDegrees; let proportionText = ""; let padams = 0; if (proportion >= 0.99) { proportionText = "പൂർണ്ണം (Full)"; padams = 4; } else if (proportion >= 0.74) { proportionText = "മുക്കാൽ (3/4)"; padams = 3; } else if (proportion >= 0.49) { proportionText = "പകുതി (1/2)"; padams = 2; } else if (proportion >= 0.24) { proportionText = "കാൽ (1/4)"; padams = 1; } return { nak, rasi, proportionText, padams }; }; // --- RENDERERS --- const renderChart = () => { const cx = 400; const cy = 400; const centerR = 80; const rasiR = 190; const nakR = 300; const grahaR = 390; return ( ); }; const renderDetails = () => { if (!selectedItem) { return (
Explore the Chakra
Select any Graha, Nakshatra, or Rasi on the wheel to reveal its astrological properties.
The outermost ring maps the 9 ruling planets (Navagrahas) to their respective Nakshatras in the repeating Vimshottari sequence.
{selectedItem.eng}
പ്രകൃതി (Nature)
{selectedItem.type}
നക്ഷത്രങ്ങൾ (Rules)
3 Nakshatras
{selectedItem.english}
അധിപൻ (Lord) {selectedItem.lord.icon}
{selectedItem.lord.eng} ({selectedItem.lord.mal})
തത്ത്വം (Element)
{selectedItem.element}
വ്യാപ്തി (Span)
30° 00'
{selectedItem.english}
അധിപൻ (Lord) {selectedItem.lord.icon}
{selectedItem.lord.eng} ({selectedItem.lord.mal})
പാദങ്ങൾ
4 Padams
വ്യാപ്തി (Span)
13° 20'