Spaces:
Running
Running
Update src/App.js
Browse files- src/App.js +308 -137
src/App.js
CHANGED
|
@@ -1,77 +1,196 @@
|
|
| 1 |
-
import React, { useState } from
|
| 2 |
|
| 3 |
const HoroscopeApp = () => {
|
| 4 |
-
const [selectedSign, setSelectedSign] = useState(
|
| 5 |
-
const [selectedGender, setSelectedGender] = useState(
|
| 6 |
-
const [selectedPeriod, setSelectedPeriod] = useState(
|
| 7 |
-
const [selectedCategory, setSelectedCategory] = useState(
|
| 8 |
const [isDarkMode, setIsDarkMode] = useState(false);
|
| 9 |
|
| 10 |
const zodiacSigns = [
|
| 11 |
-
{
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
{
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
];
|
| 24 |
|
| 25 |
const periods = [
|
| 26 |
-
{ id:
|
| 27 |
-
{ id:
|
| 28 |
-
{ id:
|
| 29 |
-
{ id:
|
| 30 |
];
|
| 31 |
|
| 32 |
const categories = [
|
| 33 |
-
{ id:
|
| 34 |
-
{ id:
|
| 35 |
-
{ id:
|
| 36 |
-
{ id:
|
| 37 |
];
|
| 38 |
|
| 39 |
const horoscopeContent = {
|
| 40 |
love: {
|
| 41 |
-
today:
|
|
|
|
| 42 |
week: "This week brings romantic opportunities and deepening connections with your loved ones.",
|
| 43 |
-
month:
|
| 44 |
-
|
|
|
|
| 45 |
},
|
| 46 |
health: {
|
| 47 |
-
today:
|
|
|
|
| 48 |
week: "Pay attention to your physical wellbeing this week. Small changes can make big differences.",
|
| 49 |
-
month:
|
| 50 |
-
|
|
|
|
| 51 |
},
|
| 52 |
relationship: {
|
| 53 |
-
today:
|
|
|
|
| 54 |
week: "Strengthen your bonds with family and friends through meaningful conversations.",
|
| 55 |
-
month:
|
| 56 |
-
|
|
|
|
| 57 |
},
|
| 58 |
finance: {
|
| 59 |
-
today:
|
|
|
|
| 60 |
week: "This week favors careful financial planning and smart investments.",
|
| 61 |
-
month:
|
| 62 |
-
|
| 63 |
-
|
|
|
|
| 64 |
};
|
| 65 |
|
| 66 |
const luckyData = {
|
| 67 |
-
colors: [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
numbers: [1, 3, 7, 9, 11, 13, 21, 23, 27, 33, 42, 77],
|
| 69 |
-
stones: [
|
| 70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
};
|
| 72 |
|
| 73 |
const getCurrentSign = () => {
|
| 74 |
-
return zodiacSigns.find(sign => sign.id === selectedSign);
|
| 75 |
};
|
| 76 |
|
| 77 |
const getHoroscopeText = () => {
|
|
@@ -85,10 +204,10 @@ const HoroscopeApp = () => {
|
|
| 85 |
|
| 86 |
const getPeriodTitle = () => {
|
| 87 |
const titles = {
|
| 88 |
-
today:
|
| 89 |
-
week:
|
| 90 |
-
month:
|
| 91 |
-
year:
|
| 92 |
};
|
| 93 |
return titles[selectedPeriod];
|
| 94 |
};
|
|
@@ -98,11 +217,13 @@ const HoroscopeApp = () => {
|
|
| 98 |
};
|
| 99 |
|
| 100 |
return (
|
| 101 |
-
<div
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
|
|
|
|
|
|
| 106 |
<div className="max-w-6xl mx-auto p-5">
|
| 107 |
{/* Header Controls */}
|
| 108 |
<div className="flex justify-between items-center mb-6 md:mb-8">
|
|
@@ -110,13 +231,15 @@ const HoroscopeApp = () => {
|
|
| 110 |
<button
|
| 111 |
onClick={toggleTheme}
|
| 112 |
className={`flex items-center gap-2 px-3 md:px-4 py-2 rounded-full font-medium transition-all duration-300 ${
|
| 113 |
-
isDarkMode
|
| 114 |
-
?
|
| 115 |
-
:
|
| 116 |
} shadow-lg hover:scale-105`}
|
| 117 |
>
|
| 118 |
-
<span className="text-xl">{isDarkMode ?
|
| 119 |
-
<span className="hidden sm:inline">
|
|
|
|
|
|
|
| 120 |
</button>
|
| 121 |
|
| 122 |
{/* App Icon - Visible on mobile */}
|
|
@@ -127,26 +250,32 @@ const HoroscopeApp = () => {
|
|
| 127 |
</div>
|
| 128 |
|
| 129 |
{/* Gender Selection */}
|
| 130 |
-
<div
|
| 131 |
-
|
| 132 |
-
|
|
|
|
|
|
|
| 133 |
<button
|
| 134 |
-
onClick={() => setSelectedGender(
|
| 135 |
className={`px-3 md:px-6 py-2 rounded-full font-medium transition-all ${
|
| 136 |
-
selectedGender ===
|
| 137 |
-
?
|
| 138 |
-
: isDarkMode
|
|
|
|
|
|
|
| 139 |
}`}
|
| 140 |
>
|
| 141 |
<span className="hidden sm:inline">Female</span>
|
| 142 |
<span className="sm:hidden">β</span>
|
| 143 |
</button>
|
| 144 |
<button
|
| 145 |
-
onClick={() => setSelectedGender(
|
| 146 |
className={`px-3 md:px-6 py-2 rounded-full font-medium transition-all ${
|
| 147 |
-
selectedGender ===
|
| 148 |
-
?
|
| 149 |
-
: isDarkMode
|
|
|
|
|
|
|
| 150 |
}`}
|
| 151 |
>
|
| 152 |
<span className="hidden sm:inline">Male</span>
|
|
@@ -172,36 +301,41 @@ const HoroscopeApp = () => {
|
|
| 172 |
onClick={() => setSelectedSign(sign.id)}
|
| 173 |
className="flex flex-col items-center cursor-pointer transition-all duration-300 hover:scale-105 flex-shrink-0"
|
| 174 |
>
|
| 175 |
-
<div
|
| 176 |
-
|
| 177 |
-
?
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
|
|
|
|
|
|
|
|
|
| 188 |
{sign.image ? (
|
| 189 |
-
<img
|
| 190 |
-
src={sign.image}
|
| 191 |
alt={sign.name}
|
| 192 |
className="w-full h-full object-cover rounded-full"
|
| 193 |
onError={(e) => {
|
| 194 |
-
e.target.style.display =
|
| 195 |
-
e.target.nextSibling.style.display =
|
| 196 |
}}
|
| 197 |
/>
|
| 198 |
) : null}
|
| 199 |
-
<span style={{ display: sign.image ?
|
| 200 |
{sign.emoji}
|
| 201 |
</span>
|
| 202 |
</div>
|
| 203 |
</div>
|
| 204 |
-
<p className="text-xs font-medium mt-2 text-center">
|
|
|
|
|
|
|
| 205 |
</div>
|
| 206 |
))}
|
| 207 |
</div>
|
|
@@ -209,17 +343,21 @@ const HoroscopeApp = () => {
|
|
| 209 |
|
| 210 |
{/* Period Selection */}
|
| 211 |
<div className="flex justify-center mb-6 md:mb-8">
|
| 212 |
-
<div
|
| 213 |
-
|
| 214 |
-
|
|
|
|
|
|
|
| 215 |
{periods.map((period) => (
|
| 216 |
<button
|
| 217 |
key={period.id}
|
| 218 |
onClick={() => setSelectedPeriod(period.id)}
|
| 219 |
className={`px-4 md:px-6 py-2 md:py-3 rounded-full font-medium transition-all text-sm md:text-base ${
|
| 220 |
selectedPeriod === period.id
|
| 221 |
-
?
|
| 222 |
-
: isDarkMode
|
|
|
|
|
|
|
| 223 |
}`}
|
| 224 |
>
|
| 225 |
{period.name}
|
|
@@ -236,10 +374,10 @@ const HoroscopeApp = () => {
|
|
| 236 |
onClick={() => setSelectedCategory(category.id)}
|
| 237 |
className={`flex items-center gap-2 px-3 md:px-4 py-2 rounded-full font-medium transition-all duration-300 shadow-lg hover:scale-105 text-sm md:text-base ${
|
| 238 |
selectedCategory === category.id
|
| 239 |
-
?
|
| 240 |
-
: isDarkMode
|
| 241 |
-
|
| 242 |
-
|
| 243 |
}`}
|
| 244 |
>
|
| 245 |
<span>{category.icon}</span>
|
|
@@ -249,31 +387,41 @@ const HoroscopeApp = () => {
|
|
| 249 |
</div>
|
| 250 |
|
| 251 |
{/* Horoscope Content */}
|
| 252 |
-
<div
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
|
|
|
|
|
|
| 257 |
<div className="flex items-center gap-6 mb-8">
|
| 258 |
-
<div
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
{getCurrentSign()?.image ? (
|
| 266 |
-
<img
|
| 267 |
-
src={getCurrentSign()?.image}
|
| 268 |
alt={getCurrentSign()?.name}
|
| 269 |
className="w-full h-full object-cover rounded-full"
|
| 270 |
onError={(e) => {
|
| 271 |
-
e.target.style.display =
|
| 272 |
-
e.target.nextSibling.style.display =
|
| 273 |
}}
|
| 274 |
/>
|
| 275 |
) : null}
|
| 276 |
-
<span
|
|
|
|
|
|
|
|
|
|
|
|
|
| 277 |
{getCurrentSign()?.emoji}
|
| 278 |
</span>
|
| 279 |
</div>
|
|
@@ -290,64 +438,87 @@ const HoroscopeApp = () => {
|
|
| 290 |
</div>
|
| 291 |
</div>
|
| 292 |
|
| 293 |
-
<p
|
|
|
|
|
|
|
|
|
|
|
|
|
| 294 |
{getCurrentSign()?.name} ({getCurrentSign()?.dates})
|
| 295 |
</p>
|
| 296 |
|
| 297 |
-
<p className="text-lg leading-relaxed mb-8">
|
| 298 |
-
{getHoroscopeText()}
|
| 299 |
-
</p>
|
| 300 |
|
| 301 |
{/* Lucky Elements */}
|
| 302 |
-
<div
|
| 303 |
-
|
| 304 |
-
|
|
|
|
|
|
|
| 305 |
<div className="text-center">
|
| 306 |
<div className="text-3xl mb-3">π</div>
|
| 307 |
-
<p
|
| 308 |
-
|
| 309 |
-
|
|
|
|
|
|
|
| 310 |
Lucky Color
|
| 311 |
</p>
|
| 312 |
-
<p className="font-bold text-green-500">
|
|
|
|
|
|
|
| 313 |
</div>
|
| 314 |
<div className="text-center">
|
| 315 |
<div className="text-3xl mb-3">π’</div>
|
| 316 |
-
<p
|
| 317 |
-
|
| 318 |
-
|
|
|
|
|
|
|
| 319 |
Lucky Number
|
| 320 |
</p>
|
| 321 |
-
<p className="font-bold text-blue-500">
|
|
|
|
|
|
|
| 322 |
</div>
|
| 323 |
<div className="text-center">
|
| 324 |
<div className="text-3xl mb-3">π</div>
|
| 325 |
-
<p
|
| 326 |
-
|
| 327 |
-
|
|
|
|
|
|
|
| 328 |
Lucky Stone
|
| 329 |
</p>
|
| 330 |
-
<p className="font-bold text-purple-500">
|
|
|
|
|
|
|
| 331 |
</div>
|
| 332 |
<div className="text-center">
|
| 333 |
<div className="text-3xl mb-3">β</div>
|
| 334 |
-
<p
|
| 335 |
-
|
| 336 |
-
|
|
|
|
|
|
|
| 337 |
Mood
|
| 338 |
</p>
|
| 339 |
-
<p className="font-bold text-yellow-500">
|
|
|
|
|
|
|
| 340 |
</div>
|
| 341 |
</div>
|
| 342 |
</div>
|
| 343 |
|
| 344 |
{/* Footer */}
|
| 345 |
<div className="text-center text-sm opacity-70 mt-4">
|
| 346 |
-
<p
|
|
|
|
|
|
|
|
|
|
| 347 |
</div>
|
| 348 |
</div>
|
| 349 |
</div>
|
| 350 |
);
|
| 351 |
};
|
| 352 |
|
| 353 |
-
export default HoroscopeApp;
|
|
|
|
| 1 |
+
import React, { useState } from "react";
|
| 2 |
|
| 3 |
const HoroscopeApp = () => {
|
| 4 |
+
const [selectedSign, setSelectedSign] = useState("taurus");
|
| 5 |
+
const [selectedGender, setSelectedGender] = useState("female");
|
| 6 |
+
const [selectedPeriod, setSelectedPeriod] = useState("today");
|
| 7 |
+
const [selectedCategory, setSelectedCategory] = useState("love");
|
| 8 |
const [isDarkMode, setIsDarkMode] = useState(false);
|
| 9 |
|
| 10 |
const zodiacSigns = [
|
| 11 |
+
{
|
| 12 |
+
id: "taurus",
|
| 13 |
+
name: "Taurus",
|
| 14 |
+
dates: "April 20 - May 20",
|
| 15 |
+
emoji: "π",
|
| 16 |
+
image: "/img/Taurus.jpg",
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
id: "sagittarius",
|
| 20 |
+
name: "Sagittarius",
|
| 21 |
+
dates: "Nov 22 - Dec 21",
|
| 22 |
+
emoji: "πΉ",
|
| 23 |
+
image: "/img/Sagittarius.jpg",
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
id: "pisces",
|
| 27 |
+
name: "Pisces",
|
| 28 |
+
dates: "Feb 19 - Mar 20",
|
| 29 |
+
emoji: "π ",
|
| 30 |
+
image: "/img/Pisces.jpg",
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
id: "libra",
|
| 34 |
+
name: "Libra",
|
| 35 |
+
dates: "Sep 23 - Oct 22",
|
| 36 |
+
emoji: "βοΈ",
|
| 37 |
+
image: "/img/Libra.jpg",
|
| 38 |
+
},
|
| 39 |
+
{
|
| 40 |
+
id: "gemini",
|
| 41 |
+
name: "Gemini",
|
| 42 |
+
dates: "May 21 - Jun 20",
|
| 43 |
+
emoji: "π―",
|
| 44 |
+
image: "/img/Gemini.jpg",
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
id: "leo",
|
| 48 |
+
name: "Leo",
|
| 49 |
+
dates: "Jul 23 - Aug 22",
|
| 50 |
+
emoji: "π¦",
|
| 51 |
+
image: "/img/Leo.jpg",
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
id: "virgo",
|
| 55 |
+
name: "Virgo",
|
| 56 |
+
dates: "Aug 23 - Sep 22",
|
| 57 |
+
emoji: "πΈ",
|
| 58 |
+
image: "/img/Virgo.jpg",
|
| 59 |
+
},
|
| 60 |
+
{
|
| 61 |
+
id: "aquarius",
|
| 62 |
+
name: "Aquarius",
|
| 63 |
+
dates: "Jan 20 - Feb 18",
|
| 64 |
+
emoji: "πΊ",
|
| 65 |
+
image: "/img/Aquarius.png",
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
id: "aries",
|
| 69 |
+
name: "Aries",
|
| 70 |
+
dates: "Mar 21 - Apr 19",
|
| 71 |
+
emoji: "π",
|
| 72 |
+
image: "/img/Aries.png",
|
| 73 |
+
},
|
| 74 |
+
{
|
| 75 |
+
id: "cancer",
|
| 76 |
+
name: "Cancer",
|
| 77 |
+
dates: "Jun 21 - Jul 22",
|
| 78 |
+
emoji: "π¦",
|
| 79 |
+
image: "/img/Cancer.png",
|
| 80 |
+
},
|
| 81 |
+
{
|
| 82 |
+
id: "scorpio",
|
| 83 |
+
name: "Scorpio",
|
| 84 |
+
dates: "Oct 23 - Nov 21",
|
| 85 |
+
emoji: "π¦",
|
| 86 |
+
image: "/img/Scorpio.png",
|
| 87 |
+
},
|
| 88 |
+
{
|
| 89 |
+
id: "capricorn",
|
| 90 |
+
name: "Capricorn",
|
| 91 |
+
dates: "Dec 22 - Jan 19",
|
| 92 |
+
emoji: "π",
|
| 93 |
+
image: "/img/Capricorn.png",
|
| 94 |
+
},
|
| 95 |
];
|
| 96 |
|
| 97 |
const periods = [
|
| 98 |
+
{ id: "today", name: "Today" },
|
| 99 |
+
{ id: "week", name: "Week" },
|
| 100 |
+
{ id: "month", name: "Month" },
|
| 101 |
+
{ id: "year", name: "Year" },
|
| 102 |
];
|
| 103 |
|
| 104 |
const categories = [
|
| 105 |
+
{ id: "love", name: "Love", icon: "π" },
|
| 106 |
+
{ id: "health", name: "Health", icon: "π" },
|
| 107 |
+
{ id: "relationship", name: "Relationship", icon: "π₯" },
|
| 108 |
+
{ id: "finance", name: "Finance", icon: "π°" },
|
| 109 |
];
|
| 110 |
|
| 111 |
const horoscopeContent = {
|
| 112 |
love: {
|
| 113 |
+
today:
|
| 114 |
+
"Love is in the air today! Your romantic side is highlighted, making it a perfect day for expressing your feelings.",
|
| 115 |
week: "This week brings romantic opportunities and deepening connections with your loved ones.",
|
| 116 |
+
month:
|
| 117 |
+
"A month of passionate encounters and meaningful relationships awaits you.",
|
| 118 |
+
year: "This year will be transformative for your love life, bringing lasting happiness.",
|
| 119 |
},
|
| 120 |
health: {
|
| 121 |
+
today:
|
| 122 |
+
"Your energy levels are high today. Focus on maintaining balance between work and rest.",
|
| 123 |
week: "Pay attention to your physical wellbeing this week. Small changes can make big differences.",
|
| 124 |
+
month:
|
| 125 |
+
"This month emphasizes the importance of mental and physical health harmony.",
|
| 126 |
+
year: "A year of wellness and vitality lies ahead. Make health your priority.",
|
| 127 |
},
|
| 128 |
relationship: {
|
| 129 |
+
today:
|
| 130 |
+
"Relationships flourish under today's cosmic energy. Communication is key to success.",
|
| 131 |
week: "Strengthen your bonds with family and friends through meaningful conversations.",
|
| 132 |
+
month:
|
| 133 |
+
"Social connections expand this month, bringing new friendships and opportunities.",
|
| 134 |
+
year: "Your social circle will grow significantly, enriching your life in unexpected ways.",
|
| 135 |
},
|
| 136 |
finance: {
|
| 137 |
+
today:
|
| 138 |
+
"Financial opportunities present themselves today. Stay alert for new possibilities.",
|
| 139 |
week: "This week favors careful financial planning and smart investments.",
|
| 140 |
+
month:
|
| 141 |
+
"Money matters require attention this month. Budget wisely for future security.",
|
| 142 |
+
year: "Financial growth and stability are highlighted throughout this year.",
|
| 143 |
+
},
|
| 144 |
};
|
| 145 |
|
| 146 |
const luckyData = {
|
| 147 |
+
colors: [
|
| 148 |
+
"Green",
|
| 149 |
+
"Blue",
|
| 150 |
+
"Purple",
|
| 151 |
+
"Gold",
|
| 152 |
+
"Silver",
|
| 153 |
+
"Red",
|
| 154 |
+
"Pink",
|
| 155 |
+
"Orange",
|
| 156 |
+
"Yellow",
|
| 157 |
+
"Turquoise",
|
| 158 |
+
"Violet",
|
| 159 |
+
"Indigo",
|
| 160 |
+
],
|
| 161 |
numbers: [1, 3, 7, 9, 11, 13, 21, 23, 27, 33, 42, 77],
|
| 162 |
+
stones: [
|
| 163 |
+
"Emerald",
|
| 164 |
+
"Sapphire",
|
| 165 |
+
"Ruby",
|
| 166 |
+
"Diamond",
|
| 167 |
+
"Amethyst",
|
| 168 |
+
"Topaz",
|
| 169 |
+
"Opal",
|
| 170 |
+
"Pearl",
|
| 171 |
+
"Garnet",
|
| 172 |
+
"Aquamarine",
|
| 173 |
+
"Citrine",
|
| 174 |
+
"Turquoise",
|
| 175 |
+
],
|
| 176 |
+
moods: [
|
| 177 |
+
"Optimistic",
|
| 178 |
+
"Energetic",
|
| 179 |
+
"Peaceful",
|
| 180 |
+
"Confident",
|
| 181 |
+
"Creative",
|
| 182 |
+
"Adventurous",
|
| 183 |
+
"Romantic",
|
| 184 |
+
"Focused",
|
| 185 |
+
"Joyful",
|
| 186 |
+
"Balanced",
|
| 187 |
+
"Inspired",
|
| 188 |
+
"Harmonious",
|
| 189 |
+
],
|
| 190 |
};
|
| 191 |
|
| 192 |
const getCurrentSign = () => {
|
| 193 |
+
return zodiacSigns.find((sign) => sign.id === selectedSign);
|
| 194 |
};
|
| 195 |
|
| 196 |
const getHoroscopeText = () => {
|
|
|
|
| 204 |
|
| 205 |
const getPeriodTitle = () => {
|
| 206 |
const titles = {
|
| 207 |
+
today: "Horoscope for Today",
|
| 208 |
+
week: "Horoscope for This Week",
|
| 209 |
+
month: "Horoscope for This Month",
|
| 210 |
+
year: "Horoscope for This Year",
|
| 211 |
};
|
| 212 |
return titles[selectedPeriod];
|
| 213 |
};
|
|
|
|
| 217 |
};
|
| 218 |
|
| 219 |
return (
|
| 220 |
+
<div
|
| 221 |
+
className={`min-h-screen transition-all duration-500 ${
|
| 222 |
+
isDarkMode
|
| 223 |
+
? "bg-gradient-to-br from-gray-900 via-blue-900 to-purple-900 text-white"
|
| 224 |
+
: "bg-gradient-to-br from-blue-50 via-purple-50 to-pink-50 text-gray-800"
|
| 225 |
+
}`}
|
| 226 |
+
>
|
| 227 |
<div className="max-w-6xl mx-auto p-5">
|
| 228 |
{/* Header Controls */}
|
| 229 |
<div className="flex justify-between items-center mb-6 md:mb-8">
|
|
|
|
| 231 |
<button
|
| 232 |
onClick={toggleTheme}
|
| 233 |
className={`flex items-center gap-2 px-3 md:px-4 py-2 rounded-full font-medium transition-all duration-300 ${
|
| 234 |
+
isDarkMode
|
| 235 |
+
? "bg-white bg-opacity-10 text-white hover:bg-opacity-20"
|
| 236 |
+
: "bg-white bg-opacity-90 text-gray-700 hover:bg-opacity-100"
|
| 237 |
} shadow-lg hover:scale-105`}
|
| 238 |
>
|
| 239 |
+
<span className="text-xl">{isDarkMode ? "βοΈ" : "π"}</span>
|
| 240 |
+
<span className="hidden sm:inline">
|
| 241 |
+
{isDarkMode ? "Light Mode" : "Dark Mode"}
|
| 242 |
+
</span>
|
| 243 |
</button>
|
| 244 |
|
| 245 |
{/* App Icon - Visible on mobile */}
|
|
|
|
| 250 |
</div>
|
| 251 |
|
| 252 |
{/* Gender Selection */}
|
| 253 |
+
<div
|
| 254 |
+
className={`flex rounded-full p-1 shadow-lg ${
|
| 255 |
+
isDarkMode ? "bg-white bg-opacity-10" : "bg-white bg-opacity-90"
|
| 256 |
+
}`}
|
| 257 |
+
>
|
| 258 |
<button
|
| 259 |
+
onClick={() => setSelectedGender("female")}
|
| 260 |
className={`px-3 md:px-6 py-2 rounded-full font-medium transition-all ${
|
| 261 |
+
selectedGender === "female"
|
| 262 |
+
? "bg-pink-400 text-white shadow-md"
|
| 263 |
+
: isDarkMode
|
| 264 |
+
? "text-white hover:text-pink-300"
|
| 265 |
+
: "text-gray-600 hover:text-pink-400"
|
| 266 |
}`}
|
| 267 |
>
|
| 268 |
<span className="hidden sm:inline">Female</span>
|
| 269 |
<span className="sm:hidden">β</span>
|
| 270 |
</button>
|
| 271 |
<button
|
| 272 |
+
onClick={() => setSelectedGender("male")}
|
| 273 |
className={`px-3 md:px-6 py-2 rounded-full font-medium transition-all ${
|
| 274 |
+
selectedGender === "male"
|
| 275 |
+
? "bg-blue-400 text-white shadow-md"
|
| 276 |
+
: isDarkMode
|
| 277 |
+
? "text-white hover:text-blue-300"
|
| 278 |
+
: "text-gray-600 hover:text-blue-400"
|
| 279 |
}`}
|
| 280 |
>
|
| 281 |
<span className="hidden sm:inline">Male</span>
|
|
|
|
| 301 |
onClick={() => setSelectedSign(sign.id)}
|
| 302 |
className="flex flex-col items-center cursor-pointer transition-all duration-300 hover:scale-105 flex-shrink-0"
|
| 303 |
>
|
| 304 |
+
<div
|
| 305 |
+
className={`w-20 h-20 md:w-24 md:h-24 rounded-full p-0.5 transition-all ${
|
| 306 |
+
selectedSign === sign.id ? "shadow-lg" : ""
|
| 307 |
+
}`}
|
| 308 |
+
style={{
|
| 309 |
+
background:
|
| 310 |
+
selectedSign === sign.id
|
| 311 |
+
? "linear-gradient(135deg, #1D3249 0%, #96D1E2 100%)"
|
| 312 |
+
: "linear-gradient(135deg, #07090A 0%, #979999 100%)",
|
| 313 |
+
}}
|
| 314 |
+
>
|
| 315 |
+
<div
|
| 316 |
+
className={`w-full h-full rounded-full flex items-center justify-center text-xl overflow-hidden ${
|
| 317 |
+
isDarkMode ? "bg-gray-800" : "bg-gray-100"
|
| 318 |
+
}`}
|
| 319 |
+
>
|
| 320 |
{sign.image ? (
|
| 321 |
+
<img
|
| 322 |
+
src={sign.image}
|
| 323 |
alt={sign.name}
|
| 324 |
className="w-full h-full object-cover rounded-full"
|
| 325 |
onError={(e) => {
|
| 326 |
+
e.target.style.display = "none";
|
| 327 |
+
e.target.nextSibling.style.display = "block";
|
| 328 |
}}
|
| 329 |
/>
|
| 330 |
) : null}
|
| 331 |
+
<span style={{ display: sign.image ? "none" : "block" }}>
|
| 332 |
{sign.emoji}
|
| 333 |
</span>
|
| 334 |
</div>
|
| 335 |
</div>
|
| 336 |
+
<p className="text-xs font-medium mt-2 text-center">
|
| 337 |
+
{sign.name}
|
| 338 |
+
</p>
|
| 339 |
</div>
|
| 340 |
))}
|
| 341 |
</div>
|
|
|
|
| 343 |
|
| 344 |
{/* Period Selection */}
|
| 345 |
<div className="flex justify-center mb-6 md:mb-8">
|
| 346 |
+
<div
|
| 347 |
+
className={`flex rounded-full p-1 shadow-lg ${
|
| 348 |
+
isDarkMode ? "bg-white bg-opacity-10" : "bg-white bg-opacity-90"
|
| 349 |
+
}`}
|
| 350 |
+
>
|
| 351 |
{periods.map((period) => (
|
| 352 |
<button
|
| 353 |
key={period.id}
|
| 354 |
onClick={() => setSelectedPeriod(period.id)}
|
| 355 |
className={`px-4 md:px-6 py-2 md:py-3 rounded-full font-medium transition-all text-sm md:text-base ${
|
| 356 |
selectedPeriod === period.id
|
| 357 |
+
? "bg-blue-400 text-white shadow-md"
|
| 358 |
+
: isDarkMode
|
| 359 |
+
? "text-white hover:text-blue-300"
|
| 360 |
+
: "text-gray-600 hover:text-blue-400"
|
| 361 |
}`}
|
| 362 |
>
|
| 363 |
{period.name}
|
|
|
|
| 374 |
onClick={() => setSelectedCategory(category.id)}
|
| 375 |
className={`flex items-center gap-2 px-3 md:px-4 py-2 rounded-full font-medium transition-all duration-300 shadow-lg hover:scale-105 text-sm md:text-base ${
|
| 376 |
selectedCategory === category.id
|
| 377 |
+
? "bg-purple-400 text-white shadow-lg"
|
| 378 |
+
: isDarkMode
|
| 379 |
+
? "bg-white bg-opacity-10 text-white hover:bg-opacity-20"
|
| 380 |
+
: "bg-white bg-opacity-90 text-gray-600 hover:bg-opacity-100"
|
| 381 |
}`}
|
| 382 |
>
|
| 383 |
<span>{category.icon}</span>
|
|
|
|
| 387 |
</div>
|
| 388 |
|
| 389 |
{/* Horoscope Content */}
|
| 390 |
+
<div
|
| 391 |
+
className={`rounded-3xl p-8 mb-4 shadow-2xl backdrop-blur-lg transition-all ${
|
| 392 |
+
isDarkMode
|
| 393 |
+
? "bg-white bg-opacity-10 border border-white border-opacity-20"
|
| 394 |
+
: "bg-white bg-opacity-95"
|
| 395 |
+
}`}
|
| 396 |
+
>
|
| 397 |
<div className="flex items-center gap-6 mb-8">
|
| 398 |
+
<div
|
| 399 |
+
className="w-20 h-20 rounded-full p-0.5 shadow-lg"
|
| 400 |
+
style={{
|
| 401 |
+
background: "linear-gradient(135deg, #1D3249 0%, #96D1E2 100%)",
|
| 402 |
+
}}
|
| 403 |
+
>
|
| 404 |
+
<div
|
| 405 |
+
className={`w-full h-full rounded-full flex items-center justify-center text-2xl overflow-hidden ${
|
| 406 |
+
isDarkMode ? "bg-gray-800" : "bg-gray-100"
|
| 407 |
+
}`}
|
| 408 |
+
>
|
| 409 |
{getCurrentSign()?.image ? (
|
| 410 |
+
<img
|
| 411 |
+
src={getCurrentSign()?.image}
|
| 412 |
alt={getCurrentSign()?.name}
|
| 413 |
className="w-full h-full object-cover rounded-full"
|
| 414 |
onError={(e) => {
|
| 415 |
+
e.target.style.display = "none";
|
| 416 |
+
e.target.nextSibling.style.display = "block";
|
| 417 |
}}
|
| 418 |
/>
|
| 419 |
) : null}
|
| 420 |
+
<span
|
| 421 |
+
style={{
|
| 422 |
+
display: getCurrentSign()?.image ? "none" : "block",
|
| 423 |
+
}}
|
| 424 |
+
>
|
| 425 |
{getCurrentSign()?.emoji}
|
| 426 |
</span>
|
| 427 |
</div>
|
|
|
|
| 438 |
</div>
|
| 439 |
</div>
|
| 440 |
|
| 441 |
+
<p
|
| 442 |
+
className={`font-medium mb-6 ${
|
| 443 |
+
isDarkMode ? "text-gray-300" : "text-gray-600"
|
| 444 |
+
}`}
|
| 445 |
+
>
|
| 446 |
{getCurrentSign()?.name} ({getCurrentSign()?.dates})
|
| 447 |
</p>
|
| 448 |
|
| 449 |
+
<p className="text-lg leading-relaxed mb-8">{getHoroscopeText()}</p>
|
|
|
|
|
|
|
| 450 |
|
| 451 |
{/* Lucky Elements */}
|
| 452 |
+
<div
|
| 453 |
+
className={`grid grid-cols-2 md:grid-cols-4 gap-6 pt-6 border-t ${
|
| 454 |
+
isDarkMode ? "border-gray-700" : "border-gray-200"
|
| 455 |
+
}`}
|
| 456 |
+
>
|
| 457 |
<div className="text-center">
|
| 458 |
<div className="text-3xl mb-3">π</div>
|
| 459 |
+
<p
|
| 460 |
+
className={`text-xs uppercase tracking-wider mb-2 ${
|
| 461 |
+
isDarkMode ? "text-gray-400" : "text-gray-500"
|
| 462 |
+
}`}
|
| 463 |
+
>
|
| 464 |
Lucky Color
|
| 465 |
</p>
|
| 466 |
+
<p className="font-bold text-green-500">
|
| 467 |
+
{getLuckyElement("colors")}
|
| 468 |
+
</p>
|
| 469 |
</div>
|
| 470 |
<div className="text-center">
|
| 471 |
<div className="text-3xl mb-3">π’</div>
|
| 472 |
+
<p
|
| 473 |
+
className={`text-xs uppercase tracking-wider mb-2 ${
|
| 474 |
+
isDarkMode ? "text-gray-400" : "text-gray-500"
|
| 475 |
+
}`}
|
| 476 |
+
>
|
| 477 |
Lucky Number
|
| 478 |
</p>
|
| 479 |
+
<p className="font-bold text-blue-500">
|
| 480 |
+
{getLuckyElement("numbers")}
|
| 481 |
+
</p>
|
| 482 |
</div>
|
| 483 |
<div className="text-center">
|
| 484 |
<div className="text-3xl mb-3">π</div>
|
| 485 |
+
<p
|
| 486 |
+
className={`text-xs uppercase tracking-wider mb-2 ${
|
| 487 |
+
isDarkMode ? "text-gray-400" : "text-gray-500"
|
| 488 |
+
}`}
|
| 489 |
+
>
|
| 490 |
Lucky Stone
|
| 491 |
</p>
|
| 492 |
+
<p className="font-bold text-purple-500">
|
| 493 |
+
{getLuckyElement("stones")}
|
| 494 |
+
</p>
|
| 495 |
</div>
|
| 496 |
<div className="text-center">
|
| 497 |
<div className="text-3xl mb-3">β</div>
|
| 498 |
+
<p
|
| 499 |
+
className={`text-xs uppercase tracking-wider mb-2 ${
|
| 500 |
+
isDarkMode ? "text-gray-400" : "text-gray-500"
|
| 501 |
+
}`}
|
| 502 |
+
>
|
| 503 |
Mood
|
| 504 |
</p>
|
| 505 |
+
<p className="font-bold text-yellow-500">
|
| 506 |
+
{getLuckyElement("moods")}
|
| 507 |
+
</p>
|
| 508 |
</div>
|
| 509 |
</div>
|
| 510 |
</div>
|
| 511 |
|
| 512 |
{/* Footer */}
|
| 513 |
<div className="text-center text-sm opacity-70 mt-4">
|
| 514 |
+
<p>
|
| 515 |
+
β¨ Discover your daily horoscope and unlock the secrets of the stars
|
| 516 |
+
β¨
|
| 517 |
+
</p>
|
| 518 |
</div>
|
| 519 |
</div>
|
| 520 |
</div>
|
| 521 |
);
|
| 522 |
};
|
| 523 |
|
| 524 |
+
export default HoroscopeApp;
|