From 50f6ade9f847967e23341965e9a6459a54333024 Mon Sep 17 00:00:00 2001 From: AliReza Date: Thu, 8 Oct 2026 16:47:05 +0330 Subject: [PATCH] Replace keyboard emojis with the app's own lucide icons (quiz reactions, +XP, welcome hand, party popper, streak flame) Co-Authored-By: Claude Sonnet 5.5 --- src/components/NoHeartsScreen.tsx | 2 +- src/screens/HomeScreen.tsx | 6 +++--- src/screens/LessonsScreen.tsx | 4 ++-- src/screens/QuizScreen.tsx | 17 +++++++++-------- src/screens/StreakScreen.tsx | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/components/NoHeartsScreen.tsx b/src/components/NoHeartsScreen.tsx index 9cc2cc9..f0c00a6 100644 --- a/src/components/NoHeartsScreen.tsx +++ b/src/components/NoHeartsScreen.tsx @@ -111,7 +111,7 @@ export function NoHeartsScreen({

{back ? 'یه قلب برگشت!' : 'قلب‌هات تموم شد'}

- {back ? 'بریم ادامه بدیم؛ این بار با دقتِ بیشتر 💪' : 'یه کم استراحت کن؛ مغزت هم استراحت لازم داره.'} + {back ? 'بریم ادامه بدیم؛ این بار با دقتِ بیشتر' : 'یه کم استراحت کن؛ مغزت هم استراحت لازم داره.'}

diff --git a/src/screens/HomeScreen.tsx b/src/screens/HomeScreen.tsx index d82d1a8..b53a9f9 100644 --- a/src/screens/HomeScreen.tsx +++ b/src/screens/HomeScreen.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from 'react'; -import { Bell, ChevronLeft, Coins, Flame, Star } from 'lucide-react'; +import { Bell, ChevronLeft, Coins, Flame, Hand, PartyPopper, Star } from 'lucide-react'; import type { HomeNode } from '@/api'; import { useAppData } from '@/state/AppData'; import { findContinue, unitColor, unitProgress } from '@/state/curriculum'; @@ -39,8 +39,8 @@ export function HomeScreen() { : !home.units.length ? 'هنوز درسی برای این پایه ثبت نشده.' : cont - ? <>سلام {name}! 👋 وقتشه جزیره‌ی «» رو شروع کنی؛ دکمه‌ی شروع رو بزن. - : <>آفرین {name}! همه‌ی جزیره‌های این پایه رو تموم کردی 🎉; + ? <>سلام {name}! وقتشه جزیره‌ی «» رو شروع کنی؛ دکمه‌ی شروع رو بزن. + : <>آفرین {name}! همه‌ی جزیره‌های این پایه رو تموم کردی ; const stats = [ { icon: Flame, value: summary?.streak.current ?? 0, label: 'روزِ پیاپی', color: '#FF7A3D', fill: true, to: 'streak' as const }, diff --git a/src/screens/LessonsScreen.tsx b/src/screens/LessonsScreen.tsx index 982cf9b..958ca2d 100644 --- a/src/screens/LessonsScreen.tsx +++ b/src/screens/LessonsScreen.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; import { motion } from 'motion/react'; -import { Brain, Check, ChevronDown, Lock, Play, Sparkles } from 'lucide-react'; +import { Brain, Check, ChevronDown, Lock, PartyPopper, Play, Sparkles } from 'lucide-react'; import { api, type HomeNode, type HomeUnit } from '@/api'; import { useAppData } from '@/state/AppData'; import { findContinue, unitColor, unitProgress } from '@/state/curriculum'; @@ -132,7 +132,7 @@ function UnitCard({ - {complete ? 'تموم شد 🎉' : `${toFa(p.total)} جزیره`} + {complete ? <>تموم شد : `${toFa(p.total)} جزیره`} diff --git a/src/screens/QuizScreen.tsx b/src/screens/QuizScreen.tsx index 478ed40..131860e 100644 --- a/src/screens/QuizScreen.tsx +++ b/src/screens/QuizScreen.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react'; import { AnimatePresence, motion } from 'motion/react'; -import { Brain, Check, ChevronLeft, Coins, Flag, Heart, Infinity as InfinityIcon, Star, X } from 'lucide-react'; +import { Brain, Check, ChevronLeft, Coins, Compass, Flag, Heart, Infinity as InfinityIcon, Lightbulb, Ruler, Sparkles, Star, Target, ThumbsUp, X, Zap, type LucideIcon } from 'lucide-react'; import { api, ApiError, type AnswerResult, type Hearts, type Question, type ReportReason } from '@/api'; import { useAppData } from '@/state/AppData'; import { findNode, findNodeOfLesson, nextLessonOf, unitColor } from '@/state/curriculum'; @@ -291,7 +291,7 @@ export function QuizScreen({ lessonId, nodeId }: { lessonId?: number; nodeId?: s transition={{ type: 'spring', stiffness: 400, damping: 14 }} className="mr-2 inline-block rounded-full bg-[#FFF3C4] px-2 py-0.5 text-[11px] font-black text-[#8A5A00]" > - +{toFa(answer.xpEarned)} ⭐ + +{toFa(answer.xpEarned)} )} @@ -430,7 +430,7 @@ function Result({

{result.stars === 3 ? 'عالی بود!' : result.stars === 2 ? 'آفرین!' : 'تموم شد!'}

- {nodeMode &&

این جزیره رو تموم کردی 🏝️

} + {nodeMode &&

این جزیره رو تموم کردی

}

{toFa(correct)} جوابِ درست از {toFa(total)} سوال

@@ -520,20 +520,21 @@ function ReportSheet({ open, questionId, onClose }: { open: boolean; questionId: ); } -/** شکلکِ کوچکِ بعد از جواب؛ هر سوال یکی از مجموعه، با یک تکانِ کوتاه. فقط ایموجی و transform. */ -const WIN = ['🧠', '💪', '🎯', '⚡', '🤩']; -const MISS = ['🤔', '💡', '📐']; +/** آیکنِ کوچکِ بعد از جواب (همان خانواده‌ی آیکنِ اپ، نه ایموجیِ کیبورد)؛ هر سوال یکی از مجموعه، با یک تکانِ کوتاه. */ +const WIN: [LucideIcon, string][] = [[Brain, '#9B7BFF'], [Zap, '#E8A400'], [Target, '#ED6956'], [ThumbsUp, '#3E9E73'], [Sparkles, '#4C5FD5']]; +const MISS: [LucideIcon, string][] = [[Lightbulb, '#E8A400'], [Ruler, '#4C5FD5'], [Compass, '#9B7BFF']]; function Reaction({ correct, seed }: { correct: boolean; seed: number }) { const set = correct ? WIN : MISS; + const [Icon, color] = set[seed % set.length]; return ( - {set[seed % set.length]} + ); } diff --git a/src/screens/StreakScreen.tsx b/src/screens/StreakScreen.tsx index d1ed28f..4377ab4 100644 --- a/src/screens/StreakScreen.tsx +++ b/src/screens/StreakScreen.tsx @@ -102,7 +102,7 @@ function StreakGoal({ current }: { current: number }) { return (

- {reached ? `🔥 ${toFa(current)} روزه‌ای! ` : ''} + {reached ? <>{toFa(current)} روزه‌ای! : null} {next ? `${toFa(next - current)} روز دیگه می‌شه زنجیره‌ی ${toFa(next)} روزه.` : 'از همه‌ی نقطه‌عطف‌ها رد شدی، افسانه‌ای!'}

{next && (